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