Назад в блог

Этому серверу 8 лет, и я его не трогаю. Вот почему

Один мой клиент пришёл с запросом: «Нам нужно переписать бэкенд. Он старый». Я спросил: «Что конкретно сломано?» Пауза. «Ну... он старый».

Это не технический аргумент. Это культурный рефлекс.

Мы живём в индустрии, где «переписать» стало синонимом «заняться делом». Если ты не мигрируешь, значит, прячешь голову в песок. Системе три года — она уже «легаси». Не использует последний фреймворк: умирает.

Я с этим не согласен.

Как «переписать» стало дефолтным ответом

Архитектурные решения принимаются в контексте. Через два года контекст меняется: новый тимлид, новая мода на микросервисы, новый стек у соседней команды. И старое решение начинает выглядеть неправильным не потому что оно сломалось, а потому что оно *другое*.

Переписывание проще продать. «Давайте мигрируем на Next.js» звучит как прогресс. «Давайте оставим PHP, добавим кеш и закроем три баги» звучит как капитуляция. Хотя второе решит реальную проблему, а первое создаст шесть новых.

Разработчики хотят работать с новым кодом. Это нормально. Но это мотивация разработчика, а не бизнеса.

Что на самом деле стоит миграция

Когда команда предлагает переписывание, она называет стоимость разработки. И не называет стоимость всего остального.

Во-первых, переписывание ломает знание. Каждая строка в работающей системе — это решение, принятое кем-то, кто знал контекст. Почему тут такая обработка граничного случая? Почему вот этот запрос такой странный? Когда переписываешь с нуля, ты теряешь весь этот неявный контекст. Его нет в Confluence. Его нет в README. Он в коде.

Во-вторых, появляется период неопределённости. Полгода-год новая система существует параллельно старой. Кто занимается поддержкой старой? Кто принимает баг-репорты? Как синхронизировать состояние? Это отдельный проект внутри проекта, о котором никто не думает заранее.

В-третьих, техдолг переносится, а не устраняется. Если команда не изменила практики разработки, через два года новый код будет выглядеть так же, как старый. Только у него не будет 8 лет отладки в продакшене.

У меня есть система, которой больше восьми лет. Она работает. Медленно обновляется, но никогда не была источником инцидентов. Когда появляется соблазн что-то переписать, я задаю себе другие вопросы.

Три признака системы, которую не надо трогать

Первый: она решает проблему, которую ты ей поставил. Не ту, что у тебя сейчас, а ту, что была тогда. Если проблема не изменилась — зачем менять решение?

Второй: операционная стоимость предсказуема. Ты знаешь, где что сломается и как починить. Эта предсказуемость стоит денег, и её трудно посчитать, потому что она проявляется в отсутствии инцидентов.

Третий: изменения можно вносить без риска для соседних частей. Если добавление новой функции не требует архитектурного решения, а просто «написал, протестировал, задеплоил» — хорошая система. Независимо от возраста.

Три признака системы, которую трогать нужно

Я не говорю «никогда не мигрируйте». Это была бы другая крайность.

Первый: базовые вещи перестали поддерживаться. Если PHP-версия или библиотека получают CVE и патч не выходит — это безопасность, а не архитектура. Тут выбора нет.

Второй: стоимость следующей фичи растёт экспоненциально. Если каждое изменение требует трогать пять мест и каждый раз что-то ломается — это сигнал. Не «переписываем всё», но «нужна планомерная расплата с техдолгом».

Третий: команда не может работать без носителя знания. Если уход одного человека парализует поддержку — это архитектурный риск. Адресовать его стоит постепенно, не переписыванием с нуля.

Три вопроса перед «давайте перепишем»

Я пользуюсь этим фреймворком каждый раз, когда слышу этот аргумент — от клиента, от коллеги, от себя.

Первый: что конкретно сломано? Не «старый», не «некрасивый», не «не на нашем стеке». А что именно не работает, с какой частотой и какой бизнес-ценой?

Второй: что произойдёт, если мы этого не сделаем? Иногда ответ: «Ничего плохого». Тогда разговор заканчивается. Иногда ответ: «Через год мы не сможем нанимать разработчиков» — и это реальный аргумент.

Третий: есть ли более дешёвое решение той же проблемы? В половине случаев, когда мне предлагали «переписать», ответом была замена одного модуля, обновление зависимостей или рефакторинг в пределах файла. Называется это работой инженера, не переписыванием.

Когда я отказался от контракта на переписывание, там был ровно этот сценарий: клиент хотел переписать Bitrix, потому что разработчик сказал «он устарел». Мы зашли в логи. 40 SQL-запросов на страницу каталога. LCP 4.2 секунды. Всё это починилось без переписывания за три недели.

Честная оговорка: когда стабильность становится ловушкой

Стабильность — не самоцель. Есть момент, когда «мы это не трогаем» превращается из осознанного решения в избегание.

Это происходит, когда стоимость поддержки давит на скорость всей разработки. Или когда команда перестаёт понимать, как устроена система. Или когда у бизнеса появились требования, которые она архитектурно не может удовлетворить без переделки ядра.

В таких случаях правильный ответ — не «переписать с нуля», а «разобрать по частям». Сначала изолировать проблемный модуль, потом заменить его, не трогая остальное. Дольше, но последствий меньше.

Owner mindset — это не «защищать старое». Это считать последствия каждого решения. Включая решение переписать.

Итог

Стабильная система — это актив. Не идеальный, не красивый, но предсказуемый. А предсказуемость — это деньги, которые ты не тратишь.

Три вопроса перед следующим «давайте перепишем» — они сами по себе часто закрывают разговор.