Цена ошибки
где можно доверять, а где нельзя
Что это
Проверять всё одинаково тщательно невозможно и не нужно. Вопрос в том, по какому признаку решать, где проверять бегло, а где построчно.
Распространённый ответ — «по сложности задачи» — неверный. Правильный признак другой: сколько стоит ошибка, если она случится. А стоимость складывается из двух вещей: насколько легко откатить и насколько быстро заметишь.
Как это считать
Обратимость
Насколько просто вернуть как было.
| Легко откатить | Трудно откатить |
|---|---|
| правка в коде под git | миграция базы, изменившая данные |
| новая функция, которую никто не вызывает | отправленные пользователям сообщения |
| локальный эксперимент | удалённые файлы |
| изменение, покрытое тестами | опубликованный релиз, который уже скачали |
Git делает обратимым почти всё, что касается кода, — поэтому он в книге отдельной статьёй (5.1). Необратимо то, что вышло за пределы репозитория: данные, письма, деньги, публикации.
Заметность
Насколько быстро ошибка даст о себе знать.
| Заметишь сразу | Можешь не заметить месяцами |
|---|---|
| не запускается | неверные числа в отчёте |
| падает с ошибкой | потерянная часть записей при импорте |
| кнопка не нажимается | неправильный часовой пояс |
| тесты краснеют | утечка, которая проявится под нагрузкой |
Правая колонка опаснее левой. Ошибка, которая роняет программу, честна: она сообщает о себе немедленно. Ошибка, которая молча портит данные, обнаружится тогда, когда испорчено уже всё.
Вместе
| Заметишь сразу | Можешь не заметить | |
|---|---|---|
| Легко откатить | бегло: запусти и посмотри | внимательно: читай логику |
| Трудно откатить | внимательно: читай дифф | построчно + план + тесты |
Правый нижний угол — миграции, рассылки, работа с деньгами и чужими данными. Там обязательны и план (статья 3.10), и мини-ТЗ (3.15), и тесты (3.9), и чтение диффа (2.13). Левый верхний — то, что можно просто запустить.
Как сказать ИИ
Оценку можно переложить на ИИ, и он с ней справляется неплохо:
Прежде чем делать: что в этой задаче необратимо
и что может сломаться незаметно? Коротко.Для всего, что меняет данные, есть отдельный вопрос:
Эта правка меняет существующие данные? Если да —
как откатить, если окажется, что она неверна?Если ответа на второй вопрос нет, задачу нельзя начинать: сначала способ отката, потом правка.
Сделай так, чтобы миграция была обратимой: сохрани старый
файл, а не удаляй. Переименование вместо удаления.На что смотреть
Необратимое выполняется без репетиции. Миграции, массовые правки,
рассылки — всё это сначала прогоняют на копии. «Режим без записи» (--dry-run),
который только печатает, что собирался сделать, стоит одной просьбы и спасает
регулярно.
Удаление вместо переименования. rm и DROP необратимы, переименование
— нет. Это самый дешёвый способ сделать операцию откатываемой.
Нет способа заметить. Если у правки нет ни теста, ни лога, ни видимого эффекта — ты узнаешь о её ошибке последним.
Доверие по привычке. Пять удачных правок подряд не делают шестую безопасной. Уровень проверки определяется задачей, а не предыдущими успехами.
Шпаргалка
Проверка настраивается по цене ошибки, а не по сложности.
Цена = обратимость × заметность.
Опаснее всего незаметное: оно обнаружится, когда испорчено всё.
Правый нижний угол (необратимо + незаметно) — план, ТЗ, тесты, дифф.
Нет способа откатить — не начинай, сначала придумай откат.
Переименовывай вместо удаления.