Способ и пространство — разные вопросы
Способ отвечает на «чем смотрели»: командой, глазами, поиском по содержимому. Пространство отвечает на «где смотрели»: рабочее дерево, индекс, основная ветка, вся история веток, соседний репозиторий, прод. Перечень способов создаёт ощущение тщательности и при этом не запрещает трижды осмотреть один угол.
| Пространство | Что в нём видно | Чего не видно |
|---|---|---|
| Рабочее дерево | текущее состояние на диске | всё, что появилось в проекте после того, как дерево отстало |
| Индекс | подготовленное к записи | незафиксированные правки соседа |
| Основная ветка | то, что доехало до всех | работа на ветках |
| Вся история веток | отправленные ветки | непушенные локальные — их не показывает обзор удалённых |
| Другие репозитории | смежные проекты сети | — |
| Прод | что реально отдаётся людям | — |
Строка про непушенные ветки — не теория. Отчёт «проверено 88 из 88 веток, невлитой работы 48» звучал исчерпывающе, а обзор удалённых по построению не видит локальных: их на том же диске оказалось 706. Отчёт был неполон втрое.
Отрицание — самое дорогое утверждение в отчёте. «Этого нет» останавливает работу, снимает задачи и обвиняет исполнителей. Из десяти зафиксированных утрат поля «пространства поиска» четыре закончились переделкой работы и три — отзывом уже сделанного вывода.
Второе «где»: откуда пришло содержание подтверждения
Ошибочное число из нашего отчёта ушло во внешнюю модель на вход — в составе материалов для стороннего разбора. Разбор вернулся и содержал это же число как подтверждение. Независимость автора была настоящей: сторонний исполнитель, другая компания, свои методы. Независимости содержания не было никакой.
Тот же механизм внутри инструментов и без всякой внешней стороны: тест сравнивал модуль сам с собой, потому что импортировал эталоны из проверяемого кода. Зелёный результат он давал и на сломанной версии.
Третье «где»: область действия, которую никто не произнёс
Массовый свип по числам отработал и в первом же прогоне переписал собственные таблицы замен: инструмент попал в свою же область действия. Утверждение «свип правит только страницы сайта» не размечалось и не проверялось по единственной причине — его никто не произносил. Оно было встроено в действие.
Ещё два случая того же класса за те же сутки:
| Что сделано | Невысказанное допущение | Чем оказалось |
|---|---|---|
| База сравнения прогнана из временного каталога вне проекта | окружение прогона не влияет на вердикт | часть правил там физически не работала; «регрессия» оказалась дефектом, существовавшим до сборки |
| Слиты две ветки: «чинят разные дефекты, слияние безопасно» | сумма исправлений равна их объединению | два дефекта не существуют ни в одной ветке по отдельности — только в сумме |
Общий вывод разметки: размечать нужно не только реплики, но и вход инструмента — область действия, окружение прогона, состав слияния. Три поля, каждое отвечает на «где», и ни одно не появится само, потому что соответствующее утверждение вслух не звучит.
Почему добавление ещё одного способа не помогает
Инстинктивная реакция на промах — усилить процедуру: проверить четвёртым способом, позвать второго человека, прогнать дважды. Все три усиления бесполезны, если новое действие остаётся в том же пространстве.
| Усиление | Помогает | Не помогает |
|---|---|---|
| Ещё один способ поиска | против опечатки в команде | против не осмотренного пространства |
| Второй проверяющий | против невнимательности | если ему дан тот же вход — против общего происхождения содержания |
| Повтор прогона | против случайного сбоя | против неверного окружения: воспроизведётся тот же неверный результат |
| Смена пространства | единственное усиление, которое добавляет новую информацию | |
Что забрать себе
- В шаблоне отрицания замените «чем искали» на «где искали». Список мест фиксированный, короткий и одинаковый для всей команды — его можно проставить галочками.
- Считайте «я не нашёл» и «этого нет» разными утверждениями. Первое — наблюдение о себе, второе требует обхода всех пространств.
- У любого подтверждения спрашивайте вход. Отзыв, полученный по нашим же материалам, подтверждает нашу аккуратность в пересказе, а не наш вывод.
- Перед массовой правкой выпишите область действия. Одна строка: что инструмент трогает и что он не трогает, включая самого себя.
- После слияния перепроверяйте сумму, а не слагаемые. Дефект, которого нет ни в одной ветке, не найдётся проверкой каждой ветки.