Однажды у клиента перестали уходить письма о новых заказах. Скрипт, который я писал, работал год — ровно год, без изменений. Менеджер сказал: «Раньше работало, значит, вы что-то сломали на прошлой неделе». На прошлой неделе я правил другой проект, к этому скрипту не прикасался. Но чувство вины всё равно жгло — так устроена работа на аутсорсе: виноват ты, пока не докажешь обратное.
Понедельник я потратил на проверку очевидного: пароль к почте, лимиты хостинга, не попали ли письма в спам. Всё чисто. Вторник — включил подробный журнал, воспроизвёл заказ тестовыми данными. Письмо ушло. На живых заказах — тишина. Значит, дело в отличии данных, а не в отправке как таковой. Среда — сравнил старые успешные записи журнала с новыми. В новых в комментарии клиенты стали вставлять смайлы и длинные куски текста из мессенджера. Четверг — я предположил, что ломается кодировка или обрезка строки. Ошибся. Пятница — нашёл, что в форме добавили обязательное поле «ИНН для юрлиц», а скрипт по-прежнему ждал старую структуру и молча выходил, если поля не было в ожидаемом виде.
Молча — это мой грех год назад. Я не добавил сообщение в журнал «данные неполные», потому что «и так сойдёт». Сойдёт не сошло, когда бизнес изменил форму без того, чтобы сказать мне. Маркетолог добавил поле за пять минут в конструкторе сайта. Для него это мелочь. Для скрипта — другая вселенная.
Я исправил за час: научил скрипт читать новое поле, а при отсутствии — писать в журнал понятную строку и слать письмо администратору «заявка не обработана, посмотрите вручную». Но неделя уже ушла. Клиент нервничал, я спал плохо, трижды перечитывал свой старый код и ругал себя за стиль «без лишних проверок».
Что изменилось после той недели
Теперь в каждом проекте я прошу список людей, кто может менять сайт, форму, учёт. И прошу писать мне до публикации, даже если «добавили одно поле». Я делаю тестовую заявку после любого их изменения — по договорённости раз в месяц, а не «когда вспомнят». Я храню журнал не неделю, а три месяца — чтобы сравнивать, как выглядели успешные данные.
Я также перестал верить фразе «раньше работало» как аргументу против разработчика. Раньше работало — значит, изменились условия: объём, форма, почта, права. Задача — найти разницу, а не искать виноватого. Клиенту на той неделе я отписался честно: «Ошибка в моей старой логике плюс изменение формы без уведомления». Он оценил прямоту больше, чем если бы я три дня доказывал, что форму трогал не я.
Неделя поиска ошибки, которую я сам заложил год назад, научила меня уважать тишину. Когда скрипт падает громко — счастье. Когда он молчит — катастрофа. С тех пор я лучше пусть напишет лишнее в журнал, чем проглотит сбой. И да, я до сих пор краснею, когда вспоминаю те семь дней. Но именно они сделали мои нынешние проекты скучнее снаружи и надёжнее внутри — а для автоматизации скучье значит, что ночью не звонят.
После исправления я предложил клиенту небольшую «подписку на спокойствие» — раз в месяц я захожу, смотрю журнал, делаю тестовую заявку, проверяю, не меняли ли форму. Не заоблачные деньги, зато не повторяется история «год работало — потом тишина». Он согласился сразу — видимо, неделя без писем его тоже научила.
Я перечитал свой код ещё раз и нашёл ещё три места с «тихим выходом». Исправил не потому, что ломалось, а потому, что могло сломаться завтра. Это заняло ещё два дня, клиент не платил — я считал это своим долгом. Сейчас в договоре есть строка: «ошибки в моей логике в первые три месяца — исправляю без спора». Репутация дороже.
Коллега спросил: «Как ты не сгорел за неделю?» Я ответил: «Сгорел, просто не показал». Заказчикам не нужен герой, им нужен человек, который признаёт косяк и чинит. Неделя в старом коде — лучший урок про смирение. Я не стал гением отладки — я стал параноиком в хорошем смысле: проверки, журналы, письма «форма изменилась». И сплю лучше.
Теперь в каждом договоре есть абзац: кто со стороны клиента отвечает за форму и учёт. Без имени и телефона я не начинаю. Это не бюрократия — это страховка от повторения той недели, когда я искал призрака в своём коде, а причина жила в чужом конструкторе сайта.