На главной странице сайта было написано: «Девять проверок сайта работают бесплатно, четыре из них — на собственных движках». Проверок к тому моменту было 15, движков — 5. Число устарело в тот день, когда появилась десятая проверка, и несколько недель этого никто не замечал.
Почему это не мелочь
Число в тексте — обещание. Оно стояло в 6 файлах: первый экран главной, вход в раздел проверок, разборы ниш, страница автора блога, страница команды и описание для поисковой выдачи. Одна ошибка, 8 вхождений в 6 файлах, и все врали в меньшую сторону: мы обещали 9 проверок, а работало 15.
Ошибка в меньшую сторону выглядит безобидной, но она из того же класса, что и ошибка в большую: текст и данные живут отдельно, и совпадение между ними — случайность.
Как починили
Заменили цифру выражением. В разметке теперь стоит длина того самого массива
из lib/check-tools.ts, по которому собираются и сами страницы проверок — все
семнадцать:
<a href="/proverka/">{checkTools.length} проверок сайта</a>
Разойтись с данными такой текст не может: добавили проверку — число выросло само, на всех страницах сразу.
И оно разошлось второй раз
Есть места, куда выражение не вставить: метатеги собираются отдельно, а страница команды — это markdown, в котором кода нет. Там число осталось словом. Когда проверок стало семнадцать, оно разошлось снова — уже в описании, которое уходит в поисковую выдачу.
Это и есть цена ручного числа: починка держится ровно до следующего изменения данных. От 9 проверок до 15 прошло около 21 дня, от 15 до 17 — ещё 14 дней. SEO это в том числе про такие сроки: описание страницы попадает в выдачу и живёт там до следующего обхода, то есть неверное число показывается людям дольше, чем стоит в коде.
Замер сегодня
Посчитали по своему коду 4 сентября 2026 года:
| Мест, где число берётся из данных | 8 в шести файлах |
| Мест, где число набрано руками | 1 |
| Проверок сейчас | 17 |
| Что написано в ручном месте | 17 |
Сейчас сходится. Но сходится случайно: это описание страницы проверок, и при восемнадцатой проверке оно разойдётся в третий раз.
Третье расхождение нашлось прямо сейчас
Пока мы это писали, нашлось ещё одно — соседнее число в той же фразе на главной: «пять из них — на собственных движках».
Проверили по коду: сегодня все семнадцать проверок обрабатываются нашими
движками — 10 функций в public_checks.py и 7 обработчиков в cabinet_api.py, плюс
отдельные модули под дубли и битые ссылки. Стороннего
API среди них нет ни одного. «Пять» — след того времени, когда своих движков
было действительно пять.
То есть в одном предложении стоят два числа: первое считается из данных и верно, второе набрано руками и уже неверно. Лучшей иллюстрации к теме мы бы не придумали. Завели задачей.
Правило, которое из этого следует
- Можно вычислить — вычисляйте. Число, выведенное из тех же данных, что и страница, не устаревает никогда.
- Нельзя вычислить — не называйте. «Проверки работают бесплатно» не устаревает; «девять проверок» устаревает на десятой.
- Если всё же назвали — держите в одном месте и помните, что это ручная работа со сроком годности.
- Ищите числа парами. Рядом с починенным числом часто стоит непочиненное: их набирали в одном предложении и в один день.
Это та же дисциплина, что и в разборе выдуманных кейсов: проверяемость важнее красоты формулировки. А про то, как мы измеряли собственный инструмент вместо догадок, — в разборе профилирования.
