voidlearn
 

2.2Истории по методу 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, я объяснил, как правильно» проваливает всю историю. Грейд не аргумент: в споре он не весит ничего, прав тот, у кого есть критерий и цифра, а не тот, у кого грейд выше.

Чем добить

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

Постмортем без обвинений - как про это говорить

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

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

  • Называть виноватого. Даже если это правда, даже если это был не ты. В «коллега написал плохой код» интервьюер услышит, как ты будешь говорить про его команду.
  • «Сидел ночью и починил». Героизм выдаёт, что процессов нет. Ценится не бессонная ночь, а откат за пять минут.
  • Заканчивать на фиксе. Если после «починил» в системе ничего не изменилось, инцидент повторится, и ровно это услышит интервьюер.
  • «Больше не повторится, будем внимательнее». Это не вывод. Вывод выглядит как алерт, тест, линтер, изменённый чек-лист или изменённая архитектура.
  • Врать про масштаб. После «лежал весь прод на четыре часа» сразу спросят про 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» сразу видно человека, который уже внедрял что-то в живой команде, а не только предлагал.

Что стоит запомнить

  • В STAR контекст и задача занимают меньше места, чем личные действия и результат.
  • Task отделяет ответственность кандидата от цели всей команды.
  • Result может включать измеримый итог и последующее изменение процесса.

Частые ошибки

  • Рассказ о проблеме команды без конкретного собственного действия не отвечает на вопрос о вкладе.
  • Нельзя приписывать себе общий результат без обозначения роли коллег.

Самопроверка

Сначала реши задачу самостоятельно, затем открой ответ и сравни ход рассуждений.

Применение

1. Дополни незавершённую STAR историю

В ответе сказано: «В одном сервисе периодически дублировались уведомления. Нужно было прекратить повторы, не потеряв доставку». Допиши Action и Result только из фактов: ты добавил таблицу processed_events с уникальным event_id, запись и изменение заказа поместил в одну транзакцию; на повторном событии обработчик завершает работу без повторной отправки; за месяц дублей не было, а повторы брокера остались включены.

Ответ и разбор

Action: «Я добавил таблицу обработанных event_id и выполнял её запись вместе с изменением заказа в одной транзакции. Если брокер доставлял событие повторно, уникальное ограничение останавливало повторную отправку, при этом повторы брокера оставались включены». Result: «За следующий месяц дубли не наблюдались». Это не доказывает отсутствие дублей навсегда, поэтому период наблюдения важен.

Применение

2. Раздели общий контекст и личную задачу

Команда должна была мигрировать интеграцию до конца месяца. Ты отвечал только за обратную совместимость HTTP DTO; коллега мигрировал хранение данных. Как сформулировать Task, чтобы не присвоить командную цель и работу коллеги?

Ответ и разбор

«Командная цель была завершить миграцию до конца месяца. Моей задачей было изменить HTTP DTO так, чтобы старые клиенты продолжали работать во время перехода». Так общий дедлайн остаётся Situation, а личная ответственность - Task. Работа коллеги не выдаётся за свой результат.

Применение

3. Урежь лишний контекст

Ответ начинается так: «Компания основана в 2012 году, у нас семь отделов, CRM переписывали дважды, команда выросла с пяти до четырнадцати человек, потом мы заметили задержки…» Вопрос был: «Расскажи о технически сложной задаче». Что оставить в Situation и почему?

Ответ и разбор

Оставь только условие, объясняющее сложность: «В CRM отчёт по сделкам стал медленным на production-объёме данных, и нужно было найти причину без изменения пользовательского результата». История компании и размер команды не помогают понять задачу. Остальное время отдай собственному расследованию и тому, как проверил эффект.

Применение

4. Ограничь claim о результате

Ты участвовал в команде из четырёх человек, добавившей outbox. После релиза график показывает снижение потерянных событий, но аудит ещё не закончен. Сформулируй Result так, чтобы не заявить недоказанное и не стереть вклад команды.

Ответ и разбор

«Мы внедрили outbox; по текущим production-метрикам число потерянных событий снизилось. Я отвечал за транзакционную запись события вместе с изменением заказа. Полный аудит периода ещё идёт, поэтому окончательную долю снижения пока не называю». Формулировка отделяет командный релиз, личную часть и ограничение данных.