Загрузка…
Загрузка…
backend / middle / tech_deep
Формат
online
Стадия
tech_deep
Когда
within_quarter
Длительность
—
01
Код
Реализуйте in-memory кэш профилей: хранение профиля по ключу (UID), два метода — положить в кэш и достать из кэша. Кэш должен быть конкурентнобезопасным и иметь TTL (время жизни элементов). Внутри профиля есть заказы, но отдельных методов для заказов не нужно. В конце — накидать небольшие тестовые сценарии (положить/достать) без отдельных тестов.
Основная задача лайвкодинга на Go. Перед ней были ещё пара разминочных задачек, которые решили скипнуть (в транскрипте не раскрыты).
02
Теория
При проверке TTL надо ли проходить по всем элементам мапы каждый раз, если к кэшу пришли за конкретным профилем?
Follow-up по ходу лайвкодинга; кандидата подвели к проверке TTL только для запрошенного ключа, а полный обход вынести в фоновый воркер.
03
Теория
Безопасно ли так просто конкурентно обращаться к мапе в Go? Как обеспечить конкурентную безопасность?
Follow-up по ходу лайвкодинга; кандидат добавил мьютекс и критические секции.
Заметки
Запись опубликована сообществом Criminal IT (помощь с трудоустройством в IT). Интервьюер упоминает, что работает «у нас в Юнити» и что найм не обязательно идёт в его команду — интервьюеры общие. Собеседование Go-бэкендера: лайвкодинг (in-memory кэш с TTL и конкурентным доступом) + прикладная теория (PostgreSQL, Kafka, микросервисы, gRPC/protobuf, Kubernetes, observability, pprof, тесты). Перед основной задачей были «парочка разминочных задачек», которые скипнули. В конце кандидат задал свой вопрос про процесс доставки фичи до релиза, интервьюер подробно описал процесс (прожи, фичовнер, техрешение, кодревью от двух человек, фича-стейдж, канареечный релиз, фичефлаги/AB-тесты).
Стиль интервьюера
Доброжелательный и поддерживающий: по ходу лайвкодинга подсказывает (фоновый воркер для TTL, направление сравнения времени, проблемы компиляции), предлагает кандидату догадаться, если тот не знает (оптимистичные блокировки, consumer lag), и сам объясняет правильные ответы (DLQ, гарантии доставки, select for update). Активно задаёт follow-up'ы для проверки глубины понимания, проверяет рассуждения через практические сценарии («что сломается, если...»).
04
Теория
Почему в get-методе ты решил возвращать указатель на профиль, а не значение по умолчанию (структуру)?
Follow-up к задаче на лайвкодинг.
05
Теория
Если после получения профиля из кэша поменять у него поле (например, имя) через указатель — что произойдёт с данными в кэше и как избежать нежелательных изменений?
Интервьюер продемонстрировал мутацию объекта в кэше через возвращённый указатель.
06
Теория
Даже если возвращать профиль по значению, что будет с заказами (слайсом) внутри профиля? Как защитить вложенные данные от мутации?
Обсудили глубокую копию и вынос копирования на уровень доменной модели (метод copy у профиля).
07
Кейс
Пробегись по своей реализации: если бы тестировщик полез проверять, где бы он нашёл проблемы? Какие зоны вызывают у тебя сомнения?
Кандидат назвал отсутствие конструктора и слабую обработку ошибок (нужны типизированные ошибки).
08
Теория
Расскажи про индексы в реляционных базах: для чего нужны, какая от них польза, с какими сталкивался на практике для разных кейсов?
Кандидат рассказал про B-tree, hash-индексы, составные индексы, правило «до первого неравенства», explain analyze.
09
Теория
Какие отрицательные эффекты есть у индексов?
Follow-up к вопросу про индексы: место на диске, замедление записи.
10
Теория
Расскажи про уровни изоляции транзакций: какие бывают и какие артефакты (аномалии) у них есть?
Обсудили read uncommitted/read committed/repeatable read/serializable, lost update, dirty read, non-repeatable read, serialization anomaly, MVCC.
11
Теория
Что-нибудь слышал про оптимистичные блокировки в базе? Чем отличаются оптимистичные и пессимистичные блокировки, как реализовать оптимистичную?
Кандидат не знал; интервьюер объяснил схему с версионированием записи (update ... where version = 1).
12
System design
Сервис крутится в Kubernetes на нескольких подах, каждый под берёт из базы записи (например, самую старую) и обновляет их в цикле. Как сделать так, чтобы поды не пытались обновить одну и ту же запись (убрать гонку)?
Кандидат предложил офсеты и шардирование; интервьюер подсказал select for update и вариант со skip locked.
13
Теория
Партиции в Kafka: что это и для чего нужны? Почему нельзя просто писать всё в топик без партиций?
14
Теория
Если внутри одной консюмер-группы несколько подов (3, 5, 10) хотят вычитывать из одного топика — что будет и зачем тут партиции?
Follow-up: из одной партиции в рамках консюмер-группы может читать не больше одного консюмера, партиции нужны для масштабирования.
15
Кейс
Что бы ты делал с сообщениями из Kafka, которые консюмер не может обработать (не распарсилось, бизнесово не обработалось)?
Кандидат предложил лог; интервьюер рассказал про dead letter queue.
16
Теория
Слышал, что такое consumer lag в Kafka? Что это за метрика?
Кандидат догадался; интервьюер пояснил: разница офсетов продюсера и консюмера.
17
Теория
Какие бывают гарантии доставки в Kafka?
Кандидат не знал; интервьюер рассказал про at-least-once, at-most-once, exactly-once.
18
Теория
Расскажи, как у вас обстоят дела с микросервисами: какие сервисы есть, как строите общение между ними, как устроена работа с базой?
Вопрос про реальный опыт кандидата; обсудили gRPC/protobuf, контракты, центральную базу.
19
Кейс
Если бы у вас появился второй сервис, которому нужно ходить в базу, — это была бы та же самая база или отдельная? Почему?
Follow-up про шаблон database-per-service и нагрузку на общую базу.
20
Теория
Какие паттерны микросервисной архитектуры можешь вспомнить и назвать?
Кандидат рассказал про сагу (оркестрация/хореография) и gateway/роутер для распила монолита.
21
Теория
Используете ли вы у себя сагу или подобные паттерны (распределённые транзакции между сервисами, S3, Redis)?
Кандидат: не используют, операции простые, транзакции между сервисами не требовались.
22
Теория
Хочу поменять gRPC-контракт в proto-файле (структуру респонса). Что я могу себе позволить безопасно сделать без обновления контракта на стороне клиента, чтобы его не сломать?
Кандидат: добавлять новые поля в конец, нумерация полей важнее имён.
23
Теория
А если переименовать поле в proto-контракте (например, address → full_address), оставив номер и тип, — сломаются ли клиенты?
Follow-up к вопросу про изменение proto-контракта.
24
Теория
А если совсем убрать поле из proto-контракта (например, удалить второе поле, не меняя остальные) — что произойдёт на стороне клиента?
Follow-up: интервьюер пояснил — закодируется/декодируется, клиент увидит значение по умолчанию.
25
Теория
Расскажи, какой у тебя опыт с Kubernetes? Для чего он нужен, какие задачи на себя берёт?
Опыт минимальный; кандидат рассказал про оркестрацию, кластер, поды, деплой, масштабирование.
26
Теория
Расскажи про observability у вас: что используете для метрик, логов, трассировки (Prometheus, Grafana и т.д.)?
Кандидат: Prometheus + Grafana для бизнес- и тех-метрик, Elasticsearch для логов, трейсинг не используют; фолбэк с ChatGPT на Claude.
27
Теория
Для бизнесовых и технических метрик определяли ли какие-то трешхолды (пороги алертов)? Как определили, что порог именно 50%?
Follow-up к вопросу про метрики; алерты в Slack при >50% неудачных ответов.
28
Теория
Приходилось ли взаимодействовать с профилировщиком (pprof)? Был ли боевой опыт?
Кандидат рассказал про pprof и бенчмарки; follow-up — были ли кейсы с утечкой памяти (не было).
29
Поведенческий
Как ты в целом относишься к тестам? Нужно ли стопроцентное покрытие?
30
Поведенческий
Нет ли ощущения, что на полстранички кода приходится писать две-четыре странички тестов и это трата времени?
Follow-up к вопросу про отношение к тестам.
31
Теория
А для чего нам вообще нужны тесты, как ты думаешь?
Кандидат: главное — защита от регрессий при рефакторинге и изменениях.