P
prepair.app
Пройти інтерв'ю →
EnglishУкраїнськаРусский
💎

Питання на співбесіді Ruby on Rails

Співбесіда з Ruby йде на двох рівнях: сама мова — блоки, модулі, ланцюг пошуку методу — і Rails, де більшість питань насправді про ActiveRecord і базу під ним. Нижче питання, які ставлять найчастіше, кожне з еталонною відповіддю.

Junior · без досвіду / до 1 рокуMiddle · 2–4 роки досвідуSenior · 5+ років досвіду

Що запитують

Ядро Ruby і блоки
ООП, модулі та міксини
ActiveRecord і звʼязки
Rails MVC, роутинг, контролери
N+1 і продуктивність
RSpec, FactoryBot, Rubocop

10 реальних питань з відповідями

До кожного питання — еталонна відповідь, з якою можна порівняти свою.

1

Що в Ruby істинне, а що хибне?

Відповідь

Хибні лише nil і false. Усе інше істинне — включно з 0, порожнім рядком і порожнім масивом, і саме тут спотикаються ті, хто прийшов з інших мов. Тому if items.empty? і if items означають зовсім різне, і друге майже ніколи не те, що ви мали на увазі.

2

Чим символ відрізняється від рядка?

Відповідь

Рядок — змінюваний обʼєкт, і кожен літерал створює новий; символ незмінний, і той самий символ — завжди той самий обʼєкт. Тому символи доречні як ідентифікатори — ключі хешу, імена методів, статуси: вони не перевиділяються за кожного використання. Рядки — для даних, які показують або змінюють.

3

Що таке блок і що робить `yield`?

Відповідь

Блок — шматок коду, переданий методу, записаний через do...end або фігурні дужки. yield викликає його зсередини методу, а block_given? перевіряє, чи передали блок узагалі. Блоки — причина того, чому код на Ruby виглядає саме так: each, map, open і обгортки транзакцій — звичайні методи, що приймають блок.

4

Чим proc відрізняється від lambda?

Відповідь

Двома речами, які важать. Lambda перевіряє арність і падає на невірній кількості аргументів; proc мовчки добʼє решту значенням nil. І return усередині lambda повертає з самої lambda, а всередині proc — з обгортального методу, через що proc здатен завершити метод, від якого ви цього не чекали.

5

Чим різняться `include`, `extend` і `prepend`?

Відповідь

include додає методи модуля як методи екземпляра, extend — як синглтон-методи обʼєкта, тому extend у тілі класу дає методи класу. prepend вставляє модуль *перед* класом у ланцюгу пошуку, тож метод модуля перемагає і може через super дотягнутися до вихідного. ancestors показує, що сталося насправді.

6

Що таке проблема N+1 і як її лікувати?

Відповідь

Один запит вантажить список, а звернення до звʼязку всередині циклу додає по запиту на рядок — 1 + N. Лікується завантаженням звʼязку заздалегідь через includes. preload завжди робить окремий запит, eager_load примусово будує один LEFT JOIN, а includes обирає між ними залежно від того, чи фільтруєте ви за звʼязком. Гем bullet показує такі місця в розробці.

7

У який момент ActiveRecord справді виконує запит?

Відповідь

Не в момент побудови. User.where(active: true) повертає relation і не чіпає базу; запит іде тоді, коли потрібні дані — each, to_a, first, count або шаблон, що їх рендерить. Ця лінивість і дозволяє зчіплювати скоупи, і вона ж пояснює, чому підозрілий where часто ні до чого, а вартість далі по ланцюгу.

8

Чим валідація відрізняється від обмеження в базі?

Відповідь

Валідація живе в моделі й виконується в Ruby; обмеження живе в базі й тримає незалежно від того, хто пише. Валідації дають зрозумілі помилки по полях, але їх обходять update_column та insert_all, їх не знає інший застосунок, і вони програють гонку двох одночасних запитів. Унікальності особливо потрібен унікальний індекс: валідація — це перевірка, а не гарантія.

9

Що таке колбеки і чому в них погана репутація?

Відповідь

Гачки навколо життєвого циклу моделі — before_save, after_create та інші. Репутацію вони заробили, обростаючи побічними ефектами: створення запису зберігає його, це шле лист, лист ставить джобу, і тесту, якому потрібен був один запис, тепер потрібна заглушка пошти. Усе, що не про власний стан запису, краще викликати явно в сервісному обʼєкті.

10

Що таке Bundler і навіщо `Gemfile.lock`?

Відповідь

Bundler розвʼязує версії гемів, що задовольняють Gemfile, і ставить їх. Gemfile.lock фіксує, що саме розвʼязалося, тому його комітять: bundle install на іншій машині відтворить ті самі версії, а не підтягне найсвіжіше. bundle update — свідома дія щодо їх зсуву.

🦎

Прочитати відповіді недостатньо

На співбесіді ти говориш вголос під тиском. Кем поставить ті самі питання, оцінить кожну відповідь і покаже, що саме підтягнути.

Пройти інтерв'ю Ruby on Rails →
Безкоштовно · 3 інтерв'ю на місяць

Варто прочитати

Всі статті →

Інші спеціалізації

🔍QA Manual🤖QA AutomationJava Backend🐍Python Backend🐘PHP Backend🦫Go Backend🟢Node.js Backend🔷C++🟨JavaScript⚛️React Frontend💚Vue Frontend🅰️Angular FrontendNext.js🍏iOS (Swift)🟩Android (Kotlin)⚙️DevOps / SRE🗄️Data Engineer📈Business Analyst🎯Product Manager📋Project Manager🎨UI/UX Designer📣Marketing