Программирование с ИИ
ENRU
1.5

Цена ошибки

где можно доверять, а где нельзя

Что это

Проверять всё одинаково тщательно невозможно и не нужно. Вопрос в том, по какому признаку решать, где проверять бегло, а где построчно.

Распространённый ответ — «по сложности задачи» — неверный. Правильный признак другой: сколько стоит ошибка, если она случится. А стоимость складывается из двух вещей: насколько легко откатить и насколько быстро заметишь.

Как это считать

Обратимость

Насколько просто вернуть как было.

Легко откатитьТрудно откатить
правка в коде под gitмиграция базы, изменившая данные
новая функция, которую никто не вызываетотправленные пользователям сообщения
локальный экспериментудалённые файлы
изменение, покрытое тестамиопубликованный релиз, который уже скачали

Git делает обратимым почти всё, что касается кода, — поэтому он в книге отдельной статьёй (5.1). Необратимо то, что вышло за пределы репозитория: данные, письма, деньги, публикации.

Заметность

Насколько быстро ошибка даст о себе знать.

Заметишь сразуМожешь не заметить месяцами
не запускаетсяневерные числа в отчёте
падает с ошибкойпотерянная часть записей при импорте
кнопка не нажимаетсянеправильный часовой пояс
тесты краснеютутечка, которая проявится под нагрузкой

Правая колонка опаснее левой. Ошибка, которая роняет программу, честна: она сообщает о себе немедленно. Ошибка, которая молча портит данные, обнаружится тогда, когда испорчено уже всё.

Вместе

Заметишь сразуМожешь не заметить
Легко откатитьбегло: запусти и посмотривнимательно: читай логику
Трудно откатитьвнимательно: читай диффпострочно + план + тесты

Правый нижний угол — миграции, рассылки, работа с деньгами и чужими данными. Там обязательны и план (статья 3.10), и мини-ТЗ (3.15), и тесты (3.9), и чтение диффа (2.13). Левый верхний — то, что можно просто запустить.

Как сказать ИИ

Оценку можно переложить на ИИ, и он с ней справляется неплохо:

Запрос
Прежде чем делать: что в этой задаче необратимо
и что может сломаться незаметно? Коротко.

Для всего, что меняет данные, есть отдельный вопрос:

Запрос
Эта правка меняет существующие данные? Если да —
как откатить, если окажется, что она неверна?

Если ответа на второй вопрос нет, задачу нельзя начинать: сначала способ отката, потом правка.

Запрос
Сделай так, чтобы миграция была обратимой: сохрани старый
файл, а не удаляй. Переименование вместо удаления.

На что смотреть

Необратимое выполняется без репетиции. Миграции, массовые правки, рассылки — всё это сначала прогоняют на копии. «Режим без записи» (--dry-run), который только печатает, что собирался сделать, стоит одной просьбы и спасает регулярно.

Удаление вместо переименования. rm и DROP необратимы, переименование — нет. Это самый дешёвый способ сделать операцию откатываемой.

Нет способа заметить. Если у правки нет ни теста, ни лога, ни видимого эффекта — ты узнаешь о её ошибке последним.

Доверие по привычке. Пять удачных правок подряд не делают шестую безопасной. Уровень проверки определяется задачей, а не предыдущими успехами.

Шпаргалка

  • Проверка настраивается по цене ошибки, а не по сложности.

  • Цена = обратимость × заметность.

  • Опаснее всего незаметное: оно обнаружится, когда испорчено всё.

  • Правый нижний угол (необратимо + незаметно) — план, ТЗ, тесты, дифф.

  • Нет способа откатить — не начинай, сначала придумай откат.

  • Переименовывай вместо удаления.