Три вопроса, которые дешевле самого замера
Любое число в отчёте — результат обхода какого-то множества файлов, строк или страниц. Ошибки, которые мы разбираем ниже, не про арифметику: она везде верна, — а про состав множества, который нигде не был напечатан.
- Что выпало из знаменателя. Фильтр по расширению, маска, лимит выдачи — любой из них сужает охват без единой строки в отчёте.
- Что залезло лишнего. Копия, снимок, бэкап, каталог зависимостей — обход заходит туда, потому что это обычные подкаталоги.
- Что именно сравнивалось. «Сверено» иногда означает «сравнили не с тем объектом», и это самый тихий из трёх случаев.
Случай первый: белый список расширений
Сверщик после выкладки сравнивает содержимое прода с содержимым репозитория. Фильтр знал пять типов: .html, .xml, .txt, .css, .js. Страница с расширением .htm — на одну букву короче — и php-обработчик заявок под фильтр не подошли и уехали на прод без проверки содержимого.
Арифметика отчёта, которую никто не считал. 176 залито − 174 сверено = 2 файла вне проверки. Ноль в графе «расхождения» относился к 174, а не к 176. Ту же слепую зону по .htm на этом же сайте уже закрывали раньше — в другом скрипте выкладки; в общем инструменте она осталась.Починка вышла не в расширении списка, а в честности вывода: инструмент теперь печатает поимённо всё, что уехало и проверено быть не может. После неё отчёт читается как 175 сверено + 1 названный пропуск = 176, и пропуск законный: прод отдаёт результат выполнения php, а не исходник — такой файл проверяют запросом по видимому результату, а не сравнением байтов.
Случай второй: в обход попало то, чего на сайте нет
Внутри репозитория сателлита лежала изолированная копия чужой сессии — полный снимок сайта примерно на 630 файлов, сделанный за месяц до замера. Рекурсивный поиск обходит весь репозиторий, а такая копия выглядит обычным подкаталогом.
| Что показал скан | Что было на самом деле |
|---|---|
| 382 страницы без формы заявки | 182 — остальное дал снимок |
| Соцсети постороннего владельца, счётчики находок 111 · 111 · 55 | В рабочем дереве этого нет вообще: следы живут только в снимке |
Ошибка тут односторонняя: число всегда завышается, а завышенное выглядит убедительнее — «проблема хуже, чем думали». Снимок хранит состояние до чисток, поэтому скан «находит» ровно то, что уже вычищено. Второй пункт таблицы мы успели записать в отчёт как реальную находку и сняли только на перепроверке.
Признак класса, по которому его видно без разбора. Находки идут пачками с одинаковым счётчиком (111, 111, 55), а пути примеров начинаются одинаково. Проверка — одна команда: поиск строки с исключением служебных каталогов. Пусто — значит на сайте этого нет.
Случай третий: сверка шла по редиректам
После другой выкладки тот же сверщик показал три расхождения. Разбирали руками, все три оказались пустыми: адреса отдают 301, а сверка шла за редиректом и сравнивала локальный файл с телом страницы-цели. Инструмент уверенно отвечал не на тот вопрос, который ему задали.
Починили не порогом и не исключениями: сверка больше не проходит редиректы, а любой ответ не-200 возвращается отдельной строкой «не сверено» с кодом. Так честнее — у 301 сравнивать нечего, а 404 у намеренно удалённой страницы это ожидаемый результат, а не дефект. Контрольный прогон на следующей партии: сошлось 225 · расхождений 0 · не сверено 4, и все четыре — действительно редиректы.
Четвёртый способ: одну величину меряют разными способами
За сутки количество открытых задач в отчётах разных исполнителей называлось как 153 → 196 → 38 → 316. Длина заголовков — «больше 60 знаков на восьми сайтах» против реальных 31–62. Спора не было: каждый мерил своим способом, в своё время, из своего источника.
Победило не последнее и не самое громкое число, а то, у которого назван воспроизводимый способ: 316 взято из общей ветки одной командой, которую может повторить любой. Остальные три — из разных срезов и с локального диска.
Что делать у себя
- Требовать от инструмента знаменатель и остаток. «Проверено N из M, не проверено K, вот их имена» — минимальный формат.
- Прописывать исключения обхода списком. Служебные каталоги, копии сессий, кеши, зависимости — целиком, а не отдельными вложенными путями.
- Спрашивать, с чем сравнивали. Следование редиректам, подстановка значений по умолчанию, автоисправление кодировки — три частых способа сравнить не то.
- Числу без способа замера не верить, даже своему. Расхождение двух чисел об одной величине — сигнал остановиться и свести, а не выбрать удобное.
Все четыре случая дали технически исправные отчёты. Ни один из них не отвечал на вопрос, ради которого запускался.