Pillar page
Модернизация устаревших систем
Инкрементный рефакторинг монолита на микросервисы, миграция с устаревших технологий на современные стеки, перенос в облако — без остановки бизнеса, с планом откатов и полным аудитом.
Каждая компания имеет какую-то устаревшую систему. Некоторые имеют их несколько. Бухгалтерская программа 2008 года, которая как-то работает. CRM, написанный консультантами, которых никто уже не помнит. Хранилище в Accessе. Каждый из них когда-нибудь придется заменить — вопрос не когда, а как и когда.
Модернизация устаревших систем — один из самых трудных типов проектов IT. Требует балансирования трёх сил: поддержания непрерывности бизнеса (система должна работать всё время), внедрения современных технологий (микросервисы, облако, AI) и контроля рисков (каждый рефакторинг может испортить что-то, что работало годами).
Почему не достаточно «переписать с нуля»?
Из нашего опыта 9 из 10 успешных модернизаций - это инкрементальный рефакторинг, а не переписывание. Переписывание заманивает концептуальной простотой („мы начнем с чистого листа"), но на практике имеет три фундаментальные проблемы:
- Невидимая бизнес-логика. Старая система содержит годы бизнес-правил — специальные условия для крупнейших клиентов, налоговые льготы для конкретных отраслей, обходы для регулирования 2015 года. Большинство из них не задокументировано. Переписывание должно их все восстановить из памяти людей или анализа кода.
- Дублирование работы. Во время написания нового системы бизнес все еще требует изменений в старой (регулирования, новых клиентов, мелких ошибок). Команда либо дублирует работу (изменение в двух местах), либо замораживает старую систему (бизнес-риски).
- Big bang deployment. Через год работы новый система „почти готова“. Переключение всех пользователей за одну ночь генерирует монументальное риски. Каждая непредвиденная проблема означает возвращение к старой системе, потерю морали команды, подрыв доверия бизнеса.
Инкрементальный рефакторинг (чаще всего по шаблону Strangler Fig) решает все три проблемы: бизнес-логика, открываемая постепенно, одно источник правды для каждой сущности, поэтапный деплой с флагами функций.
Шесть шаблонов модернизации
Каждый из них решает конкретное риск. В большинстве проектов мы комбинируем несколько шаблонов, выбирая подходящий для каждого модуля.
Strangler Fig
Постепенное "обертывание" старой системы новыми компонентами. Старый код продолжает работать, но каждая новая функциональность добавляется в новый микросервис, а существующие модули заменяются один за другим. Через 12-24 месяца старый монолит отключается.
Anti-corruption layer
Адаптер, защищающий новый код от странностей старой системы (непонятные имена полей, странные форматы дат, несоответствующие типы). Вся "грязная" логика изолирована в одном месте — новый код работает с чистой моделью домена.
Database refactoring
Шаблоны из книги Refactoring Databases (Ambler/Sadalage): expand-and-contract для миграции схемы, валидация данных перед удалением старых столбцов, параллельное поддержание обеих схем во время миграции приложения.
Branch by abstraction
Введение слоя абстракции вокруг старого компонента, параллельная реализация нового компонента, постепенное переключение с 0% на 100% трафика (флаг функции). Без "большого взрыва" деплоя.
Shadow mode
Новый код запускается параллельно со старым — оба обрабатывают одни и те же запросы, но только результаты старого кода доходят до пользователя. Результаты сравниваются офлайн. После подтверждения совместимости (обычно 2-4 недели) мы переключаем трафик на новый код.
Event sourcing для миграции
Мы записываем поток бизнес-событий из старой системы и воспроизводим его в новой. Это позволяет провести предваральную валидацию новой архитектуры без риска производства, а также вернуться к любому историческому состоянию.
Типичный график модернизации
Для средней системы (монолит ~200 тыс. строк кода, 5-10 бизнес-модулей):
- Месяц 1: Открытие и документация. Reverse engineering архитектуры, картографирование зависимостей, определение потоков данных, документация бизнес-процессов с помощью бизнес-специалистов.
- Месяц 2: Целевая архитектура и пилотный проект. Проектирование новой архитектуры, выбор технологий, пилотный проект на самом простом модуле (proof of concept). Первая валидация подхода.
- Месяцы 3-4: Выделение первого производственного модуля. Шаблон Strangler Fig, режим тени в течение 2-3 недель, переключение трафика, гиперопека. Первая реальная бизнес-ценность.
- Месяцы 5-12: Итеративное выделение последующих модулей. Каждый в цикле 4-6 недель: рефакторинг → тесты → тень → производство → гиперопека. Постоянное совершенствование процесса, сокращение времени на последующие модули.
- Месяцы 12-18: Миграция данных и выход из монолита. Когда все критические модули выделены, мы завершаем миграцию исторических данных, отключаем старую систему, архивируем. Празднуем.
Старая система vs. модернизированная
| Аспект | Система наследия (типично) | После модернизации |
|---|---|---|
| Время внедрения новой функции | 4-8 недель (высокий риск регрессии) | 3-7 дней (автоматические тесты минимизируют риск) |
| Покрытие тестами | 5-15% (или отсутствует) | >80%, в конвейере CI/CD |
| Доступность разработчиков | Небольшая (устаревшая технология) | Большая (популярные, современные стеки) |
| Безопасность | Старые библиотеки с уязвимостями CVE | Сканирование OWASP, gitleaks, автоматические обновления |
| Масштабирование | Вертикальное (больше ресурсов для монолита) | Горизонтальное (масштабирование конкретных микросервисов) |
| Наблюдаемость | Логи в файлах, отсутствие метрик | Prometheus + Grafana + Sentry + SIEM |
| Соответствие (GDPR, EU AI Act, ISO 27001) | Требовательное, дорогое для доказательства | Встроенное в архитектуру, готовое к аудиту |
Шесть типичных рисков — и как мы их устраняем
Риск: Отсутствие тестов в системе legacy
Митигация: Сначала мы создаем характерные тесты (capture tests) — записываем текущее поведение системы на основе производственных журналов и записей трафика. Только после этого мы начинаем рефакторинг, используя тесты как гарантию.
Риск: Знания, сосредоточенные в одном человеке („truck factor 1")
Митигация: Передача знаний начинается в первую неделю проекта. Все встречи с человеком, знающим систему, записываются и транскрибируются, ключевые процессы документируются, архитектурные решения обосновываются. После проекта вся команда понимает систему.
Риск: Временное замедление команды
Митигация: В первые 2-3 месяца команда поддерживает старую систему + строит новую. Естественное замедление темпов изменений. Мы митигируем их: приоритет для изменений, которые попадают только в новую систему, заморозка низкоприоритетных изменений в старом коде.
Риск: Миграция данных
Митигация: Каждая миграция данных имеет три фазы: dry-run (на копии производственной), staging (на тестовой среде с реальной масштабностью данных), производство (в окне обслуживания или инкрементно). План откатки готов перед началом.
Риск: Организационное сопротивление
Митигация: Коммуникация с бизнесом с первого дня: почему модернизация, что изменится для пользователя, какой график, как мы измеряем успех. Первая итерация выбирается так, чтобы быстро показать осязаемую ценность (например, новый UI или более быстрый отчет).
Риск: Недооценка стоимости
Митигация: Discovery (1-2 недели) перед оценкой проекта. Итерации 2-3 недельные с конкретными результатами — легче скорректировать курс, чем в длинном проекте типа «все сразу». Бюджет с буфером 20-30% на непредвиденные.
Самые частые вопросы
Что такое система legacy?
Почему стоит модернизировать систему, если она работает?
Разве не проще написать всё сначала?
Требует ли модернизация простоя бизнеса?
Как долго длится типовая модернизация?
С каких технологий мы мигрируем чаще всего?
Что насчет существующих интеграций с другими системами?
Как вы ограничиваете бизнес-риски?
Что делать с документацией системы, которой нет?
Каковы затраты на модернизацию по сравнению с поддержкой старой системы?
Начнем с аудита
Недельный технический аудит: картирование текущего состояния, определение наиболее срочных областей модернизации, этапный план с конкретными бизнес-эффектами в первой итерации.