Поведенческая секция и рассказ об опыте
Единственная секция собеса, где «правильный ответ» — это не факт, а структура. Здесь не проверяют знания: здесь проверяют, можно ли посадить тебя рядом с людьми и дать тебе прод. Плохая новость: техническая сила тут не спасает. Хорошая: всё это готовится заранее — буквально текстом, который ты один раз пишешь и три раза проговариваешь вслух.
Три вещи. Первая — умеешь ли ты рассказать про свою работу так, чтобы было понятно, что делал именно ты. Вторая — есть ли у тебя рефлексия: признаёшь ли ошибки, делаешь ли из них процессные выводы, а не «в следующий раз буду внимательнее». Третья — как ты ведёшь себя, когда есть несогласие, дефицит времени или размытое требование. Мидла отличает от джуна не знание каналов, а то, что он задаёт уточняющие вопросы до того, как начал писать код, и предупреждает о риске до дедлайна, а не после.
Люди готовят Go, БД, алгоритмы — и приходят на поведенческую «как есть», рассчитывая импровизировать. В итоге на вопрос «расскажи про сложную задачу» человек полторы минуты вспоминает, потом выдаёт бесструктурный поток на восемь минут, где половина — предыстория, а «мы» встречается сорок раз. Это обнуляет хорошую техническую секцию: остаётся впечатление «вроде знает, но что он делал руками — непонятно». Лечится ровно одним: четыре-пять заготовленных историй, записанных по STAR. STAR — это каркас рассказа из четырёх частей: обстановка, задача, действия, результат (по-английски Situation, Task, Action, Result — отсюда и буквы). Придуман он в HR для собеседований, а инженеру нужен ровно за тем, чтобы рассказ не утонул в предыстории. Подробно разбираем его в главе 2.2.
2.1Самопрезентация и рассказ о проекте
Первые две минуты собеса задают рамку всему остальному. Если из твоего рассказа интервьюер вынес «бэкендер на Go, делает CRM, отвечал за интеграции и наблюдаемость», дальше он будет копать туда, где ты силён. Если вынес «что-то про микросервисы», копать будет наугад.
Что на самом деле спрашивают словами «расскажите о себе»
Вопрос не про биографию. Он проверяет, умеешь ли ты упаковывать информацию, и заодно даёт интервьюеру крючки для следующих вопросов. Формально ты отвечаешь на «кто ты», фактически на три вопроса сразу:
- Что ты умеешь прямо сейчас? Роль, стек, домен, масштаб.
- Как ты к этому пришёл? Короткая траектория, из которой виден рост, а не список работодателей.
- Зачем ты здесь? Чего не хватает на текущем месте и почему именно их вакансия это закрывает.
Отсюда формула: настоящее → путь → чего хочу дальше. Именно в этом порядке, а не хронологически с института. Хронология проигрывает всему: самое важное (что ты умеешь сейчас) оказывается в конце, когда внимание уже уплыло.
Записать текст, прочитать вслух с секундомером, урезать до 2:00–2:30 и проговорить три раза. Заучивать не дословно, а опорные точки: пять-шесть фраз, между которыми ты импровизируешь. Зазубренный текст слышно, и звучит он хуже живого рассказа по каркасу. Тайминг проверяй честно: то, что «на глаз минута», обычно четыре.
Рассказ о проекте: четыре слоя
Дальше почти всегда идёт «расскажите подробнее про ваш проект». Здесь чаще всего ошибаются одинаково: начинают со стека, «у нас Go, Postgres, Kafka, k8s». Интервьюер так и не понял, что делает система, и вынужден догадываться. Рассказывать надо сверху вниз: бизнес-смысл, потом архитектура, потом твоя граница ответственности, потом самое сложное.
| Слой | Что говоришь | Пример формулировки (CRM) |
|---|---|---|
| 1. Бизнес-смысл | Что система делает, для кого, чем зарабатывает или что экономит | «CRM для отделов продаж: ведёт лиды и сделки, подтягивает звонки из телефонии, считает воронку. Пользователи — менеджеры продаж и руководители» |
| 2. Архитектура | Крупными мазками: сколько сервисов, чем общаются, где состояние | «Go-бэкенд из нескольких сервисов, синхронно gRPC между собой и REST наружу, события в Kafka, состояние в Postgres, кэш и распределённые локи в Redis» |
| 3. Твоя зона | Что делал ты, а не команда: конкретные куски, конкретные задачи | «Я вёл домен сделок и интеграции с телефонией, плюс наблюдаемость: метрики, дашборды, алерты» |
| 4. Самое сложное | Одно решение с альтернативами и обоснованием — это глубина | «Самым сложным была идемпотентность обработки звонков: провайдер шлёт вебхуки с ретраями» |
На схеме ниже и дальше по всей главе мелькает несколько слов из повседневного обихода команд. Договоримся о них сразу, иначе половина примеров будет читаться со спотыканием. В PR (pull request, «запрос на вливание») разработчик собирает порцию изменений и предлагает влить её в общую ветку; сам список изменённых строк называют дифом. PR читают коллеги на код-ревью, и только после их «ок» изменения попадают в основной код. Стейдж повторяет боевую систему: на нём всё проверяют до того, как это увидят пользователи. Данных и нагрузки там обычно меньше, поэтому далеко не всё, что ломается в проде, ломается на стейдже. При канареечной раскатке новую версию включают не всем сразу: сначала, скажем, на 10% трафика, несколько минут смотрят на ошибки и время ответа, и только если графики спокойные, раскатывают на остальных. Название от шахтёрской канарейки: маленькая часть трафика первой чувствует, что воздух испортился. Фича-флаг, переключатель в настройках, включает и выключает новое поведение без выкатки новой версии: код уехал в прод выключенным, включили одному отделу, что-то пошло не так, погасили флаг, а не откатывали весь сервис.
Цифры: что готовить и что делать, если их нет
Цифра в рассказе работает как доказательство. «Ускорил ручку» не весит ничего. А вот «p99 списка сделок
был 1,8 с, стал 210 мс, смотрел в Grafana по гистограмме http_request_duration_seconds»
уже можно проверить, и по такой фразе сразу видно, что человек в метрики действительно смотрел.
Три слова дальше встречаются постоянно, расшифруем их сразу, чтобы таблица ниже
читалась без запинки. Ручкой на жаргоне зовут одну точку входа в сервис,
которую «дёргают» снаружи, например GET /api/deals. RPS (requests
per second) показывает, сколько запросов в секунду приходит на сервис. p99 обозначает перцентиль,
то есть значение, ниже которого укладываются 99% запросов: «p99 = 210 мс» читается как
«99 запросов из ста уложились в 210 миллисекунд, а самый медленный сотый был хуже».
Перцентиль спрашивают вместо среднего потому, что среднее прячет медленный хвост,
а жалуются пользователи как раз на хвост.
| Что готовить | Зачем спрашивают | Где взять |
|---|---|---|
| RPS: средний и в пике | Понять реальный масштаб и калибровать твои слова про «высокие нагрузки» | sum(rate(http_requests_total[5m])) в Grafana даёт текущий RPS, для среднего за сутки окно [24h]; или посчитать от бизнес-объёма |
| Латентность: p50/p95/p99 ключевых ручек | Проверить, знаешь ли ты разницу между средним и хвостом | Гистограмма запросов, histogram_quantile(0.99, ...) |
| Объём данных: размер БД, число строк в топ-3 таблицах, суточный прирост | Оценить, сталкивался ли ты с реальными проблемами масштаба | pg_database_size, pg_total_relation_size, оценка по reltuples |
| Размер команды и своя роль в ней | Понять, сколько на тебе было автономии и коммуникации | Просто посчитать: разработчики, QA, аналитик, тимлид, продакт |
| Темп поставки: релизов в неделю, время от PR до прода | Оценить зрелость процессов, к которым ты привык | История прогонов CI — автоматической цепочки «собрать, прогнать тесты, выкатить», которая запускается на каждый PR; плюс теги релизов |
| Надёжность: доступность, число инцидентов, есть ли SLO — записанная цель по надёжности вроде «99,9% запросов без ошибок за месяц» | Понять, был ли у тебя прод в настоящем смысле слова | Алерты, разборы инцидентов (их называют постмортемами), страница статуса |
- Порядок вместо точности: «сотни RPS», «десятки гигабайт», «единицы миллионов строк».
- Явная оговорка. Хватает одного слова, «по памяти», «оценочно», «на глаз из дашборда», и цифра из вранья превращается в честную оценку.
- Вывод из бизнес-объёма: «примерно 12 тысяч сделок в сутки, на каждую за её жизнь сотни запросов — отсюда и порядок».
- Никогда не округляй вверх «чтобы солиднее». Опытный интервьюер спросит «а как эта нагрузка распределена по суткам?» или «а какой инстанс это держал?», и всё станет видно.
Сложное не значит объёмное. «Мы переписали монолит на микросервисы» говорит о масштабе, а не о сложности, и спросить оттуда лично у тебя почти нечего. Сложное начинается там, где было несколько разумных вариантов и пришлось выбирать. Идемпотентность вебхуков, порядок обработки событий, миграция без даунтайма, консистентность между сервисами: из такого получается глубокий разговор. Заранее выбери одну тему и подготовь альтернативы, которые ты отверг, и почему. Именно это отличает мидла от джуна, который «сделал как получилось».
Вопросы
4Каркас ответа
- Кто я сейчас (~30 с): имя, роль, сколько лет пишу на Go, что за продукт и для кого. Стек в одну строку, без перечисления всего, что видел.
- Проект и достижения (~60 с): что за система, за что отвечал я, два-три результата с цифрами в формате «было X — стало Y».
- Чего хочу дальше (~30 с): чего не хватает сейчас и почему именно эта вакансия это закрывает. Заодно здесь же снимается будущий вопрос «почему уходишь».
- Передача хода: «с чего вам удобнее начать — с архитектуры или с конкретных задач?» Это выглядит уверенно и экономит время обоим.
Образец под профиль «Go + CRM»
«Меня зовут Герман, я backend-разработчик, три года пишу на Go. Последние два года — в команде CRM: это система для отделов продаж, там ведутся лиды и сделки, подтягиваются звонки из телефонии и считается воронка. Бэкенд на Go: несколько сервисов, внутри gRPC, наружу REST, события через Kafka, данные в Postgres, кэш и локи в Redis, всё в Kubernetes.
Моя зона — домен сделок и интеграции с внешними системами, плюс наблюдаемость. Из того, чем доволен: во-первых, разобрался с дублями по звонкам — провайдер шлёт вебхуки с ретраями, и у нас в базе плодились дубликаты; сделал идемпотентную обработку по ключу события, дубли ушли в ноль. Во-вторых, список сделок отдавал p99 около 1,8 секунды — после разбора планов, составного индекса и убирания N+1 стало примерно 210 миллисекунд. В-третьих, завёл нормальные метрики и дашборды в Prometheus с Grafana и перевёл раскатку на канареечную: до этого релиз был событием, сейчас катим несколько раз в неделю.
Дальше хочу больше отвечать за архитектурные решения, а не только за свои сервисы, и поработать с нагрузкой на порядок выше — у вас, судя по вакансии, как раз это есть. С чего удобнее начать: с архитектуры проекта или с конкретных задач?»
Чего говорить нельзя
- Хронологию с института. После «закончил вуз, потом полгода на PHP, потом...» самое ценное окажется в конце.
- Список технологий без контекста. За «знаю Kafka, gRPC, Redis, k8s, Postgres» сразу следует «а что вы с Kafka делали?», и если ответа нет, доверие падает ко всему списку.
- Личное. Семья, город, хобби, «люблю учиться новому». Либо спросят отдельно, либо это шум.
- Негатив про текущую работу. Даже одна фраза «там всё плохо с процессами» разворачивает разговор не туда.
- Восемь минут. Если тебя перебивают, рассказ был слишком длинным, и это уже минус.
Чем добить
Подстроить последний блок под конкретную вакансию: если в описании выделены высокие нагрузки, делай акцент на латентности и метриках; если интеграции, на идемпотентности и внешних API; если много легаси, на миграциях без даунтайма. Один и тот же рассказ с разными акцентами выглядит как «человек прочитал вакансию», а это редкость.
Каркас ответа
- Что делает система и для кого. Две фразы. Без этого всё дальнейшее висит в воздухе.
- Как устроена. Сколько сервисов, кто с кем как общается (синхронно / через события), где живёт состояние, как деплоится.
- Где здесь я. Прямым текстом: «я отвечал за такие-то сервисы и такие-то задачи». Если что-то делал не ты, так и скажи, это не минус.
- Как это работает в динамике. Проведи один запрос через всю систему: от кнопки в интерфейсе до записи в БД и события в Kafka. Так проще всего показать, что ты понимаешь систему целиком.
- Масштаб цифрами. RPS, объём данных, размер команды, темп релизов.
«CRM для отделов продаж: менеджеры ведут в ней лиды и сделки, руководители смотрят воронку и отчёты. Бэкенд разбит на несколько Go-сервисов: сервис сделок и лидов — это ядро, отдельно сервис интеграций с телефонией и почтой, отдельно сервис отчётов, который читает с реплики. Между собой синхронно ходим по gRPC, наружу отдаём REST через gateway, который закрывает аутентификацию и лимиты. Всё, что не должно блокировать пользователя, уезжает событием в Kafka: уведомления, пересчёт воронки, вебхуки во внешние системы. Состояние — Postgres, миграции через goose в отдельном шаге пайплайна; в Redis кэш справочников и распределённые локи. Крутится в Kubernetes, раскатка канареечная.
Моя зона — сервис сделок и сервис интеграций целиком: схема данных, API, воркеры, миграции. Плюс наблюдаемость на всей команде: метрики, дашборды и алерты в Prometheus с Grafana я поднимал сам. Отчётами занимался коллега, фронт — отдельная команда.
Если провести один запрос: менеджер меняет статус сделки → gateway проверяет токен → сервис сделок валидирует переход по машине состояний, пишет в Postgres в транзакции вместе с записью в служебную таблицу outbox — «исходящий ящик» → отдельный воркер вычитывает её и публикует событие в Kafka → подписчики шлют уведомление и пересчитывают воронку. Outbox взяли именно потому, что "записать в БД и отправить в Kafka" без него не атомарно.»
Чего говорить нельзя
- Начинать со стека. «У нас Go, Postgres, Kafka» перечисляет зависимости, а не рассказывает о проекте.
- Сплошное «мы». Если во всём ответе ни разу не прозвучало «я сделал», интервьюер не поймёт, что делал именно ты, и решит, что ничего.
- Присваивать чужое. Достаточно одного уточняющего вопроса вглубь, чтобы это вскрылось. Гораздо сильнее звучит «это делал коллега, я знаю верхнеуровнево».
- Раскрывать то, что нельзя. Внутренние формулы, персональные данные, коммерческие цифры компании. Говори про архитектуру и порядки величин, а не про конкретику под NDA, и скажи об этом прямо: это плюс, а не минус.
Нарисуй схему. Очно на доске, по видео попроси разрешения пошарить экран и набросать в любой рисовалке, или просто проговори «представьте три прямоугольника». Кандидат, который раскладывает рассказ по картинке, выглядит как человек, который так же будет объяснять и коллегам. Схему набросай заранее, один раз, и держи её в голове.
Каркас ответа
- Проблема в одной фразе, и почему она не решалась «просто».
- Варианты: два-три, каждый с плюсом и минусом. Это ядро ответа.
- Выбор и критерий: почему именно этот, по какому признаку сравнивал.
- Как проверил, что не ошибся: метрики, нагрузочный тест, канареечная раскатка.
- Что бы сделал иначе сейчас. Эта фраза почти всегда добавляет к оценке.
«Самым сложным была идемпотентность обработки звонков. Провайдер телефонии шлёт вебхук о завершённом звонке и ретраит его, если мы не ответили 200 за две секунды. А мы иногда отвечали медленно — и в CRM появлялись дубли звонков в карточке сделки, менеджеры на это жаловались.
Вариантов было три. Первый — дедупликация по содержимому: сравнивать номер, время
и длительность. Отмёл: провайдер округлял длительность по-разному в ретраях, и это дало бы
ложные срабатывания. Второй — очередь с exactly-once поверх Kafka. Отмёл как избыточное:
exactly-once там всё равно означает "at-least-once плюс дедупликация на приёмнике", то есть
ту же задачу, но с лишней инфраструктурой. Третий — то, на чём остановились: у провайдера
в вебхуке есть call_uuid, я сделал его натуральным ключом с уникальным индексом
и вставку через INSERT ... ON CONFLICT DO NOTHING в той же транзакции, что
и запись в outbox. Обработчик стал идемпотентным, повторный вебхук просто ничего не меняет
и возвращает 200.
Проверял так: сначала на стейдже прогнал повторную доставку руками, потом раскатил канареечно на 10% трафика и смотрел счётчик конфликтов вставки — он сразу стал ненулевым, то есть ретраи реально приходили и отсекались. Дубли в проде ушли в ноль.
Что бы сделал иначе: сразу завёл бы отдельную таблицу обработанных событий с TTL вместо уникального индекса прямо на бизнес-таблице. Сейчас этот индекс мешает, когда надо перезалить историю.»
Про «чем гордишься»
Это тот же вопрос, но с другого угла: тут ценится не героизм, а изменение, которое
пережило тебя. Хорошие варианты: «после инцидента завёл алерты, которыми команда
пользуется до сих пор», «перевёл раскатку на канареечную, и релиз перестал быть событием»,
«написал линтер-правило, которое ловит забытый context». Слабые варианты вроде
«сидел ночью и починил» или «сделал за выходные» говорят про выгорание, а не про инженерию.
Чего говорить нельзя
- «Самым сложным было переписать монолит на микросервисы». Если ты был одним из десяти, это про масштаб чужой работы.
- Решение без альтернатив. «Взял Kafka», а почему не RabbitMQ, не outbox с поллингом, не обычная транзакция? Если альтернатив нет, значит, выбора не было и решение принимал не ты.
- Гордиться количеством кода: «написал сервис на 20 тысяч строк». Никто не считает строки.
Обязательный минимум
- Нагрузка: RPS средний и в пике, во сколько раз пик выше среднего.
- Латентность: p50/p95/p99 двух-трёх главных ручек. Только не среднее, оно на собесе выдаёт человека, который метрики не читал.
- Данные: размер БД, число строк в самых крупных таблицах, суточный прирост, глубина хранения.
- Команда: сколько разработчиков, есть ли QA, аналитик, тимлид; сколько человек в твоей зоне.
- Темп: релизов в неделю, время от смерженного PR до прода, есть ли автотесты в пайплайне.
- Надёжность: целевая доступность, есть ли SLO, сколько инцидентов было за квартал, есть ли дежурства.
Где брать, если не помнишь
# Prometheus: RPS сейчас, окно пять минут, и пик за сутки
sum(rate(http_requests_total[5m]))
max_over_time(sum(rate(http_requests_total[5m]))[24h:5m])
# p99 по ручке
histogram_quantile(0.99, sum by (le) (rate(http_request_duration_seconds_bucket{route="/deals"}[5m])))
# доля успешных за месяц: фактический SLI доступности
sum(rate(http_requests_total{code!~"5.."}[30d])) / sum(rate(http_requests_total[30d]))
-- размер базы и топ таблиц по объёму
SELECT pg_size_pretty(pg_database_size(current_database()));
SELECT relname,
pg_size_pretty(pg_total_relation_size(c.oid)) AS total,
reltuples::bigint AS approx_rows
FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'public' AND c.relkind = 'r'
ORDER BY pg_total_relation_size(c.oid) DESC
LIMIT 5;
Как называть цифру, если точной нет
«Точную цифру по памяти не назову, но порядок такой: в рабочие часы это сотни запросов в секунду на сервис сделок, ночью почти ноль — нагрузка сильно привязана к рабочему дню, пик раза в четыре выше суточного среднего. База была порядка двухсот гигабайт, самая крупная таблица — история изменений сделок, там единицы миллионов строк и рост порядка десятков тысяч записей в сутки. Если нужно точнее — могу посмотреть и написать после интервью.»
В этом ответе три приёма: назван порядок, объяснена форма нагрузки (привязка к рабочему дню показывает, что ты понимаешь систему, а не запомнил цифру) и предложено уточнить позже. Последним почти никогда не пользуются, но напряжение оно снимает.
Чего говорить нельзя
- «Высоконагруженный проект» без числа. Это слово ничего не значит: для кого-то это 500 RPS, для кого-то 500 000.
- Среднее время ответа вместо перцентилей. Сразу прилетит «а p99?», и если ответа нет, вопрос про метрики закрыт не в твою пользу.
- Округление вверх «для солидности». Один вопрос «а на скольких подах это крутилось?», и арифметика не сойдётся.
- Путать SLA, SLO и SLI. Это три ступени одной лестницы. SLI (service level indicator) обозначает саму измеряемую величину, например долю запросов, отработавших без ошибки. SLO (objective, «цель») задаёт внутреннюю цель по этой величине, «не ниже 99,9% за месяц»: за её нарушение никто не платит, но команда обязана реагировать. SLA (agreement, «соглашение») фиксирует то же обещание в договоре с клиентом, и за нарушение уже платят деньгами или скидкой. Мидл эту тройку различает.
Заведи одну заметку «цифры проекта» и держи её открытой на втором экране во время созвона. Это не читерство: интервьюер сам держит перед глазами свои заметки. Но выучи её настолько, чтобы не делать пауз: подглядывай, чтобы свериться, а не чтобы прочитать.
2.2Истории по методу STAR
В поведенческой секции четыре-пять вопросов, и каждый просит историю. Историю нельзя вспомнить на месте: её надо один раз записать по каркасу и проговорить вслух. Каркас называется STAR, и нужен он для одного: не дать свалиться в пересказ контекста.
Что такое STAR и почему без него получается вода
В STAR четыре буквы, по одной на часть истории: Situation (обстановка), Task (задача, которая стояла перед тобой), Action (что ты делал), Result (что получилось). Придумали это в HR для структурированных интервью, но инженеру метод полезен одним: он заставляет отдать большую часть времени Action и Result.
Без каркаса происходит одно и то же. Человека просят рассказать про сложную задачу, и он начинает с того, что «у нас была CRM, там было несколько сервисов, исторически сложилось, что...», а через три минуты всё ещё объясняет контекст. Интервьюер перебивает («а что конкретно вы сделали?») и получает две фразы. В итоге он унёс с собой подробное описание чужого проекта и ноль информации про кандидата. Не потому, что человек слабый: просто рассказывать контекст легко, а формулировать свой вклад трудно, и без структуры мозг всегда выбирает лёгкое.
| Часть | Время | Что должно прозвучать | Типичная ошибка |
|---|---|---|---|
| S — Situation | ~20 сек | Система, момент, кто пострадал от проблемы. Две-три фразы | Пересказ архитектуры всего проекта и «исторически сложилось» |
| T — Task | ~20 сек | Что нужно было сделать мне, с какими ограничениями (срок, данные, легаси) | «Нам нужно было...» — задача растворяется в команде |
| A — Action | ~55 сек | Шаги от первого лица, рассмотренные варианты, критерий выбора, что делал при осложнениях | Один глагол вместо шагов: «я это пофиксил». Что именно — непонятно |
| R — Result | ~30 сек | Измеримый итог, системное изменение, вывод одной фразой | «Всё заработало, все были довольны» — результата нет |
- «Мы» вместо «я». Самая частая. Проверь свой текст поиском: если «мы» встречается чаще, чем «я», интервьюер физически не сможет понять, что делал ты. Правило простое: «мы» допустимо в S, дальше только «я». Про командную работу скажешь отдельной фразой: «параллельно коллега вёл вот эту часть, я синхронизировался с ним по контракту».
- Нет измеримого результата. «Стало быстрее», «стало удобнее», «пользователи перестали жаловаться». Это ощущения. Нужно: «p99 с 1,8 с до 210 мс», «дубли ушли в ноль», «время от PR до прода с трёх дней до сорока минут». Если цифры нет вообще, назови проверяемый факт: «за полгода после этого ни одного инцидента этого класса».
- Слишком много контекста. Признак: ты объясняешь термины своего домена. Если для понимания истории нужно знать, что такое «карточка сделки в статусе предоплаты», ты либо не ту историю выбрал, либо не так её рассказал.
Банк историй: четыре заготовки закрывают почти все вопросы
Готовить историю на каждый возможный вопрос не нужно. Хватит четырёх, если знать, каким боком каждую повернуть. Один и тот же инцидент в проде отвечает и на «расскажите про сложную задачу», и на «расскажите про ошибку», и на «как вы работаете под давлением».
| История | Что она доказывает | На какие вопросы отвечает |
|---|---|---|
| 1. Спор на код-ревью коммуникация |
Умеешь спорить по критериям, а не по вкусу, и умеешь менять позицию от данных | «Конфликт в команде», «техническое несогласие», «как вы ревьюите код», «расскажите, когда вы были не правы» |
| 2. Инцидент в проде надёжность |
Умеешь диагностировать по метрикам, не паникуешь, делаешь системные выводы | «Сложная задача», «работа под давлением», «ошибка и чему научились», «как устроены дежурства у вас» |
| 3. Фича от постановки до деплоя процесс |
Умеешь декомпозировать, оценивать, торговаться за скоуп (объём работ — что именно входит в задачу, а что переезжает в следующую версию) и предупреждать о риске | «Не успеваете в срок», «как оцениваете задачи», «как работаете с аналитиком и продактом» |
| 4. Инициатива зрелость |
Видишь проблему до того, как она стала инцидентом, и доводишь улучшение до конца | «Чем гордитесь», «что улучшили сами», «как убеждали команду», «как относитесь к техдолгу» |
Открой заметку, для каждой из четырёх историй напиши четыре абзаца: S, T, A, R. Потом прочитай вслух с секундомером и урежь до двух минут: первым режется S. Дальше выпиши из каждой истории пять опорных слов: запоминать надо их, а не текст. На собесе ты рассказываешь по опорным словам своими словами, и слышно, что это рассказ, а не заготовка. После трёх прогонов вслух история перестаёт разваливаться.
Как аргументировать в техническом споре
Половина поведенческих вопросов так или иначе про спор. Поэтому про механику аргумента стоит знать отдельно: спор идёт по лестнице из четырёх уровней, и на всех уровнях ниже четвёртого спорят личности, а не решения.
«Давай сначала договоримся, по какому критерию выбираем». Одна фраза, а вытаскивает любой спор с первого уровня на четвёртый. Критерии для кода почти всегда одни и те же: читаемость на месте вызова, число веток, которые придётся тестировать, стоимость следующего изменения, вероятность ошибиться при использовании. На собесе именно эта фраза в истории про спор даёт больше всего очков.
Вопросы
5Каркас ответа
- Назвать четыре части и сразу сказать, зачем метод нужен: он не даёт свалиться в пересказ контекста.
- S — обстановка, ~20 секунд: система, момент, кто страдал. Две-три фразы, без экскурсии по архитектуре.
- T — задача, ~20 секунд: что нужно было сделать лично мне и с какими ограничениями.
- A — действия, ~55 секунд: шаги от первого лица, какие варианты рассматривал, по какому критерию выбрал, что делал, когда пошло не по плану. Это ядро.
- R — результат, ~30 секунд: цифра или проверяемый факт, системное изменение, вывод одной фразой.
«STAR — это каркас на четыре части: обстановка, задача, действия, результат. Я его использую не потому, что так модно в HR, а потому что он держит пропорции. Без каркаса рассказ уезжает в контекст: человек три минуты объясняет, как у него всё устроено, а на вопрос "что сделали вы" остаётся полторы фразы.
Пропорция примерно такая: секунд двадцать на обстановку, двадцать на задачу, минута на действия и полминуты на результат. То есть две трети времени — про то, что делал я, и про то, что из этого вышло. Обстановку я специально держу короткой: достаточно сказать "у нас CRM, интеграция с телефонией шлёт вебхуки", а дальше сразу к делу.
В части "действия" я стараюсь говорить шагами и от первого лица: сначала посмотрел метрики, увидел вот это, выдвинул гипотезу, проверил, отбросил, взял вторую. И обязательно называю варианты, которые отверг, — без них непонятно, было ли вообще решение.
В результате всегда стараюсь дать число: было столько, стало столько, измерял вот так. Если числа нет — говорю проверяемый факт: например, "за полгода после этого ни одного инцидента такого класса не было". И в конце одна фраза про то, что я после этого поменял в процессе, а не только в коде.»
Чего говорить нельзя
- Проговаривать буквы вслух в самой истории. «Итак, ситуация. Теперь задача.» Так звучит отчёт по шаблону. Каркас должен быть невидимым: он у тебя в голове, а вслух идёт обычный рассказ.
- Начинать историю с результата. Соблазн есть, но тогда весь рассказ дальше слушают как оправдание уже названной цифры, и интрига «как ты к этому пришёл» пропадает.
- Одна история на все вопросы. Если на четвёртый вопрос подряд ты возвращаешься к тому же инциденту, это читается как «больше ничего не было».
Чем добить
Скажи, что истории у тебя заготовлены заранее и почему: «я держу четыре истории — спор, инцидент, фича целиком и улучшение по своей инициативе; они закрывают почти любой вопрос с разных сторон». Это выглядит как подготовка к встрече, а не как зубрёжка, и заодно подсказывает интервьюеру, о чём тебя интересно спросить.
Предмет спора: булевы флаги против раздельных методов
Классика, которая случается в любой команде. Была одна ручка обновления сделки, потом понадобилось «иногда не слать уведомление», потом «иногда пропустить валидацию для импорта». Каждый раз добавляли булев параметр, и получилось вот такое:
// Что было в сигнатуре
func (s *DealService) Update(ctx context.Context, d *Deal, notify bool, skipValidation bool) error
// Как это выглядит на месте вызова, в другом файле
if err := s.Update(ctx, deal, true, false); err != nil { ... }
// Чтобы понять, что значат true и false, придётся открыть сигнатуру.
// Два флага дают четыре комбинации, и одна из них бессмысленна:
// skipValidation=true вместе с notify=true уведомит о заведомо невалидной сделке.
Вместо этого поведение разводят по разным входам. Либо отдельные методы, либо функциональные опции, если вариантов много и они ортогональны:
// Вариант А: раздельные методы. Вызов читается сам по себе.
func (s *DealService) Update(ctx context.Context, d *Deal) error
func (s *DealService) UpdateSilently(ctx context.Context, d *Deal) error
func (s *DealService) ImportUpdate(ctx context.Context, d *Deal) error // без валидации, только для импорта
// Вариант Б: функциональные опции, когда флагов много и они правда независимы
type UpdateOption func(*updateCfg)
func WithoutNotification() UpdateOption { return func(c *updateCfg) { c.notify = false } }
func (s *DealService) Update(ctx context.Context, d *Deal, opts ...UpdateOption) error
// На месте вызова:
s.Update(ctx, deal, WithoutNotification()) // понятно, не открывая сигнатуру
Каркас ответа
- S: ревью PR коллеги, в сигнатуру добавлялся второй булев флаг. Одна фраза.
- T: как ревьюер я должен был либо согласиться, либо внятно объяснить, почему нет. Не «настоять на своём».
- A: как я поднял спор с уровня вкуса до уровня критерия. Это ядро. Назвать критерии: читаемость на месте вызова, число комбинаций, которые надо тестировать, стоимость следующего флага.
- A: что предложил конкретно и что услышал в ответ. У коллеги был контраргумент, его тоже надо назвать.
- R: к чему пришли, что закрепили в договорённостях команды и в чём я сам оказался не прав.
«Был спор на ревью. Коллега добавлял в метод обновления сделки второй булев параметр —
сначала там появился notify, теперь добавлялся skipValidation.
Я это заблокировал, и он резонно спросил: а что не так, работает же.
Первое, что я сделал, — не стал говорить "мне так не нравится". Я предложил сначала договориться о критерии, по которому мы вообще выбираем. Мы сошлись на трёх: понятно ли читателю место вызова без перехода к сигнатуре, сколько веток придётся покрывать тестами и сколько будет стоить следующий такой флаг.
Дальше я просто посчитал по этим критериям. Читаемость: строка s.Update(ctx, deal, true, false)
на другом конце проекта не читается вообще, надо открывать сигнатуру. Ветки: два флага —
четыре комбинации, и одна из них бессмысленна — пропустить валидацию, но при этом послать
уведомление о сделке, которая заведомо кривая. То есть тип позволяет выразить состояние,
которого не должно существовать. Стоимость следующего: третий флаг даст восемь комбинаций,
из которых осмысленны от силы пять, и в тестах это разложить уже нереально.
Предложил два варианта: либо развести на отдельные методы — Update,
UpdateSilently, ImportUpdate, — либо функциональные опции, если
флаги правда независимы. Коллега возразил по делу: раздельные методы дадут дублирование
тела и придётся выносить общий приватный метод, а это лишний слой. Аргумент честный,
я его принял. В итоге сошлись на функциональных опциях: место вызова стало читаемым,
невалидная комбинация просто не выражается — опции, отключающей валидацию, снаружи пакета
нет вообще, импорт вызывает отдельный внутренний путь.
Результат: PR прошёл в тот же день, и мы записали в договорённости команды одну строчку — "булев параметр в публичной сигнатуре только один и только если он читается на месте вызова". Для меня главный вывод был другой: если бы я в первом же комментарии написал "флаги — зло", мы бы спорили неделю. Спор закончился за полчаса ровно потому, что сначала договорились о критерии, а потом уже считали.»
Чего говорить нельзя
- «Я объяснил, и он согласился». Спор без контраргумента не спор, а лекция. Обязательно назови, что тебе возразили: так видно, что ты слышишь собеседника.
- «Позвал тимлида, он решил». Эскалация первым шагом выдаёт, что договариваться ты не умеешь. Последним шагом она нормальна, и то с формулировкой «нужен арбитр, время идёт».
- Спор про вкусовое. Табы против пробелов, длину строки, порядок импортов решают линтер и форматтер, а не спор. История про такой спор показывает одно: битву ты выбрал не ту.
- Ни одной уступки за всю историю. Если по всем пунктам прав оказался ты, это звучит неправдоподобно и высокомерно.
- Личное. «Он junior, я объяснил, как правильно» проваливает всю историю. Грейд не аргумент. Грейд здесь значит ступеньку на внутренней лестнице компании: джун, мидл, сеньор и их подступени вроде «мидл+». В споре он не весит ничего: прав тот, у кого есть критерий и цифра, а не тот, кто выше по лестнице. Подробнее про грейды в главе 2.5, там от них зависят деньги.
Чем добить
Скажи, как ты формулируешь блокирующие замечания: вопросом, а не приказом, и с явной пометкой уровня. «Правильно ли я понимаю, что комбинация skipValidation плюс notify невалидна? Если да — может, вынесем в отдельный метод, чтобы её нельзя было выразить?» И отдельно скажи, что отсутствие флага в сигнатуре часто важнее любого код-стайла: хороший API не даёт выразить невалидное состояние. Это уже разговор про дизайн, а не про ревью.
Каркас ответа
- S: что сломалось и кто это почувствовал. Одна-две фразы, обязательно с масштабом («часть пользователей получала 500 на списке сделок»).
- T: моя роль: был дежурным / поднял тревогу / вёл починку.
- A, шаг 1, остановить кровь. Это называют митигацией: временная мера снимает боль, но причину не лечит. Что сделал, чтобы пользователям стало легче прямо сейчас, до понимания причины (откат канарейки, фича-флаг, лимит).
- A, шаг 2, диагностика: по каким сигналам шёл. Метрики → логи → трейсы → состояние БД. Обязательно назови гипотезы, которые отбросил.
- A, шаг 3, фикс: что именно правил и как убедился, что помогло.
- R: время до восстановления и, главное, что изменилось в системе и процессе после: алерт, автотест, правило, статический анализ, постмортем без обвинений. Постмортем (буквально «после смерти», слово пришло из медицины) пишут, когда всё уже починили. Это письменный разбор инцидента: что сломалось, по какой цепочке, что делали и что меняем, чтобы не повторилось. Без обвинений значит, что в разборе нет графы «виноватый»: ищут не человека, а дырку в процессе, через которую ошибка доехала до прода.
«Самый показательный случай был с исчерпанием пула соединений к Postgres. Утром прилетел алерт: доля пятисоток на сервисе сделок выше процента, p99 улетел с двухсот миллисекунд до таймаута. Пользователи — менеджеры продаж — получали ошибку при открытии списка сделок, то есть встал основной сценарий.
Дежурил я. Первым делом не полез искать причину, а посмотрел, что менялось: за сорок минут до этого мы раскатили канарейку сервиса интеграций. Откатил канарейку — доля ошибок начала падать. Это заняло минут пять и вернуло людям работоспособную систему; дальше уже можно было разбираться спокойно.
Дальше диагностика. Гипотеза номер один была "тяжёлый запрос после релиза" — пошёл
в pg_stat_activity, но долгих запросов не было, зато было полно соединений
в состоянии idle in transaction. Это сразу сузило круг: не нагрузка, а утечка.
Гипотеза номер два — новый воркер не закрывает то, что открыл. Пошёл в диф канарейки:
там был новый обход сделок с курсором, и в ветке с ошибкой rows.Close() не вызывался: defer стоял ниже раннего return, а не сразу после успешного запроса.
Ошибка встречалась редко, поэтому на стейдже не выстрелила: пул там просто больше
относительно нагрузки.
Фикс был на три строки: defer rows.Close() сразу после успешного
Query, плюс проверка rows.Err() после цикла. Убедился не глазами:
раскатил снова канареечно и смотрел на график занятых соединений — он перестал расти
монотонно и вышел на полку. От алерта до отката прошло около семи минут, до полного
фикса в проде — часа три.
Но главное было после. Мы разобрали это на постмортеме
и договорились не про "будем внимательнее", а про три конкретные вещи. Первое: включили
в CI линтеры sqlclosecheck и rowserrcheck — незакрытые rows теперь не проходят сборку. Второе: я завёл метрику занятости пула и алерт на восемьдесят
процентов от максимума — он предупреждает за минуты до того, как пул кончится, то есть мы
узнаём раньше пользователей. Третье: в чек-лист канарейки добавили не только ошибки
и латентность, но и графики ресурсов — соединения, горутины, память. За следующий год
этот алерт срабатывал дважды и оба раза до инцидента.»
Постмортем без обвинений — как про это говорить
По-английски это blameless postmortem; в русских командах говорят и так, и «разбор без поиска виноватых», понимают одинаково. Формулировка, которую стоит произнести дословно: «разбирали не кто написал, а почему система позволила это выкатить». Дальше конкретика того же уровня: код-ревью пропустило, потому что диф был на четыреста строк; стейдж не воспроизвёл, потому что там другой размер пула; алерта не было вообще. Каждую из этих причин чинят инструментом, а не силой воли. Если в твоей истории виноват человек, история слабая: человек ошибётся снова.
Чего говорить нельзя
- Называть виноватого. Даже если это правда, даже если это был не ты. В «коллега написал плохой код» интервьюер услышит, как ты будешь говорить про его команду.
- «Сидел ночью и починил». Героизм выдаёт, что процессов нет. Ценится не бессонная ночь, а откат за пять минут.
- Заканчивать на фиксе. Если после «починил» в системе ничего не изменилось, инцидент повторится, и ровно это услышит интервьюер.
- «Больше не повторится, будем внимательнее». Это не вывод. Вывод выглядит как алерт, тест, линтер, изменённый чек-лист или изменённая архитектура.
- Врать про масштаб. После «лежал весь прод на четыре часа» сразу спросят про SLA, про то, как сообщали клиентам, про компенсации. Лучше настоящий масштаб.
Чем добить
Назови две метрики словами, время до обнаружения и время до восстановления, и скажи, какую из них ты сокращал. Почти все кандидаты чинят вторую (быстрее откатывать), а по-настоящему ценно сокращать первую, чтобы система сообщала о проблеме раньше, чем менеджер продаж в чате. Ещё сильный ход: сказать, что после инцидента ты сам написал постмортем, даже если ошибка была не твоя.
Каркас ответа
- S: что за фича и зачем она бизнесу. Одна фраза, обязательно с бизнес-смыслом.
- T: что было на входе (часто это размытая постановка) и что я должен был дать на выходе.
- A, уточнение: какие вопросы задал до начала. Это первое, что отличает мидла.
- A, декомпозиция: на какие куски разрезал и по какому принципу. Хороший принцип, например, «каждый кусок можно смержить и выкатить отдельно».
- A, оценка: как оценивал и чем закрывал неопределённость: спайк (день на разведку незнакомого куска, после которого даёшь оценку), вилка вместо одного числа, буфер на непредвиденное.
- A, что пошло не так: обязательный элемент. Без него история выглядит вылизанной.
- R: выкатили так-то, эффект такой-то, и что поменял в своём подходе к оценке.
«Делал массовые операции над сделками: менеджеру нужно было выделить пачку сделок в списке и, например, перевести их все в другой статус или переназначить на другого сотрудника. До этого он делал это по одной, и на сотне сделок это был час кликов.
Постановка пришла в одну строчку: "сделать массовое изменение статуса". Прежде чем что-то писать, я задал четыре вопроса. Первый: какой максимальный размер пачки — ответ "иногда весь фильтр", а под фильтр могло попасть и пятьдесят тысяч сделок, и это сразу меняло дизайн. Второй: что делать, если часть сделок не проходит — переход по машине состояний запрещён или нет прав. Оказалось, продакт вообще про это не думал; договорились, что операция частичная: что смогли — применили, по остальным вернули список причин. Третий: нужно ли это в истории изменений и в уведомлениях — да, но уведомление одно на пачку, а не пятьдесят тысяч писем. Четвёртый: синхронно или можно фоном — сошлись, что до сотни сделок синхронно, дальше фоновая задача со статусом.
Декомпозировал на пять кусков, каждый мержится отдельно: миграция под таблицу фоновых операций; доменная функция применения перехода к списку с накоплением ошибок; синхронная ручка для маленьких пачек; воркер и ручка статуса для больших; уведомления и запись в историю. Оценил в восемь дней и явно сказал, что в оценке есть один рисковый пункт — поведение на больших пачках, там могу ошибиться в полтора раза.
Не по плану пошло именно там, где я и предупреждал, но с другой стороны. На тестовых данных с пятьюдесятью тысячами сделок одна транзакция на всю пачку держала блокировки несколько минут и мешала обычной работе — параллельные обновления тех же сделок вставали в очередь. Пришлось переделать на батчи по пятьсот записей с отдельной транзакцией на батч и сохранением прогресса, чтобы операция была возобновляемой. Это добавило два дня. Как только я это увидел, я не стал молча догонять: в тот же день написал продакту, что вижу риск, и предложил три варианта — сдвинуть на два дня, или выкатить в первой версии только синхронный режим с лимитом в сто сделок, или урезать переназначение сотрудника и оставить только статус. Выбрали второй: выкатили лимитированную версию в срок, а фоновый режим приехал через неделю.
По итогу: массовая операция закрыла реальную боль, время на типовую пачку упало с часа до пары минут. А для себя я поменял подход к оценке — теперь на любую задачу, где есть слово "массово" или "все", я закладываю отдельный день на проверку поведения на реальном объёме данных, до того как называю срок.»
Про оценку: что говорить, если спросят «как вы оцениваете задачи»
- Резать до кусков в полдня-день. Всё, что оценено «дня в три», на деле оценено наугад: такой кусок режь дальше, и обычно при этом вылезает забытая работа.
- Не забывать невидимое: миграции и их откат, тесты, ревью и время на его ожидание, выкатка и наблюдение за канарейкой, документация, фича-флаг.
- Называть вилку и её причину: «шесть дней, если схема данных подойдёт как есть, восемь-девять, если придётся перелить историю задним числом (это называют backfill)». Вилка без причины выглядит как торг.
- Спайк на неизвестное: если в задаче есть кусок с незнакомой технологией, признаться «дайте день на разведку, после него дам оценку» сильнее, чем угадать число.
Чего говорить нельзя
- «Всё прошло по плану». Либо задача была тривиальная, либо ты не помнишь. И то и другое минус.
- «Постановка была плохая, поэтому не успели». Уточнить плохую постановку было твоей работой. Пусть виноват аналитик, но спросят с тебя, и интервьюер это знает.
- Оценка одним числом без обоснования. «Сказал две недели», а почему две?
- Тихо догонять. История, где ты обнаружил риск и молча работал по вечерам, получается про то, что менеджеру с тобой некомфортно: он узнаёт о проблемах последним.
Чем добить
Скажи про порядок нарезки: первым выкатывают самый рисковый кусок, а не самый понятный. Если непонятно, выдержит ли БД массовую операцию, это делают первым, пусть даже заглушкой: именно от этого зависит, останется ли план в силе. Кандидаты обычно нарезают по слоям (сначала БД, потом сервис, потом ручка), а нарезка по риску и по возможности выкатить каждый кусок отдельно звучит гораздо взрослее.
Каркас ответа
- S: что раздражало и чем это измерялось (или не измерялось вообще, и тогда это первая проблема).
- T: задачу никто не ставил, я сам решил, что это надо. Так и скажи прямо.
- A, продажа идеи: как объяснил ценность в терминах боли команды и бизнеса, а не технологии.
- A, минимальный пилот: сделал маленький кусок на одном сервисе, а не проект на квартал.
- A, масштабирование: как раскатил на остальное и как сделал так, чтобы это не развалилось без тебя.
- R: измеримый эффект и то, что этим пользуются до сих пор.
«Самое полезное, что я сделал по своей инициативе, — наблюдаемость и канареечная раскатка. Когда я пришёл, релиз был событием: катили раз в две недели вечером, всей командой смотрели в логи, и если что-то шло не так, узнавали об этом из чата поддержки. Метрики формально были — стандартные метрики от библиотеки, — но дашборда, на который смотрят, не существовало, и алертов не было ни одного.
Задачу мне никто не ставил, я сам её принёс. Но продавал я её не как "давайте поставим Prometheus" — это никого не трогает. Я взял три последних инцидента и посчитал, сколько времени в каждом ушло от момента поломки до момента, когда мы вообще узнали: получилось от сорока минут до трёх часов. С этой цифрой пошёл к тимлиду: вот наша реальная цена отсутствия алертов, я хочу потратить неделю и сократить её до минут.
Начал с малого — с одного сервиса сделок. Завёл три базовые метрики: количество запросов, доля ошибок, гистограмма длительности по ручкам. Сделал один дашборд, где на первом экране видно состояние сервиса, и три алерта: доля пятисоток, p99 выше порога, и рост занятости пула соединений. Сознательно не стал делать двадцать алертов: лучше три, на которые реагируют, чем двадцать, которые заглушат.
Дальше — раскатка. Вынес общие метрики в маленькую внутреннюю библиотеку с одним middleware, чтобы подключение к новому сервису стоило три строки. Когда цифры появились, появился и следующий шаг: раз мы теперь видим ошибки и латентность в реальном времени, можно катить не всё сразу. Настроили канареечный деплой: десять процентов трафика, десять минут наблюдения, автоматический откат по превышению доли ошибок. Отдельно привёл в порядок миграции: раскатка схемы отдельным шагом пайплайна, только совместимые вперёд изменения, чтобы откат приложения не ломал базу.
Результат в цифрах: время от поломки до обнаружения упало с десятков минут, а то и часов, до одной-двух — алерт приходит раньше, чем жалоба. Релизов стало несколько в неделю вместо одного в две недели, и релиз перестал быть вечерним событием. Самое ценное для меня — что это пережило меня как инициатора: дашбордом пользуется вся команда, а на новых сервисах метрики подключают сами, потому что это три строки, а не проект.»
Чего говорить нельзя
- «Сделал по ночам и поставил перед фактом». Это не инициатива, а обход команды. Даже если так и было, расскажи, как ты потом это защищал и передавал.
- «Переписал legacy-модуль, потому что он был ужасный». Без измеренной проблемы улучшение выглядит вкусовщиной за деньги компании. Цифра «до» нужна всегда.
- Инициатива ради технологии. «Затащил Kafka», а какую боль это закрыло? Если ответ «стало модно/интересно», любой тимлид увидит красный флаг.
- Инициатива, которой никто не пользуется. Если «написал генератор, но команда не перешла», рассказывай про то, почему не перешли и что ты понял, а не про генератор.
Чем добить
Расскажи, во что подключение обходится остальным: сколько строк надо написать коллеге и сколько нового ему надо выучить. Инициативы умирают не потому, что они плохие, а потому что их дорого принять. По фразе «я специально сделал так, чтобы подключение стоило три строки и не требовало ничего знать про Prometheus» сразу видно человека, который уже внедрял что-то в живой команде, а не только предлагал.
2.3Неудобные вопросы
Провал, конфликт, сорванный срок. Здесь проверяют не «был ли грех», а есть ли у тебя рефлексия и не превращаешься ли ты в проблему для команды, когда всё идёт плохо. Ответ «у меня такого не было» хуже любого честного рассказа.
Зачем вообще спрашивают про плохое
У интервьюера гипотеза простая: то, как человек рассказывает о своих ошибках сейчас, показывает, как он будет вести себя во время инцидента через полгода. Если в рассказе виноваты аналитик, тестировщик и менеджер, то в его команде виноватыми будут те же люди. Если ошибка признана, но выводов нет, она повторится. Если ошибки «не было», то либо не было ответственности, либо нет рефлексии, и оба варианта плохи.
Отсюда рабочая формула честного ответа: признал → что сделал → что изменил в процессе. Третий пункт важнее всех, и его почти всегда пропускают. Он и превращает «я накосячил» в «я закрыл целый класс ошибок».
- «У меня не было провалов». Худший вариант из возможных. Значит одно из двух: либо ты не работал с продом, либо не считаешь свои ошибки ошибками.
- Виноватые с именами и должностями. Даже если правда на твоей стороне, интервьюер примеряет: так же он будет рассказывать про нас.
- Фальшивый провал. «Мой недостаток — я слишком въедливый, из-за этого один раз задержал релиз на день». Это самопохвала в маскировке, а не провал, и её слышно сразу.
- Провал космического масштаба. «Из-за меня компания потеряла клиента на десять миллионов»: если это правда, придётся объяснять, почему тебя допустили до такого в одиночку. Масштаб у хорошего провала заметный, но переживаемый: минуты-часы деградации, а не крах бизнеса.
- «Больше не повторится, буду внимательнее». Внимательность не масштабируется. Пока не изменился инструмент, повторится.
Конфликт и техническое несогласие
Слово «конфликт» в вопросе пугает, но спрашивают на самом деле про другое: умеешь ли ты довести несогласие до решения, не превратив его в личное. В хорошем ответе спор почти всегда переводят из плоскости мнений в плоскость данных и trade-offs. Это английское слово прижилось без перевода и означает «что мы за этот вариант получаем и чем за него платим». Кэш даёт скорость, платим за неё устареванием данных. Индекс ускоряет чтение, платим скоростью записи и местом на диске. Спор про trade-off всегда решаем, потому что цены можно сравнить; спор про «мне так больше нравится» не решить.
- «Я так думаю» / «мне кажется, так лучше»
- «Это же очевидно»
- «Так делают все нормальные команды»
- «У меня больше опыта»
- «Мы всегда так делали»
- Спор в чате на сорок сообщений вместо пятнадцатиминутного созвона
- «Давай сначала договоримся о критерии выбора»
- «Вот замер: с индексом 210 мс, с кэшем 40 мс, но плюс инвалидация»
- «У варианта А цена вот такая, у Б — вот такая. Что для нас дороже?»
- «Что должно случиться, чтобы ты изменил мнение?»
- «Давай зафиксируем решение и условие, при котором вернёмся к нему»
- «Не согласен, но принимаю — делаю как решили, в полную силу»
Формулировка американская и переводится примерно так: не согласен, но принимаю решение и делаю в полную силу. Принцип простой: до решения спорь сколько угодно, после решения работай на него как на своё. На собесе это звучит так: «я остался при своём мнении, но решение приняли другое, и я сделал его качественно — саботировать решение команды и потом говорить "я же предупреждал" мне кажется худшим, что можно сделать». Обязательное дополнение, по которому узнают зрелого инженера: зафиксировать условие пересмотра, скажем «договорились вернуться к этому, если p99 вырастет выше 500 мс». Тогда спор не тлеет: у него есть точка выхода.
Срок горит: механика правильного поведения
Вопрос здесь не «что делать», а когда сказать. Плохая новость за неделю до срока остаётся рабочей ситуацией с вариантами. Та же новость в день дедлайна превращается в сорванный дедлайн, и вариантов нет уже ни у кого.
- Пересчитать честно. Не «наверное, успею», а сколько реально осталось работы и какая новая дата, если ничего не менять. Число, а не ощущение.
- Сказать сразу, письменно и адресно. Тому, кто отвечает за срок, а не в общий чат. Формат: «риск такой-то, причина такая-то, новая оценка такая-то».
- Принести варианты, а не проблему. Минимум три: урезать скоуп (что именно можно выкинуть или отложить и что от этого потеряется), сдвинуть дату, подключить второго человека (с оговоркой, что это ускоряет не всегда). Свою рекомендацию назвать явно.
- Договориться о точке контроля. «Проверим в четверг: если к этому моменту миграция не поедет, идём по варианту с урезанным скоупом». Это снимает тревогу у всех.
Красные флаги: что интервьюер слышит на самом деле
| Фраза в ответе | Что слышит интервьюер | Как надо |
|---|---|---|
| «У меня не было провалов / конфликтов» | Нет ответственности или нет рефлексии | Взять реальный случай среднего масштаба и рассказать по формуле |
| «Виноват был аналитик / тестировщик / менеджер» | Так он будет говорить и про нашу команду | «Постановка была размытая — и это была моя работа её уточнить, я этого не сделал» |
| «Мы всё исправили» (в истории про свою ошибку) | Прячется за командой, когда неприятно | «Ошибку допустил я, чинили вместе, отдельно расскажу, кто что делал» |
| «Больше не повторится, буду внимательнее» | Вывода нет, повторится | Назвать инструмент: линтер, тест, алерт, правило ревью, изменённый пайплайн |
| «В итоге я оказался прав» | Спорит, чтобы победить, а не чтобы решить | Назвать, в чём был прав оппонент и что ты у него взял |
| «Я просто сделал как сказали, хотя был против» | Пассивная агрессия, потом «я же предупреждал» | Disagree and commit плюс зафиксированное условие пересмотра |
| «Пришлось выйти в выходные, но мы успели» | Героизм вместо процессов; выгорит и уйдёт | «Я поднял риск за неделю, вместе урезали скоуп и выкатили в срок» |
| «Там всё было очень плохо, легаси, никто ничего не документировал» | Жалуется, а не меняет | «Было мало документации — я завёл описание домена, к которому теперь ходят новички» |
| Долгая пауза и «дайте подумать» на каждом таком вопросе | Не готовился, историй нет | Заготовленные четыре истории — пауза в пять секунд нормальна, в тридцать нет |
Вопросы
4Каркас ответа
- Назвать ошибку прямо, в первой фразе. Без разгона и без смягчений: «я выкатил миграцию, которая сломала работу списка сделок на несколько минут».
- Признать свой вклад точно. Что именно сделал не так и почему тогда это казалось нормальным.
- Как чинил. Коротко: что выбрал, откат или движение вперёд, и почему.
- Что изменилось после. Это ядро: правило, автоматическая проверка, изменённый порядок работы. Желательно два-три конкретных пункта.
- Вывод одной фразой: обобщение уровня «класс ошибок», а не «этот случай».
«Самая дорогая моя ошибка — миграция, несовместимая с выкаткой. Я переименовывал
колонку в таблице сделок: owner_id стал assignee_id, потому что
поле уже давно значило не то, что называлось. Сделал одной миграцией — ALTER TABLE ... RENAME COLUMN, —
поправил код и выкатил всё одним релизом.
Проблема в том, что раскатка в Kubernetes идёт постепенно: несколько минут в проде
живут одновременно старые и новые поды. Миграция применилась мгновенно, а старые поды
продолжали спрашивать owner_id — колонки уже не было. Примерно шесть минут
часть запросов к сделкам падала пятисотками. И вторая, более неприятная часть: откатить
релиз было нельзя — откат приложения вернул бы код, который тоже не работает с новой схемой.
То есть я сам себя лишил кнопки отката.
Чинил движением вперёд: добил раскатку новой версии до всех подов, чтобы старых не осталось. Это заняло минуты три, ошибки прекратились. Правильнее было бы иметь возможность откатиться, но её у меня в тот момент не было — и это была ровно моя ошибка, а не стечение обстоятельств.
После этого я поменял три вещи, и они живут в команде до сих пор. Первое — правило
расширяй-и-сжимай: любое изменение схемы растягивается минимум на три релиза. Сначала добавляем новую колонку и пишем в обе, потом переводим чтение на новую, и только потом, когда старого кода в проде уже нет, отдельным релизом удаляем старую. То есть каждая отдельная миграция совместима и со старым, и с новым кодом.
Второе — миграции стали отдельным шагом пайплайна до раскатки приложения, и в ревью
миграций появился явный чек-лист: работает ли старый код с этой схемой, есть ли откат,
берёт ли операция тяжёлые блокировки. Третье — на опасные конструкции повесили проверку
в CI: DROP COLUMN, RENAME, CREATE INDEX
без CONCURRENTLY, ALTER без lock_timeout
требуют явного подтверждения в описании PR.
Вывод для себя я сформулировал так: раскатка — это не мгновенное событие, а промежуток, в течение которого в проде живут две версии кода одновременно. Пока я этого не прочувствовал, я думал про миграцию как про «поменять состояние базы», а надо думать как про «сохранить совместимость на время перехода». Это касается не только схемы БД — то же самое с форматами событий в Kafka и с контрактами API между сервисами.»
Чего говорить нельзя
- «Провалов не было». Мгновенный минус: либо не было прода, либо нет рефлексии.
- «Ревью пропустило». Правда, но не твоя часть правды. Ревью годится как системная причина («диф был большой, миграцию не разглядели, поэтому мы завели отдельный чек-лист»), но не как виноватый.
- Псевдопровал. «Я слишком перфекционист», «задержал релиз ради качества».
- Провал, который никак не закончился. Если после истории ничего не изменилось, лучше взять другую историю.
- Эмоции вместо фактов. «Было очень стыдно, я неделю переживал»: одной фразы хватит, дальше нужны действия.
Чем добить
Обобщи ошибку до класса. Не «я больше не переименовываю колонки», а «я перестал считать деплой атомарным событием — и это касается схемы БД, схем событий и контрактов API». По такому обобщению видно, что выводы человек делает по причине, а не по частному случаю. Второй сильный ход: сказать, что ты сам написал постмортем и сам вынес это на общий разбор, а не ждал, пока разберут за тебя.
Каркас ответа
- Предмет несогласия одной фразой: техническое, не личное.
- Позиции сторон и их резоны. Обязательно назови сильную сторону чужого варианта: это доказывает, что ты его понял.
- Как перевёл в измеримое: критерий, замер, эксперимент. Ядро ответа.
- Чем кончилось и что взял из чужой позиции.
- Отдельно про случай, когда решение приняли не твоё, и как ты себя повёл.
«Живой пример: у нас тормозил список сделок — p99 около двух секунд, менеджеры жаловались. Коллега предложил закэшировать выдачу в Redis: быстро, эффект сразу. Я был против и предлагал сначала разобраться в самом запросе.
Первое, что я сделал, — проговорил, в чём он прав. Кэш действительно даёт эффект за полдня, а разбор запроса может занять неделю и ничего не дать. Это честный аргумент, и я не стал делать вид, что его нет.
Дальше предложил не спорить, а посчитать, и сформулировал критерии: какая будет
латентность, во сколько нам обойдётся инвалидация и насколько мы рискуем показать
менеджеру устаревшие данные. Последнее в CRM важно: сделка меняется постоянно, и увидеть
старый статус — это реальная бизнес-проблема, а не косметика. Взял час, снял
EXPLAIN ANALYZE: там был seq scan по таблице сделок с фильтром по владельцу
и статусу плюс классический N+1 при подтягивании последнего контакта. Собрал составной
индекс, убрал N+1 одним запросом — получилось 210 миллисекунд без всякого кэша.
С этим числом спор закончился за пять минут: кэш дал бы 40 миллисекунд, но принёс бы инвалидацию по десятку событий и риск устаревших данных — а разница между 210 и 40 для пользователя, который открывает список, неощутима. Мы зафиксировали и обратное условие: если после роста нагрузки p99 снова уйдёт за 500 миллисекунд, возвращаемся к кэшу, и тогда уже осознанно, с продуманной инвалидацией.
Что я взял из его позиции: он был прав в том, что чинить надо быстро. Поэтому я не ушёл в разбор на неделю, а жёстко ограничил себе время: ровно один день. Не нашёл бы за день причину — сделали бы кэш, как он и предлагал.
Бывало и наоборот. Я предлагал вынести отчёты в отдельный сервис, тимлид решил оставить в монолите и читать с реплики. Я остался при своём мнении, но сделал вариант с репликой качественно и не возвращался к этому спору каждую неделю. Мы договорились о точке пересмотра — если отчёты начнут влиять на основную нагрузку. Через полгода это случилось, мы вернулись к разговору уже с графиками, и сервис выделили. Мне кажется, это правильный способ: спорить до решения, работать после него, и заранее договориться, что заставит нас пересмотреть выбор.»
Как выглядит хороший исход спора
- Есть решение, а не перемирие. Исход «каждый остался при своём» плохой: вопрос всплывёт снова.
- Есть критерий, по которому выбрали, и он записан: в комментарии к PR, в задаче или в ADR. ADR (architecture decision record, «запись об архитектурном решении») занимает полстраницы: что решали, какие были варианты, что выбрали и почему. Через полгода это единственное, что отвечает на вопрос «а почему у нас так сделано».
- Есть условие пересмотра. Фраза «вернёмся, если p99 выйдет за 500 мс» превращает решение из вечного в обратимое.
- Отношения не пострадали. Признак: с этим человеком ты дальше нормально работаешь и рассказываешь про него спокойно.
Чего говорить нельзя
- Личный конфликт. «Не сошлись характерами», «он токсичный». Даже если так, на собесе это читается как «он приносит конфликты с собой».
- «Я оказался прав». Как единственный итог не годится. Если ты правда был прав, скажи это через данные: «замер показал, что вариант с индексом дешевле».
- «Позвал тимлида, он решил». Как первый шаг это сигнал, что договариваться не умеешь.
- «Я просто уступил, чтобы не спорить». Это не гибкость, а отсутствие позиции.
- Спор длиной в месяц. Затянутый спор тоже плохой исход, даже если ты победил.
Чем добить
Назови вопрос, которым ты пользуешься в тупике: «что должно произойти, чтобы ты изменил мнение?». Он делает две вещи сразу: вытаскивает настоящий критерий собеседника и нередко показывает, что критерия нет вообще. И добавь про формат: длинные споры ты выносишь из чата в пятнадцатиминутный созвон, а решение возвращаешь в письменном виде, чтобы через месяц никто не спорил заново.
Каркас ответа
- Пересчитываю честно и получаю новую дату: число, а не ощущение.
- Сообщаю в тот же день, письменно, адресно: риск, причина, новая оценка.
- Приношу три варианта с ценой каждого и говорю, какой рекомендую.
- Договариваюсь о точке контроля, чтобы решение можно было принять не в последний день.
- Дальше работаю по выбранному варианту и держу статус видимым.
«Первое — я стараюсь понять это как можно раньше, потому что вся разница между рабочей ситуацией и сорванным сроком в том, за сколько дней ты об этом сказал. Практически это значит, что я держу задачу нарезанной на куски по полдня-день и смотрю, попадаю ли я в темп. Как только два-три куска подряд заняли вдвое больше, чем я думал, — это сигнал, дальше само не выправится.
Второе — пересчитываю и называю новое число. Не "кажется, задерживаюсь", а "осталось примерно четыре дня работы вместо запланированных двух, потому что вот здесь вылезло вот это".
Третье — в тот же день пишу продакту и тимлиду, и не с проблемой, а с вариантами. Обычно их три. Урезать скоуп: вот эту часть можно не делать в первой версии, тогда укладываемся в срок, потеряем вот такой сценарий. Сдвинуть дату: нужно ещё столько-то дней, объём такой-то. Добавить человека: помогает, только если есть кусок, который правда отделяется, — если нет, второй человек скорее замедлит. Я всегда говорю, какой вариант рекомендую сам и почему.
Живой пример: делал интеграцию с новым провайдером телефонии, а он выдал доступ к тестовому контуру на неделю позже обещанного. Стало понятно сразу, что в срок не влезаем. Я написал в тот же день и предложил выкатить в первой версии только входящие звонки, а исходящие и запись разговоров отложить на следующий спринт — потому что бизнесу были нужны в первую очередь входящие. Продакт согласился, дату по основной части не двигали.
И последнее — договариваюсь о точке контроля. Например: "проверим в четверг; если к четвергу тестовый контур не появится, идём по урезанному варианту". Тогда решение принимается спокойно и заранее, а не в вечер дедлайна. Чего я стараюсь не делать — это молча догонять по вечерам. Даже если получится, команда узнает о риске последней, и в следующий раз мне просто не поверят на слово.»
Чего говорить нельзя
- «Останусь подольше и всё успею». Разово бывает у всех, но как ответ на вопрос это сигнал: человек прячет риски и выгорит.
- «Скажу в день дедлайна». Даже в мягкой формулировке «предупрежу ближе к сроку».
- «Это не моя вина, аналитик поздно принёс требования». Причина бывает и внешней, но сообщить о риске в любом случае твоя работа.
- «Срежу тесты, потом допишу». Резать надо скоуп, а не качество: тесты и обработку ошибок «потом» не дописывают никогда, и опытный интервьюер это знает.
- Снизить качество, никому не сказав. Хуже всех вариантов: срок формально соблюдён, а расплата приходит через месяц и уже дороже.
Чем добить
Скажи, что предупреждение о риске не признание поражения, а инструмент: чем раньше ты его подаёшь, тем дешевле оно обходится компании. И добавь профилактику: на этапе оценки ты явно называешь рисковые пункты («вот здесь могу ошибиться в полтора раза — это работа с объёмом данных, которого я ещё не видел»). Тогда сработавший риск не сюрприз, а заранее обозначенная развилка, и разговор получается совсем другой.
Шесть флагов, которые закрывают вакансию
- Виноватые. В истории появляются должности: аналитик, тестировщик, менеджер. Интервьюер мгновенно достраивает, как ты будешь рассказывать про его команду.
- «Мы» в неприятных местах и «я» в приятных. Достижения «я сделал», ошибки «мы не учли». Заметно уже на второй истории.
- Нет системного вывода. «Буду внимательнее», «стал аккуратнее» значат то же, что «ничего не изменилось».
- Героизм. Ночи, выходные, «спас релиз». Читается так: процессов нет, а человек вот-вот выгорит.
- Жалобы без действий. «Легаси, документации нет, процессы кривые»: если за описанием проблемы не следует ни одной твоей попытки что-то изменить, это позиция пассажира.
- Спор ради победы. «В итоге я оказался прав» без единого пункта, где прав был оппонент. Такой человек дорого обходится команде, даже когда технически силён.
Два флага помельче, но заметных
- Идеальные истории. Всё прошло по плану, конфликтов не было, ошибок не было. Читается это не как «сильный кандидат», а как «не рассказывает правду» или «не было ответственности».
- Долгие паузы на каждом вопросе. Пять секунд подумать нормально и даже хорошо. Тридцать секунд на каждый вопрос подряд выдают, что историй нет и человек сочиняет на ходу.
«Если смотреть со стороны интервьюера, все плохие ответы на такие вопросы сводятся к четырём вещам. Первое — перекладывание: в истории появляются виноватые, и понятно, что в новой команде виноватые тоже найдутся. Второе — асимметрия местоимений: достижения "я", ошибки "мы". Третье — отсутствие вывода: человек честно рассказал про провал, но всё, что он из него вынес, — это "буду внимательнее"; значит, повторится. Четвёртое — героизм: если история заканчивается тем, что человек сидел ночь и всех спас, то на самом деле она про то, что в команде не было ни отката, ни алертов, ни разговора о риске.
Я поэтому свои истории специально проверяю на два вопроса: "есть ли тут кто-то виноватый, кроме меня" и "что изменилось в системе после этого". Если на первый ответ "да", а на второй "ничего" — историю надо переписывать или брать другую.»
Чем добить
Скажи, что ты отличаешь причину от виноватого. Причину назвать обязательно: «диф был на четыреста строк, поэтому миграцию не разглядели на ревью» звучит как системная причина, из неё следует изменение процесса. А «Петя не разглядел» указывает на виноватого, из него не следует ничего. Про культуру постмортема без обвинений короче не скажешь, и вслух эта пара слов звучит хорошо.
2.4Инженерная зрелость
Три сюжета, по которым мидла отличают от джуна вернее, чем по знанию каналов: как ты превращаешь размытое требование в проверяемое, как ты читаешь чужой код и как ты объясняешь техническое решение людям, которые не пишут код. Здесь почти нет «правильных ответов», есть узнаваемый способ думать, который интервьюер либо слышит, либо нет.
«Нам нужна быстрая система»
Это не требование. Требование можно сделать и потом проверить, причём проверить может не автор. «Быстро» нельзя ни сделать, ни проверить: у заказчика в голове «чтобы список сделок открывался мгновенно», у тебя «p99 меньше 200 мс», а у нагрузочного теста вообще среднее по всем ручкам за сутки. Три разных мира, и на приёмке они встретятся.
Джун в этом месте идёт оптимизировать: добавляет индекс, ставит кэш, крутит пул соединений. Иногда угадывает. Мидл сначала задаёт вопросы, и не потому, что вредный, а потому что у слова «быстро» есть цена, и её платит бизнес. Разница между 500 мс и 200 мс на одной ручке может стоить недели работы, а между 200 мс и 50 мс — переписывания хранилища. Прежде чем платить, надо знать, за что.
Метрика + перцентиль + значение + условия нагрузки + окно наблюдения + способ измерения.
Пример: «время ответа GET /api/deals — p95 не больше 300 мс при 400 RPS
и 5 млн сделок в базе, считаем по гистограмме в Prometheus, окно — 30 дней, доля
удачных интервалов 99%». Вот это можно принять или не принять, и спора на приёмке не будет.
Полный чеклист уточняющих вопросов
| Вопрос заказчику | Зачем его задавать | Что бывает, если не спросить |
|---|---|---|
| Что значит «быстро» и в каких единицах? Миллисекунды, секунды, «пока человек не заметил»? | Чтобы перевести ощущение в число. Пока «быстро» не стало цифрой, договариваться не о чем: у тебя и у заказчика в голове разные значения этого слова | Делаешь 300 мс, а ждали 50 мс — или наоборот, месяц пилил 50 мс, когда хватило бы секунды |
| Для какой доли запросов? Среднее, p95, p99 или «вообще всегда»? | Чтобы знать, по какой доле запросов тебя будут судить. Среднее прячет медленный хвост, а «вообще всегда» стоит в разы дороже, чем p99 | Среднее 120 мс, а каждый сотый пользователь ждёт 4 секунды — и жалуется именно он |
| При какой нагрузке? Сколько RPS в обычный день, сколько в пик, когда бывает пик? | Чтобы число вообще что-то значило: время ответа без указанной нагрузки — это скорость на пустом стенде, к проду она отношения не имеет | Померили на пустом стенде, в проде в понедельник утром всё легло |
| На каком объёме данных? Сейчас и через год. | Чтобы решение не протухло через полгода: с ростом таблицы Postgres выбирает другой план запроса, и вчерашний индекс перестаёт помогать | На 100 тысячах строк фильтр отбирает горстку строк и индекс работает, а на 20 млн тот же фильтр возвращает миллионы, и планировщик читает таблицу целиком (это и называют seq scan) |
| На каких сценариях? Какие конкретно экраны, ручки, отчёты? | Чтобы понимать, что именно оптимизировать: «вся система» — это сотни ручек, и ускорить их все нельзя ни за какие деньги | Ускорил то, чем пользуются двое, а тормозил список сделок у всего отдела продаж |
| Какой бюджет и срок? Неделя, квартал, «до конца года»? | Чтобы выбрать класс решения. За неделю можно переписать запрос и добавить индекс; за квартал — завести кэш, реплику для чтения или сменить хранилище | Приносишь план на два месяца там, где ждали трёх дней |
| Что можно ухудшить взамен? Свежесть данных, консистентность, стоимость железа, часть функциональности? | Чтобы знать, чем разрешено платить. Бесплатной скорости не бывает, и без ответа на этот вопрос ты сам себе запрещаешь кэш, денормализацию и чтение с реплики | Не даёшь себе права на кэш и на лишнюю реплику для чтения, хотя заказчик легко согласился бы на минуту устаревания данных |
| Как будем измерять и кто подтвердит? Метрика, дашборд, кто смотрит на приёмке? | Чтобы «сделано» не осталось вопросом веры: нужен график и живой человек, который по нему скажет «принято» | Ты считаешь, что сделал; заказчик говорит «всё равно медленно», и спор нечем закрыть |
| Что уже пробовали и почему не помогло? | Чтобы не пройти чужой путь заново. Один вопрос экономит неделю работы и заодно показывает, какие ограничения в системе уже известны | Ставишь кэш, который год назад уже ставили и сняли из-за рассинхрона |
Заказчик: «CRM тормозит, надо ускорить». Начинаешь разматывать, и почти всегда за общей фразой оказывается один конкретный сценарий и один конкретный человек, который жалуется.
- «Что именно тормозит?» → «Список сделок у продажников».
- «Когда?» → «Утром в понедельник и в конце месяца».
- «Насколько сейчас и сколько было бы нормально?» → «Крутится секунд пять, хотелось бы, чтобы сразу».
- «"Сразу" — это меньше секунды?» → «Да, чтобы за секунду».
- «У всех или у некоторых?» → «У руководителей отделов, у них фильтр по всей воронке».
- «Данные могут отставать на минуту?» → «Да, это не отчётность, это рабочий список».
Итог: «p95 списка сделок с фильтром "все сделки отдела" — не больше 1 секунды в пик понедельника при текущем объёме и полуторном на год вперёд; допустимо отставание данных до минуты». Из размытого «тормозит» получилось требование, у которого есть и цена, и способ проверки. Заодно выяснилось, что можно кэшировать, а это меняет решение целиком.
В сильном ответе есть два вопроса, которые задают редко. Первый вопрос «зачем»: что за этим стоит, кто и на что жалуется, потеряли ли из-за этого деньги. Часто выясняется, что «быстро» лишь симптом, а болит другое (например, менеджер не может найти сделку, и дело не в скорости, а в поиске). Второй вопрос «чем можно платить»: без него ты сам себе запрещаешь кэш, денормализацию, реплику для чтения и асинхронную выдачу. Кандидат, который спросил «что можно ухудшить взамен», выглядит взрослее остальных: он понимает, что бесплатной скорости не бывает.
«Как ты ревьюишь чужой код»
Вопрос звучит безобидно, а различает людей жёстко. Слабый ответ перечисляет вкусовщину: «смотрю на именование, на длину функций, чтобы код был чистый». По такому ответу интервьюер понимает, что человек ревьюит текст. В сильном ответе человек ревьюит последствия: что произойдёт с этим кодом в проде в три часа ночи, что будет при откате, что будет, когда данных станет в двадцать раз больше.
Поэтому в ответе нужна явная иерархия: сначала то, что дорого чинить потом, в самом конце то, что вообще не должен смотреть человек. Формулировка, которая почти всегда заходит: «я иду сверху вниз по цене ошибки». Стиль и форматирование стоят внизу не потому, что неважны, а потому что их проверяет линтер, а не ревьюер.
- Читаю задачу, а не один диф. Половина серьёзных замечаний звучит как «код написан хорошо, но решает не ту задачу» или «решает только половину». Из дифа этого не видно.
- Смотрю на размер. Если PR больше пяти-шести сотен строк осмысленных изменений, честнее сразу написать «давай разобьём», чем делать вид, что я это внимательно прочитал. Ревью на восемьсот строк всегда идёт с пропущенными багами, сколько ни старайся.
- Прохожу диф целиком один раз без комментариев, чтобы понять замысел, и только потом иду вторым проходом придираться. Иначе первые двадцать комментариев будут про то, что автор уже решил тремя файлами ниже.
- Отдельно открываю миграции, конфиги и всё, что трогает прод-инфраструктуру: там цена ошибки на порядок выше, чем в бизнес-логике.
Порядок приоритетов: сверху вниз по цене ошибки
| Уровень | На что смотрю | Типичная находка в нашей CRM |
|---|---|---|
| 1. Правильно ли понята задача | Делает ли код то, что просили, и всё ли из того, что просили | Сделали смену статуса сделки, но забыли, что при переходе в «выиграна» надо писать событие в Kafka — интеграция с биллингом не узнает |
| 2. Что будет в проде | Ошибки не проглочены, контексты пробрасываются, тело ответа закрывается, горутины завершаются, ретраи идемпотентны | defer resp.Body.Close() забыт в ветке с ошибкой; горутина без ограничения времени висит до конца процесса |
| 3. Данные и запросы | N+1, отсутствующий индекс, транзакция вокруг сетевого вызова, длинные блокировки, выборка без лимита | Список сделок тянет последний контакт отдельным запросом на каждую строку; в транзакции сидит вызов внешнего API на пару секунд |
| 4. Совместимость и откат | Миграция совместима со старым кодом? Контракт API не сломан? Формат события в Kafka читается старыми консьюмерами? Как откатываем? | DROP COLUMN в том же релизе, что и код, который перестал ей пользоваться, — откат становится невозможным |
| 5. Безопасность и приватность | Валидация входа, проверка прав на объект, конкатенация SQL, персональные данные в логах | Ручка отдаёт сделку по id без проверки, что она принадлежит отделу пользователя; телефон клиента улетает в лог целиком |
| 6. Наблюдаемость | Есть ли логи с контекстом, метрика на новый путь, понятно ли будет по дашборду, что это сломалось | Новый фоновый воркер без единой метрики: узнаем, что он встал, от менеджеров |
| 7. Тесты | Есть ли тест на исправленный баг и на неочевидные ветки; можно ли это вообще протестировать | Фикс без теста — значит, тот же баг вернётся через полгода и никто не заметит |
| 8. Читаемость | Имена, размер функции, смешение уровней абстракции, мёртвый код | Функция на 200 строк, где HTTP-разбор, бизнес-правила и SQL живут вперемешку |
| 9. Стиль | Ничего не смотрю руками — это gofmt, golangci-lint и CI | Спор о переносах строк в комментариях к PR — верный признак, что линтер не настроен |
Как комментировать, чтобы это работало
- Помечать вес комментария. Три метки.
blocker(«блокирующее»): без этого не мержим.вопрос: я не понял, объясни.nit(от английского nitpick, «придирка»): вкусовщина, можешь проигнорировать. Без меток все двадцать замечаний для автора весят одинаково, и он либо переделывает всё, либо не делает ничего. - Спрашивать, а не приказывать. «А что будет, если сюда придёт пустой список?» вместо «тут баг». В половине случаев выясняется, что ты не прав, и вопрос спасает лицо обоим. Плюс автор сам находит проблему, а такое запоминается лучше.
- Если крупных замечаний больше пяти, идти в звонок. Письменный пинг-понг на десять итераций съедает дни и портит отношения. Пятнадцать минут голосом решают то же самое, а в PR остаётся короткое резюме договорённости.
- Писать, что понравилось. Одна строчка «вот эту развязку с интерфейсом я себе заберу» меняет тон всей ветки. Ревью, где бывают только замечания, люди начинают избегать.
Первое: начать с именования и форматирования. Значит, человек не видел, как пропущенный на ревью N+1 кладёт базу. Второе: «я проверяю, что код чистый и соответствует SOLID». Это лозунг, а не проверка. Третье: ни слова про людей. Ревью держится на коммуникации, и если кандидат не упомянул, как он доносит замечания, интервьюер запомнит именно это. Четвёртое: «я всегда всё проверяю досконально». На PR в тысячу строк это физически неправда, и опытный интервьюер это знает.
Как принимаешь технические решения и объясняешь их бизнесу
Принять техническое решение значит выбрать из нескольких вариантов при ограничениях. Если у тебя в рассказе один вариант, ты не принимал решение, ты просто сделал первое, что пришло в голову. Поэтому в сильном ответе всегда есть альтернативы, критерии выбора и то, что заставит вернуться и пересмотреть.
Самый полезный критерий редко называют вслух: обратимость. Решения делятся на те, откуда легко вернуться (поменять библиотеку логирования, добавить кэш перед запросом), и те, откуда вернуться почти нельзя (разрезать монолит, сменить хранилище, зафиксировать публичный контракт API). Первые надо принимать быстро и не устраивать вокруг них совет директоров, вторые — медленно, письменно и с несколькими парами глаз. Команды чаще всего ошибаются именно тут: смешивают эти два режима.
У этой пары есть ходовое название, и его стоит знать, потому что на собесах оно звучит: двусторонняя дверь и односторонняя дверь. Метафора из письма Джеффа Безоса акционерам Amazon, оттуда разошлась по индустрии. В двустороннюю дверь можно войти, оглядеться и спокойно выйти обратно: решение обратимое, его принимают быстро, часто в одиночку, и ошибка стоит день работы. Односторонняя дверь захлопывается за спиной: вернуться либо нельзя вообще, либо очень дорого. Вся польза метафоры в том, что она за два слова объясняет, почему на выбор библиотеки нельзя тратить неделю, а на выбор хранилища можно и нужно.
- Что за задача и по какой метрике поймём, что решили. Без метрики дальше нет смысла.
- Два-три реальных варианта. Обязательно с вариантом «ничего не делать» или «сделать самое дешёвое»: он часто выигрывает.
- Критерии: срок, риск, стоимость поддержки, обратимость, кто это будет эксплуатировать в три часа ночи.
- Данные, а не мнения.
EXPLAIN ANALYZE, замер на копии прода, прототип на день, что угодно, лишь бы спор превратился в число. - Решение и запись. Короткий ADR или хотя бы абзац в задаче: что выбрали, почему, что отвергли и по какой причине.
- Условие пересмотра. «Возвращаемся, если p99 уйдёт за 500 мс» или «если объём вырастет вдвое».
С объяснением бизнесу правило одно: говорить в деньгах, времени и риске, а не в технологиях. Бизнесу нечего делать с фразой «нужно вынести отчёты в отдельный сервис». Ему есть что делать с фразой «сейчас тяжёлые отчёты тормозят работу продажников в конце месяца — это тот же час, когда закрываются сделки». Дальше всегда идут варианты с ценой, а не отказ: «за неделю сделаем вдвое быстрее, за месяц сделаем в десять раз быстрее и уберём влияние на основную работу». Слово «нет» бизнес слышит как «инженер не хочет», а «вот три варианта и их цена» — как предложение выбрать.
«Надо порефакторить» звучит как просьба дать время непонятно на что, и её справедливо отклоняют. Работающая формулировка привязывает техдолг к тому, что бизнес уже чувствует: «каждая новая интеграция сейчас занимает три недели вместо одной, потому что весь обмен с внешними системами прибит к одному пакету; если потратим две недели на разделение, следующие интеграции пойдут по неделе — в ноль выйдем уже на первой». Это уже не рефакторинг ради красоты, а инвестиция с понятной точкой окупаемости.
Вопросы
3Каркас ответа
- Сказать вслух, что это пока не требование. «Быстро» нельзя ни сделать, ни принять, значит, первым делом я перевожу его в проверяемую формулировку.
- Вопросы про число: что значит «быстро» и в каких единицах, для какой доли запросов (среднее / p95 / p99), при какой нагрузке, на каком объёме данных, на каких конкретно сценариях.
- Вопрос «зачем»: кто именно жалуется, что он в этот момент делает, что бизнес из-за этого теряет. Часто оказывается, что скорость только симптом, а болит другое.
- Вопрос про цену: срок и бюджет, а главное, чем можно платить (свежесть данных, консистентность, деньги на железо, часть функциональности).
- Вопрос про приёмку: какая метрика, на каком дашборде, кто скажет «принято».
- Закончить сформулированным SLO: показать, как из фразы получается строчка, которую можно проверить.
«Первое, что я скажу вслух: в таком виде это ещё не требование. "Быстро" нельзя ни сделать, ни проверить — на приёмке мы с заказчиком будем иметь в виду разные вещи. Поэтому я задам несколько вопросов, и они займут минут пятнадцать, а сэкономят недели.
Начну не с чисел, а с "зачем": что именно тормозит, кто жалуется и что этот человек в тот момент делает. У нас в CRM почти всегда за фразой "система тормозит" стоит один конкретный экран и один конкретный отдел. В последний раз это оказался список сделок у руководителей отделов, у которых фильтр по всей воронке, — и только утром в понедельник и в конце месяца. Это сразу сузило задачу с "всей системы" до одной ручки.
Дальше числа. Что значит "быстро" в секундах: сейчас крутится пять секунд, а нормально — чтобы за секунду. Для какой доли запросов: среднее прячет хвосты, поэтому я всегда переспрашиваю, говорим ли мы про p95 или p99, — разница между ними может стоить месяца работы. При какой нагрузке: сколько RPS в обычный день и в пик, когда бывает пик. На каком объёме: сейчас пять миллионов сделок, а через год? Планировщик Postgres на выросшей таблице легко уходит в seq scan там, где вчера был индекс.
Потом вопрос, который задают реже всего и который меняет решение целиком: чем можно платить. Можно ли показывать данные с отставанием в минуту? Если да — мне открылись кэш, материализованное представление и чтение с реплики. Если нет и нужна строгая свежесть — это совсем другой класс решений и другая цена. В том случае с CRM ответ был "это рабочий список, а не отчётность, минута отставания нормальна", и это определило всё дальнейшее.
И два закрывающих вопроса: какой срок и бюджет — неделя и квартал допускают разные решения; и как мы будем измерять и кто подтвердит приёмку, потому что без метрики "сделано" остаётся вопросом веры. Заодно спрошу, что уже пробовали и почему это не помогло: пару раз это спасало меня от повторения чужого пути.
В итоге из "хотим быструю систему" получается строчка, которую можно повесить на дашборд: p95 списка сделок с фильтром "все сделки отдела" — не больше одной секунды при текущей нагрузке в пик понедельника и полуторном объёме данных на год вперёд; допустимо отставание данных до минуты; метрика — гистограмма в Prometheus, приёмка — продакт по дашборду в Grafana. Вот с этим я уже готов идти что-то делать.»
Чего говорить нельзя
- Сразу предлагать решения. «Поставим Redis, добавим индексы, поднимем реплику». Классический провал: кандидат оптимизирует то, чего не измерил, и, скорее всего, не то.
- «Сделаем максимально быстро». Это обещание без цены и без критерия приёмки.
- Спрашивать только про latency. Без вопросов «зачем» и «чем можно платить» ответ выглядит как чек-лист, а не как понимание.
- Задавать вопросы бесконечно. Если на этом всё и закончилось, кандидат выглядит как человек, который умеет уточнять, но не умеет доводить. Обязательно закончить сформулированным требованием.
- Обещать «всегда быстро». Требование «всегда меньше 100 мс» без перцентиля практически недостижимо: всегда найдётся GC-пауза, ретрай или холодный кэш.
Чем добить
Скажи, что после согласования SLO ты первым делом измеряешь, а не оптимизируешь: вешаешь гистограмму по этой ручке в Prometheus и панель в Grafana. Дальше два аргумента, которые звучат по-взрослому. «Бесплатной скорости не бывает»: за неё всегда платят свежестью данных, деньгами на железо или сложностью поддержки, и весь разговор нужен, чтобы выяснить, чем именно заказчик готов заплатить. И второй, «у скорости есть точка, после которой пользователь не замечает разницы»: если 210 мс и 40 мс для человека неотличимы, второй вариант не стоит своей инвалидации кэша. Так ты показываешь, что оптимизируешь бизнес-эффект, а не число на графике.
Каркас ответа
- Назвать принцип, а не список. «Иду сверху вниз по цене ошибки».
- Что делаю до комментариев: читаю задачу, смотрю размер PR, прохожу диф целиком один раз молча.
- Верхние уровни подробно: та ли задача решена → что будет в проде → данные и запросы → совместимость и откат → безопасность.
- Нижние уровни коротко: наблюдаемость, тесты, читаемость; стиль отдаю линтеру.
- Как коммуницирую. Половина ответа: ревью про людей, а не про текст.
- Один живой пример находки, он делает весь ответ достоверным.
«У меня есть порядок, и он про цену ошибки: сверху то, что дорого чинить в проде, снизу то, что вообще не должен смотреть человек.
До первого комментария я делаю три вещи. Открываю задачу — довольно часто самое важное замечание звучит как "код хороший, но решает половину задачи", и из дифа это не видно. Смотрю на размер: если там больше пятисот-шестисот содержательных строк, я честно пишу "давай разобьём", потому что ревью такого объёма — это ревью с пропущенными багами, как ни старайся. И прохожу диф целиком один раз без комментариев, чтобы понять замысел, иначе первые десять замечаний окажутся про то, что автор решил тремя файлами ниже.
Дальше по уровням. Первое — та ли задача решена и вся ли: например, статус сделки
меняется, но при переходе в "выиграна" не пишется событие в Kafka, и биллинг об этом
не узнает. Второе — что будет в проде: проглоченные ошибки, потерянный context,
незакрытое тело ответа в ветке с ошибкой, горутина без таймаута, неидемпотентный ретрай.
Третье — данные: N+1, запрос без индекса, выборка без лимита, сетевой вызов внутри
транзакции, который держит блокировку секунды. Четвёртое — совместимость и откат:
совместима ли миграция со старым кодом, ведь при раскатке несколько минут в проде живут
две версии; не сломан ли контракт API; прочитают ли старые консьюмеры новое событие;
и есть ли вообще возможность откатиться. Пятое — безопасность и персональные данные:
проверяются ли права на конкретный объект, а не только факт авторизации, не улетает ли
телефон клиента в лог целиком.
Ниже — наблюдаемость и тесты. Новый фоновый воркер без метрики значит, что о его
падении мы узнаем от менеджеров, а не от алерта. Фикс бага без теста значит, что баг
вернётся. Ещё ниже — читаемость: имена, длина функции, смешанные уровни абстракции.
А стиль и форматирование я не смотрю вообще, это gofmt и
golangci-lint в CI; если люди спорят в PR о переносах строк, значит,
линтер не настроен, и чинить надо это.
Отдельно — как я пишу комментарии, для меня это половина дела. Я помечаю вес:
blocker — без этого не мержим, вопрос — я не понял, объясни,
nit — вкусовщина, можно проигнорировать. Без меток автор видит двадцать
одинаковых замечаний и либо переделывает всё, либо забивает. Формулирую вопросом:
"а что будет, если сюда придёт пустой список?" — потому что в половине случаев прав автор,
и вопрос спасает лицо нам обоим. Если крупных замечаний больше пяти, иду в звонок
на пятнадцать минут вместо десяти итераций переписки, а в PR оставляю резюме
договорённости. И стараюсь написать, что понравилось, — ревью, где бывают только
замечания, люди начинают избегать.
Из недавнего: коллега добавлял выгрузку сделок в отчёт, код был аккуратный, но внутри цикла по сделкам подтягивался последний контакт отдельным запросом. На тестовых данных — двадцать сделок и незаметно, в проде у крупного отдела — несколько тысяч. Я не написал "тут N+1, исправь", а спросил: "сколько сделок бывает у самого большого отдела и что будет с этим циклом на таком объёме?" Он сам посчитал, переделал одним запросом с джойном, и мы заодно договорились, что такие места проверяем на реальных объёмах.»
Чего говорить нельзя
- Начинать с именования и форматирования. Мгновенно читается как «ревьюил только учебные проекты».
- «Проверяю чистоту кода и SOLID». Лозунг вместо процедуры. Если говоришь про принципы, называй, какое конкретно нарушение и чем оно навредит.
- «Я всегда всё проверяю досконально». На PR в тысячу строк это неправда, и интервьюер это знает. Взрослый ответ звучит иначе: «я говорю, что не могу качественно отревьюить такой объём».
- Ни слова про коммуникацию. В ревью всегда двое; кандидат, который описал только техническую часть, выглядит как источник конфликтов.
- «Отклоняю PR, если не нравится подход». Без критериев это вкусовщина
с правом вето. Нравится/не нравится тянет максимум на
nit, а блокирует только то, что сломает прод или контракт. - Ревью как способ показать, что ты умнее. Тон «а вот здесь ты не знаешь, как работает планировщик» для любого тимлида красный флаг.
Чем добить
Скажи, что часть замечаний нужно убирать из ревью в автоматику: если одно и то же
повторяется третий раз, это не тема для комментария, а тема для линтера, шаблона PR или
чек-листа. У нас так появилась проверка на опасные миграции в CI (DROP COLUMN,
RENAME, CREATE INDEX без CONCURRENTLY), и эти
замечания просто перестали существовать как ручная работа. Второй сильный ход: сказать,
что ревью для тебя ещё и способ распространять знание о системе. Читая чужие PR,
ты держишь в голове, что происходит в соседних частях CRM, и это окупается на инцидентах.
Каркас ответа
- Метрика успеха: по чему поймём, что решили задачу.
- Два-три реальных варианта, обязательно с самым дешёвым и с «ничего не делать».
- Критерии выбора, среди них обязательно обратимость: односторонняя дверь или двусторонняя.
- Данные вместо мнений: замер, прототип на день,
EXPLAIN. - Запись решения: ADR или абзац в задаче, что выбрали, что отвергли и почему.
- Условие пересмотра.
- Перевод для бизнеса: те же варианты на языке денег, сроков и риска.
«Для меня решение — это выбор из вариантов при ограничениях. Если я могу назвать только один вариант, значит, я не принимал решение, а сделал первое, что пришло в голову. Поэтому у меня есть простой порядок.
Сначала метрика: по чему мы поймём, что задача решена. Потом два-три варианта, причём я всегда держу среди них самый дешёвый и вариант "ничего не делать" — они выигрывают чаще, чем кажется. Дальше критерии: срок, риск, стоимость поддержки и обратимость. Обратимость для меня главный: есть решения, откуда легко вернуться — добавить кэш, поменять библиотеку, — их надо принимать быстро и не устраивать вокруг них совет. И есть решения, откуда вернуться почти нельзя: разрезать монолит, сменить хранилище, зафиксировать публичный контракт API. Вот их я принимаю медленно, письменно и не в одиночку. Смешивать эти два режима — самая частая ошибка: команда неделю спорит про имя пакета и за час на созвоне решает разрезать сервис.
Дальше стараюсь заменить мнения данными: снять EXPLAIN ANALYZE,
прогнать замер на копии прода, собрать прототип за день. Спор "кэш или индекс" мы так
закрыли за час: замер показал 210 мс на переписанном запросе, и обсуждать стало нечего.
Решение записываю коротко — что выбрали, что отвергли и почему; через полгода это
единственное, что спасает от разговора "а почему у нас так сделано". И обязательно
фиксирую условие пересмотра: "возвращаемся к кэшу, если p99 уйдёт за 500 мс".
Это превращает решение из вечного в обратимое, и людям легче согласиться на не свой
вариант, когда есть точка возврата.
С бизнесом правило одно: говорить в деньгах, времени и риске, а не в технологиях. Фраза "нужно вынести отчёты в отдельный сервис" для продакта не значит ничего. Работает другое: "тяжёлые отчёты сейчас тормозят работу продажников в конце месяца — ровно в тот час, когда закрываются сделки". И дальше всегда варианты с ценой: "за неделю читаем отчёты с реплики, станет вдвое быстрее и перестанет мешать основной работе; за месяц делаем отдельный сервис, будет в десять раз быстрее и появится история по срезам. Предлагаю сейчас первое, а второе — обсудить в квартальном плане". Я почти никогда не говорю "нет": бизнес слышит в этом "инженер не хочет". Вместо этого — "можно, и вот сколько это стоит", а решение пусть принимает тот, кто отвечает за деньги.
Про техдолг разговариваю так же. "Надо порефакторить" — это просьба дать время непонятно на что, её справедливо отклоняют. А "каждая новая интеграция сейчас занимает три недели вместо одной, потому что весь обмен с внешними системами прибит к одному пакету; две недели на разделение окупятся на второй интеграции" — это уже инвестиция с точкой окупаемости, и такие разговоры у меня заканчивались выделенным временем в спринте.»
Чего говорить нельзя
- «Я выбираю лучшее решение». Лучшего не бывает, бывает подходящее под ограничения. Ответ без слова «trade-off» звучит незрело.
- «Смотрю, как принято в индустрии» / «так делают в больших компаниях». Аргумент по авторитету вместо аргумента по контексту.
- Технические термины бизнесу. «Нам нужен шардинг, потому что вертикальное масштабирование упёрлось» гарантированно кончается репликой «делай как знаешь, только не мешай», а потом «почему это заняло два месяца».
- Слово «нет» без вариантов. Отказ без цены выглядит как нежелание работать.
- Решать всё в одиночку. Через односторонние двери идут вместе с командой, иначе это не зрелость, а самоуверенность.
- Пугать бизнес. «Всё упадёт, если не переписать» без цифр звучит как шантаж, и его быстро перестают воспринимать всерьёз.
Чем добить
Назови вслух пару «односторонняя дверь / двусторонняя дверь»: это самая короткая формулировка того, как отличать решения, которые надо принимать быстро, от тех, где стоит потратить неделю. И добавь честный пример решения, которое ты пересмотрел: «мы договорились читать отчёты с реплики, зафиксировали условие возврата, через полгода оно наступило, и мы вынесли отдельный сервис уже с графиками на руках». Признанный пересмотр выглядит сильнее, чем безошибочность: он доказывает, что условие пересмотра у тебя не для красоты, а работает.
2.5Финал интервью
Последние двадцать минут. За них можно потерять всё, что заработал за три часа технических секций, а можно, наоборот, добрать заметную часть оффера. Три темы: почему ты уходишь, сколько ты стоишь и что ты спросишь сам. Первая проверяет, не притащишь ли ты конфликт с собой. Вторую выигрывают не красноречием, а домашней работой. В третьей ты собеседуешь компанию, единственный раз за всё интервью, и по твоим вопросам о тебе понимают больше, чем по ответам.
Тут нет «правильных ответов», но есть дорогие ошибки. Негатив про прошлое место стоит оффера чаще, чем провал по горутинам: технику можно доучить, а человека, который жалуется на коллег, никто не хочет сажать рядом с собой. Названная наугад зарплата стоит реальных денег: разницу в двадцать процентов ты не отыграешь потом ни за один пересмотр. А если своих вопросов нет, это читается как «мне всё равно, куда идти», и с этим последним впечатлением интервьюер уйдёт писать фидбэк.
Ещё одно слово, которое дальше будет на каждой странице, теперь уже со стороны денег. Грейд, напомним, означает ступеньку на внутренней лестнице компании: джун, мидл, сеньор и их подступени вроде «мидл+». Строчкой в трудовой дело не ограничивается: к грейду привязана утверждённая вилка зарплаты, объём ответственности и то, на что ты можешь претендовать при пересмотре. Лестница у каждой компании своя, наружу её обычно не публикуют, поэтому «мидл» в двух разных местах спокойно отличается вдвое по деньгам, и спрашивать про грейд на оффере так же важно, как про сумму.
«Почему уходишь с текущего места»
Интервьюер задаёт этот вопрос не из любопытства. Он проверяет три вещи: не принесёшь ли ты конфликт с собой, не уйдёшь ли ты от нас так же через полгода и умеешь ли ты говорить о неприятном, не сваливаясь в жалобу. Подробности прошлой драмы ему не нужны и скорее мешают.
Рабочая конструкция всегда одна и та же: «там было хорошо и я это ценю — но у меня кончился конкретный ресурс — и он есть у вас». Три части, каждая обязательна. Первая снимает подозрение в конфликте. Вторая должна быть конкретной: не «хочу развиваться», а «за два года я закрыл всё, что можно закрыть в этом продукте, и следующие полгода будут такими же, как прошлые». Третья привязывает уход именно к этой вакансии, иначе выходит, что ты просто бежишь, и неважно куда.
Из чего собрать честную причину
| Что на самом деле произошло | Как это звучит без негатива |
|---|---|
| Скучно, одни и те же задачи | «Продукт стабилизировался, задачи стали повторяться. За последний год я не сделал ничего, что не умел бы годом раньше, — и это моя причина уходить» |
| Не поднимают зарплату | «Мы дважды обсуждали пересмотр, компания сейчас не может его сделать — я это понимаю, но для меня это существенно» |
| Нет роста в грейде, некуда двигаться | «В команде из четырёх человек следующая ступень — место тимлида, оно занято и освободится нескоро. Мне нужен масштаб, где такая ступень существует» |
| Технологический тупик, устаревший стек | «Мне интересна нагрузка и распределённые системы, а наш продукт по бизнесу к ним не идёт — там честно хватает одного инстанса и Postgres» |
| Сменился руководитель, стало хуже | «Поменялись приоритеты команды: мы ушли в поддержку интеграций, а я хочу заниматься продуктовой разработкой» |
| Компанию штормит, увольнения, задержки | «В компании идёт реструктуризация, планы на год стали непредсказуемыми. Мне важна предсказуемость на горизонте хотя бы года» |
| Отменили удалёнку / переезд офиса | «Изменились условия по формату работы — для меня это принципиально, поэтому смотрю варианты» — коротко и без обиды |
| Реальный конфликт с руководителем | «У нас разные взгляды на то, как строить процессы разработки. Я своё мнение обозначил, решения принимает руководитель — это нормально, но мне ближе другой подход» — и не углубляться |
Иногда уходят от токсичного руководителя, от зарплаты, которую задерживают месяцами, или из откровенно мёртвого продукта. Врать не надо: враньё слышно, и оно всплывает при проверке рекомендаций. Тут работает формула из трёх шагов.
- Назвать факт нейтрально и коротко, одним предложением, без прилагательных. «Зарплату задерживают третий месяц» звучит как факт. «Владельцу плевать на людей» уже оценка, и она про тебя, а не про них.
- Показать, что ты пробовал решить это внутри. «Я поднимал вопрос с руководителем дважды, предлагал вариант» снимает главный страх интервьюера: что ты молча копишь недовольство и потом хлопаешь дверью.
- Закрыть тему самому и вернуть разговор в будущее. «Мы это не решили, поэтому я ищу новое место. Мне важно, чтобы на новом месте было вот это и это — можно я спрошу, как у вас с…» Ты не выглядишь ни жертвой, ни жалобщиком, и разговор идёт дальше.
Отдельно про интонацию. Одна и та же фраза, сказанная спокойно и сказанная с обидой в голосе, читается совершенно по-разному. Если тема ещё болит, тем более стоит написать формулировку заранее и проговорить её вслух несколько раз, пока она не станет скучной. Скучная интонация на этом вопросе как раз то, что нужно.
Имён и подробностей конфликта. Рынок маленький, интервьюер может знать этих людей лично. «Там все дураки / никто не умеет писать код». Даже если это правда, ты выставляешь себя человеком, который не смог ни на кого повлиять. Претензий к компании как к организации: «жадные», «непрофессиональные», «обманывают». Деталей про деньги в негативе: «кинули с премией». «Меня не ценили». Звучит как обида, а не как причина. И ни в коем случае не врать про увольнение: если тебя сократили или попросили уйти, честное «попал под сокращение команды, вот что я успел там сделать» работает нормально, а вскрывшееся враньё не работает вообще.
Зарплатные ожидания
Единственный вопрос интервью, который стоит тебе живых денег прямо в момент ответа. Разницу в двадцать процентов, отданную за пятнадцать секунд неуверенности на скрининге (первом коротком звонке с рекрутером, где отсеивают по формальным признакам), потом не отыграть: пересмотры считают в процентах от твоей же цифры, и догонять рынок придётся годами. Сам разговор при этом выигрывают домашней работой, а не красноречием: кто знает рынок, тот называет вилку спокойно, потому что ему есть на что опереться.
Шаг нулевой: узнать рынок до того, как спросили
| Источник | Что даёт | Как читать |
|---|---|---|
| Зарплатные обзоры (Хабр Карьера, отраслевые отчёты рекрутинговых агентств) | Медиану и перцентили по грейду, стеку и городу | Смотреть медиану (выстроить все зарплаты по возрастанию и взять ту, что ровно посередине: половина людей получает меньше, половина больше) и верхний квартиль (границу, выше которой платят четверти рынка), а не среднее: среднее вытягивают вверх редкие большие цифры. И обязательно смотреть дату — обзор годовой давности на нашем рынке уже неточен |
| Вилки в самих вакансиях на hh и в агрегаторах | Живой срез спроса прямо сейчас | Верх вилки в вакансии — это почти всегда «для кандидата мечты» плюс переговорный запас. Полезнее считать не по одной вакансии, а по двадцати: собрать список и посмотреть, где сгущается |
| Telegram-каналы с вакансиями и зарплатами, боты-агрегаторы (getmatch и подобные) | Вилки, которые компании реально называют, часто с указанием грейда | Тут вилки честнее, чем на hh, потому что каналы отсеивают объявления без денег. Обращать внимание на формулировку грейда — «мидл» в разных компаниях отличается вдвое |
| Живые люди: знакомые в других компаниях, бывшие коллеги, чаты | Самые точные данные — что реально платят на руки за конкретный набор навыков | Спрашивать не «сколько ты получаешь» (неловко), а «на какую вилку сейчас можно рассчитывать мидлу на Go с таким-то опытом» — на такой вопрос отвечают охотно |
| Собственные интервью | Обратная связь рынка лично про тебя | Если твоя цифра не вызывает вообще никакой реакции у всех подряд — она низкая. Если после неё половина компаний отваливается на скрининге — она у верхней границы твоего сегмента, и это нормальная позиция |
Из всего этого собирается своя вилка из трёх чисел. Ниже минимума не идёшь вообще, при любых уговорах (иначе через три месяца снова будешь искать работу). Цель: столько ты реально ожидаешь, и рынок это подтверждает. До амбиции дотягиваешься, если совпал стек, ты понравился и компания платит выше рынка. На вопрос об ожиданиях называешь интервал между целью и амбицией; минимум вслух не произносится никогда, это твоя внутренняя граница.
Первый, кто называет число, задаёт рамку всему дальнейшему разговору: обсуждать будут уже вокруг него. Поэтому по умолчанию лучше, чтобы бюджет позиции назвала компания. У неё этот бюджет всегда есть: вилку по грейду утвердили до открытия вакансии, а ты про неё можешь только догадываться.
- Мягкий возврат вопроса: «Я ориентируюсь на рынок и готов назвать вилку. Но, чтобы не тратить время, скажите сначала, какая вилка заложена по этой позиции — у вас она наверняка есть».
- Если вилка есть в вакансии, вопрос уже решён: называешь верхнюю часть этой вилки, если считаешь, что подходишь, и ничего своего не выдумываешь.
- Если давят («назовите вы»), не упирайся дважды. Спор о том, кто скажет первым, портит впечатление сильнее, чем неидеальная цифра. Называешь свой интервал спокойно, одним предложением, без оправданий.
- Работает это только на скрининге. К моменту оффера рамку всё равно придётся называть тебе, зато там ты уже сильнее: тебя выбрали.
И отдельно про два слова, на которых теряют деньги. Гросс (от английского gross, «грязными») означает зарплату до вычета НДФЛ, то есть ту сумму, которую компания ставит в оффер. На руки (иногда говорят «нетто»), наоборот, то, что реально приходит на карту за вычетом НДФЛ. С 2025 года шкала пятиступенчатая (13 / 15 / 18 / 20 / 22%), так что на вилке 600–700 тыс. ₽ в месяц эффективная ставка выходит около 15–16%, а не привычные 13%. В России чаще обсуждают гросс, но далеко не все, поэтому цифру всегда называй с уточнением: «650 на руки» или «750 гросс». Не уточнишь, поймаешь неприятный сюрприз в оффере.
Вопрос про текущую зарплату задают, чтобы сделать оффер от неё, а не от рынка. Это законная тактика работодателя, но она не в твоих интересах: твоя прошлая зарплата никак не связана с тем, сколько стоит эта работа. Отвечать честной цифрой стоит только в одном случае: если она выше или равна той, что ты просишь.
- Стандартный уход: «Текущий доход я бы не хотел обсуждать — он про мою прошлую задачу. Про эту роль я ориентируюсь на 600–700 тысяч гросс». Если сказать это спокойно и без пафоса, работает почти всегда.
- Если настаивают: «Скажу честно: текущая цифра ниже рынка, это одна из причин, почему я смотрю варианты. Ориентируюсь на такую-то вилку и понимаю, откуда она берётся». Признать факт и сразу переключить на рынок сильнее, чем увиливать.
- Чего не делать: завышать текущую зарплату. Иногда просят справку 2-НДФЛ или подтверждение дохода, и пойманное враньё убивает оффер целиком.
- Чего ещё не делать: называть текущую цифру и добавлять «хотелось бы чуть побольше». Это приглашение сделать оффер +10% вместо рыночного.
Как назвать вилку, чтобы это звучало уверенно
Уверенность здесь берётся не из голоса, а из структуры фразы. Работает такая: число — обоснование одной строкой — точка. Никаких «ну, наверное», «если можно», «я не знаю, сколько у вас принято». И главное, не оправдываться после того, как назвал: пауза в этом месте нормальна, закрывать её должен собеседник, а не ты. Люди проваливают этот момент именно так: называют хорошую цифру, пугаются тишины и сами же начинают её снижать.
«Я ориентируюсь на 600–700 тысяч гросс. Это соответствует рынку для мидла на Go
с продакшн-опытом с PostgreSQL, Kafka и эксплуатацией сервиса в проде — я смотрел обзоры
и вилки в вакансиях. Внутри этой вилки конкретная цифра зависит от объёма
ответственности».
«Вилка — 600–700, ближе к верхней границе, если в роли есть дежурства и владение сервисом
целиком. Готов обсуждать пакет в целом, а не только оклад».
А если вилку хотят прямо на первом звонке, а ты ещё ничего не знаешь о роли:
«Мне пока рано называть точное число — я не знаю объёма задач. Скажу так: ниже 600 гросс
рассматривать не буду, а дальше давайте вернёмся к этому, когда станет понятнее,
что за роль».
Переговоры об оффере
Оффер не конец, а начало отдельного короткого разговора, и обсуждают там весь пакет, а не один оклад. Половина того, что делает работу хорошей или плохой, деньгами не измеряется: как часто пересматривают, есть ли дежурства и платят ли за них, кто покупает тебе ноутбук, сколько дней отпуска и можно ли работать из другого города. Всё это спрашивают один раз, в момент оффера, а потом менять поздно.
Что обсуждается кроме оклада
| Пункт | Что спросить конкретно | Зачем это важно |
|---|---|---|
| Бонус или премия | От чего зависит, как часто платится, сколько людей получили её полностью в прошлом году | Бонус «до трёх окладов» может оказаться нулевым третий год подряд. Считать доход стоит по гарантированной части |
| Срок и правила пересмотра | Когда ближайший пересмотр, привязан ли он к календарю или к грейду, что нужно сделать, чтобы получить повышение | Самый недооценённый пункт. «Через 6 месяцев ревью» может стоить дороже, чем +30 тысяч в оклад сейчас, — но только если это записано |
| Грейд и название роли | Какой грейд по внутренней шкале, что отличает его от следующего | Грейд определяет вилку пересмотров и то, что будет написано в трудовой. «Мидл» с обязанностями сеньора — плохая сделка на два года вперёд |
| ДМС | С какого месяца, со стоматологией или без, включена ли семья, какая клиника | Разброс между «поликлиника у дома» и нормальной программой — десятки тысяч в год |
| Техника | Дают ли ноутбук, какой, можно ли выбрать, есть ли бюджет на монитор и периферию | Работать три года на слабой машине — это ежедневный налог на нервы; попросить нормальную технику на этапе оффера легко, потом — уже неловко |
| Формат работы | Удалёнка, гибрид или офис; сколько дней в офисе; можно ли работать из другого города или страны; как оформлено в договоре | Устное «у нас все и так удалённо» меняется со сменой руководителя. Если формат критичен — он должен быть в оффере |
| Обучение и конференции | Есть ли бюджет, кто его согласовывает, оплачиваются ли курсы и участие в конференциях | Обычно небольшие деньги, но легко даются — и это хороший индикатор отношения к развитию людей |
| Отпуск и переработки | Сколько дней, есть ли дополнительные, как относятся к длинным отпускам; оплачиваются ли дежурства и переработки | Он-колл (от английского on-call — дежурство «на телефоне» вне рабочих часов, когда ты обязан взять трубку и починить прод) без компенсации и отгулов — скрытая часть зарплаты, которую ты платишь компании |
| Дата выхода | Когда ждут, готовы ли подождать отработку и отпуск между работами | Две недели отдыха между работами — единственный шанс на длинную паузу в ближайший год; это спокойно обсуждается на этапе оффера |
- Сначала поблагодарить и показать интерес. «Спасибо, мне очень интересна задача, я хочу к вам». Торг без выраженного интереса читается как «я тут ради денег» и снижает желание идти навстречу.
- Один раунд, одно число. «Готов выходить, если оклад будет 700». Не «хотелось бы побольше», не «а можно ещё чуть-чуть»: такое дожимание по кругу раздражает.
- Обосновать, но коротко. Ссылки на рынок и на объём роли хватает. Личные обстоятельства (ипотека, дети, аренда) не аргумент: компания платит за работу, а не за твои расходы.
- Быть готовым сказать «да». Если попросил 700 и тебе дали 700, торг закончен. Кто приходит после этого с новой просьбой, того запоминают надолго.
- Если по окладу потолок, переключайся на остальной пакет: срок пересмотра, подписной бонус, отпуск, техника, дата выхода. Часто именно там есть свобода, которой нет в вилке грейда.
- Другой оффер упоминать можно, если он настоящий. «У меня есть предложение на 750, но мне интереснее ваша задача» звучит честно и работает. Блефовать не стоит: иногда отвечают «тогда удачи», и отыграть назад нельзя.
«Оффер действителен до завтра», «нам нужен ответ прямо сейчас, иначе передадим другому кандидату». Это приём, а не реальность. Компания, которая потратила на тебя четыре часа интервью, не отзовёт оффер за то, что ты попросил два дня.
- Просить время нормально и почти всегда дают. Формулировка: «Спасибо, это серьёзное решение — мне нужно пару дней. Отвечу в среду до конца дня». Назвать конкретный день важнее, чем попросить срок: это выглядит как ответственность, а не как затягивание.
- Стандарт: два–пять рабочих дней. Больше недели без объяснения выглядит как «жду ответа от другой компании», и это все понимают.
- Жёсткий дедлайн в 24 часа сам по себе сигнал о компании. Так же они будут вести себя с дедлайнами по задачам. Взрослый ответ: «Понимаю, что сроки поджимают. Мне нужно два дня; если это невозможно, скажите — я приму решение исходя из этого». Иногда «невозможно» внезапно становится возможным.
- Не принимай оффер в звонке из вежливости. Слово «да», сказанное голосом, психологически связывает, и торговаться потом уже поздно.
- И наоборот, не тяни молча. Если ждёшь другой оффер, скажи об этом прямо: «Честно — у меня в процессе ещё одна компания, финал в четверг. Готов дать ответ в пятницу». Это уважают гораздо больше, чем исчезновение на неделю.
Свои вопросы интервьюеру
«У вас есть вопросы?» спрашивают не для галочки. Это последние пять минут, которые интервьюер помнит лучше всего, когда садится писать фидбэк. И единственный момент, когда ты получаешь данные о месте, где собираешься провести следующие два года. Ответ «нет, вы всё рассказали» читается ровно одним способом: человеку всё равно, куда идти.
Хороший вопрос отличается от плохого тем, что на него нельзя ответить рекламой. «У вас интересные задачи?» рекламой отбивается легко. «Что было последним крупным инцидентом и что после него изменили?» так не отбить: придётся рассказать, как всё устроено на самом деле. Готовь восемь–двенадцать таких вопросов, задавай три–пять, выбирая по ходу те, что уместны этому конкретному собеседнику: тимлиду, будущему коллеге и HR нужно задавать разное.
Двенадцать сильных вопросов и что они на самом деле выясняют
| Вопрос | Что на самом деле выясняешь | Тревожный ответ |
|---|---|---|
| Из кого состоит команда — сколько человек, какие грейды, кто будет рядом со мной? | Есть ли у кого учиться и не окажешься ли ты самым опытным по умолчанию | «Команда формируется» без деталей; ты единственный бэкендер на большой продукт |
| Давно ли команда в этом составе? Кто-нибудь уходил за последний год? | Стабильность и настоящий климат. Отток — самый честный индикатор | «У нас все новые», «за год сменилось полкоманды» без внятного объяснения |
| Почему открыта эта вакансия — рост команды или кто-то ушёл? | Идёшь ты в развитие или затыкать дыру после выгоревшего человека | Уклончивость. Честное «человек ушёл, потому что…» — наоборот, хороший знак |
| Как задача проходит путь от идеи до прода? | Есть ли процесс, кто пишет требования, участвуют ли разработчики в постановке | «Приходит задача от бизнеса, мы делаем» — то есть разработчики не влияют ни на что |
| Что происходит, когда команда не успевает к сроку? | Режут скоуп, двигают дату или работают вечерами. Самый показательный вопрос про культуру | «Обычно успеваем», «поднажимаем» — то есть переработки считаются нормой |
| Как принимаются технические решения — кто решает, фиксируется ли где-то? | Сможешь ли ты влиять на архитектуру или всё спускается сверху | «Как скажет архитектор» без возможности обсуждения; решения нигде не записаны |
| Как планируется техдолг — есть ли на него доля спринта? | Придётся ли тебе годами работать в системе, которую никто не чинит | «Занимаемся, когда есть время» — то есть не занимаются никогда |
| Как устроены релизы и как выглядит откат? | Инженерная зрелость: CI/CD, канареечные раскатки, фича-флаги, кнопка отката | «Выкатываем по пятницам вручную», «откатов у нас не было» — оба варианта плохие |
| Есть ли дежурства? Как устроен график и оплачивается ли он? | Скрытую часть нагрузки и то, честно ли компания за неё платит | «Ну, если что-то упало, мы все смотрим» — то есть дежурство есть, но неоформленное и бесплатное |
| Что было последним крупным инцидентом и что после него изменили? | Лучший вопрос всего списка: культуру постмортемов, наличие выводов, отношение к ошибкам | «Инцидентов не было» — либо нет мониторинга, либо неправда. Поиск виноватых в рассказе — красный флаг |
| Как выглядит успех на этой позиции через полгода? | Есть ли у нанимающего вообще картинка того, зачем тебя берут | Общие слова «влиться в команду и приносить пользу» — критерии оценки придумают потом и задним числом |
| Что вам самим больше всего не нравится в текущей работе команды? | Честность собеседника. Заодно узнаёте о проблемах до, а не после выхода | «Да всё отлично» — либо не готовы говорить откровенно, либо не видят проблем. Оба варианта неприятны |
- «А чем вообще занимается компания?» Показывает, что ты не открыл даже сайт. Мгновенный минус, который уже не отыграть.
- «Много ли у вас переработок?» в лоб. Вопрос правильный, формулировка плохая: звучит как «я боюсь работать». Спрашивай через процесс («что происходит, когда команда не успевает к сроку?») и узнаешь то же самое и даже больше.
- Отпуск, ДМС, соцпакет и обеды на техническом интервью. Это к рекрутеру и к моменту оффера. Тимлиду это неинтересно, а впечатление смещается с «инженер» на «соискатель льгот».
- «Когда меня повысят?» До того, как тебя взяли, это выглядит как торг за то, чего ещё нет. Правильная версия: «как у вас устроен рост грейда и пересмотр», и лучше на этапе оффера.
- «Как я справился? Что скажете про мои шансы?» Ставит собеседника в неловкое положение: решение принимает не он один и не прямо сейчас. Спросить про сроки и следующий шаг можно и нужно, просить оценку на месте нельзя.
- Вопросы-экзамены. «А знаете ли вы, как в Go устроен планировщик?» Даже если ты просто хотел поговорить о технике, это читается как попытка показать, что ты умнее. Проиграешь в любом случае.
- Вопросы, ответ на которые уже прозвучал. Верный признак, что ты не слушал. Если вопрос из списка уже закрыли по ходу разговора, вычеркни его и бери следующий.
- Двадцать вопросов подряд. Это финал, а не допрос. Три–пять точных вопросов выглядят как подготовка, а пятнадцать уже как проверка на прочность.
Чем закончить интервью
Последняя минута стоит непропорционально дорого: именно она попадает в фидбэк почти дословно. Закрывай интервью тремя короткими репликами, все три укладываются в полминуты.
- Сказать, что тебе интересно, и почему именно. Не общее «спасибо, было приятно», а одна конкретная зацепка из разговора: «мне понравилось, что вы рассказали про переход на события в Kafka — это ровно то, чем я хочу заниматься дальше». Так видно, что ты слушал, и это запоминается.
- Закрыть сомнение, если оно повисло. Если по ходу ты что-то завалил или видел, что собеседник засомневался, скажи про это сам: «я вижу, что у меня слабее место с Kubernetes, чем вам нужно; в CRM я работал с ним как пользователь, но за пару месяцев закрою». Признанный и очерченный пробел пугает намного меньше, чем замолчанный.
- Спросить про следующий шаг и сроки. «Какой следующий этап и когда ждать обратную связь?» Это нормальный деловой вопрос, он ставит точку в разговоре и заодно подсказывает тебе, когда можно вежливо напомнить о себе.
Обещанный срок прошёл? Короткое письмо через день-два после него уместно и ничем не вредит: «Добрый день! Мы говорили в четверг, вы упоминали обратную связь к среде. Подскажите, есть ли новости? Со своей стороны подтверждаю интерес к позиции». Молчание тут не вежливость, а упущенный оффер: заявки теряются в системах чаще, чем кажется.
Вопросы
4Каркас ответа
- Одна фраза благодарности прошлому месту: что оно тебе дало. Снимает подозрение в конфликте до того, как оно возникло.
- Конкретная причина. Не эмоция, а факт: закончился рост, закрылось направление, упёрлись в потолок грейда, изменились приоритеты команды.
- Что ты пробовал сделать внутри, если пробовал. Показывает, что ты не копишь недовольство молча.
- Чего ты ищешь, сформулированное как требование к следующему месту.
- Почему именно сюда. Замыкает ответ на эту вакансию и превращает уход в осознанный переход.
«Мне на этом месте многое дали: я пришёл туда джуном, а сейчас веду бэкенд CRM практически целиком — и это заслуга команды и руководителя, они дали мне влезть в прод, в миграции, в мониторинг. Ухожу я не от людей.
Причина конкретная: у меня кончился рост. Продукт стабилизировался, нагрузка предсказуемая, архитектура сложилась, и последний год я в основном поддерживаю то, что сам же и построил. Если честно посмотреть, за этот год я не сделал ничего, чего не умел бы годом раньше. Следующие полгода будут такими же — это и есть мой ответ, почему я смотрю варианты.
Я пробовал решить это внутри: предлагал взять на себя вынос отчётов в отдельный сервис и переход интеграций на события, обсуждал это с тимлидом. Часть удалось — мы сделали канареечные выкатки и нормальные метрики. Но большая часть упирается в то, что бизнесу это сейчас не нужно, и я это понимаю: команда из четырёх человек, продукт работает, тратить квартал на переезд архитектуры незачем. Просто для меня это значит, что расти дальше надо в другом месте.
Ищу я две вещи: масштаб, где нагрузка и объём данных сами создают инженерные задачи, и команду, где есть люди сильнее меня, у которых можно учиться. В вашей вакансии совпадает и то, и другое: вы говорите про десятки тысяч RPS и про разделение монолита — это ровно тот класс задач, которого мне не хватает, и в команде из двенадцати человек с двумя сеньорами мне явно будет у кого спросить.»
Чего говорить нельзя
- Любого негатива про людей. «Тимлид самодур», «коллеги не умеют писать код», «менеджеры ничего не понимают». Даже если это правда, интервьюер услышит только одно: через год этот человек так же расскажет про нас.
- Имён и подробностей конфликта. Рынок маленький, вероятность пересечения выше, чем кажется.
- «Просто устал / захотелось перемен». Пустой ответ, который читается как «настоящую причину назвать нельзя».
- «Хочу развиваться» без содержания. Следующим вопросом будет «в чём именно?», и если сказать нечего, весь ответ обнуляется.
- Только про деньги. «Мало платят» как единственная причина означает, что ты уйдёшь за первым, кто предложит на десять процентов больше.
- Длинной истории. Пять минут про то, как всё разваливалось, остаются жалобой, как её ни упаковывай. Потолок здесь минута.
- Вранья про увольнение. Если было сокращение, так и скажи: это сейчас никого не удивляет, а вскрывшаяся ложь закрывает оффер.
Чем добить
Скажи, что ты никуда не бежишь: «мне не срочно, я не в состоянии "лишь бы уйти" — поэтому и выбираю аккуратно». Кандидат, который не горит, воспринимается сильнее, чем кандидат в панике. Второй ход: упомянуть, что уходишь правильно, то есть доделываешь начатое, передаёшь дела, написал документацию по сервису. Лучшего сигнала о том, как ты когда-нибудь будешь уходить и отсюда, не бывает, а интервьюер думает об этом чаще, чем признаётся.
Каркас ответа
- Показать, что ты знаешь рынок: отсюда и берётся уверенность.
- Мягко вернуть вопрос: «какая вилка заложена по позиции?»
- Если настаивают, назвать интервал: цель → амбиция. Минимум не произносится никогда.
- Уточнить гросс или на руки, иначе разница в 15–16% на ровном месте.
- Одна строка обоснования и пауза. Не оправдываться.
- Про текущую зарплату либо вежливо уйти от ответа, либо назвать честно и сразу перевести разговор на рынок.
- Оставить дверь открытой: готов обсуждать пакет целиком.
«Я смотрел рынок: обзоры зарплат, вилки в вакансиях и каналы, где компании указывают деньги, плюс разговаривал со знакомыми. Прежде чем называть свою цифру — подскажите, какая вилка заложена у вас по этой позиции? Она наверняка есть, и так мы быстрее поймём, есть ли о чём говорить.»
[Если отвечают «а вы назовите первым»]: «Хорошо. Я ориентируюсь на 600–700 тысяч гросс. Это соответствует рынку для мидла на Go с продакшн-опытом: PostgreSQL, Redis, Kafka, свои метрики и дежурства, миграции и канареечные выкатки на боевой системе. Внутри вилки конкретная цифра зависит от объёма ответственности — если это владение сервисом целиком и дежурства, то ближе к верхней границе.»
[И дальше — молчание. Паузу закрывает собеседник.]
[На «а сколько получаете сейчас»]: «Текущий доход я бы не обсуждал — он про мою прошлую задачу и про компанию, где я вырос из джуна, поэтому он отстаёт от рынка. Это, собственно, одна из причин, почему я смотрю варианты. По этой роли я ориентируюсь на ту вилку, которую назвал, и понимаю, из чего она складывается.»
[Если вилка компании ниже вашей]: «Понял. 550 — это ниже того, на что я рассчитывал, и, честно говоря, ниже рынка для этого набора задач. Мне интересна сама работа, поэтому давайте так: если по окладу есть потолок, я готов обсудить пакет целиком — например, пересмотр через полгода с зафиксированными критериями, или чуть больше отпуска. Если и это невозможно, лучше честно сказать друг другу сейчас, чем через месяц.»
Чего говорить нельзя
- «Сколько предложите» / «зарплата для меня не главное». Это приглашение предложить минимум по вилке. И звучит неправдой: деньги важны всем.
- Одно число вместо вилки. Одна цифра становится потолком, от которого будут торговаться вниз. Интервал оставляет пространство и выглядит как знание рынка.
- Оправдываться после названной суммы. «…но это обсуждаемо, я в целом гибкий, можно и меньше», и ты только что сам уронил свою цифру на сто тысяч.
- Аргументировать личными расходами. Ипотека, аренда, дети аргументом не считаются: платят за работу, а не за твои обязательства.
- Завышать текущую зарплату. Иногда просят подтверждение дохода, и это единственная ошибка, после которой оффер отзывают целиком.
- Называть цифру, не уточнив гросс или на руки. Разница в 15–16% выяснится в самый неподходящий момент.
- Соглашаться на «ниже, зато потом пересмотрим» без записанных критериев и даты. Устного пересмотра не существует.
Чем добить
Добавь одну фразу, которая переводит разговор из торга в деловой: «Готов обсуждать пакет в целом, а не только оклад». Она показывает, что ты взрослый переговорщик, и открывает компании путь дать тебе то, что у неё есть, когда вилка грейда упёрлась: срок пересмотра, грейд, дежурные выплаты, отпуск, технику. И держи в голове: обсуждать деньги выгоднее после оффера, чем до него. На скрининге ты одна строчка в списке, а после финала человек, на которого потратили несколько часов и которого ещё месяц искать заново.
Каркас ответа
- Благодарность и выраженный интерес, и только потом просьбы.
- Просьба о времени с конкретным днём: «отвечу в среду до конца дня».
- Список того, что ты хочешь уточнить, коротко и по пунктам, чтобы собеседник видел, что это не затягивание.
- Один раунд встречного предложения: число + обоснование + готовность закрыть сделку.
- Если оклад упёрся, переключаешься на остальной пакет.
- Фиксация в письме.
- Реакция на давление: спокойная, с готовностью принять «нет».
«Первое, что я скажу в звонке, — спасибо и что мне интересно: чтобы не было ощущения, будто я торгуюсь из вредности. Дальше попрошу время, но не абстрактно: "Это серьёзное решение, мне нужно пару дней. Отвечу в среду до конца дня". Конкретная дата снимает у рекрутера тревогу гораздо лучше, чем просьба "дайте подумать".
Пока думаю, я разбираю не оклад, а весь пакет. Что спрашиваю: из чего состоит бонус, от чего он зависит и сколько людей получили его полностью в прошлом году — «до трёх окладов» бывает нулём третий год подряд, и считать надо по гарантированной части. Когда ближайший пересмотр и что нужно сделать, чтобы он произошёл. Какой грейд по внутренней шкале и чем он отличается от следующего. ДМС — с какого месяца, со стоматологией или нет. Техника — дают ли ноутбук и можно ли выбрать. Формат работы — сколько дней в офисе и записано ли это в договоре, потому что устное «у нас все удалённо» меняется вместе с руководителем. Есть ли бюджет на обучение. И отдельно — дежурства: есть ли он-колл, как устроен график и оплачивается ли он, потому что неоплаченный он-колл — это скрытая часть зарплаты, которую плачу я.
Если хочу больше денег — иду одним раундом и с одним числом: "Мне очень интересна задача, я хочу к вам. Готов выходить, если оклад будет 700 — это верх той вилки, которую я называл, и он соответствует объёму: владение сервисом целиком плюс дежурства". И дальше я действительно готов сказать «да»: если мне дают 700, торг закончен, и я не прихожу через день с новой просьбой. Если по окладу потолок, переключаюсь на то, где свобода обычно есть: пересмотр через полгода с записанными критериями, подписной бонус, отпуск, дата выхода. Всё, о чём договорились устно, прошу отразить в письменном оффере — иначе через полгода этой договорённости просто не существует.
Про дедлайн «ответ до завтра» — я отношусь к нему спокойно и как к информации о компании. Скажу примерно так: "Понимаю, что сроки поджимают. Мне нужно два дня — это решение на пару лет. Если это совсем невозможно, скажите прямо, и я приму решение исходя из этого". По моему опыту, в большинстве случаев «невозможно» оказывается возможным: никто не отзывает оффер за просьбу подумать два дня после четырёх часов интервью. А если действительно отзовут — это ровно тот ответ, который мне нужен про то, как здесь устроены дедлайны в работе.»
Чего говорить нельзя
- «Да» прямо в звонке. Согласие голосом связывает: торговаться потом уже неудобно, а деталей пакета ты ещё не видел.
- Торговаться по кругу. «А можно ещё чуть-чуть?» на третьем заходе запоминают надолго и пересказывают коллегам.
- Просить и не быть готовым согласиться. Назвал 700, тебе дали 700, значит, выходишь. Иначе ты не переговорщик, а человек, который тянет время.
- Блефовать чужим оффером. Иногда отвечают «тогда удачи», и отыграть назад нельзя. Настоящий оффер упоминать можно и нужно.
- Верить устным обещаниям. «Через полгода точно пересмотрим» без строчки в оффере остаётся разговором, а не обещанием.
- Исчезать молча. Если ждёшь другую компанию, скажи об этом прямо и назови дату. Неделя молчания рушит доверие ещё до выхода.
- Устраивать скандал из-за дедлайна. «Это манипуляция, я так не работаю»: по сути ты прав, по форме проиграл.
Чем добить
Назови пункт, который почти никто не называет и который часто стоит дороже прибавки: зафиксированный срок и критерии пересмотра. «Через шесть месяцев ревью, критерии — вот эти, записаны в оффере» может принести больше денег за два года, чем плюс тридцать тысяч сейчас, и компании соглашаются на это охотнее, чем на выход за вилку грейда. И вторая фраза, которая хорошо звучит: «всё, о чём договорились устно, должно быть в письме — не из недоверия, а потому что люди меняются, а документ остаётся». Спокойная взрослая позиция, её уважают по обе стороны стола.
Каркас ответа
- Показать, что вопросы подготовлены, а не придуманы на месте.
- Три–пять вопросов из разных блоков, выбранных под роль собеседника.
- Реагировать на ответы, а не читать список: уточняющий вопрос ценнее следующего пункта.
- Одна фраза интереса с конкретной зацепкой из разговора.
- Закрыть сомнение, если оно повисло по ходу интервью.
- Спросить про следующий шаг и сроки обратной связи.
«Да, у меня есть несколько — я готовился. Начну с команды: из кого она состоит сейчас, какие грейды, кто будет работать рядом со мной? И связанный вопрос — почему открыта эта вакансия: команда растёт или кто-то ушёл?
Дальше про процесс. Что происходит, когда команда не успевает к сроку — режете скоуп, двигаете дату или как? Мне этот вопрос кажется самым честным индикатором культуры: по ответу видно всё сразу.
Про прод — два вопроса, они для меня важные. Есть ли дежурства, как устроен график и оплачиваются ли они? И второй: что было последним крупным инцидентом и что после него изменили? Я сам после своей истории с несовместимой миграцией вынес постмортем на общий разбор, и у нас из этого выросли правило расширяй-и-сжимай и проверка миграций в CI. Мне интересно, как это устроено у вас — есть ли постмортемы и во что они превращаются.
И про мою роль: как выглядит успех на этой позиции через полгода — что должно произойти, чтобы вы сказали, что наняли правильного человека? Плюс, если можно, какие две-три задачи ждут меня первыми.
Последний вопрос — вам лично: что вам самому сейчас больше всего не нравится в работе команды?»
[В конце] «Спасибо, мне стало гораздо понятнее. Отдельно скажу: то, что вы рассказали про переход интеграций на события, — это ровно тот класс задач, ради которого я и меняю работу, так что мне интересно. И честно обозначу: с Kubernetes у меня опыт как у пользователя — деплою, читаю логи, правлю манифесты, но глубоко в устройство кластера не лез; если для роли это критично, готов подтянуть в первые месяцы. Подскажите, какой следующий этап и когда ждать обратную связь?»
Чего говорить нельзя
- «Нет, вы всё рассказали». Самый дорогой ответ в этом блоке: читается как «мне всё равно, куда идти». Даже если правда всё рассказали, спроси про успех через полгода или про следующий шаг.
- «А чем занимается компания?» Не открыл даже сайт.
- Отпуск, ДМС, обеды и переработки у технического интервьюера. Это к рекрутеру и к моменту оффера.
- «Когда меня повысят?» До того, как взяли.
- «Как я справился, какие у меня шансы?» Ставит собеседника в неловкое положение: решение принимает не он и не сейчас.
- Вопросы-экзамены. Попытка показать, что ты разбираешься лучше, проигрывает при любом исходе.
- Читать список, не слушая ответы. И тем более задавать то, о чём уже подробно говорили полчаса назад.
- Пятнадцать вопросов подряд. Финал не допрос: три–пять точных выглядят гораздо сильнее.
Чем добить
Лучший вопрос всего списка: «что было последним крупным инцидентом и что после него изменили». Рекламой на него не ответить: тебе либо расскажут про постмортем, выводы и изменённый процесс (и это отличная компания), либо начнут искать в рассказе виноватых, либо скажут «инцидентов у нас не бывает», а это значит, что мониторинга нет. Любой из трёх ответов тебе полезен. И маленькая деталь, которая работает всегда: задай уточняющий вопрос к ответу. Это превращает твой список в разговор и показывает, что ты действительно слушал. Именно это остаётся в фидбэке формулировкой «с ним было интересно разговаривать».