Postmortem без поиска виноватых
Как провести разбор инцидента без охоты на виноватых и превратить цепочку причин в конкретные улучшения системы.
Инженерные практикиНадёжностьУтро понедельника в офисе было тихим и напряжённым. Пятничный пожар потушили, сервис авторизации, лежавший почти час, подняли, но осадок остался.
— Ладно, проехали, — сказала Таня, тимлид, на утреннем стендапе. — Главное, что всё работает. Не будем тратить время, у нас куча задач на спринт.
Сергей, разработчик, чей коммит был последним перед падением, нервно кивнул, стараясь не встречаться ни с кем взглядом.
— Минутку, — вмешался Макс, спокойно отпивая кофе. — Я думаю, время как раз потратить стоит. Предлагаю в 11 собраться в переговорке на полчаса. Проведём post-mortem.
В воздухе повисло неловкое молчание. Слово «post-mortem» прозвучало как «вызов на допрос».
— Макс, да что там разбирать? — не выдержала Таня. — Сергей ошибся, мы поправили. Все устали, не надо никого тыкать носом.
— А я и не собираюсь, — ответил Макс. — Моя цель — не найти виноватого, а понять, почему наша система позволила этой ошибке случиться.
В 11:00 в переговорке было тихо, как в библиотеке. Сергей сидел, скрестив руки, готовый к обороне.
— Итак, — начал Макс и подошёл к доске. — Прежде чем мы начнём, одно правило.
Он указал на доску, где крупными буквами было написано:
❗️Мы все верим, что каждый из нас действовал из лучших побуждений, исходя из той информации, которая у него была. Сломалась система, а не человек
— Цель этой встречи, — продолжил он, — сделать нашу систему сильнее. Давайте разберём не «кто», а «почему». Итак, что случилось?
— Сервис упал из-за NullPointerException, — буркнул Сергей. — В поле userProfile пришёл NULL, а код этого не ожидал.
— Окей, это триггер. А теперь давайте раскрутим цепочку, — Макс нарисовал первую стрелку. — Почему в коде не было проверки на NULL?
— Я был уверен, что профиль есть всегда, — ответил Сергей. — В требованиях не было указано, что он может отсутствовать. Меня торопили с задачей, я не стал добавлять избыточных проверок.
— Понятно, — сказал Макс. — Это не ошибка, это фактор №1: неполные требования и спешка.
Он нарисовал вторую стрелку. — Почему тесты пропустили такой сценарий?
— У нас в тестовых данных у всех пользователей есть профили, — вступила Оля, тестировщик. — Скрипт генерации тестовых данных старый, он не покрывает этот случай.
— Фактор №2: устаревшая тестовая среда. Записал. Идём дальше. Почему мы узнали о проблеме от пользователей, а не от мониторинга?
— Алерт сработал, но уже когда сервис перестал отвечать на health-чеки, — ответил Макс сам себе. — У нас нет алерта на конкретную ошибку в логах. Фактор №3: неэффективный мониторинг.
Напряжение в комнате начало спадать. Стало очевидно, что дело не только в строчке кода Сергея.
— И последний вопрос, — сказал Макс. — Почему мы выкатывали критичное изменение в сервис авторизации в пятницу в 15:00?
Таня вздохнула.
— Потому что маркетинг обещал клиентам запуск акции на выходных. Было давление сверху.
— Фактор №4: нарушение внутренних процессов под давлением бизнеса.
Макс обвёл все четыре пункта на доске.
— Смотрите. Падение — это не вина Сергея. Это результат совпадения четырёх факторов. Любой из них мог бы его предотвратить. Наша задача — исправить систему, чтобы эта цепочка больше не собралась.
Дальше встреча пошла конструктивно. За 15 минут команда накидала конкретные задачи:
💻 Код: Добавить проверку на NULL в сервис. отв.: Сергей.
🧪 Тесты: Обновить скрипт генерации тестовых данных. отв.: Оля.
📈 Мониторинг: Настроить алерт на NullPointerException в логах сервиса. отв.: Макс.
📋 Процессы: Внести в регламент обновлений раздел “Критичные сервисы” и правило, запрещающее релизы критичных сервисов в нерегламентное время. отв.: Таня.
Когда все расходились, атмосфера была совершенно другой. Вместо поиска виноватых команда работала вместе над улучшением системы.
Сергей подошёл к Максу.
— Спасибо. Я думал, меня сейчас будут распинать.
— Запомни, — ответил Макс, — хороший инженер не тот, кто не ошибается, а тот, кто делает выводы из ошибок, чтобы система стала надёжнее. Сегодня мы все стали немного лучшими инженерами.