Красное надо разложить по причинам, прежде чем считать
Правило выглядело безобидно: если вопрос объявлен в разметке, он обязан присутствовать в тексте, который видит читатель. Расхождение — красный вердикт. Прогнали, получили список красных, сели разбирать поимённо.
| Что показал разбор расхождений | Полный состав | Чистый состав |
|---|---|---|
| Вопросов в замере всего | 101 | 70 |
| Совпало с видимым текстом | 58 | 32 |
| Не совпало только из-за знака вопроса | 22 | 19 |
| Вопроса на странице действительно нет | 21 | 19 |
Половина расхождений оказалась пунктуацией. Формулировка в разметке и формулировка в заголовке страницы совпадали дословно, различался финальный символ — и прибор писал несовпадение. Настоящих дефектов в красном было примерно столько же, сколько мусора, и по списку вердиктов их не различить.
Дороже всего обошлось не само красное. Замер сравнивал участников между собой, и разрыв между двумя лидерами держался в заметной мере на этом артефакте. Вывод о том, кто сильнее, строился на том, поставил ли генератор вопросительный знак.
Проверка воспроизводима: гейт лежит в основной ветке, прогон повторяется на том же наборе страниц и даёт те же три числа.
Одна причина, умноженная на тираж
Второй способ прибору соврать — сложить в одну кучу находки, у которых общий корень. Базовый прогон по сайту дал 6489 находок, и первое побуждение — прочитать это как объём работы. Разбор дал другую картину.
| Источник находок | Находок |
|---|---|
| Повторяющиеся карточки шаблона на 358 страницах | 3221 |
| Повторяющиеся плитки шаблона на тех же страницах | 2864 |
| Одна правка генератора | закрывает ~6400 находок |
Карточки и плитки на страницы никто не писал руками — их вставляет общий шаблон, и каждая повторяется на всех 358 страницах сразу. Ни одна из тысяч находок не требовала отдельного решения: решение было одно, и находилось оно в генераторе, а не на страницах.
Третье направление — вниз
Ложная тревога раздражает, но видна. Хуже, когда прибор молчит. Счётчик выдуманных фактов показал ноль на работе, в которой выдуманный факт о компании присутствовал и был найден руками.
Причина в источнике списка разрешённых значений: его собирали из текста самого задания. Число, стоявшее в брифе внутри запретительной фразы, попадало в разрешённые и переставало считаться выдумкой — прибор видел знакомую строку и успокаивался. Отдельно счётчик срабатывал на служебных технических числах страницы, то есть врал ещё и вверх.
Формулировка класса. Источник разрешённого не может совпадать с источником проверяемого. Если белый список автоматически набирается из того же текста, который подаётся модели, проверка перестаёт быть независимой и превращается в самоподтверждение.
Честный статус: класс мы записали, переписывание проверки — в работе. До тех пор нулю этого счётчика мы не верим без выборочной сверки руками и в отчёты его не носим.
Как читаем число из прибора теперь
- Разложить красное по причинам поимённо. Хотя бы два десятка случаев вручную, пока не появятся повторяющиеся формулировки причин.
- Сгруппировать находки по источнику вставки. Число уникальных причин — вот реальный объём работы.
- Спросить, где прибор мог промолчать. Ноль без позитивного контроля — это не результат, а отсутствие результата.
- Проверить, из чего собран эталон. Список допустимого, построенный из проверяемого материала, гарантирует зелёный вердикт независимо от качества работы.
Ни один из трёх сюжетов не был поломкой кода: все три правила работали ровно так, как написаны. Врало не исполнение, а перевод числа в вывод — и делали этот перевод мы.
Что забрать себе
- Число находок — не число дефектов и не объём работы. Между ними стоит разбор по причинам, и он занимает часы, а не минуты.
- Строгое сравнение строк ловит форму, а не смысл. Знак препинания стоил нашему замеру половины красных вердиктов и сдвинул сравнение участников.
- Мелочь в критерии перестаёт быть мелочью, когда критерий кого-то ранжирует. Пока прибор просто светит — цена ошибки нулевая; как только по нему сравнивают — артефакт становится выводом.
- Ноль от прибора требует доказательства отдельно. Мы верим нулю только после того, как тот же прибор покраснел на заведомо дефектном образце.