Одиннадцать инструментов, ноль библиотек
Задача, которую я поставил сам
Мой профиль начинается словами «делаю работу, которую можно проверить». Обычно это проверяется так: клиент открывает файл и смотрит, сходится ли. Для сайта услуг такой проверки не было — были картинки услуг и слова о них. Значит, надо было сделать инструменты: не «я умею чистить базы», а вставил свои данные — получил результат.
Второе условие я добавил себе сам: ни одной библиотеки и ни одного сервера. Причина не в спортивном интересе. Человек, который отдаёт базу клиентов, хочет знать, куда она уходит. Ответ «никуда» убедителен только тогда, когда его можно проверить в исходниках: нет запросов — некуда уходить.
Что получилось
Четыре места, где я ошибся
Это самая полезная часть разбора. Всё дальше я реально сломал по дороге — и починил только потому, что замерял, а не смотрел.
Файл, который не открывался
Первая версия разбора PDF выдавала не текст, а мусор: я складывал ширину символов и сдвиг Td, хотя в PDF сдвиг считается от линейной матрицы, а не от конца предыдущей строки. Плюс не учитывал, что в матрице ось Y перевёрнута. Заметил не глазом — тестом: текст выходил кусками «С | ЧЁТ-Ф | АК | ТУР | А».
Доступность: 240 нарушений
Скачал axe-core и прогнал все страницы. Оказалось, ни одна не имела ориентира «основное содержимое», а зелёная метка «работает» имела контраст 3,7:1 вместо нужных 4,5 — то есть самое мелкое и важное было хуже всего читаемым. Пересчитал цвета: синий 4,8:1, зелёный 6,3:1, и получил ноль нарушений.
Шесть страниц из двенадцати уезжали за экран
Я задавал сетки инлайн-стилем, а он побеждает любой медиазапрос. На телефоне страницы скроллились вбок, лист А4 сжимался в нечитаемое. Перевёл раскладку в классы, добавил min-width: 0 детям сеток — и замер показал ноль замечаний на тринадцати страницах.
Текст, срезанный краем полотна
Самое неприятное. В баннере 300×250 заголовок с подписью наезжали на кнопку и обрезались: кегли задавались долей от размера, а высота не проверялась. То есть бракованным был файл, который скачивает клиент, а не картинка на экране. Теперь кегль подбирается под отведённую высоту, а замер смотрит последние строки полотна: если там есть светлые пиксели — текст срезан.
Как я это проверил
Инструменты открываются настоящим браузером, в них вставляются данные, и результат читается из страницы: счётчики, содержимое таблиц, содержимое скачанных файлов. Файлы распаковываются сторонними программами — чтобы «валидный .docx» подтверждал не тот же код, который его собрал.
Проверка лежит рядом с сайтом и запускается одной командой. Она жмёт кнопки выгрузки и смотрит, получился ли файл: .docx 6 605 байт, CSV, PNG. Это не формальность: однажды я пересобрал разметку и молча потерял подключения библиотек — счётчики продолжали считать, а выгрузка перестала работать. С тех пор это ловится автоматически.
Что осталось непроверенным
Честный список, он важнее предыдущего. .docx не открывался в живом Word — структура валидна и проверена распаковкой, но не редактором. Разбор PDF проверен на одном файле, а формат злой: сканы, защита и шрифты без карты символов ломают его по-разному. Excel не разворачивает объединённые ячейки и не открывает старые .xls. Всё это записано на странице «что проверено» и не спрятано.
Как считается цена
- Цену называю до начала работы и не меняю её по ходу. Если задача оказалась другой — останавливаюсь и говорю об этом, а не дою по часам.
- Считаю по задаче, а не по строчкам кода. Разбор базы на 50 000 строк и кнопка «отправить» в боте — работы разного объёма при похожем коде.
- Срок называю там же, вместе с ценой. Если не успеваю — предупреждаю заранее, а не в день сдачи.
- Чего не умею — говорю сразу. Отказываюсь до оплаты, а не после.
- Инструменты на сайте бесплатные. Они показывают, как я думаю, и решают типовой случай. Ваш случай, скорее всего, не типовой — иначе вам не нужен был бы человек.