Перейти к содержанию
Innovialabs

Переписать или рефакторить: когда пересобирать продукт

Продвинутое3 мин

Коротко

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

Короткий ответ

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

Полная переработка (rewrite) оправдана реже, чем кажется команде. Она имеет смысл, когда текущая платформа фундаментально не выдерживает требований бизнеса, а исправить это по частям дороже, чем построить заново. И даже тогда лучше переписывать не «всё сразу», а модуль за модулем.

Почему переписать хочется чаще, чем нужно

Старый код всегда выглядит хуже, чем он есть. В нем годами копились исправления реальных проблем: обработка редких случаев, интеграции, особенности поведения клиентов. При переписывании эти знания легко потерять — и потом заново найти их через баги на продакшене.

Еще одна ловушка — движущаяся цель. Пока новая версия строится, старая продолжает меняться, и новой приходится догонять. Проект растягивается, бизнес месяцами не получает новых функций.

Критерии выбора

ПризнакСкорее рефакторингСкорее переработка
АрхитектураНеудобна, но позволяет развиватьсяБлокирует ключевые требования: масштаб, безопасность, интеграции
ТехнологииУстаревшие, но поддерживаемыеПлатформа или язык больше не поддерживаются, нет специалистов
Знание системыКоманда понимает, как всё работаетНикто не знает, как работает код, документации нет
ТестыЕсть или их можно добавитьДобавить невозможно без перестройки
Бизнес-модельПродукт решает ту же задачуПродукт кардинально изменился
РесурсыНужно параллельно выпускать функцииМожно выделить команду и время на переход

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

Когда рефакторинг не работает

  • Каждое изменение ломает что-то в неожиданном месте, и это не исправляется тестами.
  • Невозможно обновить фреймворк или зависимости без переписывания большей части кода.
  • Производительность упирается в архитектуру, а не в отдельные медленные места.
  • Требования безопасности или регуляторики нельзя выполнить на текущей основе.

Подход к миграции: замена по частям

Самый надежный способ — паттерн Strangler Fig («удушающая смоковница»): новая система постепенно растет вокруг старой и забирает ее функции по одной.

  1. Зафиксируйте текущее поведение. Напишите тесты на ключевые сценарии, особенно на деньги, заказы, права доступа.
  2. Поставьте точку маршрутизации. API-шлюз или прокси, который решает, какой запрос обработает старая система, а какой новая.
  3. Выберите первый модуль. Лучше тот, что достаточно изолирован и при этом приносит ощутимую пользу.
  4. Перенесите и сравните. Запускайте новую реализацию параллельно, сверяйте результаты, переключайте трафик постепенно.
  5. Отключайте старое. Удаляйте код старого модуля, когда новый стабилен. Иначе вы будете поддерживать две системы.
  6. Повторяйте для следующих модулей.

Отдельное внимание — миграции данных. Их нужно прогонять заранее на копии продакшен-данных, проверять целостность и иметь план отката.

Главные риски

  • Потеря скрытой логики — решается тестами и общением с теми, кто знает систему.
  • Замороженная разработка — бизнес не может ждать месяцами; планируйте так, чтобы новые функции продолжали выходить.
  • Две системы навсегда — миграция застревает на последних, самых сложных модулях. Нужен четкий план отключения старого.
  • Повторение тех же ошибок — если не понять, почему старый код стал плохим, новый ждет та же судьба.

Частые вопросы

Это зависит от объема функций, качества документации, количества интеграций и данных. Честную оценку можно дать только после аудита кода и инвентаризации функционала. Поэтапная миграция удобна тем, что первые результаты появляются задолго до конца.

Поможем с этим

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

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.