Инженерная практика
Безвинные постмортемы: превращать аварии в системы, что чинишь, а не в людей, кого винишь
Деплой кладёт checkout на 40 минут. На ретро директор спрашивает «кто его запушил?». Инженер, что зашипил, замолкает, таймлайн вычищается, и отчёт заключает «человеческая ошибка — добавили чеклист деплоя». Шесть недель спустя тот же класс аварии повторяется, потому что настоящая история — CI-гейт, что тихо пропустился на флейки-тесте, конфиг-флаг без покрытия в staging, алерт, что пейджил не ту команду, — так и не попала в комнату. Вина не сделала систему безопаснее. Она сделала следующий инцидент тише.
Почему безвинность — инженерное решение, не просто доброта
Аргумент за безвинность не в том, что люди заслуживают избавления от дискомфорта. Он в том, что вина уничтожает информацию. В момент, когда инженер верит, что ретро охотится за кем-то для наказания, он перестаёт добровольно выдавать детали, что важны: полупонятый воркэраунд, алерт, что замьютил на прошлой неделе, нутряное чувство, что проигнорил под дедлайном. SRE-книга Google излагает предпосылку прямо — безвинный постмортем «предполагает, что все вовлечённые в инцидент имели добрые намерения и делали правильное с информацией, что у них была». John Allspaw из Etsy формулирует ту же идею как справедливую культуру (just culture): ты трактуешь инцидент «как источник данных, не что-то стыдное, от чего надо шарахаться».
Механизм прост и жесток. Накажи гонца — и натренируешь лучших инженеров молчать о риске. Данные всплывают не как меньше инцидентов, а как меньше отчётных инцидентов — пока один, что не спрятать, не кладёт checkout. Сеньор читает подозрительно чистую историю инцидентов как запах, не трофей: обычно это значит, что организация загнала отказ в подполье, а не вон из системы.
Структура: таймлайн, импакт, способствующие факторы, action items
Постмортем, что окупает свою цену, имеет четыре несущих секции. Таймлайн — нейтральный, с временными метками отчёт — детект, эскалация, митигация, восстановление — написанный в прошедшем времени без прилагательных о компетентности. Импакт квантифицирует радиус поражения: минуты простоя, проваленные запросы, затронутые клиенты, сожжённая выручка или бюджет SLO. Размытый импакт («некоторые пользователи видели ошибки») — это как авария получает заниженный приоритет, а фикс так и не получает людей.
Третья секция — где безвинность и наивная практика расходятся: способствующие факторы, во множественном, не «корневая причина». Руководство Google — два-пять системных причин: брешь процесса, ограничение тулинга, недостающий тест, неверно смаршрутизированный алерт, дыра в документации — каждая сформулирована как свойство системы, не человека. Четвёртая секция, action items, — единственная часть, что меняет будущее. Каждый пункт должен быть конкретным, иметь единственного именованного владельца и нести срок; action item без владельца — это пожелание.
| Секция | Безвинно / полезно | С виной / театр |
|---|---|---|
| Таймлайн | Нейтральные метки: детект → митигация → восстановление | «Инженер X беспечно запушил в 14:02» |
| Импакт | 40 мин простоя, 12k проваленных checkout, 30% бюджета SLO | «Некоторые пользователи были затронуты» |
| Причина | 2–5 способствующих факторов по людям, тулам, процессу | Одна корневая причина: «человеческая ошибка» |
| Action items | Конкретные, один владелец, срок, трекинг до готово | «Быть внимательнее» / «добавили чеклист» |
Почему «5 почему» и единственная корневая причина — неверная модель
Народный метод — «5 почему»: спроси «почему» пять раз и дойдёшь до той самой корневой причины. Для сложных систем это активно вводит в заблуждение. Эссе Allspaw The Infinite Hows — опираясь на Sidney Dekker и Nancy Leveson — доказывает, что спрашивать «почему» раз за разом тащит тебя к единственной линейной цепи, ретроспективному искажению и в итоге вине, потому что каждое «почему» требует оправдания, а оправдания указывают на людей. Реальные аварии многопричинны: деплой, флейки-тест, что дал гейту пропуститься, конфиг-флаг без покрытия в staging и неверный маршрут алерта — все должны были выстроиться в ряд. Ни один в одиночку не «вызвал» это; вызвало их взаимодействие.
Рефрейм Allspaw — спрашивать «как» вместо «почему» — бесконечные как. Вопросы «как» поднимают условия, что сделали действие разумным на тот момент, скрытое экспертное знание, что люди использовали, трейдоффы эффективность-против-тщательности, в которых они лавировали под давлением. Сдвиг от «почему ты это сделал?» к «как это действие имело смысл при том, что ты знал?» — разница между допросом и расследованием. Ты не можешь починить человека; ты можешь починить систему, что сделала опасный путь лёгким.
Почему это работает
«Корневая причина» грамматически в единственном числе, и в этом ловушка — это подталкивает всех остановиться на первом правдоподобном факторе и пришпилить его тому, кто был ближе всех к клавиатуре. Dekker называет это старым взглядом: ошибка как причина отказа. Новый взгляд трактует ошибку как симптом более глубоких системных условий. Переключение с «корневой причины» на «способствующие факторы» — не педантизм; оно меняет то, куда смотрит комната.
Трейдофф сеньора: ретро стоят времени и окупаются, только если пункты шипятся
Тщательный постмортем дорог: часы времени инженеров на написание таймлайна, кросс-командная ревью-встреча, трекинг последующих действий. Эта цена оправдана, только если action items реально делаются — и индустриальные данные тут мрачны. Отчётные нормы ставят выполнение action items ниже 50%, у многих команд под 40% выполнено за 90 дней, а частота повторных инцидентов приземляется около 35–50%. Когда пункты написаны и подшиты с нулевым доведением до конца, ты заплатил полную цену ретро и купил ничего: та же авария повторяется, и теперь твои инженеры ещё и верят, что постмортемы — театр.
Так что ход сеньора — нормировать церемонию и защищать доведение до конца. Не каждый сбой заслуживает полного постмортема — команды ставят триггер по severity (нарушение SLO, видимый клиенту простой дольше N минут, sev1/sev2). SRE-воркбук Google рекомендует публиковать быстро (цель — под 48 часов, пока память свежа) и трекать action items до закрытия как любую другую приоритизированную работу, с проверками на 30/60/90 дней и целью выполнения заметно выше 85%. Документ постмортема — дешёвая часть; дорогая, ценная часть — работа, на которую он тебя обязывает.
40-минутная авария checkout только что разрешилась. Как команде провести ретро?
Почему ревью инцидента, движимое виной, со временем делает системы менее безопасными?
Ретро заключает одной корневой причиной: «человеческая ошибка, добавили чеклист». В чём критика сеньора?
Расставь секции безвинного постмортема по мере его построения:
- 1 Таймлайн: нейтральный, с временными метками отчёт детект → митигация → восстановление
- 2 Импакт: квантифицируй радиус поражения — минуты простоя, проваленные запросы, сожжённый бюджет SLO
- 3 Способствующие факторы: 2–5 системных причин по людям, тулам и процессу
- 4 Action items: конкретные, один владелец, срок
- 5 Доведение до конца: трекай каждый пункт до закрытия с проверками на 30/60/90 дней
- 01Объясни коллеге, почему «кто запушил плохой деплой?» — неверный открывающий вопрос, и что спрашивать вместо.
- 02Почему постмортем с action items, но без доведения до конца хуже, чем вообще никакого постмортема?
Безвинные постмортемы — инженерное решение, не любезность: вина уничтожает нужную тебе информацию, потому что наказанные инженеры учатся прятать инциденты и вычищать таймлайны, оставляя тебя с меньшим числом отчётных отказов, а не меньшим числом реальных. Полезный постмортем имеет четыре несущих части — нейтральный таймлайн с метками, квантифицированный импакт, два-пять способствующих факторов вместо единственной корневой причины и конкретные action items, каждый с одним владельцем и сроком. Привычка «5 почему» и единственной корневой причины — неверная модель для сложных систем, что падают многопричинно; Infinite Hows Allspaw перерамляет дознание с «почему» (что указывает на людей) на «как» (что поднимает условия, сделавшие опасный путь лёгким). Трейдофф сеньора в том, что ретро дороги и окупаются, только когда пункты реально шипятся, так что нормируй церемонию триггером по severity, публикуй быстро и трекай каждый action item до закрытия — потому что постмортем, подшитый с нулевым доведением, стоит полную цену и покупает ничего, пока та же авария повторяется.