Тема 02

Поведенческая секция и рассказ об опыте

Единственная секция собеса, где «правильный ответ» — это не факт, а структура. Здесь не проверяют знания: здесь проверяют, можно ли посадить тебя рядом с людьми и дать тебе прод. Плохая новость: техническая сила тут не спасает. Хорошая: всё это готовится заранее — буквально текстом, который ты один раз пишешь и три раза проговариваешь вслух.

Что реально проверяют этой секцией

Три вещи. Первая — умеешь ли ты рассказать про свою работу так, чтобы было понятно, что делал именно ты. Вторая — есть ли у тебя рефлексия: признаёшь ли ошибки, делаешь ли из них процессные выводы, а не «в следующий раз буду внимательнее». Третья — как ты ведёшь себя, когда есть несогласие, дефицит времени или размытое требование. Мидла отличает от джуна не знание каналов, а то, что он задаёт уточняющие вопросы до того, как начал писать код, и предупреждает о риске до дедлайна, а не после.

Главная ошибка подготовки

Люди готовят Go, БД, алгоритмы — и приходят на поведенческую «как есть», рассчитывая импровизировать. В итоге на вопрос «расскажи про сложную задачу» человек полторы минуты вспоминает, потом выдаёт бесструктурный поток на восемь минут, где половина — предыстория, а «мы» встречается сорок раз. Это обнуляет хорошую техническую секцию: остаётся впечатление «вроде знает, но что он делал руками — непонятно». Лечится ровно одним: четыре-пять заготовленных историй, записанных по STAR. STAR — это каркас рассказа из четырёх частей: обстановка, задача, действия, результат (по-английски Situation, Task, Action, Result — отсюда и буквы). Придуман он в HR для собеседований, а инженеру нужен ровно за тем, чтобы рассказ не утонул в предыстории. Подробно разбираем его в главе 2.2.

2.1Самопрезентация и рассказ о проекте

Первые две минуты собеса задают рамку всему остальному. Если из твоего рассказа интервьюер вынес «бэкендер на Go, делает CRM, отвечал за интеграции и наблюдаемость», дальше он будет копать туда, где ты силён. Если вынес «что-то про микросервисы», копать будет наугад.

Что на самом деле спрашивают словами «расскажите о себе»

Вопрос не про биографию. Он проверяет, умеешь ли ты упаковывать информацию, и заодно даёт интервьюеру крючки для следующих вопросов. Формально ты отвечаешь на «кто ты», фактически на три вопроса сразу:

  1. Что ты умеешь прямо сейчас? Роль, стек, домен, масштаб.
  2. Как ты к этому пришёл? Короткая траектория, из которой виден рост, а не список работодателей.
  3. Зачем ты здесь? Чего не хватает на текущем месте и почему именно их вакансия это закрывает.

Отсюда формула: настоящее → путь → чего хочу дальше. Именно в этом порядке, а не хронологически с института. Хронология проигрывает всему: самое важное (что ты умеешь сейчас) оказывается в конце, когда внимание уже уплыло.

Самопрезентация: две минуты, три блока, фиксированные пропорции 1. НАСТОЯЩЕЕ ~30 секунд 2. ПУТЬ И ДОСТИЖЕНИЯ ~60 секунд — ядро рассказа 3. КУДА ДАЛЬШЕ ~30 секунд 0:00 0:30 1:30 2:00 Имя, роль, сколько в Go Продукт: что за система, кому и зачем нужна Стек — одной строкой Проект целиком: архитектура в две фразы, твоя зона ответственности 2-3 достижения, каждое с цифрой: было X — стало Y, и как измерил Самое сложное решение и почему выбрал именно его, а не альтернативу Как работаешь с людьми: ревью, постановка, дежурства Чего не хватает на текущем месте Почему именно эта вакансия это закрывает Что сюда НЕ класть Биографию с института. Список всех мест работы по годам. Перечисление технологий без контекста («знаю Kafka, Redis, gRPC» — и что с ними делал?). Личное: семья, город, хобби. Это либо спросят, либо оно не нужно.
Пропорции важнее слов. Половина времени уходит на блок «что делал и с каким результатом», потому что оттуда интервьюер берёт следующие вопросы. Если этот блок короче рассказа про путь, разговор уедет в биографию.
Правило двух минут

Записать текст, прочитать вслух с секундомером, урезать до 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% трафика, несколько минут смотрят на ошибки и время ответа, и только если графики спокойные, раскатывают на остальных. Название от шахтёрской канарейки: маленькая часть трафика первой чувствует, что воздух испортился. Фича-флаг, переключатель в настройках, включает и выключает новое поведение без выкатки новой версии: код уехал в прод выключенным, включили одному отделу, что-то пошло не так, погасили флаг, а не откатывали весь сервис.

Карта, по которой идёшь, когда рассказываешь про проект Клиенты веб и мобилка API Gateway authn, rate limit CRM-бэкенд на Go — твоя зона HTTP / gRPC API хендлеры, валидация Воркеры очереди, ретраи Домен сделки, лиды, задачи Интеграции телефония, почта Наблюдаемость Prometheus + Grafana, алерты, канареечный деплой PostgreSQL миграции Redis кэш, локи Kafka события Три фразы, которые обязаны прозвучать 1) «Система делает вот это для вот таких пользователей» — смысл. 2) «Я отвечал вот за эти куски» — граница. 3) «Самое сложное было здесь, решили так, потому что...» — глубина. Без третьей фразы это просто список технологий.
Главное на схеме: зона ответственности. Интервьюер весь рассказ пытается понять, где заканчивается «наша команда» и начинается «я». Проведи эту границу словами сам, иначе он будет вытаскивать её вопросами, а это уже похоже на допрос.

Цифры: что готовить и что делать, если их нет

Цифра в рассказе работает как доказательство. «Ускорил ручку» не весит ничего. А вот «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% запросов без ошибок за месяц»Понять, был ли у тебя прод в настоящем смысле словаАлерты, разборы инцидентов (их называют постмортемами), страница статуса
Цифры в рассказе: три уровня достоверности Выдумка «у нас миллионы запросов» Ломается одним вопросом: «а сколько это в пике?» — и ответа уже нет Честная оценка «порядка 300-500 RPS, точнее не скажу, давно не смотрел» Это нормально. Главное — назвать порядок и признать погрешность Измерено «~400 RPS в пике, p99 120 мс, база 180 ГБ, команда 6 человек» Цифра из Grafana или из БД. Уровень, на который целимся За час до собеса открыть дашборд и выписать 6-8 чисел на бумажку — это вся подготовка Если доступа к метрикам уже нет Считай от бизнеса: 12 000 сделок в день — это 0,14 сделки в секунду, а на каждую за её жизнь набегают сотни запросов: карточка, списки, звонки. Итого десятки RPS в среднем и сотни в рабочие часы, пик в 3–5 раз выше среднего. Так и говори: «оценочно».
Погрешность простят, выдумку нет. Фразу «порядка, точнее не скажу» воспринимают нормально. А круглая красивая цифра, которая рассыпается от одного уточнения, подрывает доверие ко всему остальному рассказу.
Как называть цифру, если точной нет
  • Порядок вместо точности: «сотни RPS», «десятки гигабайт», «единицы миллионов строк».
  • Явная оговорка. Хватает одного слова, «по памяти», «оценочно», «на глаз из дашборда», и цифра из вранья превращается в честную оценку.
  • Вывод из бизнес-объёма: «примерно 12 тысяч сделок в сутки, на каждую за её жизнь сотни запросов — отсюда и порядок».
  • Никогда не округляй вверх «чтобы солиднее». Опытный интервьюер спросит «а как эта нагрузка распределена по суткам?» или «а какой инстанс это держал?», и всё станет видно.
Подвох: «расскажите про самое сложное»

Сложное не значит объёмное. «Мы переписали монолит на микросервисы» говорит о масштабе, а не о сложности, и спросить оттуда лично у тебя почти нечего. Сложное начинается там, где было несколько разумных вариантов и пришлось выбирать. Идемпотентность вебхуков, порядок обработки событий, миграция без даунтайма, консистентность между сервисами: из такого получается глубокий разговор. Заранее выбери одну тему и подготовь альтернативы, которые ты отверг, и почему. Именно это отличает мидла от джуна, который «сделал как получилось».

Вопросы

4
Суть: три блока в фиксированном порядке — настоящее → путь и достижения → чего хочу дальше. Две минуты, половина времени на достижения с цифрами.

Каркас ответа

  1. Кто я сейчас (~30 с): имя, роль, сколько лет пишу на Go, что за продукт и для кого. Стек в одну строку, без перечисления всего, что видел.
  2. Проект и достижения (~60 с): что за система, за что отвечал я, два-три результата с цифрами в формате «было X — стало Y».
  3. Чего хочу дальше (~30 с): чего не хватает сейчас и почему именно эта вакансия это закрывает. Заодно здесь же снимается будущий вопрос «почему уходишь».
  4. Передача хода: «с чего вам удобнее начать — с архитектуры или с конкретных задач?» Это выглядит уверенно и экономит время обоим.

Образец под профиль «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; если много легаси, на миграциях без даунтайма. Один и тот же рассказ с разными акцентами выглядит как «человек прочитал вакансию», а это редкость.

Суть: сверху вниз — бизнес-смысл, архитектура крупными мазками, граница «я / команда», и только потом детали. Стек называется последним, а не первым.

Каркас ответа

  1. Что делает система и для кого. Две фразы. Без этого всё дальнейшее висит в воздухе.
  2. Как устроена. Сколько сервисов, кто с кем как общается (синхронно / через события), где живёт состояние, как деплоится.
  3. Где здесь я. Прямым текстом: «я отвечал за такие-то сервисы и такие-то задачи». Если что-то делал не ты, так и скажи, это не минус.
  4. Как это работает в динамике. Проведи один запрос через всю систему: от кнопки в интерфейсе до записи в БД и события в Kafka. Так проще всего показать, что ты понимаешь систему целиком.
  5. Масштаб цифрами. RPS, объём данных, размер команды, темп релизов.
Так это звучит вслух

«CRM для отделов продаж: менеджеры ведут в ней лиды и сделки, руководители смотрят воронку и отчёты. Бэкенд разбит на несколько Go-сервисов: сервис сделок и лидов — это ядро, отдельно сервис интеграций с телефонией и почтой, отдельно сервис отчётов, который читает с реплики. Между собой синхронно ходим по gRPC, наружу отдаём REST через gateway, который закрывает аутентификацию и лимиты. Всё, что не должно блокировать пользователя, уезжает событием в Kafka: уведомления, пересчёт воронки, вебхуки во внешние системы. Состояние — Postgres, миграции через goose в отдельном шаге пайплайна; в Redis кэш справочников и распределённые локи. Крутится в Kubernetes, раскатка канареечная.

Моя зона — сервис сделок и сервис интеграций целиком: схема данных, API, воркеры, миграции. Плюс наблюдаемость на всей команде: метрики, дашборды и алерты в Prometheus с Grafana я поднимал сам. Отчётами занимался коллега, фронт — отдельная команда.

Если провести один запрос: менеджер меняет статус сделки → gateway проверяет токен → сервис сделок валидирует переход по машине состояний, пишет в Postgres в транзакции вместе с записью в служебную таблицу outbox — «исходящий ящик» → отдельный воркер вычитывает её и публикует событие в Kafka → подписчики шлют уведомление и пересчитывают воронку. Outbox взяли именно потому, что "записать в БД и отправить в Kafka" без него не атомарно.»

Чего говорить нельзя

  • Начинать со стека. «У нас Go, Postgres, Kafka» перечисляет зависимости, а не рассказывает о проекте.
  • Сплошное «мы». Если во всём ответе ни разу не прозвучало «я сделал», интервьюер не поймёт, что делал именно ты, и решит, что ничего.
  • Присваивать чужое. Достаточно одного уточняющего вопроса вглубь, чтобы это вскрылось. Гораздо сильнее звучит «это делал коллега, я знаю верхнеуровнево».
  • Раскрывать то, что нельзя. Внутренние формулы, персональные данные, коммерческие цифры компании. Говори про архитектуру и порядки величин, а не про конкретику под NDA, и скажи об этом прямо: это плюс, а не минус.
Приём, который выделяет

Нарисуй схему. Очно на доске, по видео попроси разрешения пошарить экран и набросать в любой рисовалке, или просто проговори «представьте три прямоугольника». Кандидат, который раскладывает рассказ по картинке, выглядит как человек, который так же будет объяснять и коллегам. Схему набросай заранее, один раз, и держи её в голове.

Суть: сложное = там, где было несколько разумных вариантов и пришлось выбирать. Ответ обязан содержать отвергнутые альтернативы и причину выбора.

Каркас ответа

  1. Проблема в одной фразе, и почему она не решалась «просто».
  2. Варианты: два-три, каждый с плюсом и минусом. Это ядро ответа.
  3. Выбор и критерий: почему именно этот, по какому признаку сравнивал.
  4. Как проверил, что не ошибся: метрики, нагрузочный тест, канареечная раскатка.
  5. Что бы сделал иначе сейчас. Эта фраза почти всегда добавляет к оценке.
Так это звучит вслух

«Самым сложным была идемпотентность обработки звонков. Провайдер телефонии шлёт вебхук о завершённом звонке и ретраит его, если мы не ответили 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, там было несколько сервисов, исторически сложилось, что...», а через три минуты всё ещё объясняет контекст. Интервьюер перебивает («а что конкретно вы сделали?») и получает две фразы. В итоге он унёс с собой подробное описание чужого проекта и ноль информации про кандидата. Не потому, что человек слабый: просто рассказывать контекст легко, а формулировать свой вклад трудно, и без структуры мозг всегда выбирает лёгкое.

STAR: четыре части и сколько времени на каждую из двух минут S — Situation ~20 сек T — Task ~20 сек A — Action ~55 сек — ядро всей истории R — Result ~30 сек 0:00 0:20 0:40 1:35 2:05 S — Situation Где это было и что за система. Ровно столько контекста, чтобы стала понятна задача. Ловушка: пересказ проекта T — Task Что нужно было сделать мне лично, кто поставил, какие были ограничения по срокам и по данным. Ключевое слово: я, не мы A — Action Пошагово, что делал сам. Какие варианты смотрел и по какому критерию выбрал. Что делал, когда пошло не по плану. R — Result Цифра или проверяемый факт: было X, стало Y. Что осталось в процессе после меня. И одна фраза про то, чему научился. Правило пропорции: S плюс T — это треть истории, а не половина Если через минуту рассказа ты всё ещё описываешь, как у вас всё устроено, — история провалена, даже если дальше будет отличный технический разбор. До «дальше» просто не доедут: перебьют и перейдут к следующему вопросу.
Весь метод в пропорциях. Буквы запомнить легко, а работает только распределение времени: минута на то, что делал ты, полминуты на результат и всего сорок секунд на весь контекст вместе с постановкой задачи.
ЧастьВремяЧто должно прозвучатьТипичная ошибка
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. Дальше выпиши из каждой истории пять опорных слов: запоминать надо их, а не текст. На собесе ты рассказываешь по опорным словам своими словами, и слышно, что это рассказ, а не заготовка. После трёх прогонов вслух история перестаёт разваливаться.

Как аргументировать в техническом споре

Половина поведенческих вопросов так или иначе про спор. Поэтому про механику аргумента стоит знать отдельно: спор идёт по лестнице из четырёх уровней, и на всех уровнях ниже четвёртого спорят личности, а не решения.

Лестница аргумента: от вкуса к измеримому критерию 1. Вкус «Мне так не нравится», «я всегда пишу иначе» — это предпочтение, а не аргумент. Спор превращается в перетягивание каната: побеждает тот, кто упрямее или старше по должности. 2. Авторитет «Так не принято», «в книжке написано», «в стандартной библиотеке так не делают». Уже лучше, но проверить нельзя: у собеседника найдётся своя книжка и свой контрпример. 3. Сценарий «Смотри, что будет дальше: добавим третий флаг — восемь комбинаций, три из них бессмысленны». Спор уже не про вкус: обсуждается конкретное последствие, и его можно проверить примером. 4. Критерий и цена «Критерий — сколько веток надо покрыть тестами и понятен ли вызов без перехода к сигнатуре». Дальше вопрос не «кто прав», а «какой вариант дешевле по этому критерию» — это уже решаемо. Что происходит, когда спор поднялся на четвёртый уровень Появляется общий критерий — и дальше спорят не люди, а варианты. Иногда выясняется, что по этому критерию прав собеседник: тогда ты меняешь позицию, и это плюс. История «я передумал от данных» звучит сильнее истории «я победил».
Техника спора одна: поднять его на уровень выше. Если оппонент на первом уровне, а ты сразу называешь критерий и считаешь по нему цену, эмоции уходят из разговора сами: спорить с числом трудно, а с «мне не нравится» бесполезно.
Формулировка, которая работает почти всегда

«Давай сначала договоримся, по какому критерию выбираем». Одна фраза, а вытаскивает любой спор с первого уровня на четвёртый. Критерии для кода почти всегда одни и те же: читаемость на месте вызова, число веток, которые придётся тестировать, стоимость следующего изменения, вероятность ошибиться при использовании. На собесе именно эта фраза в истории про спор даёт больше всего очков.

Вопросы

5
Суть: Situation → Task → Action → Result. Пропорция важнее букв: треть времени на контекст и постановку, две трети — на действия и результат. Два с небольшим минуты на историю.

Каркас ответа

  1. Назвать четыре части и сразу сказать, зачем метод нужен: он не даёт свалиться в пересказ контекста.
  2. S — обстановка, ~20 секунд: система, момент, кто страдал. Две-три фразы, без экскурсии по архитектуре.
  3. T — задача, ~20 секунд: что нужно было сделать лично мне и с какими ограничениями.
  4. A — действия, ~55 секунд: шаги от первого лица, какие варианты рассматривал, по какому критерию выбрал, что делал, когда пошло не по плану. Это ядро.
  5. 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()) // понятно, не открывая сигнатуру

Каркас ответа

  1. S: ревью PR коллеги, в сигнатуру добавлялся второй булев флаг. Одна фраза.
  2. T: как ревьюер я должен был либо согласиться, либо внятно объяснить, почему нет. Не «настоять на своём».
  3. A: как я поднял спор с уровня вкуса до уровня критерия. Это ядро. Назвать критерии: читаемость на месте вызова, число комбинаций, которые надо тестировать, стоимость следующего флага.
  4. A: что предложил конкретно и что услышал в ответ. У коллеги был контраргумент, его тоже надо назвать.
  5. R: к чему пришли, что закрепили в договорённостях команды и в чём я сам оказался не прав.
Образец ответа

«Был спор на ревью. Коллега добавлял в метод обновления сделки второй булев параметр — сначала там появился notify, теперь добавлялся skipValidation. Я это заблокировал, и он резонно спросил: а что не так, работает же.

Первое, что я сделал, — не стал говорить "мне так не нравится". Я предложил сначала договориться о критерии, по которому мы вообще выбираем. Мы сошлись на трёх: понятно ли читателю место вызова без перехода к сигнатуре, сколько веток придётся покрывать тестами и сколько будет стоить следующий такой флаг.

Дальше я просто посчитал по этим критериям. Читаемость: строка s.Update(ctx, deal, true, false) на другом конце проекта не читается вообще, надо открывать сигнатуру. Ветки: два флага — четыре комбинации, и одна из них бессмысленна — пропустить валидацию, но при этом послать уведомление о сделке, которая заведомо кривая. То есть тип позволяет выразить состояние, которого не должно существовать. Стоимость следующего: третий флаг даст восемь комбинаций, из которых осмысленны от силы пять, и в тестах это разложить уже нереально.

Предложил два варианта: либо развести на отдельные методы — Update, UpdateSilently, ImportUpdate, — либо функциональные опции, если флаги правда независимы. Коллега возразил по делу: раздельные методы дадут дублирование тела и придётся выносить общий приватный метод, а это лишний слой. Аргумент честный, я его принял. В итоге сошлись на функциональных опциях: место вызова стало читаемым, невалидная комбинация просто не выражается — опции, отключающей валидацию, снаружи пакета нет вообще, импорт вызывает отдельный внутренний путь.

Результат: PR прошёл в тот же день, и мы записали в договорённости команды одну строчку — "булев параметр в публичной сигнатуре только один и только если он читается на месте вызова". Для меня главный вывод был другой: если бы я в первом же комментарии написал "флаги — зло", мы бы спорили неделю. Спор закончился за полчаса ровно потому, что сначала договорились о критерии, а потом уже считали.»

Чего говорить нельзя

  • «Я объяснил, и он согласился». Спор без контраргумента не спор, а лекция. Обязательно назови, что тебе возразили: так видно, что ты слышишь собеседника.
  • «Позвал тимлида, он решил». Эскалация первым шагом выдаёт, что договариваться ты не умеешь. Последним шагом она нормальна, и то с формулировкой «нужен арбитр, время идёт».
  • Спор про вкусовое. Табы против пробелов, длину строки, порядок импортов решают линтер и форматтер, а не спор. История про такой спор показывает одно: битву ты выбрал не ту.
  • Ни одной уступки за всю историю. Если по всем пунктам прав оказался ты, это звучит неправдоподобно и высокомерно.
  • Личное. «Он junior, я объяснил, как правильно» проваливает всю историю. Грейд не аргумент. Грейд здесь значит ступеньку на внутренней лестнице компании: джун, мидл, сеньор и их подступени вроде «мидл+». В споре он не весит ничего: прав тот, у кого есть критерий и цифра, а не тот, кто выше по лестнице. Подробнее про грейды в главе 2.5, там от них зависят деньги.

Чем добить

Скажи, как ты формулируешь блокирующие замечания: вопросом, а не приказом, и с явной пометкой уровня. «Правильно ли я понимаю, что комбинация skipValidation плюс notify невалидна? Если да — может, вынесем в отдельный метод, чтобы её нельзя было выразить?» И отдельно скажи, что отсутствие флага в сигнатуре часто важнее любого код-стайла: хороший API не даёт выразить невалидное состояние. Это уже разговор про дизайн, а не про ревью.

Суть: порядок действий — сначала остановить кровь, потом искать причину. И главное в истории не героический дебаг, а системное изменение после: алерт, тест, линтер, правило — то, что не даст этому классу ошибок повториться.

Каркас ответа

  1. S: что сломалось и кто это почувствовал. Одна-две фразы, обязательно с масштабом («часть пользователей получала 500 на списке сделок»).
  2. T: моя роль: был дежурным / поднял тревогу / вёл починку.
  3. A, шаг 1, остановить кровь. Это называют митигацией: временная мера снимает боль, но причину не лечит. Что сделал, чтобы пользователям стало легче прямо сейчас, до понимания причины (откат канарейки, фича-флаг, лимит).
  4. A, шаг 2, диагностика: по каким сигналам шёл. Метрики → логи → трейсы → состояние БД. Обязательно назови гипотезы, которые отбросил.
  5. A, шаг 3, фикс: что именно правил и как убедился, что помогло.
  6. 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, про то, как сообщали клиентам, про компенсации. Лучше настоящий масштаб.

Чем добить

Назови две метрики словами, время до обнаружения и время до восстановления, и скажи, какую из них ты сокращал. Почти все кандидаты чинят вторую (быстрее откатывать), а по-настоящему ценно сокращать первую, чтобы система сообщала о проблеме раньше, чем менеджер продаж в чате. Ещё сильный ход: сказать, что после инцидента ты сам написал постмортем, даже если ошибка была не твоя.

Суть: история про процесс, а не про код. Ключевые точки — уточняющие вопросы до начала работы, декомпозиция на куски по полдня-день, оценка с явной неопределённостью, и честный рассказ о том, где оценка поехала и что ты с этим сделал.

Каркас ответа

  1. S: что за фича и зачем она бизнесу. Одна фраза, обязательно с бизнес-смыслом.
  2. T: что было на входе (часто это размытая постановка) и что я должен был дать на выходе.
  3. A, уточнение: какие вопросы задал до начала. Это первое, что отличает мидла.
  4. A, декомпозиция: на какие куски разрезал и по какому принципу. Хороший принцип, например, «каждый кусок можно смержить и выкатить отдельно».
  5. A, оценка: как оценивал и чем закрывал неопределённость: спайк (день на разведку незнакомого куска, после которого даёшь оценку), вилка вместо одного числа, буфер на непредвиденное.
  6. A, что пошло не так: обязательный элемент. Без него история выглядит вылизанной.
  7. R: выкатили так-то, эффект такой-то, и что поменял в своём подходе к оценке.
Образец ответа

«Делал массовые операции над сделками: менеджеру нужно было выделить пачку сделок в списке и, например, перевести их все в другой статус или переназначить на другого сотрудника. До этого он делал это по одной, и на сотне сделок это был час кликов.

Постановка пришла в одну строчку: "сделать массовое изменение статуса". Прежде чем что-то писать, я задал четыре вопроса. Первый: какой максимальный размер пачки — ответ "иногда весь фильтр", а под фильтр могло попасть и пятьдесят тысяч сделок, и это сразу меняло дизайн. Второй: что делать, если часть сделок не проходит — переход по машине состояний запрещён или нет прав. Оказалось, продакт вообще про это не думал; договорились, что операция частичная: что смогли — применили, по остальным вернули список причин. Третий: нужно ли это в истории изменений и в уведомлениях — да, но уведомление одно на пачку, а не пятьдесят тысяч писем. Четвёртый: синхронно или можно фоном — сошлись, что до сотни сделок синхронно, дальше фоновая задача со статусом.

Декомпозировал на пять кусков, каждый мержится отдельно: миграция под таблицу фоновых операций; доменная функция применения перехода к списку с накоплением ошибок; синхронная ручка для маленьких пачек; воркер и ручка статуса для больших; уведомления и запись в историю. Оценил в восемь дней и явно сказал, что в оценке есть один рисковый пункт — поведение на больших пачках, там могу ошибиться в полтора раза.

Не по плану пошло именно там, где я и предупреждал, но с другой стороны. На тестовых данных с пятьюдесятью тысячами сделок одна транзакция на всю пачку держала блокировки несколько минут и мешала обычной работе — параллельные обновления тех же сделок вставали в очередь. Пришлось переделать на батчи по пятьсот записей с отдельной транзакцией на батч и сохранением прогресса, чтобы операция была возобновляемой. Это добавило два дня. Как только я это увидел, я не стал молча догонять: в тот же день написал продакту, что вижу риск, и предложил три варианта — сдвинуть на два дня, или выкатить в первой версии только синхронный режим с лимитом в сто сделок, или урезать переназначение сотрудника и оставить только статус. Выбрали второй: выкатили лимитированную версию в срок, а фоновый режим приехал через неделю.

По итогу: массовая операция закрыла реальную боль, время на типовую пачку упало с часа до пары минут. А для себя я поменял подход к оценке — теперь на любую задачу, где есть слово "массово" или "все", я закладываю отдельный день на проверку поведения на реальном объёме данных, до того как называю срок.»

Про оценку: что говорить, если спросят «как вы оцениваете задачи»

  • Резать до кусков в полдня-день. Всё, что оценено «дня в три», на деле оценено наугад: такой кусок режь дальше, и обычно при этом вылезает забытая работа.
  • Не забывать невидимое: миграции и их откат, тесты, ревью и время на его ожидание, выкатка и наблюдение за канарейкой, документация, фича-флаг.
  • Называть вилку и её причину: «шесть дней, если схема данных подойдёт как есть, восемь-девять, если придётся перелить историю задним числом (это называют backfill)». Вилка без причины выглядит как торг.
  • Спайк на неизвестное: если в задаче есть кусок с незнакомой технологией, признаться «дайте день на разведку, после него дам оценку» сильнее, чем угадать число.

Чего говорить нельзя

  • «Всё прошло по плану». Либо задача была тривиальная, либо ты не помнишь. И то и другое минус.
  • «Постановка была плохая, поэтому не успели». Уточнить плохую постановку было твоей работой. Пусть виноват аналитик, но спросят с тебя, и интервьюер это знает.
  • Оценка одним числом без обоснования. «Сказал две недели», а почему две?
  • Тихо догонять. История, где ты обнаружил риск и молча работал по вечерам, получается про то, что менеджеру с тобой некомфортно: он узнаёт о проблемах последним.

Чем добить

Скажи про порядок нарезки: первым выкатывают самый рисковый кусок, а не самый понятный. Если непонятно, выдержит ли БД массовую операцию, это делают первым, пусть даже заглушкой: именно от этого зависит, останется ли план в силе. Кандидаты обычно нарезают по слоям (сначала БД, потом сервис, потом ручка), а нарезка по риску и по возможности выкатить каждый кусок отдельно звучит гораздо взрослее.

Суть: инициатива ценится не сама по себе, а в связке «увидел проблему в цифрах → сделал маленький пилот → показал эффект → закрепил в процессе». И обязательно — как ты это протащил через людей, а не сделал в тайне по ночам.

Каркас ответа

  1. S: что раздражало и чем это измерялось (или не измерялось вообще, и тогда это первая проблема).
  2. T: задачу никто не ставил, я сам решил, что это надо. Так и скажи прямо.
  3. A, продажа идеи: как объяснил ценность в терминах боли команды и бизнеса, а не технологии.
  4. A, минимальный пилот: сделал маленький кусок на одном сервисе, а не проект на квартал.
  5. A, масштабирование: как раскатил на остальное и как сделал так, чтобы это не развалилось без тебя.
  6. R: измеримый эффект и то, что этим пользуются до сих пор.
Образец ответа

«Самое полезное, что я сделал по своей инициативе, — наблюдаемость и канареечная раскатка. Когда я пришёл, релиз был событием: катили раз в две недели вечером, всей командой смотрели в логи, и если что-то шло не так, узнавали об этом из чата поддержки. Метрики формально были — стандартные метрики от библиотеки, — но дашборда, на который смотрят, не существовало, и алертов не было ни одного.

Задачу мне никто не ставил, я сам её принёс. Но продавал я её не как "давайте поставим Prometheus" — это никого не трогает. Я взял три последних инцидента и посчитал, сколько времени в каждом ушло от момента поломки до момента, когда мы вообще узнали: получилось от сорока минут до трёх часов. С этой цифрой пошёл к тимлиду: вот наша реальная цена отсутствия алертов, я хочу потратить неделю и сократить её до минут.

Начал с малого — с одного сервиса сделок. Завёл три базовые метрики: количество запросов, доля ошибок, гистограмма длительности по ручкам. Сделал один дашборд, где на первом экране видно состояние сервиса, и три алерта: доля пятисоток, p99 выше порога, и рост занятости пула соединений. Сознательно не стал делать двадцать алертов: лучше три, на которые реагируют, чем двадцать, которые заглушат.

Дальше — раскатка. Вынес общие метрики в маленькую внутреннюю библиотеку с одним middleware, чтобы подключение к новому сервису стоило три строки. Когда цифры появились, появился и следующий шаг: раз мы теперь видим ошибки и латентность в реальном времени, можно катить не всё сразу. Настроили канареечный деплой: десять процентов трафика, десять минут наблюдения, автоматический откат по превышению доли ошибок. Отдельно привёл в порядок миграции: раскатка схемы отдельным шагом пайплайна, только совместимые вперёд изменения, чтобы откат приложения не ломал базу.

Результат в цифрах: время от поломки до обнаружения упало с десятков минут, а то и часов, до одной-двух — алерт приходит раньше, чем жалоба. Релизов стало несколько в неделю вместо одного в две недели, и релиз перестал быть вечерним событием. Самое ценное для меня — что это пережило меня как инициатора: дашбордом пользуется вся команда, а на новых сервисах метрики подключают сами, потому что это три строки, а не проект.»

Чего говорить нельзя

  • «Сделал по ночам и поставил перед фактом». Это не инициатива, а обход команды. Даже если так и было, расскажи, как ты потом это защищал и передавал.
  • «Переписал legacy-модуль, потому что он был ужасный». Без измеренной проблемы улучшение выглядит вкусовщиной за деньги компании. Цифра «до» нужна всегда.
  • Инициатива ради технологии. «Затащил Kafka», а какую боль это закрыло? Если ответ «стало модно/интересно», любой тимлид увидит красный флаг.
  • Инициатива, которой никто не пользуется. Если «написал генератор, но команда не перешла», рассказывай про то, почему не перешли и что ты понял, а не про генератор.

Чем добить

Расскажи, во что подключение обходится остальным: сколько строк надо написать коллеге и сколько нового ему надо выучить. Инициативы умирают не потому, что они плохие, а потому что их дорого принять. По фразе «я специально сделал так, чтобы подключение стоило три строки и не требовало ничего знать про Prometheus» сразу видно человека, который уже внедрял что-то в живой команде, а не только предлагал.

2.3Неудобные вопросы

Провал, конфликт, сорванный срок. Здесь проверяют не «был ли грех», а есть ли у тебя рефлексия и не превращаешься ли ты в проблему для команды, когда всё идёт плохо. Ответ «у меня такого не было» хуже любого честного рассказа.

Зачем вообще спрашивают про плохое

У интервьюера гипотеза простая: то, как человек рассказывает о своих ошибках сейчас, показывает, как он будет вести себя во время инцидента через полгода. Если в рассказе виноваты аналитик, тестировщик и менеджер, то в его команде виноватыми будут те же люди. Если ошибка признана, но выводов нет, она повторится. Если ошибки «не было», то либо не было ответственности, либо нет рефлексии, и оба варианта плохи.

Отсюда рабочая формула честного ответа: признал → что сделал → что изменил в процессе. Третий пункт важнее всех, и его почти всегда пропускают. Он и превращает «я накосячил» в «я закрыл целый класс ошибок».

Вопрос «расскажите про свой провал»: четыре типа ответа 0. Отрицание «Провалов не было, всё всегда получалось» Читается как: не было ответственности за прод 1. Перевод стрелок «Аналитик плохо описал, тестировщик пропустил» Читается как: в команде он будет искать виноватых 2. Честно, но пусто «Уронил прод, было стыдно, больше не буду» Нет системного вывода — значит, повторится 3. Полный ответ Факт, мой вклад, как чинил, что изменил Класс ошибок закрыт инструментом, а не волей Доверие растёт слева направо: интервьюер ищет не безгрешность, а способность делать выводы 1. Признал что именно сломал я, без «так вышло» 2. Что сделал как чинил, за какое время, чем проверил 3. Что изменил правило, тест, алерт, линтер, чек-лист Проверка своей истории на прочность Вычеркни из неё всё, что произошло после починки. Если ничего не осталось — вывода нет, история пустая. И наоборот: если третий шаг сильный, первые два можно рассказать коротко — интервьюер уже всё понял.
Третий шаг решает всё. Кандидаты подробно рассказывают, как чинили, и одной фразой упоминают, что изменилось после. Пропорции нужны обратные: починка интересна как деталь, а системное изменение и есть ответ на вопрос.
Чего в ответе про провал быть не должно
  • «У меня не было провалов». Худший вариант из возможных. Значит одно из двух: либо ты не работал с продом, либо не считаешь свои ошибки ошибками.
  • Виноватые с именами и должностями. Даже если правда на твоей стороне, интервьюер примеряет: так же он будет рассказывать про нас.
  • Фальшивый провал. «Мой недостаток — я слишком въедливый, из-за этого один раз задержал релиз на день». Это самопохвала в маскировке, а не провал, и её слышно сразу.
  • Провал космического масштаба. «Из-за меня компания потеряла клиента на десять миллионов»: если это правда, придётся объяснять, почему тебя допустили до такого в одиночку. Масштаб у хорошего провала заметный, но переживаемый: минуты-часы деградации, а не крах бизнеса.
  • «Больше не повторится, буду внимательнее». Внимательность не масштабируется. Пока не изменился инструмент, повторится.

Конфликт и техническое несогласие

Слово «конфликт» в вопросе пугает, но спрашивают на самом деле про другое: умеешь ли ты довести несогласие до решения, не превратив его в личное. В хорошем ответе спор почти всегда переводят из плоскости мнений в плоскость данных и trade-offs. Это английское слово прижилось без перевода и означает «что мы за этот вариант получаем и чем за него платим». Кэш даёт скорость, платим за неё устареванием данных. Индекс ускоряет чтение, платим скоростью записи и местом на диске. Спор про trade-off всегда решаем, потому что цены можно сравнить; спор про «мне так больше нравится» не решить.

Аргументация, которая не работает
  • «Я так думаю» / «мне кажется, так лучше»
  • «Это же очевидно»
  • «Так делают все нормальные команды»
  • «У меня больше опыта»
  • «Мы всегда так делали»
  • Спор в чате на сорок сообщений вместо пятнадцатиминутного созвона
Аргументация, которая работает
  • «Давай сначала договоримся о критерии выбора»
  • «Вот замер: с индексом 210 мс, с кэшем 40 мс, но плюс инвалидация»
  • «У варианта А цена вот такая, у Б — вот такая. Что для нас дороже?»
  • «Что должно случиться, чтобы ты изменил мнение?»
  • «Давай зафиксируем решение и условие, при котором вернёмся к нему»
  • «Не согласен, но принимаю — делаю как решили, в полную силу»
Disagree and commit: «не согласен, но принимаю»

Формулировка американская и переводится примерно так: не согласен, но принимаю решение и делаю в полную силу. Принцип простой: до решения спорь сколько угодно, после решения работай на него как на своё. На собесе это звучит так: «я остался при своём мнении, но решение приняли другое, и я сделал его качественно — саботировать решение команды и потом говорить "я же предупреждал" мне кажется худшим, что можно сделать». Обязательное дополнение, по которому узнают зрелого инженера: зафиксировать условие пересмотра, скажем «договорились вернуться к этому, если p99 вырастет выше 500 мс». Тогда спор не тлеет: у него есть точка выхода.

Срок горит: механика правильного поведения

Вопрос здесь не «что делать», а когда сказать. Плохая новость за неделю до срока остаётся рабочей ситуацией с вариантами. Та же новость в день дедлайна превращается в сорванный дедлайн, и вариантов нет уже ни у кого.

Когда сказать, что не успеваешь Хорошо: в момент, когда стало ясно Прихожу не с проблемой, а с тремя вариантами: урезать скоуп / сдвинуть дату / добавить руки. Решение принимает продакт — но у него есть выбор. старт оценка поехала половина срока за два дня дедлайн Плохо: молчал и догонял по вечерам К этому моменту урезать скоуп уже поздно, сдвинуть дату — тоже: её уже кому-то назвали. Вывод для команды: он узнаёт о проблемах последним.
Ценность не в честности, а в опережении. Две точки на этой линии различаются одним: в первой у менеджера есть три варианта, во второй ни одного. Поэтому «сказал заранее» на собесе весит больше, чем «в итоге всё-таки успел».
Протокол «не успеваю» в четыре шага
  1. Пересчитать честно. Не «наверное, успею», а сколько реально осталось работы и какая новая дата, если ничего не менять. Число, а не ощущение.
  2. Сказать сразу, письменно и адресно. Тому, кто отвечает за срок, а не в общий чат. Формат: «риск такой-то, причина такая-то, новая оценка такая-то».
  3. Принести варианты, а не проблему. Минимум три: урезать скоуп (что именно можно выкинуть или отложить и что от этого потеряется), сдвинуть дату, подключить второго человека (с оговоркой, что это ускоряет не всегда). Свою рекомендацию назвать явно.
  4. Договориться о точке контроля. «Проверим в четверг: если к этому моменту миграция не поедет, идём по варианту с урезанным скоупом». Это снимает тревогу у всех.

Красные флаги: что интервьюер слышит на самом деле

Фраза в ответеЧто слышит интервьюерКак надо
«У меня не было провалов / конфликтов»Нет ответственности или нет рефлексииВзять реальный случай среднего масштаба и рассказать по формуле
«Виноват был аналитик / тестировщик / менеджер»Так он будет говорить и про нашу команду«Постановка была размытая — и это была моя работа её уточнить, я этого не сделал»
«Мы всё исправили» (в истории про свою ошибку)Прячется за командой, когда неприятно«Ошибку допустил я, чинили вместе, отдельно расскажу, кто что делал»
«Больше не повторится, буду внимательнее»Вывода нет, повторитсяНазвать инструмент: линтер, тест, алерт, правило ревью, изменённый пайплайн
«В итоге я оказался прав»Спорит, чтобы победить, а не чтобы решитьНазвать, в чём был прав оппонент и что ты у него взял
«Я просто сделал как сказали, хотя был против»Пассивная агрессия, потом «я же предупреждал»Disagree and commit плюс зафиксированное условие пересмотра
«Пришлось выйти в выходные, но мы успели»Героизм вместо процессов; выгорит и уйдёт«Я поднял риск за неделю, вместе урезали скоуп и выкатили в срок»
«Там всё было очень плохо, легаси, никто ничего не документировал»Жалуется, а не меняет«Было мало документации — я завёл описание домена, к которому теперь ходят новички»
Долгая пауза и «дайте подумать» на каждом таком вопросеНе готовился, историй нетЗаготовленные четыре истории — пауза в пять секунд нормальна, в тридцать нет

Вопросы

4
Суть: формула признал → что сделал → что изменил в процессе. Масштаб — заметный, но переживаемый. Вывод — инструмент, а не «буду внимательнее». Никаких виноватых по именам.

Каркас ответа

  1. Назвать ошибку прямо, в первой фразе. Без разгона и без смягчений: «я выкатил миграцию, которая сломала работу списка сделок на несколько минут».
  2. Признать свой вклад точно. Что именно сделал не так и почему тогда это казалось нормальным.
  3. Как чинил. Коротко: что выбрал, откат или движение вперёд, и почему.
  4. Что изменилось после. Это ядро: правило, автоматическая проверка, изменённый порядок работы. Желательно два-три конкретных пункта.
  5. Вывод одной фразой: обобщение уровня «класс ошибок», а не «этот случай».
Образец ответа

«Самая дорогая моя ошибка — миграция, несовместимая с выкаткой. Я переименовывал колонку в таблице сделок: 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». По такому обобщению видно, что выводы человек делает по причине, а не по частному случаю. Второй сильный ход: сказать, что ты сам написал постмортем и сам вынес это на общий разбор, а не ждал, пока разберут за тебя.

Суть: перевести спор из «кто прав» в «какие trade-offs и что говорят данные». Хороший исход — это общий критерий и замер, а если решение всё равно приняли не твоё — disagree and commit с зафиксированным условием пересмотра.

Каркас ответа

  1. Предмет несогласия одной фразой: техническое, не личное.
  2. Позиции сторон и их резоны. Обязательно назови сильную сторону чужого варианта: это доказывает, что ты его понял.
  3. Как перевёл в измеримое: критерий, замер, эксперимент. Ядро ответа.
  4. Чем кончилось и что взял из чужой позиции.
  5. Отдельно про случай, когда решение приняли не твоё, и как ты себя повёл.
Образец ответа

«Живой пример: у нас тормозил список сделок — 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 мс» превращает решение из вечного в обратимое.
  • Отношения не пострадали. Признак: с этим человеком ты дальше нормально работаешь и рассказываешь про него спокойно.

Чего говорить нельзя

  • Личный конфликт. «Не сошлись характерами», «он токсичный». Даже если так, на собесе это читается как «он приносит конфликты с собой».
  • «Я оказался прав». Как единственный итог не годится. Если ты правда был прав, скажи это через данные: «замер показал, что вариант с индексом дешевле».
  • «Позвал тимлида, он решил». Как первый шаг это сигнал, что договариваться не умеешь.
  • «Я просто уступил, чтобы не спорить». Это не гибкость, а отсутствие позиции.
  • Спор длиной в месяц. Затянутый спор тоже плохой исход, даже если ты победил.

Чем добить

Назови вопрос, которым ты пользуешься в тупике: «что должно произойти, чтобы ты изменил мнение?». Он делает две вещи сразу: вытаскивает настоящий критерий собеседника и нередко показывает, что критерия нет вообще. И добавь про формат: длинные споры ты выносишь из чата в пятнадцатиминутный созвон, а решение возвращаешь в письменном виде, чтобы через месяц никто не спорил заново.

Суть: сказать сразу, как стало ясно, тому, кто отвечает за срок, и прийти с вариантами, а не с проблемой: урезать скоуп / сдвинуть дату / добавить руки, со своей рекомендацией. Молчать до дедлайна — единственный по-настоящему неправильный ответ.

Каркас ответа

  1. Пересчитываю честно и получаю новую дату: число, а не ощущение.
  2. Сообщаю в тот же день, письменно, адресно: риск, причина, новая оценка.
  3. Приношу три варианта с ценой каждого и говорю, какой рекомендую.
  4. Договариваюсь о точке контроля, чтобы решение можно было принять не в последний день.
  5. Дальше работаю по выбранному варианту и держу статус видимым.
Образец ответа

«Первое — я стараюсь понять это как можно раньше, потому что вся разница между рабочей ситуацией и сорванным сроком в том, за сколько дней ты об этом сказал. Практически это значит, что я держу задачу нарезанной на куски по полдня-день и смотрю, попадаю ли я в темп. Как только два-три куска подряд заняли вдвое больше, чем я думал, — это сигнал, дальше само не выправится.

Второе — пересчитываю и называю новое число. Не "кажется, задерживаюсь", а "осталось примерно четыре дня работы вместо запланированных двух, потому что вот здесь вылезло вот это".

Третье — в тот же день пишу продакту и тимлиду, и не с проблемой, а с вариантами. Обычно их три. Урезать скоуп: вот эту часть можно не делать в первой версии, тогда укладываемся в срок, потеряем вот такой сценарий. Сдвинуть дату: нужно ещё столько-то дней, объём такой-то. Добавить человека: помогает, только если есть кусок, который правда отделяется, — если нет, второй человек скорее замедлит. Я всегда говорю, какой вариант рекомендую сам и почему.

Живой пример: делал интеграцию с новым провайдером телефонии, а он выдал доступ к тестовому контуру на неделю позже обещанного. Стало понятно сразу, что в срок не влезаем. Я написал в тот же день и предложил выкатить в первой версии только входящие звонки, а исходящие и запись разговоров отложить на следующий спринт — потому что бизнесу были нужны в первую очередь входящие. Продакт согласился, дату по основной части не двигали.

И последнее — договариваюсь о точке контроля. Например: "проверим в четверг; если к четвергу тестовый контур не появится, идём по урезанному варианту". Тогда решение принимается спокойно и заранее, а не в вечер дедлайна. Чего я стараюсь не делать — это молча догонять по вечерам. Даже если получится, команда узнает о риске последней, и в следующий раз мне просто не поверят на слово.»

Чего говорить нельзя

  • «Останусь подольше и всё успею». Разово бывает у всех, но как ответ на вопрос это сигнал: человек прячет риски и выгорит.
  • «Скажу в день дедлайна». Даже в мягкой формулировке «предупрежу ближе к сроку».
  • «Это не моя вина, аналитик поздно принёс требования». Причина бывает и внешней, но сообщить о риске в любом случае твоя работа.
  • «Срежу тесты, потом допишу». Резать надо скоуп, а не качество: тесты и обработку ошибок «потом» не дописывают никогда, и опытный интервьюер это знает.
  • Снизить качество, никому не сказав. Хуже всех вариантов: срок формально соблюдён, а расплата приходит через месяц и уже дороже.

Чем добить

Скажи, что предупреждение о риске не признание поражения, а инструмент: чем раньше ты его подаёшь, тем дешевле оно обходится компании. И добавь профилактику: на этапе оценки ты явно называешь рисковые пункты («вот здесь могу ошибиться в полтора раза — это работа с объёмом данных, которого я ещё не видел»). Тогда сработавший риск не сюрприз, а заранее обозначенная развилка, и разговор получается совсем другой.

Суть: красные флаги — это не грубость и не незнание, а перекладывание ответственности, отсутствие вывода, героизм вместо процессов и жалобы вместо изменений. Каждый из них слышен по конкретной фразе.

Шесть флагов, которые закрывают вакансию

  1. Виноватые. В истории появляются должности: аналитик, тестировщик, менеджер. Интервьюер мгновенно достраивает, как ты будешь рассказывать про его команду.
  2. «Мы» в неприятных местах и «я» в приятных. Достижения «я сделал», ошибки «мы не учли». Заметно уже на второй истории.
  3. Нет системного вывода. «Буду внимательнее», «стал аккуратнее» значат то же, что «ничего не изменилось».
  4. Героизм. Ночи, выходные, «спас релиз». Читается так: процессов нет, а человек вот-вот выгорит.
  5. Жалобы без действий. «Легаси, документации нет, процессы кривые»: если за описанием проблемы не следует ни одной твоей попытки что-то изменить, это позиция пассажира.
  6. Спор ради победы. «В итоге я оказался прав» без единого пункта, где прав был оппонент. Такой человек дорого обходится команде, даже когда технически силён.

Два флага помельче, но заметных

  • Идеальные истории. Всё прошло по плану, конфликтов не было, ошибок не было. Читается это не как «сильный кандидат», а как «не рассказывает правду» или «не было ответственности».
  • Долгие паузы на каждом вопросе. Пять секунд подумать нормально и даже хорошо. Тридцать секунд на каждый вопрос подряд выдают, что историй нет и человек сочиняет на ходу.
Образец ответа

«Если смотреть со стороны интервьюера, все плохие ответы на такие вопросы сводятся к четырём вещам. Первое — перекладывание: в истории появляются виноватые, и понятно, что в новой команде виноватые тоже найдутся. Второе — асимметрия местоимений: достижения "я", ошибки "мы". Третье — отсутствие вывода: человек честно рассказал про провал, но всё, что он из него вынес, — это "буду внимательнее"; значит, повторится. Четвёртое — героизм: если история заканчивается тем, что человек сидел ночь и всех спас, то на самом деле она про то, что в команде не было ни отката, ни алертов, ни разговора о риске.

Я поэтому свои истории специально проверяю на два вопроса: "есть ли тут кто-то виноватый, кроме меня" и "что изменилось в системе после этого". Если на первый ответ "да", а на второй "ничего" — историю надо переписывать или брать другую.»

Чем добить

Скажи, что ты отличаешь причину от виноватого. Причину назвать обязательно: «диф был на четыреста строк, поэтому миграцию не разглядели на ревью» звучит как системная причина, из неё следует изменение процесса. А «Петя не разглядел» указывает на виноватого, из него не следует ничего. Про культуру постмортема без обвинений короче не скажешь, и вслух эта пара слов звучит хорошо.

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)
На каких сценариях? Какие конкретно экраны, ручки, отчёты?Чтобы понимать, что именно оптимизировать: «вся система» — это сотни ручек, и ускорить их все нельзя ни за какие деньгиУскорил то, чем пользуются двое, а тормозил список сделок у всего отдела продаж
Какой бюджет и срок? Неделя, квартал, «до конца года»?Чтобы выбрать класс решения. За неделю можно переписать запрос и добавить индекс; за квартал — завести кэш, реплику для чтения или сменить хранилищеПриносишь план на два месяца там, где ждали трёх дней
Что можно ухудшить взамен? Свежесть данных, консистентность, стоимость железа, часть функциональности?Чтобы знать, чем разрешено платить. Бесплатной скорости не бывает, и без ответа на этот вопрос ты сам себе запрещаешь кэш, денормализацию и чтение с репликиНе даёшь себе права на кэш и на лишнюю реплику для чтения, хотя заказчик легко согласился бы на минуту устаревания данных
Как будем измерять и кто подтвердит? Метрика, дашборд, кто смотрит на приёмке?Чтобы «сделано» не осталось вопросом веры: нужен график и живой человек, который по нему скажет «принято»Ты считаешь, что сделал; заказчик говорит «всё равно медленно», и спор нечем закрыть
Что уже пробовали и почему не помогло?Чтобы не пройти чужой путь заново. Один вопрос экономит неделю работы и заодно показывает, какие ограничения в системе уже известныСтавишь кэш, который год назад уже ставили и сняли из-за рассинхрона
От «сделайте побыстрее» к измеримому SLO «Хотим быструю систему» нельзя ни сделать, ни проверить 1. Что значит «быстро»? В каких единицах — миллисекунды, секунды, «пока не заметно»? 2. Для какой доли запросов? Среднее прячет хвосты. p95 или p99 — разница в цене. 3. При какой нагрузке? RPS в обычный день и в пик, когда именно бывает пик. 4. На каком объёме данных? Сейчас и через год: план запроса меняется вместе с таблицей. 5. На каких сценариях? Конкретные ручки и экраны, а не «вся система». 6. Бюджет и срок? Неделя и квартал — это разные классы решений. 7. Чем можно платить? Свежесть данных, деньги на железо, часть сценариев. 8. Как измеряем и кто примет? Метрика, дашборд, человек, который скажет «принято». 9. Что уже пробовали? И почему это не помогло — экономит неделю работы. Измеримый SLO — его уже можно принять или не принять p95 GET /api/deals не более 300 мс при 400 RPS и 5 млн сделок, окно 30 дней, 99% интервалов Метрика: гистограмма в Prometheus. Дашборд в Grafana. Приёмка: продакт по этому дашборду.
Уточнение здесь не бюрократия, а перевод. На входе фраза, за которую никто не может отвечать; на выходе строчка, которую можно повесить на дашборд и по которой любой человек через полгода скажет, выполняется она или нет. Девять вопросов занимают пятнадцать минут разговора и экономят недели работы не туда.
Как это выглядит в жизни за пятнадцать минут

Заказчик: «CRM тормозит, надо ускорить». Начинаешь разматывать, и почти всегда за общей фразой оказывается один конкретный сценарий и один конкретный человек, который жалуется.

  • «Что именно тормозит?» → «Список сделок у продажников».
  • «Когда?» → «Утром в понедельник и в конце месяца».
  • «Насколько сейчас и сколько было бы нормально?» → «Крутится секунд пять, хотелось бы, чтобы сразу».
  • «"Сразу" — это меньше секунды?» → «Да, чтобы за секунду».
  • «У всех или у некоторых?» → «У руководителей отделов, у них фильтр по всей воронке».
  • «Данные могут отставать на минуту?» → «Да, это не отчётность, это рабочий список».

Итог: «p95 списка сделок с фильтром "все сделки отдела" — не больше 1 секунды в пик понедельника при текущем объёме и полуторном на год вперёд; допустимо отставание данных до минуты». Из размытого «тормозит» получилось требование, у которого есть и цена, и способ проверки. Заодно выяснилось, что можно кэшировать, а это меняет решение целиком.

Подвох: одной latency интервьюеру мало

В сильном ответе есть два вопроса, которые задают редко. Первый вопрос «зачем»: что за этим стоит, кто и на что жалуется, потеряли ли из-за этого деньги. Часто выясняется, что «быстро» лишь симптом, а болит другое (например, менеджер не может найти сделку, и дело не в скорости, а в поиске). Второй вопрос «чем можно платить»: без него ты сам себе запрещаешь кэш, денормализацию, реплику для чтения и асинхронную выдачу. Кандидат, который спросил «что можно ухудшить взамен», выглядит взрослее остальных: он понимает, что бесплатной скорости не бывает.

«Как ты ревьюишь чужой код»

Вопрос звучит безобидно, а различает людей жёстко. Слабый ответ перечисляет вкусовщину: «смотрю на именование, на длину функций, чтобы код был чистый». По такому ответу интервьюер понимает, что человек ревьюит текст. В сильном ответе человек ревьюит последствия: что произойдёт с этим кодом в проде в три часа ночи, что будет при откате, что будет, когда данных станет в двадцать раз больше.

Поэтому в ответе нужна явная иерархия: сначала то, что дорого чинить потом, в самом конце то, что вообще не должен смотреть человек. Формулировка, которая почти всегда заходит: «я иду сверху вниз по цене ошибки». Стиль и форматирование стоят внизу не потому, что неважны, а потому что их проверяет линтер, а не ревьюер.

Что я делаю до первого комментария
  • Читаю задачу, а не один диф. Половина серьёзных замечаний звучит как «код написан хорошо, но решает не ту задачу» или «решает только половину». Из дифа этого не видно.
  • Смотрю на размер. Если 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 — верный признак, что линтер не настроен
Ревью сверху вниз: от того, что дорого чинить, к тому, что чинит робот 1. Решает ли код ту задачу — и всю ли Читаю тикет, а не только диф. Половина настоящих замечаний живёт здесь. 2. Что будет в проде ночью Проглоченные ошибки, потерянный context, вечные горутины, неидемпотентный ретрай. 3. Данные и запросы N+1, нет индекса, сетевой вызов внутри транзакции, выборка без LIMIT. 4. Совместимость и возможность отката Миграция и старый код, контракт API, формат события в Kafka, кнопка «назад». 5. Безопасность и персональные данные Права на объект, валидация, склейка SQL, телефон клиента в логе. 6–7. Наблюдаемость и тесты Метрика на новый путь; тест на исправленный баг, иначе он вернётся. 8. Читаемость Имена, длина функции, смешанные уровни абстракции. 9. Стиль и форматирование Сюда человек не смотрит вообще: gofmt и golangci-lint в CI. цена ошибки падает вниз чем выше пункт, тем дороже пропустить: верхние три — это инцидент в проде, нижние два — это просто неудобно читать здесь человек не нужен
Иерархия важнее списка. Любой кандидат назовёт те же девять пунктов, разница в порядке. Тот, кто начинает с именования переменных, ревьюит текст; тот, кто начинает с «а что будет при откате», ревьюит систему. Заодно это ответ на вопрос, куда девать время: на PR в двести строк у тебя есть минут двадцать, и потратить их надо на верхние четыре уровня.

Как комментировать, чтобы это работало

Четыре приёма, которые снимают 90% боли код-ревью
  • Помечать вес комментария. Три метки. blocker («блокирующее»): без этого не мержим. вопрос: я не понял, объясни. nit (от английского nitpick, «придирка»): вкусовщина, можешь проигнорировать. Без меток все двадцать замечаний для автора весят одинаково, и он либо переделывает всё, либо не делает ничего.
  • Спрашивать, а не приказывать. «А что будет, если сюда придёт пустой список?» вместо «тут баг». В половине случаев выясняется, что ты не прав, и вопрос спасает лицо обоим. Плюс автор сам находит проблему, а такое запоминается лучше.
  • Если крупных замечаний больше пяти, идти в звонок. Письменный пинг-понг на десять итераций съедает дни и портит отношения. Пятнадцать минут голосом решают то же самое, а в PR остаётся короткое резюме договорённости.
  • Писать, что понравилось. Одна строчка «вот эту развязку с интерфейсом я себе заберу» меняет тон всей ветки. Ревью, где бывают только замечания, люди начинают избегать.
Что выдаёт джуна в ответе про ревью

Первое: начать с именования и форматирования. Значит, человек не видел, как пропущенный на ревью N+1 кладёт базу. Второе: «я проверяю, что код чистый и соответствует SOLID». Это лозунг, а не проверка. Третье: ни слова про людей. Ревью держится на коммуникации, и если кандидат не упомянул, как он доносит замечания, интервьюер запомнит именно это. Четвёртое: «я всегда всё проверяю досконально». На PR в тысячу строк это физически неправда, и опытный интервьюер это знает.

Как принимаешь технические решения и объясняешь их бизнесу

Принять техническое решение значит выбрать из нескольких вариантов при ограничениях. Если у тебя в рассказе один вариант, ты не принимал решение, ты просто сделал первое, что пришло в голову. Поэтому в сильном ответе всегда есть альтернативы, критерии выбора и то, что заставит вернуться и пересмотреть.

Самый полезный критерий редко называют вслух: обратимость. Решения делятся на те, откуда легко вернуться (поменять библиотеку логирования, добавить кэш перед запросом), и те, откуда вернуться почти нельзя (разрезать монолит, сменить хранилище, зафиксировать публичный контракт API). Первые надо принимать быстро и не устраивать вокруг них совет директоров, вторые — медленно, письменно и с несколькими парами глаз. Команды чаще всего ошибаются именно тут: смешивают эти два режима.

У этой пары есть ходовое название, и его стоит знать, потому что на собесах оно звучит: двусторонняя дверь и односторонняя дверь. Метафора из письма Джеффа Безоса акционерам Amazon, оттуда разошлась по индустрии. В двустороннюю дверь можно войти, оглядеться и спокойно выйти обратно: решение обратимое, его принимают быстро, часто в одиночку, и ошибка стоит день работы. Односторонняя дверь захлопывается за спиной: вернуться либо нельзя вообще, либо очень дорого. Вся польза метафоры в том, что она за два слова объясняет, почему на выбор библиотеки нельзя тратить неделю, а на выбор хранилища можно и нужно.

Шаги, по которым это можно рассказать вслух
  1. Что за задача и по какой метрике поймём, что решили. Без метрики дальше нет смысла.
  2. Два-три реальных варианта. Обязательно с вариантом «ничего не делать» или «сделать самое дешёвое»: он часто выигрывает.
  3. Критерии: срок, риск, стоимость поддержки, обратимость, кто это будет эксплуатировать в три часа ночи.
  4. Данные, а не мнения. EXPLAIN ANALYZE, замер на копии прода, прототип на день, что угодно, лишь бы спор превратился в число.
  5. Решение и запись. Короткий ADR или хотя бы абзац в задаче: что выбрали, почему, что отвергли и по какой причине.
  6. Условие пересмотра. «Возвращаемся, если p99 уйдёт за 500 мс» или «если объём вырастет вдвое».

С объяснением бизнесу правило одно: говорить в деньгах, времени и риске, а не в технологиях. Бизнесу нечего делать с фразой «нужно вынести отчёты в отдельный сервис». Ему есть что делать с фразой «сейчас тяжёлые отчёты тормозят работу продажников в конце месяца — это тот же час, когда закрываются сделки». Дальше всегда идут варианты с ценой, а не отказ: «за неделю сделаем вдвое быстрее, за месяц сделаем в десять раз быстрее и уберём влияние на основную работу». Слово «нет» бизнес слышит как «инженер не хочет», а «вот три варианта и их цена» — как предложение выбрать.

Про техдолг разговаривать так же

«Надо порефакторить» звучит как просьба дать время непонятно на что, и её справедливо отклоняют. Работающая формулировка привязывает техдолг к тому, что бизнес уже чувствует: «каждая новая интеграция сейчас занимает три недели вместо одной, потому что весь обмен с внешними системами прибит к одному пакету; если потратим две недели на разделение, следующие интеграции пойдут по неделе — в ноль выйдем уже на первой». Это уже не рефакторинг ради красоты, а инвестиция с понятной точкой окупаемости.

Вопросы

3
Суть: не идти оптимизировать, а перевести ощущение в измеримое: метрика, перцентиль, нагрузка, объём данных, конкретные сценарии, срок и бюджет, чем можно платить и кто подтвердит, что готово. Два вопроса, которые отличают сильный ответ: «зачем это на самом деле» и «что можно ухудшить взамен».

Каркас ответа

  1. Сказать вслух, что это пока не требование. «Быстро» нельзя ни сделать, ни принять, значит, первым делом я перевожу его в проверяемую формулировку.
  2. Вопросы про число: что значит «быстро» и в каких единицах, для какой доли запросов (среднее / p95 / p99), при какой нагрузке, на каком объёме данных, на каких конкретно сценариях.
  3. Вопрос «зачем»: кто именно жалуется, что он в этот момент делает, что бизнес из-за этого теряет. Часто оказывается, что скорость только симптом, а болит другое.
  4. Вопрос про цену: срок и бюджет, а главное, чем можно платить (свежесть данных, консистентность, деньги на железо, часть функциональности).
  5. Вопрос про приёмку: какая метрика, на каком дашборде, кто скажет «принято».
  6. Закончить сформулированным SLO: показать, как из фразы получается строчка, которую можно проверить.
Образец ответа

«Первое, что я скажу вслух: в таком виде это ещё не требование. "Быстро" нельзя ни сделать, ни проверить — на приёмке мы с заказчиком будем иметь в виду разные вещи. Поэтому я задам несколько вопросов, и они займут минут пятнадцать, а сэкономят недели.

Начну не с чисел, а с "зачем": что именно тормозит, кто жалуется и что этот человек в тот момент делает. У нас в CRM почти всегда за фразой "система тормозит" стоит один конкретный экран и один конкретный отдел. В последний раз это оказался список сделок у руководителей отделов, у которых фильтр по всей воронке, — и только утром в понедельник и в конце месяца. Это сразу сузило задачу с "всей системы" до одной ручки.

Дальше числа. Что значит "быстро" в секундах: сейчас крутится пять секунд, а нормально — чтобы за секунду. Для какой доли запросов: среднее прячет хвосты, поэтому я всегда переспрашиваю, говорим ли мы про p95 или p99, — разница между ними может стоить месяца работы. При какой нагрузке: сколько RPS в обычный день и в пик, когда бывает пик. На каком объёме: сейчас пять миллионов сделок, а через год? Планировщик Postgres на выросшей таблице легко уходит в seq scan там, где вчера был индекс.

Потом вопрос, который задают реже всего и который меняет решение целиком: чем можно платить. Можно ли показывать данные с отставанием в минуту? Если да — мне открылись кэш, материализованное представление и чтение с реплики. Если нет и нужна строгая свежесть — это совсем другой класс решений и другая цена. В том случае с CRM ответ был "это рабочий список, а не отчётность, минута отставания нормальна", и это определило всё дальнейшее.

И два закрывающих вопроса: какой срок и бюджет — неделя и квартал допускают разные решения; и как мы будем измерять и кто подтвердит приёмку, потому что без метрики "сделано" остаётся вопросом веры. Заодно спрошу, что уже пробовали и почему это не помогло: пару раз это спасало меня от повторения чужого пути.

В итоге из "хотим быструю систему" получается строчка, которую можно повесить на дашборд: p95 списка сделок с фильтром "все сделки отдела" — не больше одной секунды при текущей нагрузке в пик понедельника и полуторном объёме данных на год вперёд; допустимо отставание данных до минуты; метрика — гистограмма в Prometheus, приёмка — продакт по дашборду в Grafana. Вот с этим я уже готов идти что-то делать.»

Чего говорить нельзя

  • Сразу предлагать решения. «Поставим Redis, добавим индексы, поднимем реплику». Классический провал: кандидат оптимизирует то, чего не измерил, и, скорее всего, не то.
  • «Сделаем максимально быстро». Это обещание без цены и без критерия приёмки.
  • Спрашивать только про latency. Без вопросов «зачем» и «чем можно платить» ответ выглядит как чек-лист, а не как понимание.
  • Задавать вопросы бесконечно. Если на этом всё и закончилось, кандидат выглядит как человек, который умеет уточнять, но не умеет доводить. Обязательно закончить сформулированным требованием.
  • Обещать «всегда быстро». Требование «всегда меньше 100 мс» без перцентиля практически недостижимо: всегда найдётся GC-пауза, ретрай или холодный кэш.

Чем добить

Скажи, что после согласования SLO ты первым делом измеряешь, а не оптимизируешь: вешаешь гистограмму по этой ручке в Prometheus и панель в Grafana. Дальше два аргумента, которые звучат по-взрослому. «Бесплатной скорости не бывает»: за неё всегда платят свежестью данных, деньгами на железо или сложностью поддержки, и весь разговор нужен, чтобы выяснить, чем именно заказчик готов заплатить. И второй, «у скорости есть точка, после которой пользователь не замечает разницы»: если 210 мс и 40 мс для человека неотличимы, второй вариант не стоит своей инвалидации кэша. Так ты показываешь, что оптимизируешь бизнес-эффект, а не число на графике.

Суть: назвать явную иерархию по цене ошибки — задача, прод, данные, откат, безопасность, наблюдаемость, тесты, читаемость, и только в самом низу стиль, который смотрит линтер, а не человек. Плюс обязательно — как ты общаешься в комментариях: метки blocker/вопрос/nit, вопросы вместо приговоров, звонок вместо десятой итерации.

Каркас ответа

  1. Назвать принцип, а не список. «Иду сверху вниз по цене ошибки».
  2. Что делаю до комментариев: читаю задачу, смотрю размер PR, прохожу диф целиком один раз молча.
  3. Верхние уровни подробно: та ли задача решена → что будет в проде → данные и запросы → совместимость и откат → безопасность.
  4. Нижние уровни коротко: наблюдаемость, тесты, читаемость; стиль отдаю линтеру.
  5. Как коммуницирую. Половина ответа: ревью про людей, а не про текст.
  6. Один живой пример находки, он делает весь ответ достоверным.
Образец ответа

«У меня есть порядок, и он про цену ошибки: сверху то, что дорого чинить в проде, снизу то, что вообще не должен смотреть человек.

До первого комментария я делаю три вещи. Открываю задачу — довольно часто самое важное замечание звучит как "код хороший, но решает половину задачи", и из дифа это не видно. Смотрю на размер: если там больше пятисот-шестисот содержательных строк, я честно пишу "давай разобьём", потому что ревью такого объёма — это ревью с пропущенными багами, как ни старайся. И прохожу диф целиком один раз без комментариев, чтобы понять замысел, иначе первые десять замечаний окажутся про то, что автор решил тремя файлами ниже.

Дальше по уровням. Первое — та ли задача решена и вся ли: например, статус сделки меняется, но при переходе в "выиграна" не пишется событие в 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, и это окупается на инцидентах.

Суть: решение — это выбор из вариантов при ограничениях, а не первое пришедшее в голову. Критерии: срок, риск, стоимость поддержки, обратимость, кто будет это эксплуатировать ночью. Записать решение и условие пересмотра. Бизнесу говорить в деньгах, времени и риске — и всегда давать варианты с ценой, а не слово «нет».

Каркас ответа

  1. Метрика успеха: по чему поймём, что решили задачу.
  2. Два-три реальных варианта, обязательно с самым дешёвым и с «ничего не делать».
  3. Критерии выбора, среди них обязательно обратимость: односторонняя дверь или двусторонняя.
  4. Данные вместо мнений: замер, прототип на день, EXPLAIN.
  5. Запись решения: ADR или абзац в задаче, что выбрали, что отвергли и почему.
  6. Условие пересмотра.
  7. Перевод для бизнеса: те же варианты на языке денег, сроков и риска.
Образец ответа

«Для меня решение — это выбор из вариантов при ограничениях. Если я могу назвать только один вариант, значит, я не принимал решение, а сделал первое, что пришло в голову. Поэтому у меня есть простой порядок.

Сначала метрика: по чему мы поймём, что задача решена. Потом два-три варианта, причём я всегда держу среди них самый дешёвый и вариант "ничего не делать" — они выигрывают чаще, чем кажется. Дальше критерии: срок, риск, стоимость поддержки и обратимость. Обратимость для меня главный: есть решения, откуда легко вернуться — добавить кэш, поменять библиотеку, — их надо принимать быстро и не устраивать вокруг них совет. И есть решения, откуда вернуться почти нельзя: разрезать монолит, сменить хранилище, зафиксировать публичный контракт 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 гросс рассматривать не буду, а дальше давайте вернёмся к этому, когда станет понятнее, что за роль».

Переговоры об оффере

Оффер не конец, а начало отдельного короткого разговора, и обсуждают там весь пакет, а не один оклад. Половина того, что делает работу хорошей или плохой, деньгами не измеряется: как часто пересматривают, есть ли дежурства и платят ли за них, кто покупает тебе ноутбук, сколько дней отпуска и можно ли работать из другого города. Всё это спрашивают один раз, в момент оффера, а потом менять поздно.

Переговоры по шагам: чем позже разговор о деньгах, тем ты сильнее 1. До интервью — собрать рынок и свою вилку из трёх чисел Обзоры, вилки в вакансиях, каналы, знакомые. Минимум / цель / амбиция. 2. Скрининг — по возможности вернуть вопрос про бюджет позиции Настаивают — назвать интервал «цель — амбиция». Минимум вслух не звучит никогда. 3. Технические этапы — про деньги не торговаться вообще Твоя задача здесь — вырастить переговорную силу, а не отстоять цифру. 4. Оффер получен — поблагодарить и взять время, не соглашаться в звонке «Спасибо, очень интересно. Дайте пару дней, вернусь с ответом в среду». 5. Разобрать пакет целиком, а не только оклад Бонус, срок пересмотра, грейд, ДМС, техника, удалёнка, отпуск, обучение, дежурства. 6. Один раунд встречного предложения — с числом и обоснованием «Готов выходить, если оклад будет 700» — и быть готовым сказать «да» на согласие. 7. Всё договорённое — в письменный оффер Устное «через полгода пересмотрим» не существует. Дата выхода — тоже в письме. много мало переговорная сила растёт с каждым этапом
Сила кандидата не постоянна. На скрининге ты всего лишь одна строчка в списке из сорока, и любое требование звучит как каприз. После оффера ты уже человек, на которого команда потратила несколько часов, а альтернативу искать ещё месяц. Поэтому все просьбы переносятся в правую часть шкалы: на скрининге обозначаешь рамку, а торгуешься ровно один раз, когда оффер уже на руках.

Что обсуждается кроме оклада

ПунктЧто спросить конкретноЗачем это важно
Бонус или премияОт чего зависит, как часто платится, сколько людей получили её полностью в прошлом годуБонус «до трёх окладов» может оказаться нулевым третий год подряд. Считать доход стоит по гарантированной части
Срок и правила пересмотраКогда ближайший пересмотр, привязан ли он к календарю или к грейду, что нужно сделать, чтобы получить повышениеСамый недооценённый пункт. «Через 6 месяцев ревью» может стоить дороже, чем +30 тысяч в оклад сейчас, — но только если это записано
Грейд и название ролиКакой грейд по внутренней шкале, что отличает его от следующегоГрейд определяет вилку пересмотров и то, что будет написано в трудовой. «Мидл» с обязанностями сеньора — плохая сделка на два года вперёд
ДМСС какого месяца, со стоматологией или без, включена ли семья, какая клиникаРазброс между «поликлиника у дома» и нормальной программой — десятки тысяч в год
ТехникаДают ли ноутбук, какой, можно ли выбрать, есть ли бюджет на монитор и перифериюРаботать три года на слабой машине — это ежедневный налог на нервы; попросить нормальную технику на этапе оффера легко, потом — уже неловко
Формат работыУдалёнка, гибрид или офис; сколько дней в офисе; можно ли работать из другого города или страны; как оформлено в договореУстное «у нас все и так удалённо» меняется со сменой руководителя. Если формат критичен — он должен быть в оффере
Обучение и конференцииЕсть ли бюджет, кто его согласовывает, оплачиваются ли курсы и участие в конференцияхОбычно небольшие деньги, но легко даются — и это хороший индикатор отношения к развитию людей
Отпуск и переработкиСколько дней, есть ли дополнительные, как относятся к длинным отпускам; оплачиваются ли дежурства и переработкиОн-колл (от английского on-call — дежурство «на телефоне» вне рабочих часов, когда ты обязан взять трубку и починить прод) без компенсации и отгулов — скрытая часть зарплаты, которую ты платишь компании
Дата выходаКогда ждут, готовы ли подождать отработку и отпуск между работамиДве недели отдыха между работами — единственный шанс на длинную паузу в ближайший год; это спокойно обсуждается на этапе оффера
Как торговаться, чтобы не испортить отношения
  • Сначала поблагодарить и показать интерес. «Спасибо, мне очень интересна задача, я хочу к вам». Торг без выраженного интереса читается как «я тут ради денег» и снижает желание идти навстречу.
  • Один раунд, одно число. «Готов выходить, если оклад будет 700». Не «хотелось бы побольше», не «а можно ещё чуть-чуть»: такое дожимание по кругу раздражает.
  • Обосновать, но коротко. Ссылки на рынок и на объём роли хватает. Личные обстоятельства (ипотека, дети, аренда) не аргумент: компания платит за работу, а не за твои расходы.
  • Быть готовым сказать «да». Если попросил 700 и тебе дали 700, торг закончен. Кто приходит после этого с новой просьбой, того запоминают надолго.
  • Если по окладу потолок, переключайся на остальной пакет: срок пересмотра, подписной бонус, отпуск, техника, дата выхода. Часто именно там есть свобода, которой нет в вилке грейда.
  • Другой оффер упоминать можно, если он настоящий. «У меня есть предложение на 750, но мне интереснее ваша задача» звучит честно и работает. Блефовать не стоит: иногда отвечают «тогда удачи», и отыграть назад нельзя.
Давление и дедлайн по офферу

«Оффер действителен до завтра», «нам нужен ответ прямо сейчас, иначе передадим другому кандидату». Это приём, а не реальность. Компания, которая потратила на тебя четыре часа интервью, не отзовёт оффер за то, что ты попросил два дня.

  • Просить время нормально и почти всегда дают. Формулировка: «Спасибо, это серьёзное решение — мне нужно пару дней. Отвечу в среду до конца дня». Назвать конкретный день важнее, чем попросить срок: это выглядит как ответственность, а не как затягивание.
  • Стандарт: два–пять рабочих дней. Больше недели без объяснения выглядит как «жду ответа от другой компании», и это все понимают.
  • Жёсткий дедлайн в 24 часа сам по себе сигнал о компании. Так же они будут вести себя с дедлайнами по задачам. Взрослый ответ: «Понимаю, что сроки поджимают. Мне нужно два дня; если это невозможно, скажите — я приму решение исходя из этого». Иногда «невозможно» внезапно становится возможным.
  • Не принимай оффер в звонке из вежливости. Слово «да», сказанное голосом, психологически связывает, и торговаться потом уже поздно.
  • И наоборот, не тяни молча. Если ждёшь другой оффер, скажи об этом прямо: «Честно — у меня в процессе ещё одна компания, финал в четверг. Готов дать ответ в пятницу». Это уважают гораздо больше, чем исчезновение на неделю.

Свои вопросы интервьюеру

«У вас есть вопросы?» спрашивают не для галочки. Это последние пять минут, которые интервьюер помнит лучше всего, когда садится писать фидбэк. И единственный момент, когда ты получаешь данные о месте, где собираешься провести следующие два года. Ответ «нет, вы всё рассказали» читается ровно одним способом: человеку всё равно, куда идти.

Хороший вопрос отличается от плохого тем, что на него нельзя ответить рекламой. «У вас интересные задачи?» рекламой отбивается легко. «Что было последним крупным инцидентом и что после него изменили?» так не отбить: придётся рассказать, как всё устроено на самом деле. Готовь восемь–двенадцать таких вопросов, задавай три–пять, выбирая по ходу те, что уместны этому конкретному собеседнику: тимлиду, будущему коллеге и HR нужно задавать разное.

Что спрашивать: пять блоков и один запретный Подготовить все, задать три–пять — те, что уместны этому собеседнику. Команда и люди • Сколько человек, какие грейды, кто рядом со мной? • Давно ли команда собрана, был ли отток за год? • Почему открыта вакансия: рост или кто-то ушёл? • Кто принимает решение, если мнения разошлись? Выясняешь: не горит ли команда, есть ли у кого учиться, и не закрываешь ли ты собой чью-то дыру. Процессы и планирование • Как задача проходит путь от идеи до прода? • Кто ставит приоритеты и как часто они меняются? • Что происходит, когда команда не успевает к сроку? • Как устроено ревью и сколько живёт средний PR? Выясняешь: есть ли процесс вообще, или всё держится на героизме и вечных срочных задачах. Прод, дежурства, инциденты • Есть ли он-колл, как устроен график, оплачивается? • Сколько раз за месяц будят ночью — честно? • Что было последним крупным инцидентом? • Что после него изменили — и пишут ли постмортемы? Выясняешь: зрелость эксплуатации. Ответ «инцидентов не бывает» означает, что их просто не замечают. Инженерные решения и техдолг • Как принимаются технические решения, есть ли ADR? • Как планируется техдолг: доля спринта, отдельные   задачи или «когда-нибудь потом»? • Как устроены релизы и как выглядит откат? Выясняешь: сможешь ли ты влиять на систему или будешь только закрывать тикеты в чужой архитектуре. Роль и успех • Как выглядит успех на этой позиции через полгода? • Какие две-три задачи ждут меня первыми? • Как устроены пересмотр и рост грейда? • Чего вам не хватает в команде прямо сейчас? Выясняешь: понимают ли вообще, зачем тебя нанимают. Размытый ответ здесь — самый тревожный из всех. Чего не спрашивать на первых этапах • «Чем вы занимаетесь?» — не прочитал даже сайт • «Много ли переработок?» в лоб — звучит как «боюсь работы» • Отпуск, ДМС, соцпакет — это к офферу, не к тимлиду • «Когда повышение?» до того, как взяли • «Как я справился?» — ставит собеседника в неловкое • Вопросы-экзамены, чтобы показать, что ты умнее
Пять блоков, почти два десятка вопросов, из которых ты выберешь нужные. Тимлиду задавай про решения, техдолг и релизы; будущему коллеге про процессы и про то, что бесит в работе; нанимающему руководителю про успех через полгода и почему открыта вакансия; HR про пересмотры, формат и оффер. Один и тот же вопрос, заданный не тому человеку, часто получает бессмысленный ответ и тратит твой единственный шанс спросить.

Двенадцать сильных вопросов и что они на самом деле выясняют

ВопросЧто на самом деле выясняешьТревожный ответ
Из кого состоит команда — сколько человек, какие грейды, кто будет рядом со мной?Есть ли у кого учиться и не окажешься ли ты самым опытным по умолчанию«Команда формируется» без деталей; ты единственный бэкендер на большой продукт
Давно ли команда в этом составе? Кто-нибудь уходил за последний год?Стабильность и настоящий климат. Отток — самый честный индикатор«У нас все новые», «за год сменилось полкоманды» без внятного объяснения
Почему открыта эта вакансия — рост команды или кто-то ушёл?Идёшь ты в развитие или затыкать дыру после выгоревшего человекаУклончивость. Честное «человек ушёл, потому что…» — наоборот, хороший знак
Как задача проходит путь от идеи до прода?Есть ли процесс, кто пишет требования, участвуют ли разработчики в постановке«Приходит задача от бизнеса, мы делаем» — то есть разработчики не влияют ни на что
Что происходит, когда команда не успевает к сроку?Режут скоуп, двигают дату или работают вечерами. Самый показательный вопрос про культуру«Обычно успеваем», «поднажимаем» — то есть переработки считаются нормой
Как принимаются технические решения — кто решает, фиксируется ли где-то?Сможешь ли ты влиять на архитектуру или всё спускается сверху«Как скажет архитектор» без возможности обсуждения; решения нигде не записаны
Как планируется техдолг — есть ли на него доля спринта?Придётся ли тебе годами работать в системе, которую никто не чинит«Занимаемся, когда есть время» — то есть не занимаются никогда
Как устроены релизы и как выглядит откат?Инженерная зрелость: CI/CD, канареечные раскатки, фича-флаги, кнопка отката«Выкатываем по пятницам вручную», «откатов у нас не было» — оба варианта плохие
Есть ли дежурства? Как устроен график и оплачивается ли он?Скрытую часть нагрузки и то, честно ли компания за неё платит«Ну, если что-то упало, мы все смотрим» — то есть дежурство есть, но неоформленное и бесплатное
Что было последним крупным инцидентом и что после него изменили?Лучший вопрос всего списка: культуру постмортемов, наличие выводов, отношение к ошибкам«Инцидентов не было» — либо нет мониторинга, либо неправда. Поиск виноватых в рассказе — красный флаг
Как выглядит успех на этой позиции через полгода?Есть ли у нанимающего вообще картинка того, зачем тебя берутОбщие слова «влиться в команду и приносить пользу» — критерии оценки придумают потом и задним числом
Что вам самим больше всего не нравится в текущей работе команды?Честность собеседника. Заодно узнаёте о проблемах до, а не после выхода«Да всё отлично» — либо не готовы говорить откровенно, либо не видят проблем. Оба варианта неприятны
Какие вопросы задавать не стоит и почему
  • «А чем вообще занимается компания?» Показывает, что ты не открыл даже сайт. Мгновенный минус, который уже не отыграть.
  • «Много ли у вас переработок?» в лоб. Вопрос правильный, формулировка плохая: звучит как «я боюсь работать». Спрашивай через процесс («что происходит, когда команда не успевает к сроку?») и узнаешь то же самое и даже больше.
  • Отпуск, ДМС, соцпакет и обеды на техническом интервью. Это к рекрутеру и к моменту оффера. Тимлиду это неинтересно, а впечатление смещается с «инженер» на «соискатель льгот».
  • «Когда меня повысят?» До того, как тебя взяли, это выглядит как торг за то, чего ещё нет. Правильная версия: «как у вас устроен рост грейда и пересмотр», и лучше на этапе оффера.
  • «Как я справился? Что скажете про мои шансы?» Ставит собеседника в неловкое положение: решение принимает не он один и не прямо сейчас. Спросить про сроки и следующий шаг можно и нужно, просить оценку на месте нельзя.
  • Вопросы-экзамены. «А знаете ли вы, как в Go устроен планировщик?» Даже если ты просто хотел поговорить о технике, это читается как попытка показать, что ты умнее. Проиграешь в любом случае.
  • Вопросы, ответ на которые уже прозвучал. Верный признак, что ты не слушал. Если вопрос из списка уже закрыли по ходу разговора, вычеркни его и бери следующий.
  • Двадцать вопросов подряд. Это финал, а не допрос. Три–пять точных вопросов выглядят как подготовка, а пятнадцать уже как проверка на прочность.

Чем закончить интервью

Последняя минута стоит непропорционально дорого: именно она попадает в фидбэк почти дословно. Закрывай интервью тремя короткими репликами, все три укладываются в полминуты.

Закрывающие тридцать секунд
  1. Сказать, что тебе интересно, и почему именно. Не общее «спасибо, было приятно», а одна конкретная зацепка из разговора: «мне понравилось, что вы рассказали про переход на события в Kafka — это ровно то, чем я хочу заниматься дальше». Так видно, что ты слушал, и это запоминается.
  2. Закрыть сомнение, если оно повисло. Если по ходу ты что-то завалил или видел, что собеседник засомневался, скажи про это сам: «я вижу, что у меня слабее место с Kubernetes, чем вам нужно; в CRM я работал с ним как пользователь, но за пару месяцев закрою». Признанный и очерченный пробел пугает намного меньше, чем замолчанный.
  3. Спросить про следующий шаг и сроки. «Какой следующий этап и когда ждать обратную связь?» Это нормальный деловой вопрос, он ставит точку в разговоре и заодно подсказывает тебе, когда можно вежливо напомнить о себе.

Обещанный срок прошёл? Короткое письмо через день-два после него уместно и ничем не вредит: «Добрый день! Мы говорили в четверг, вы упоминали обратную связь к среде. Подскажите, есть ли новости? Со своей стороны подтверждаю интерес к позиции». Молчание тут не вежливость, а упущенный оффер: заявки теряются в системах чаще, чем кажется.

Вопросы

4
Суть: три части — признать хорошее в прошлом месте, назвать конкретный кончившийся ресурс (не «хочу развиваться», а что именно), привязать к этой вакансии. Ноль негатива, ноль имён, ноль подробностей конфликта. Ответ занимает минуту, не пять.

Каркас ответа

  1. Одна фраза благодарности прошлому месту: что оно тебе дало. Снимает подозрение в конфликте до того, как оно возникло.
  2. Конкретная причина. Не эмоция, а факт: закончился рост, закрылось направление, упёрлись в потолок грейда, изменились приоритеты команды.
  3. Что ты пробовал сделать внутри, если пробовал. Показывает, что ты не копишь недовольство молча.
  4. Чего ты ищешь, сформулированное как требование к следующему месту.
  5. Почему именно сюда. Замыкает ответ на эту вакансию и превращает уход в осознанный переход.
Образец ответа

«Мне на этом месте многое дали: я пришёл туда джуном, а сейчас веду бэкенд CRM практически целиком — и это заслуга команды и руководителя, они дали мне влезть в прод, в миграции, в мониторинг. Ухожу я не от людей.

Причина конкретная: у меня кончился рост. Продукт стабилизировался, нагрузка предсказуемая, архитектура сложилась, и последний год я в основном поддерживаю то, что сам же и построил. Если честно посмотреть, за этот год я не сделал ничего, чего не умел бы годом раньше. Следующие полгода будут такими же — это и есть мой ответ, почему я смотрю варианты.

Я пробовал решить это внутри: предлагал взять на себя вынос отчётов в отдельный сервис и переход интеграций на события, обсуждал это с тимлидом. Часть удалось — мы сделали канареечные выкатки и нормальные метрики. Но большая часть упирается в то, что бизнесу это сейчас не нужно, и я это понимаю: команда из четырёх человек, продукт работает, тратить квартал на переезд архитектуры незачем. Просто для меня это значит, что расти дальше надо в другом месте.

Ищу я две вещи: масштаб, где нагрузка и объём данных сами создают инженерные задачи, и команду, где есть люди сильнее меня, у которых можно учиться. В вашей вакансии совпадает и то, и другое: вы говорите про десятки тысяч RPS и про разделение монолита — это ровно тот класс задач, которого мне не хватает, и в команде из двенадцати человек с двумя сеньорами мне явно будет у кого спросить.»

Чего говорить нельзя

  • Любого негатива про людей. «Тимлид самодур», «коллеги не умеют писать код», «менеджеры ничего не понимают». Даже если это правда, интервьюер услышит только одно: через год этот человек так же расскажет про нас.
  • Имён и подробностей конфликта. Рынок маленький, вероятность пересечения выше, чем кажется.
  • «Просто устал / захотелось перемен». Пустой ответ, который читается как «настоящую причину назвать нельзя».
  • «Хочу развиваться» без содержания. Следующим вопросом будет «в чём именно?», и если сказать нечего, весь ответ обнуляется.
  • Только про деньги. «Мало платят» как единственная причина означает, что ты уйдёшь за первым, кто предложит на десять процентов больше.
  • Длинной истории. Пять минут про то, как всё разваливалось, остаются жалобой, как её ни упаковывай. Потолок здесь минута.
  • Вранья про увольнение. Если было сокращение, так и скажи: это сейчас никого не удивляет, а вскрывшаяся ложь закрывает оффер.

Чем добить

Скажи, что ты никуда не бежишь: «мне не срочно, я не в состоянии "лишь бы уйти" — поэтому и выбираю аккуратно». Кандидат, который не горит, воспринимается сильнее, чем кандидат в панике. Второй ход: упомянуть, что уходишь правильно, то есть доделываешь начатое, передаёшь дела, написал документацию по сервису. Лучшего сигнала о том, как ты когда-нибудь будешь уходить и отсюда, не бывает, а интервьюер думает об этом чаще, чем признаётся.

Суть: прийти с домашней работой — тремя числами (минимум, цель, амбиция) и знанием рынка. Сначала мягко вернуть вопрос про бюджет позиции; если настаивают — назвать интервал от цели до амбиции, гросс или на руки уточнить явно, обосновать одной строкой и замолчать. Текущую зарплату называть не обязаны — но и врать нельзя.

Каркас ответа

  1. Показать, что ты знаешь рынок: отсюда и берётся уверенность.
  2. Мягко вернуть вопрос: «какая вилка заложена по позиции?»
  3. Если настаивают, назвать интервал: цель → амбиция. Минимум не произносится никогда.
  4. Уточнить гросс или на руки, иначе разница в 15–16% на ровном месте.
  5. Одна строка обоснования и пауза. Не оправдываться.
  6. Про текущую зарплату либо вежливо уйти от ответа, либо назвать честно и сразу перевести разговор на рынок.
  7. Оставить дверь открытой: готов обсуждать пакет целиком.
Образец ответа

«Я смотрел рынок: обзоры зарплат, вилки в вакансиях и каналы, где компании указывают деньги, плюс разговаривал со знакомыми. Прежде чем называть свою цифру — подскажите, какая вилка заложена у вас по этой позиции? Она наверняка есть, и так мы быстрее поймём, есть ли о чём говорить.»

[Если отвечают «а вы назовите первым»]: «Хорошо. Я ориентируюсь на 600–700 тысяч гросс. Это соответствует рынку для мидла на Go с продакшн-опытом: PostgreSQL, Redis, Kafka, свои метрики и дежурства, миграции и канареечные выкатки на боевой системе. Внутри вилки конкретная цифра зависит от объёма ответственности — если это владение сервисом целиком и дежурства, то ближе к верхней границе.»

[И дальше — молчание. Паузу закрывает собеседник.]

[На «а сколько получаете сейчас»]: «Текущий доход я бы не обсуждал — он про мою прошлую задачу и про компанию, где я вырос из джуна, поэтому он отстаёт от рынка. Это, собственно, одна из причин, почему я смотрю варианты. По этой роли я ориентируюсь на ту вилку, которую назвал, и понимаю, из чего она складывается.»

[Если вилка компании ниже вашей]: «Понял. 550 — это ниже того, на что я рассчитывал, и, честно говоря, ниже рынка для этого набора задач. Мне интересна сама работа, поэтому давайте так: если по окладу есть потолок, я готов обсудить пакет целиком — например, пересмотр через полгода с зафиксированными критериями, или чуть больше отпуска. Если и это невозможно, лучше честно сказать друг другу сейчас, чем через месяц.»

Чего говорить нельзя

  • «Сколько предложите» / «зарплата для меня не главное». Это приглашение предложить минимум по вилке. И звучит неправдой: деньги важны всем.
  • Одно число вместо вилки. Одна цифра становится потолком, от которого будут торговаться вниз. Интервал оставляет пространство и выглядит как знание рынка.
  • Оправдываться после названной суммы. «…но это обсуждаемо, я в целом гибкий, можно и меньше», и ты только что сам уронил свою цифру на сто тысяч.
  • Аргументировать личными расходами. Ипотека, аренда, дети аргументом не считаются: платят за работу, а не за твои обязательства.
  • Завышать текущую зарплату. Иногда просят подтверждение дохода, и это единственная ошибка, после которой оффер отзывают целиком.
  • Называть цифру, не уточнив гросс или на руки. Разница в 15–16% выяснится в самый неподходящий момент.
  • Соглашаться на «ниже, зато потом пересмотрим» без записанных критериев и даты. Устного пересмотра не существует.

Чем добить

Добавь одну фразу, которая переводит разговор из торга в деловой: «Готов обсуждать пакет в целом, а не только оклад». Она показывает, что ты взрослый переговорщик, и открывает компании путь дать тебе то, что у неё есть, когда вилка грейда упёрлась: срок пересмотра, грейд, дежурные выплаты, отпуск, технику. И держи в голове: обсуждать деньги выгоднее после оффера, чем до него. На скрининге ты одна строчка в списке, а после финала человек, на которого потратили несколько часов и которого ещё месяц искать заново.

Суть: не соглашаться в звонке, поблагодарить и взять время с конкретной датой. Разобрать пакет целиком: бонус и его реальность, срок и правила пересмотра, грейд, ДМС, техника, формат работы, обучение, отпуск, оплата дежурств, дата выхода. Торговаться один раз, одним числом, с готовностью сказать «да». Всё договорённое — в письменный оффер.

Каркас ответа

  1. Благодарность и выраженный интерес, и только потом просьбы.
  2. Просьба о времени с конкретным днём: «отвечу в среду до конца дня».
  3. Список того, что ты хочешь уточнить, коротко и по пунктам, чтобы собеседник видел, что это не затягивание.
  4. Один раунд встречного предложения: число + обоснование + готовность закрыть сделку.
  5. Если оклад упёрся, переключаешься на остальной пакет.
  6. Фиксация в письме.
  7. Реакция на давление: спокойная, с готовностью принять «нет».
Образец ответа

«Первое, что я скажу в звонке, — спасибо и что мне интересно: чтобы не было ощущения, будто я торгуюсь из вредности. Дальше попрошу время, но не абстрактно: "Это серьёзное решение, мне нужно пару дней. Отвечу в среду до конца дня". Конкретная дата снимает у рекрутера тревогу гораздо лучше, чем просьба "дайте подумать".

Пока думаю, я разбираю не оклад, а весь пакет. Что спрашиваю: из чего состоит бонус, от чего он зависит и сколько людей получили его полностью в прошлом году — «до трёх окладов» бывает нулём третий год подряд, и считать надо по гарантированной части. Когда ближайший пересмотр и что нужно сделать, чтобы он произошёл. Какой грейд по внутренней шкале и чем он отличается от следующего. ДМС — с какого месяца, со стоматологией или нет. Техника — дают ли ноутбук и можно ли выбрать. Формат работы — сколько дней в офисе и записано ли это в договоре, потому что устное «у нас все удалённо» меняется вместе с руководителем. Есть ли бюджет на обучение. И отдельно — дежурства: есть ли он-колл, как устроен график и оплачивается ли он, потому что неоплаченный он-колл — это скрытая часть зарплаты, которую плачу я.

Если хочу больше денег — иду одним раундом и с одним числом: "Мне очень интересна задача, я хочу к вам. Готов выходить, если оклад будет 700 — это верх той вилки, которую я называл, и он соответствует объёму: владение сервисом целиком плюс дежурства". И дальше я действительно готов сказать «да»: если мне дают 700, торг закончен, и я не прихожу через день с новой просьбой. Если по окладу потолок, переключаюсь на то, где свобода обычно есть: пересмотр через полгода с записанными критериями, подписной бонус, отпуск, дата выхода. Всё, о чём договорились устно, прошу отразить в письменном оффере — иначе через полгода этой договорённости просто не существует.

Про дедлайн «ответ до завтра» — я отношусь к нему спокойно и как к информации о компании. Скажу примерно так: "Понимаю, что сроки поджимают. Мне нужно два дня — это решение на пару лет. Если это совсем невозможно, скажите прямо, и я приму решение исходя из этого". По моему опыту, в большинстве случаев «невозможно» оказывается возможным: никто не отзывает оффер за просьбу подумать два дня после четырёх часов интервью. А если действительно отзовут — это ровно тот ответ, который мне нужен про то, как здесь устроены дедлайны в работе.»

Чего говорить нельзя

  • «Да» прямо в звонке. Согласие голосом связывает: торговаться потом уже неудобно, а деталей пакета ты ещё не видел.
  • Торговаться по кругу. «А можно ещё чуть-чуть?» на третьем заходе запоминают надолго и пересказывают коллегам.
  • Просить и не быть готовым согласиться. Назвал 700, тебе дали 700, значит, выходишь. Иначе ты не переговорщик, а человек, который тянет время.
  • Блефовать чужим оффером. Иногда отвечают «тогда удачи», и отыграть назад нельзя. Настоящий оффер упоминать можно и нужно.
  • Верить устным обещаниям. «Через полгода точно пересмотрим» без строчки в оффере остаётся разговором, а не обещанием.
  • Исчезать молча. Если ждёшь другую компанию, скажи об этом прямо и назови дату. Неделя молчания рушит доверие ещё до выхода.
  • Устраивать скандал из-за дедлайна. «Это манипуляция, я так не работаю»: по сути ты прав, по форме проиграл.

Чем добить

Назови пункт, который почти никто не называет и который часто стоит дороже прибавки: зафиксированный срок и критерии пересмотра. «Через шесть месяцев ревью, критерии — вот эти, записаны в оффере» может принести больше денег за два года, чем плюс тридцать тысяч сейчас, и компании соглашаются на это охотнее, чем на выход за вилку грейда. И вторая фраза, которая хорошо звучит: «всё, о чём договорились устно, должно быть в письме — не из недоверия, а потому что люди меняются, а документ остаётся». Спокойная взрослая позиция, её уважают по обе стороны стола.

Суть: подготовить 8–12 вопросов по блокам (команда, процессы, прод и дежурства, решения и техдолг, роль и успех), задать три–пять, подобрав их под конкретного собеседника. Сильный вопрос — тот, на который нельзя ответить рекламой. Заканчивать вопросом про следующий шаг и сроки.

Каркас ответа

  1. Показать, что вопросы подготовлены, а не придуманы на месте.
  2. Три–пять вопросов из разных блоков, выбранных под роль собеседника.
  3. Реагировать на ответы, а не читать список: уточняющий вопрос ценнее следующего пункта.
  4. Одна фраза интереса с конкретной зацепкой из разговора.
  5. Закрыть сомнение, если оно повисло по ходу интервью.
  6. Спросить про следующий шаг и сроки обратной связи.
Образец ответа

«Да, у меня есть несколько — я готовился. Начну с команды: из кого она состоит сейчас, какие грейды, кто будет работать рядом со мной? И связанный вопрос — почему открыта эта вакансия: команда растёт или кто-то ушёл?

Дальше про процесс. Что происходит, когда команда не успевает к сроку — режете скоуп, двигаете дату или как? Мне этот вопрос кажется самым честным индикатором культуры: по ответу видно всё сразу.

Про прод — два вопроса, они для меня важные. Есть ли дежурства, как устроен график и оплачиваются ли они? И второй: что было последним крупным инцидентом и что после него изменили? Я сам после своей истории с несовместимой миграцией вынес постмортем на общий разбор, и у нас из этого выросли правило расширяй-и-сжимай и проверка миграций в CI. Мне интересно, как это устроено у вас — есть ли постмортемы и во что они превращаются.

И про мою роль: как выглядит успех на этой позиции через полгода — что должно произойти, чтобы вы сказали, что наняли правильного человека? Плюс, если можно, какие две-три задачи ждут меня первыми.

Последний вопрос — вам лично: что вам самому сейчас больше всего не нравится в работе команды?»

[В конце] «Спасибо, мне стало гораздо понятнее. Отдельно скажу: то, что вы рассказали про переход интеграций на события, — это ровно тот класс задач, ради которого я и меняю работу, так что мне интересно. И честно обозначу: с Kubernetes у меня опыт как у пользователя — деплою, читаю логи, правлю манифесты, но глубоко в устройство кластера не лез; если для роли это критично, готов подтянуть в первые месяцы. Подскажите, какой следующий этап и когда ждать обратную связь?»

Чего говорить нельзя

  • «Нет, вы всё рассказали». Самый дорогой ответ в этом блоке: читается как «мне всё равно, куда идти». Даже если правда всё рассказали, спроси про успех через полгода или про следующий шаг.
  • «А чем занимается компания?» Не открыл даже сайт.
  • Отпуск, ДМС, обеды и переработки у технического интервьюера. Это к рекрутеру и к моменту оффера.
  • «Когда меня повысят?» До того, как взяли.
  • «Как я справился, какие у меня шансы?» Ставит собеседника в неловкое положение: решение принимает не он и не сейчас.
  • Вопросы-экзамены. Попытка показать, что ты разбираешься лучше, проигрывает при любом исходе.
  • Читать список, не слушая ответы. И тем более задавать то, о чём уже подробно говорили полчаса назад.
  • Пятнадцать вопросов подряд. Финал не допрос: три–пять точных выглядят гораздо сильнее.

Чем добить

Лучший вопрос всего списка: «что было последним крупным инцидентом и что после него изменили». Рекламой на него не ответить: тебе либо расскажут про постмортем, выводы и изменённый процесс (и это отличная компания), либо начнут искать в рассказе виноватых, либо скажут «инцидентов у нас не бывает», а это значит, что мониторинга нет. Любой из трёх ответов тебе полезен. И маленькая деталь, которая работает всегда: задай уточняющий вопрос к ответу. Это превращает твой список в разговор и показывает, что ты действительно слушал. Именно это остаётся в фидбэке формулировкой «с ним было интересно разговаривать».