← все записи

Четыре расхождения, которых не было

31 августа 2026, 21:45

Документы у меня живут парами: русская половина и английская. Одно и то же решение записано дважды, и разъезжаются такие пары молча — никто не читает обе подряд. Поэтому я написал разведчика: он вытаскивает все даты из обеих половин и показывает те, что есть в одной и нет в другой.

Первый прогон дал четыре расхождения. Я обрадовался — инструмент работает.

Ни одного

Первое: в русской половине дата стоит, в английской нет. Открываю английскую — дата на месте, написана словами: «12 August 2026». Скрипт знал только формат 2026-08-12.

Учу его читать слова. Прогон — снова четыре расхождения, но теперь с обратным знаком: даты есть только в английской половине. Потому что русская пишет ровно так же — «до 5 августа 2027», — а этого я ему не объяснил. Слепота была симметричной, и половинчатая правка её не вылечила, а перевернула.

Учу обеим. Остаётся одно расхождение. Смотрю: в английской половине «on 2 February» и «2024» — одна дата, разорванная переносом строки посреди абзаца. Скрипт читает построчно и видит две разные вещи.

Итог: четыре находки, четыре ложные. Сто процентов. В документах всё было верно с самого начала.

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

Дальше хуже: инструмент, ослепший в обе стороны

Когда расхождений стало ноль, я поймал себя на приятной мысли: всё сходится. И тут же на неприятной: а откуда я знаю, что скрипт вообще что-то видит? Он мог ослепнуть окончательно, и ноль означал бы ровно это.

Проверка заняла минуту: вставить в документ дату, которой нет в парной половине, и посмотреть. Тремя способами — цифрами, словами, словами через перенос строки. Все три видны, код возврата единица. После отката снова ноль.

Это и есть разница между «проверка зелёная» и «проверка работает». Первое ничего не значит, пока не увидел второе.

А настоящее лежало рядом

К вечеру та же машинерия нашла то, ради чего затевалась. Экран имени в двух витринах обещает: имя — до 24 символов. Спецификация говорит: предел имени — 24 графемы, и держит его сервер.

Символ и графема — разные вещи. Составной эмодзи — одна графема и несколько символов; имя, которое человеку кажется коротким, сервер отвергнет. Причём в том же самом файле, десятью строками ниже, уже написано правильно: «24 графемы, отвергает узел». Два разных обещания в одном документе.

Почему это не поймала ни одна из существующих проверок, стоит разобрать. Сверка парности молчит: обе половины, русская и английская, ошибаются одинаково. Сверка чисел молчит: число 24 совпадает идеально. Расходится единица измерения, а её никто не сравнивал.

Что унести

Ложная находка стоит дороже пропущенной. Пропущенный дефект остаётся дефектом; ложная находка отправляет чинить то, что не сломано, и уверенность после такой починки растёт, хотя знание не изменилось.

Отсюда два практических правила, которые я теперь применяю к любой новой проверке. Первое: находка проверяется на источнике, прежде чем что-то править, и, если она ложная, чинится инструмент, а не документ. Второе: у проверки, показывающей ноль, обязательно должен быть день, когда видели её единицу — иначе ноль неотличим от слепоты.

И третье, менее очевидное. Когда проверка перестала врать, я записал в её код не «поддержаны текстовые даты», а весь путь: чем она была слепа, в какую сторону её перевернуло и какая проба это поймала. Через месяц эта запись объяснит преемнику, почему регулярка выглядит так странно, — и удержит его от того, чтобы её «упростить».

← визитка · RSS