Психология обвинений: почему мы ищем виноватых
Эволюционная ловушка
Человеческий мозг эволюционировал для выживания в саванне, а не для анализа распределенных систем. Когда что-то идет не так, наш древний мозг кричит: "Найди угрозу! Накажи виновного! Защити племя!" Эта реакция спасала наших предков от саблезубых тигров, но разрушает современные инженерные команды.
Статистика, которая отрезвляет:
85% проблем в production — системные, а не человеческие ошибки (Google SRE)
94% инцидентов имеют множественные причины (STELLA Report)
Команды с культурой обвинений имеют в 3 раза больше повторных инцидентов
Цена страха: скрытые инциденты
Когда инженеры боятся наказания, они начинают скрывать проблемы:
Реальный пример из финтеха: Джуниор инженер случайно удалил индекс в production базе. Боясь увольнения, он потратил 6 часов, пытаясь восстановить его втайне. За это время:
Система работала с деградированной производительностью
30% транзакций обрабатывались с задержкой
Потери составили $1.2M
Если бы он сразу сообщил о проблеме, восстановление заняло бы 30 минут с потерями ~$100K.
Культура обвинений vs Культура обучения
Культура обвинений |
Культура обучения |
|---|---|
"Кто это сделал?" |
"Что произошло?" |
"Почему ты не проверил?" |
"Какие проверки отсутствовали в системе?" |
"Это твоя вина" |
"Система позволила это сделать" |
"Будь внимательнее" |
"Как сделать ошибку невозможной?" |
Наказание виновного |
Улучшение системы |
Страх ошибок |
Эксперименты и инновации |
Структура Blameless Postmortem
Timeline без имен: факты, не лица
Плохо:
14:32 - Иван запустил деплой без проверки конфигурации
14:33 - Из-за ошибки Ивана сервис упал
14:45 - Мария заметила проблему (наконец-то!)
15:10 - Петр починил то, что сломал Иван
Хорошо:
14:32 - Инициирован деплой версии 2.3.1
14:33 - Сервис стал недоступен (отсутствовала валидация конфига)
14:45 - Сработал алерт о недоступности (задержка 12 минут)
15:10 - Выполнен rollback к версии 2.3.0
"Что" вместо "кто": фокус на системе
Ключевые вопросы postmortem:
-
Что позволило этому случиться?
Отсутствие автоматических проверок
Недостаточное тестовое покрытие
Слабые safeguards
-
Почему это не было обнаружено раньше?
Мониторинг не покрывал этот сценарий
Staging окружение отличалось от production
Отсутствовали smoke tests
-
Какие барьеры не сработали?
Code review пропустил проблему
CI/CD не проверял этот кейс
Canary deployment не был настроен
Contributing Factors vs Root Cause
Устаревший подход "Root Cause": "Основная причина — невнимательность инженера"
Современный подход "Contributing Factors":
contributing_factors:
- immediate:
- Конфигурационный файл содержал опечатку
- Валидация конфига отсутствовала
- environmental:
- Деплой выполнялся в пятницу вечером
- Основной эксперт был в отпуске
- systemic:
- Процесс деплоя не требовал peer review
- Отсутствовала документация по конфигурации
- Staging окружение не идентично production
- organizational:
- Давление на скорость релизов
- Недостаток времени на техдолг
Системные улучшения vs Наказания
Бесполезные "action items":
❌ "Быть внимательнее"
❌ "Провести тренинг для Джона"
❌ "Усилить контроль"
❌ "Не допускать подобного"
Эффективные action items:
✅ "Добавить pre-commit hook для валидации конфига"
✅ "Реализовать canary deployment с автоматическим rollback"
✅ "Создать dashboard для мониторинга ключевых метрик"
✅ "Автоматизировать проверку конфигурации в CI/CD"
Фасилитация встречи: искусство управления эмоциями
Роль модератора
Модератор postmortem — это дирижер, управляющий оркестром эмоций и фактов:
Обязанности модератора:
Установить правила в начале встречи
Перенаправлять обвинения на системные проблемы
Защищать участников от атак
Фокусировать дискуссию на улучшениях
Документировать договоренности
Скрипт открытия встречи:
"Добро пожаловать на postmortem инцидента INC-2847.
Наша цель — понять, что произошло, и улучшить систему.
Правила:
1. Никаких обвинений — мы анализируем систему, не людей
2. Все ошибки — это возможности для улучшения
3. Если система позволила ошибку — проблема в системе
4. Мы здесь, чтобы учиться, не судить
Вопросы по правилам?"
Правила обсуждения
The Vegas Rule: "What happens in postmortem, stays in postmortem" — обсуждение не используется для performance review
The Prime Directive: "Все делали лучшее, что могли, с теми знаниями, ресурсами и в тех обстоятельствах, в которых находились"
No Judgment Rule: Запрещены фразы:
"Надо было..."
"Почему ты не..."
"Это очевидно..."
"Любой бы догадался..."
Техники переформулирования обвинений
Обвинение |
Переформулирование |
|---|---|
"Джон сломал production" |
"В production произошел инцидент во время деплоя" |
"Мария не заметила алерт" |
"Алерт не привлек достаточного внимания" |
"Петр написал баг" |
"В коде обнаружен дефект, прошедший review" |
"Команда недоработала" |
"В процессе есть пробелы, которые мы можем закрыть" |
"Это была глупая ошибка" |
"Система позволила совершить распространенную ошибку" |
Техника "5 Почему" без обвинений:
Инцидент: База данных недоступна
Почему? → Закончилось место на диске
Почему? → Логи заняли все пространство
Почему? → Ротация логов не работала
Почему? → Cron job был отключен при миграции
Почему? → Чек-лист миграции не включал проверку cron
Заметьте: ни одно "почему" не указывает на человека.
Работа с эмоциями участников
Стадии принятия в postmortem:
Отрицание: "Это не моя система виновата"
Гнев: "Почему никто не следит за мониторингом?!"
Торг: "Если бы у нас было больше времени..."
Депрессия: "Мы никогда это не исправим"
Принятие: "Давайте сделаем систему лучше"
Техники работы с эмоциями:
def handle_emotional_response(emotion_type, response):
strategies = {
'blame': "Давайте сфокусируемся на том, что система позволила это произойти",
'defensiveness': "Помните, мы анализируем систему, не ваши действия",
'anger': "Я понимаю frustration. Как мы можем предотвратить это?",
'guilt': "Вы действовали наилучшим образом с доступной информацией",
'fear': "Это обсуждение конфиденциально и не влияет на оценку работы"
}
return strategies.get(emotion_type)
Шаблон и примеры успешных Postmortem
Шаблон Google Postmortem
# Postmortem: [Название инцидента]
## Метаданные
- **Дата:** 2024-03-15
- **Авторы:** SRE Team
- **Статус:** Complete
- **Severity:** P1
- **Длительность:** 47 минут
## Резюме
Краткое описание что произошло (2-3 предложения).
## Влияние
- **Затронуто пользователей:** 15,000 (23% от активных)
- **Потерянный revenue:** $47,000
- **SLA impact:** -0.02% за месяц
## Timeline
| Время | Событие |
|-------|---------|
| 14:32 | Начат деплой версии 2.3.1 |
| 14:33 | Метрики показали рост ошибок 500 |
| 14:35 | Автоскейлинг начал создавать новые поды |
| 14:38 | Все поды в CrashLoopBackOff |
| 14:45 | Сработал PagerDuty алерт |
| 14:50 | Инженер начал investigation |
| 15:10 | Обнаружена проблема с конфигурацией |
| 15:15 | Инициирован rollback |
| 15:19 | Сервис восстановлен |
## Анализ
### Что сработало хорошо
- Алерт сработал в течение 12 минут
- Rollback процедура отработала чисто
- Коммуникация в команде была эффективной
### Что можно улучшить
- Валидация конфигурации перед деплоем
- Скорость обнаружения проблемы
- Canary deployment отсутствовал
### Contributing Factors
1. Отсутствие валидации YAML конфигурации
2. Различие между staging и production окружениями
3. Недостаточное покрытие интеграционными тестами
4. Деплой в пятницу без дополнительных проверок
## Action Items
| Действие | Владелец | Срок | Статус |
|----------|----------|------|--------|
| Добавить YAML validation в CI/CD | Platform Team | 2024-03-22 | In Progress |
| Настроить canary deployment | SRE Team | 2024-03-29 | Planned |
| Создать pre-prod окружение идентичное prod | Infrastructure | 2024-04-15 | Planned |
| Добавить smoke tests после деплоя | QA Team | 2024-03-25 | In Progress |
## Lessons Learned
1. Конфигурационные файлы требуют такой же строгой проверки, как код
2. Canary deployment критичен даже для "простых" изменений
3. Staging должен максимально соответствовать production
## Supporting Information
- [Ссылка на PR с проблемой]
- [Dashboard во время инцидента]
- [Slack thread обсуждения]
Пример переработки обвиняющего postmortem
До (обвиняющий стиль):
Инцидент произошел потому, что:
- Иван не проверил конфигурацию перед деплоем
- Мария опоздала с реакцией на алерт
- Команда недостаточно тестировала
- Разработчики были невнимательны
Action items:
- Провести тренинг для Ивана
- Обсудить с Марией важность алертов
- Усилить контроль за тестированием
После (blameless стиль):
Contributing factors:
- Система позволила деплой невалидной конфигурации
- Алертинг имел 12-минутную задержку
- Тестовое покрытие не включало данный сценарий
- Процесс review не выявил проблему
Action items:
- Автоматическая валидация конфигов в pipeline
- Настройка более чувствительных алертов
- Добавление integration тестов для конфигурации
- Чек-лист для review конфигурационных изменений
Метрики успешности blameless культуры
Количественные метрики
class PostmortemMetrics:
def calculate_culture_score(self):
metrics = {
'incident_reporting_rate': self.get_reporting_rate(), # Растет = хорошо
'repeat_incident_rate': self.get_repeat_rate(), # Падает = хорошо
'action_item_completion': self.get_completion_rate(), # Растет = хорошо
'mean_time_to_resolution': self.get_mttr(), # Падает = хорошо
'postmortem_participation': self.get_participation(), # Растет = хорошо
}
# Здоровая культура: высокий reporting, низкий repeat
culture_score = (
metrics['incident_reporting_rate'] * 0.3 +
(1 - metrics['repeat_incident_rate']) * 0.3 +
metrics['action_item_completion'] * 0.2 +
(1 - metrics['mean_time_to_resolution']) * 0.1 +
metrics['postmortem_participation'] * 0.1
)
return culture_score
Качественные признаки
Признаки здоровой культуры:
✅ Инженеры сами сообщают о своих ошибках
✅ На postmortem приходят добровольно
✅ Обсуждение фокусируется на системе
✅ Action items выполняются без напоминаний
✅ Количество инцидентов растет (больше репортят)
✅ Severity инцидентов падает (ловят раньше)
Признаки токсичной культуры:
❌ Инциденты скрывают до последнего
❌ На postmortem ищут козла отпущения
❌ Action items игнорируются
❌ Одни и те же проблемы повторяются
❌ Люди боятся дежурить
❌ High performers уходят из команды
Практические кейсы трансформации культуры
Кейс 1: От токсичности к доверию (финтех стартап)
Исходная ситуация:
3-4 инцидента в неделю
0 postmortem за последние 3 месяца
50% turnover в SRE команде
CEO лично разбирал каждый инцидент
Шаги трансформации:
Месяц 1: Амнистия
Объявили "амнистию" — никаких наказаний за инциденты
Первый postmortem провел сам CTO, взяв вину на себя
Ввели правило: "имена только в разделе участников"
Месяц 2: Обучение
Workshop по blameless postmortem для всей команды
Внешний фасилитатор для первых 3 встреч
Создали анонимный канал для сообщения об инцидентах
Месяц 3: Закрепление
Публичная похвала за обнаружение и исправление проблем
Метрика "обучение из инцидентов" в KPI команды
Празднование "лучшего postmortem месяца"
Результаты через 6 месяцев:
30+ postmortem проведено
Количество повторных инцидентов снизилось на 75%
0% turnover в команде
MTTR снизился с 47 до 12 минут
Кейс 2: Enterprise трансформация (банк, 5000+ сотрудников)
Исходная ситуация:
Культура "найти и наказать виновного"
Postmortem = разбор полетов с руководством
Инженеры писали CYA (Cover Your Ass) документацию
Инновации заморожены из-за страха
Стратегия изменений:
Фаза 1: Пилот (3 месяца)
Выбрали одну команду-чемпиона
Обучили blameless подходу
Изолировали от общего процесса
Фаза 2: Расширение (6 месяцев)
Success stories от пилотной команды
Постепенное вовлечение других команд
Метрики вместо мнений
Фаза 3: Институционализация (12 месяцев)
Изменение корпоративных политик
Обучение менеджмента
Привязка бонусов к культуре, не uptime
Ключевые изменения:
- "Incident Review Board" с директорами
+ "Learning Review" с инженерами
- "Root Cause Analysis Report"
+ "Learning from Incidents"
- "Responsible Person"
+ "Facilitator"
- "Corrective Actions"
+ "System Improvements"
Инструменты и шаблоны
Автоматизация postmortem процесса
# postmortem_automation.py
class PostmortemAutomation:
def __init__(self, incident_id):
self.incident_id = incident_id
def create_template(self):
"""Создает документ из шаблона"""
return {
'incident_id': self.incident_id,
'timeline': self.extract_timeline(),
'metrics': self.gather_metrics(),
'participants': self.get_oncall_engineers(),
'draft_factors': self.analyze_logs()
}
def extract_timeline(self):
"""Автоматически строит timeline из логов"""
events = []
events.extend(self.get_deployment_events())
events.extend(self.get_alert_events())
events.extend(self.get_metric_anomalies())
events.extend(self.get_chat_mentions())
return sorted(events, key=lambda x: x['timestamp'])
def schedule_meeting(self):
"""Планирует встречу в календаре"""
participants = self.get_participants()
available_slot = self.find_common_slot(participants)
meeting = {
'title': f'Postmortem: {self.incident_id}',
'duration': 60,
'participants': participants,
'time': available_slot,
'agenda': self.generate_agenda()
}
return self.calendar.create_meeting(meeting)
def track_action_items(self):
"""Создает задачи в Jira/GitHub"""
for action in self.action_items:
self.create_ticket(
title=action['description'],
assignee=action['owner'],
due_date=action['deadline'],
labels=['postmortem', 'reliability']
)
Чек-лист фасилитатора
## Before Meeting
- [ ] Создан документ из шаблона
- [ ] Собрана предварительная timeline
- [ ] Приглашены все участники
- [ ] Подготовлены графики и дашборды
- [ ] Отправлено напоминание о blameless правилах
## During Meeting
- [ ] Озвучены правила в начале
- [ ] Назначен note-taker
- [ ] Следим за временем (60 минут макс)
- [ ] Перенаправляем обвинения на систему
- [ ] Фиксируем все contributing factors
- [ ] Определяем конкретные action items
## After Meeting
- [ ] Документ финализирован в течение 24ч
- [ ] Action items созданы в трекере
- [ ] Документ опубликован для всех
- [ ] Запланирован follow-up через 2 недели
- [ ] Метрики обновлены
Заключение: путь к настоящей blameless культуре
Blameless postmortem — это не просто процесс, это философия. Переход от культуры обвинений к культуре обучения требует:
Терпения — изменение культуры занимает месяцы
Последовательности — один обвиняющий postmortem может откатить прогресс
Поддержки руководства — без нее трансформация обречена
Измерения прогресса — метрики важнее ощущений
Празднования успехов — отмечайте хорошие postmortem
Помните: каждый инцидент — это инвестиция в обучение, но только если вы готовы учиться, а не судить. Команды, освоившие blameless культуру, не только имеют меньше инцидентов, но и быстрее инновируют, потому что не боятся экспериментировать.
В конце концов, если пилоты авиации смогли создать культуру, где ошибки обсуждаются открыто (и благодаря этому авиация стала самым безопасным видом транспорта), то и IT-индустрия способна на это. Вопрос только в готовности отказаться от поиска виноватых в пользу построения надежных систем.
Комментарии (15)

zababurin
19.10.2025 18:32Хороший подход мне кажется. А размывание ответственности можно обойти ещё одним уровнем, на котором эти шаги привязываются к определенному человеку (до того, как что то произошло, а не после) Это позволяет создать гибкие обязанности на основе фактической роли человека в проекте, а не на том, что должен человек делать на формально занимаемой должности.
а когда каждый этап будет закреплен за определенным человеком занимающим формально определенную должность, сформируется и методология, с определенным набором качеств под определенную роль

ruomserg
19.10.2025 18:32Я очень призываю использовать опыт отраслей, где правила написаны кровью - например ICAO. Является совершенно обязательным отделить техническое расследование от административного. Техническое расследование - делается именно так, как описано в статье: обезличенно, опираясь на факты - с целью выработать мероприятия для предотвращения (или хотя бы смягчения последствий). На этом уровне очень важно понимать, что любые мероприятия до определенного момента снижают частоту инцидентов "фронтально", но в какой-то момент вы упираетесь в предел: можно снижать вероятность одних только за счет других (вы не можете одновременно требовать от пилотов и вылетать по расписанию в любую погоду, и не заходить на посадку при плохой видимости - чудес не бывает!). И дальше - обязанность бизнеса сказать чем он готов рисковать, а чем - нет.
А помимо технического расследования (но возможно, с учетом его материалов) - можно проводить административное расследование, чтобы установить выполнили ли участники событий свои обязанности. В рамках административного расследования, однако, следует возрерживаться от объективного вменения - раз наступили неблагоприятные последствия, значит виновен. Следует ограничиться выяснением обстоятельств указывающих на вину в виде умысла (желал наступления неблагоприятных последствий), или преступной небрежности (не желал наступления, предвидел и допускал возникновение, однако надеялся что последствия не наступят).
Административные же последствия должны наступать в ситуации, когда предписанный порядок действий существовал, был достаточен для предотвращения негативных последствий, но не исполнялся. Например - чеклист предусматривал прогнать конфиг через lint, но это не было сделано (а галочка - поставлена, или не сделано и не поставлено - и деплоили с невыполненным чеклистом). Или дежурный не поставив никого в известность - был вне зоны доступа в течение часа с возникновения проблемы...
Разумеется, здесь есть риск начать писать инструкции в стиле "техники безопасности для канатоходца": при движении по канату совершайте плавные и размеренные движения, удерживая проекцию центра тяжести тела в пределах площади опоры. "Кто упал, тот нарушил!" (C) Контрольный вопрос для предотвращения: правила и инструкции должны быть такими, чтобы вы могли с легким сердцем наказать за неисполнение ДАЖЕ если в конкретном случае ничего страшного не произошло. Ибо если люди деплоят не выполняя чеклисты - им надо делать втык и объяснять, что с теорией вероятности играть не следует - эта тварь всегда выигрывает...
Опять же - необходимо предусматривать процедуру выхода за пределы инструкций, если они не применимы к ситуации. Иначе можно получить итальянскую забастовку (все сидят и ждут - но по-инструкции)! Крайне желательно чтобы отступления от инструкции (вместе с мотивами этого) и предполагаемые действия фиксировались средствами объективного контроля (запись в журнале, пост в канале тимз). Очень важно чтобы все (включая менеджмент) понимали что записывая отступление от инструкции, человек освобождается от ответственности (кроме случаев умысла на причинение вреда). Ибо административная процедура не может наказывать за ошибки - а только за виновные действия!
В конечном счете - для успеха необходимо совместить два действия: конвертировать ошибки в опыт - не вызывая паралича воли у исполнителей, и одновременно дискриминировать (вплоть до увольнения) - необучаемых мудаков...

nordby Автор
19.10.2025 18:32Отлично сказано, полностью согласен. Именно этот баланс и нужен — чтобы ошибки превращались в опыт, а не в страх, и при этом безнаказанности тоже не было. Есть и те, кто реально старается, учится и отвечает за результат — просто хочется, чтобы система это поощряла, а не душила инициативу.

tsbt
19.10.2025 18:32Более забавны ситуации, когда на протяжении многих лет известны реальные индивиды, которые своими руками и мозгами принимают решения без опоры на реальность, строят планы и графики реализации проектов, сложных интеграций подсистем в единое поставляемое заказчикам решение. И всякий раз у них приключения на итоговой фазе сдачи проекта.
И всякий раз оказывается, что эти скоморохи забыли написать ТЗ для отдельного модуля, не продумали модель данных, элементарно не включили в план работы по тестированию решения под нагрузкой целевой и даже не имеют малейшего представления о том, какой она должна быть.
При получении нейтрального письма-постмортемы, эти ребята нежно розовеют и предпочитают опять игнорировать факты.
Они выбирают безопасный для себя путь - просто с текущей точки начать писать ТЗ, но очень лениво и неохотно.
Коллеги, которые должны проверить работу решения под нагрузкой не могут с многих десятков попыток достучаться и получить описание профиля целевого нагружения, описания критичных сценариев конкретной кастомной подсистемы.
Когда данные получены и выполняется первичная ручная проверка сценариев - оказывается отдельные подсистемы не работают и требуют доработки.
Когда в рабочую группу добавляют руководство - теневые размыватели ответственности начинают писать клеветнические письма, что группа коллег, которые в последние 2% времени по их плану должна провести нагрузочные испытания по их графику - отказывается работать.
На этом этапе они говорят, что коллеги срывают график, но игнорируют факты и отказываются признавать, что ТЗ и профиль нагружения ещё не описаны, сценариев нет.
Здесь же стимулируется эмоциональная неприязнь и нежелание читать письма с фактами и перечнем необходимых мер.

XelaVopelk
19.10.2025 18:32Реальный пример из финтеха: Джуниор инженер случайно удалил индекс в production базе. Боясь увольнения, он потратил 6 часов, пытаясь восстановить его втайне.
Что это за "финтех", если не секрет, в котором джун может лазать в админском режиме грязными руками в продовой базе? При чём "тайно".
Хотелось бы знать, чтобы случайно не воспользоваться "услугами" этой организации.
muxa_ru
А когда я говорю, что рукожопы по факту не несут ответственности, мне говорят, чтоя выдумываю.
Ну и да.
У каждого из этих пунктов есть имя и должность.
А то что Вы пишете, называется "размывание ответственности", и это не "современный подход", а очень старый способ сделать вид, что "оно само так произошло".
nordby Автор
ты в целом прав — размывание ответственности реально существует, и когда «никто не виноват», всё обычно заканчивается тем, что никто и ничего не меняет. Это бесит, согласен.
Но сам подход “blameless” по идее не про то, чтобы отмазать рукожопов. Он про то, чтобы разобрать, почему система вообще допустила ошибку, а не просто повесить всех собак на одного человека. Потому что если кто-то нажал не ту кнопку — значит, у нас есть процесс, где это можно было сделать без проверки, без подтверждения, без safeguards.
Наказание конкретного человека проблему не решает, оно максимум даёт ощущение справедливости. А вот если после инцидента команда спокойно разбирает, что пошло не так, и назначает конкретные действия и ответственных за исправление — тогда уже появляется смысл.
Так что да, ответственность должна быть. Просто не “кто виноват”, а “кто теперь делает, чтобы не повторилось”. А если этим прикрываются и ничего не чинят — ну, тогда это уже не “blameless”, а просто безответственность под модным словом.
muxa_ru
Он на то, чтобы освободить от страха сознательных исполнителей, которые стараются делать хорошо, но находятся под гнётом наказания.
Но для этого надо, чтобы человек сперва вырос в условиях жёсткого контроля и умел и хотел контролировать себя сам. А у нас вся отрасль выросла в условиях "никто не виноват, потому что тут всё очень сложно и слишком много людей участвует".
И этот процесс кто-то утвердил. Он будет наказан?
nordby Автор
процесс утвердил конкретный человек, и он тоже несёт ответственность. Просто не в формате «наказать», а в формате «разобраться и исправить, чтобы больше не повторилось».
muxa_ru
Ну вот об этом и речь - отрасль живёт в атмофсере полной безнаказанности, поэтому нет никаких причин делать что-то хорошо. Если из-за твоего рукожопства куча людей и компаний получат проблемы и убытки, то лично тебе ПОФИГ!
nordby Автор
Не всем пофиг, правда. Есть люди (и среди зумеров тоже), которые реально переживают за результат и стараются делать хорошо — просто им нужно пространство, где ответственность проявляется в делах, а не в страхе получить по шапке.
muxa_ru
А что делать, если из-за некачественной таких людей кто-то погибнет?
Они понесут наказание?
nordby Автор
это уже суд будет решать, если ты в таком ключе ставишь вопрос
muxa_ru
А суд будет?
nordby Автор
если кто-то погибнет, но с высокой вероятностью что - да