Как мы строили «Договорились». Часть 4: зелёная сборка, красный прод
Это четвёртая часть серии о том, как мы строили «Договорились». В прошлых частях продукт родился из идеи, доехал до прода и обрёл голос. Теперь — честная изнанка. Четыре раза, когда всё было зелёное, все проверки пройдены, а продукт всё равно делал не то.
Самая коварная ложь в разработке
Есть зелёный сигнал, которому хочется верить. Сборка прошла. Сервер ответил «ОК». Твои собственные записи говорят «сделано». Кажется — всё хорошо.
Главный урок этих 48 часов и недели после: зелёный сигнал не значит того, что ты думаешь. Четыре истории — все про это.
История первая: продукт собрался, и тут же упал на первом клике
Ядро готово, всё собирается без единой ошибки. Запускаем — и создание самого первого пакта валится с ошибкой сервера.
Причина была обидно мелкой. Приложение записывало в базу слово заглавными буквами (DRAFT), а база ждала его строчными (draft). Одно и то же слово, разный регистр — и база отказалась его принимать.
Почему проверки молчали: все автоматические проверки смотрят на код — а код был синтаксически правильный. Поймать это могла только реальная запись в реальную базу, то есть первый живой клик. Урок, который потом повторялся: «собирается» — это ещё не «работает». Зелёная сборка проверяет, что код складно написан. Она ничего не знает о том, что произойдёт при первом настоящем действии пользователя.
История вторая: день, которого не было
Этот вылез только когда мы реально прожили с продуктом сутки. Пакт стартовал вечером, в восемь. На следующее утро, в десять, человек заходит отметиться за новый день — а приложение по-прежнему показывает «День 1».
Оказалось, приложение считало дни не по календарю, а полными отрезками по 24 часа. С вечера до утра прошло 14 часов — меньше суток — значит, по логике приложения, день всё ещё первый. Хотя на календаре уже завтра.
Самое противное: и сборка, и ручная проверка в первый день это пропускали. Потому что в первый день ошибка не видна — там и так «день 1». Чтобы её поймать, надо было реально прожить с пактом сутки и зайти на следующее утро. Мы перевели счёт на календарные дни и вынесли всю работу с датами в одно место, чтобы и приложение, и бот считали одинаково.
История третья: сервер ответил «ОК», но включил не тот тариф
Самый дорогой по нервам. Человек оплачивает тариф Pro — подписка активируется как Plus, который дешевле. Деньги пришли, сервер бодро отрапортовал «ОК, обработано», а человек получил не то, за что заплатил.
Под капотом продукт различал тарифы по полю, которое, как выяснилось, всегда приходило в неожиданном формате — и любая оплата по-тихому сваливалась в дешёвый тариф по умолчанию. Совпадения, по которому продукт «узнавал» дорогой тариф, не случалось никогда.
Главный урок здесь даже не технический. «Сервер ответил ОК» — это ещё не «сервер сделал правильно». Запрос на оплату прошёл успешно, код ответа честно сказал «всё хорошо» — а результат был неверный. Проверять надо было не ответ сервера, а то, что в итоге записалось в базу. Мы перевели определение тарифа на надёжный признак и заодно перестали верить кодам ответа на слово.
История четвёртая: записи врали, а сервер — нет
Четвёртый случай — не про код, а про нас самих. Дважды подряд мы налетели на одни грабли с разных сторон.
Сначала — написали отчёт, что фича задеплоена, а на сервер её на самом деле не выкатили. Через неделю — наоборот: выкатили новый код на сервер, а в записях он числился «ещё не задеплоен», и мы чуть не выложили его поверх самого себя.
Вывод простой и неудобный: наши записи о проде врут в обе стороны. Прод — не врёт. С тех пор перед любым «давай выложим» мы первым делом смотрим не в свои заметки, а в реальное состояние сервера. Заметки дрейфуют. Живой сервер — единственный источник правды о том, что на нём на самом деле стоит.
Что забрать себе
Все четыре бага роднит одно: между «выглядит готовым» и «работает правильно» лежит пропасть, и зелёные галочки её не показывают.
- Сборка прошла → но первый живой клик может уронить сервер.
- Первый день работает → но на второй вылезет то, что в первый было не видно.
- Сервер ответил «ОК» → но мог сделать при этом не то.
- Твои записи говорят «сделано» → но это говорят записи, а не сервер.
Это не повод не доверять проверкам — это повод понимать, что именно каждая из них проверяет. Зелёная сборка говорит «код складный». Не «продукт работает». Между этими двумя фразами — всё самое интересное.
И ещё: почти каждый из этих багов всплыл только потому, что мы сами жили со своим продуктом — создавали пакты, проходили сутки, платили настоящими деньгами. Никакая проверка не заменит того, чтобы пользоваться собственным продуктом по-настоящему.
Дальше: продукт работает и не врёт — пора расти. Как мы встроили в него вирусность и почему сделали ставку не на кнопку «Поделиться», а на шаблон.