Загрузка…
Загрузка…
backend / middle / tech_deep
Формат
online
Стадия
tech_deep
Когда
within_quarter
Длительность
140 мин
01
Поведенческий
Расскажи, пожалуйста, про свой опыт работы, стек, с которым работал, и проекты.
Вводный вопрос; далее попросили подробнее про последнее место
02
Поведенческий
Расскажи подробнее про архитектуру и стек на последнем месте работы.
03
Поведенческий
Какие базы данных используются у вас на проекте?
04
Поведенческий
Напомни, пожалуйста, какой у тебя был опыт работы с MySQL?
Кандидат также упомянул опыт с MongoDB и Redis для кэша
Заметки
Транскрипт опубликованной видеозаписи собеседования (PHP/Symfony backend), все названия компаний и имена замазаны словом-цензором «бусте», поэтому компания не определяется. Собеседуют двое: руководитель команды и разработчик (Семён), команда разработки антифрод-системы. В нарративе кандидат упоминает прошлые места работы: аутсорс, геодезическая компания, LMS/онлайн-образование, тендерная площадка крупного российского банка (микросервисы, gRPC, protobuf, Go), крупная компания с «большими выигрышами» (замазана), компания-разработчик PIM/аналитики для маркетплейсов (Ozon, Яндекс). В конце звонка озвучен оффер: 260 тыс. на руки на испытательный срок, 280 тыс. после, плюс до двух окладов в год бонусами (июнь и декабрь), далее анкета СБ. Процессы команды: канбан (не скрам), ежедневный синк в 11:00 МСК (5–30 минут), задачи в стори-поинтах не оцениваются.
Подготовка
Кандидат упоминает, что перед собеседованием гуглил «топ-10 вопросов на PHP-собеседовании» — темы оттуда (шардирование, репликация) реально всплыли на интервью. Также отмечает пользу практики с ChatGPT, но предупреждает, что тот выдумывает несуществующие библиотеки и методы.
Стиль интервьюера
Формат дискуссионный: интервьюеры прямо говорят, что большинство вопросов не предполагают единственно правильного ответа, спорить и рассуждать приветствуется. Дают подсказки и наводящие вопросы, сами объясняют правильные ответы, когда кандидат сдаётся или «плавает» (шардирование, сервис-локатор, ребалансировка B-tree). Атмосфера дружелюбная, на «ты», с шутками; в конце подробно рассказывают о команде, процессах, отвечают на вопросы кандидата и сразу делают оффер.
05
Кейс
Почему на проекте использовался и RabbitMQ, и Kafka одновременно? Как выбирали, где какую очередь применять?
Ответ: Kafka — где важна надёжность и хранение истории (карточки товаров на Озон), RabbitMQ — где нужно быстро и просто
06
Поведенческий
Какая самая крупная доработка или технический кейс, которым ты гордишься?
Follow-up: «Почему ты считаешь систему ревью на той работе „дикой“?» — обсуждение многоуровневого процесса ревью с тестировщиками посередине
07
System design
Ситуация: тестировщик говорит, что твой сервис падает при 10 RPS, профиль нагрузки — преимущественно чтения, видно, что «тупит» база данных. Что будешь делать?
Ожидаемый ход: мониторинг (Grafana/Kibana), slow query log, EXPLAIN, индексы; интервьюер дополнил про оценку селективности индекса
08
System design
Follow-up: индексы и оптимизация запросов помогли, сервис держит 20 RPS, но нужно 100. Из одной базы всё выжали — что делать дальше?
Ожидаемый ответ: репликация (slave) + балансировщик нагрузки для масштабирования чтений
09
System design
Мы поставили реплику (slave) — это классический способ горизонтального масштабирования, но он подходит только в одном случае. Подойдёт ли он в нашем кейсе и почему?
Ответ: подойдёт, т.к. нагрузка — чтения, запросы не конкурируют, распределённые транзакции не нужны; репликация — способ масштабирования чтений
10
Теория
А можно ли поставить несколько слейвов (реплик)?
Ответ: да, так и делается, десятки реплик — нормальная практика
11
System design
Другая ситуация: есть сервис с проблемами записи — не успеваем писать, при этом нужна транзакционность (финансовые транзакции). Как масштабировать запись?
Кандидат предложил очереди и вложенные транзакции, в итоге сдался; правильный ответ — шардирование как единственный способ масштабирования записей. Попутно обсудили, что распределённые транзакции — «смерть любой системы»
12
Теория
Чем отличается push-модель от pull-модели в очередях? Разбери на примере Kafka и RabbitMQ — чем Kafka отличается от RabbitMQ?
Ответ: RabbitMQ сам пушит ивенты консьюмеру-подписчику, в Kafka консьюмер сам приходит и забирает сообщения
13
Теория
Чем абстрактный класс отличается от интерфейса?
Попутно упомянуто отсутствие множественного наследования в PHP
14
Теория
Что такое сервис-локатор?
Кандидат не знал; интервьюер пояснил, что это паттерн, на котором сделаны DI-контейнеры, в том числе в Symfony
15
Теория
Что такое low coupling / high cohesion (низкая связанность и высокая связность)?
Кандидат не смог ответить уверенно; интервьюер пояснил: низкая связанность между сервисами/модулями, высокая когерентность — нацеленность на одну задачу
16
Теория
Расскажи про принцип Single Responsibility.
Кандидат также рассказал про dependency inversion; follow-up интервьюера: «А можно примером?» (пример с рестораном и официантом)
17
Теория
Что такое абстрагирование (абстракция)?
18
Теория
Есть хэш-индекс, а есть B-tree индекс. В чём преимущество хэш-индекса и в чём преимущество B-tree?
Обсудили O(1) у хэш-индекса и логарифмическую сложность B-tree; B — balanced, а не binary
19
Теория
Follow-up: логарифмическая сложность явно хуже константной — почему тогда не использовать всегда хэш-индексы?
Ответ: хэш не работает на дублирующихся значениях, и не только это
20
Теория
Follow-up: при каждой вставке в B-tree идёт ребалансировка — что конкретно делает дерево, зачем переставляет элементы, как в итоге разложены данные?
Ответ: данные хранятся отсортированно, что позволяет делать range-сканы — этим B-tree и ценен, с хэш-индексом так нельзя
21
Brainteaser
Есть рекурсивная функция, которая печатает время (сама себя вызывает). Можно ли при помощи этой рекурсии написать бесконечный цикл?
«Любимый философский вопрос» интервьюера; правильный базовый ответ — нет, память/стек закончатся
22
Brainteaser
Follow-up: как сделать так, чтобы бесконечная рекурсия всё-таки стала возможной? Что с лимитом глубины рекурсии и стеком вызовов?
Обсуждались варианты: переназначить лимит глубины (в PHP ~512 → Exception), «хакерски» подсовывать один и тот же адрес в стек, goto в начало, гипотетический компьютер с бесконечной памятью
23
Теория
Есть принцип открытости/закрытости (Open/Closed): код должен расширяться без изменения. В каких случаях этот принцип лучше НЕ соблюдать? Есть ли такие случаи?
Дискуссионный вопрос от второго интервьюера; обсуждали: изменение API внешних систем, сильное изменение бизнеса, исправление багов, цена регрессионного тестирования
24
Кейс
Ты много упоминал Symfony. Если мы предложим проект, где нет этих библиотек, а есть внутренний фреймворк — согласишься ли работать, насколько это для тебя критично?
Кандидат ответил, что стек не критичен, сложнее входить в бизнес-домен, чем в реализацию
25
Теория
Поговорим про функциональное программирование в PHP (функциональные возможности языка).
Из другого собеседования, упомянутого кандидатом в нарративе: интервьюер ~50 лет сказал «мы на PHP пишем в функциональном стиле, давай про функциональщину поговорим»
26
Brainteaser
Мы можем работать с обычным integer, а можем в шестнадцатеричной системе. Зачем это вообще нужно — придумай кейс, где это применяется.
Вопрос не с этого собеседования: кандидат рассказал, что сам задаёт его как интервьюер (пример применения — битовая матрица прав пользователей)