Вернуться в видеотекусобес: руби + эликсир
Длинное техническое собеседование по Ruby и Elixir с практической задачей на потоки и подробным разбором Elixir-кластера. Участники обсуждают автозагрузку, GC, конкурентность, распределение состояния, макросы, конфигурацию и тестирование.
- Направление
- Backend
- Формат
- Техническое собеседование
- Длительность
- 2 ч 16 мин
Коротко о видео
Это записанное техническое собеседование по Ruby и Elixir: после вопросов о модулях, операторе `===`, областях видимости переменных и автозагрузке Rails участнику дают задачу с потоками и тайм-аутом, затем обсуждают GC и конкурентность. Во второй половине разбирают код Elixir-проекта с кластеризацией: старт релиза, обнаружение нод, Docker, горячие кэши, перераспределение работы и корректный уход ноды. В финале обсуждают макросы и compile-time-конфигурацию, Credo, тесты и техдолг, а также фиксируют темы для дальнейшего изучения — GIL, GC и собственные тесты проекта.
Затронутые темы
Что взять на заметку
- Для Ruby-собеседования стоит уметь различать роли модулей: mixin через include/prepend, пространство имён и контейнер для функций без состояния.
- Нужно уверенно объяснять области видимости Ruby-переменных; отдельно проговорить, почему class variables разделяются между наследниками и когда безопаснее class instance variables.
- Подготовить версионно-зависимое объяснение require, load и autoload, а также того, как Rails/Zeitwerk подгружает константы в development и production.
- Полезно потренироваться на задаче с Thread, join, ожиданием результата и тайм-аутом, не полагаясь на автодополнение IDE.
- При обсуждении производительности сначала искать неэффективный код и лишние аллокации, а уже затем связывать проблему с garbage collector или версией Ruby.
- Для сервисов с горячим состоянием продумать graceful shutdown: предупредить о завершении, передать работу живым нодам и не потерять прогретый кэш при перезапуске контейнера.
- В Elixir следует различать compile-time и runtime-конфигурацию: compile-time-подстановка может быть оправдана для неизменяемых значений, но ухудшает переносимость библиотеки без явной документации.
- При ревью собственного старого кода важно проверять Git history, покрытие тестами и причины оптимизаций, а не предполагать их назначение по текущему виду кода.