Повне переписування з нуля («великий вибух») - один з найризикованіших проєктів: старою системою треба користуватися, поки пишеться нова; нова довго не дає жодної цінності; функції старої системи, про які всі забули, виявляються в останній момент; а дата перемикання постійно зсувається.
Strangler Fig (фікус-«душитель», що поступово обвиває й замінює дерево) - поступова заміна: нова система росте навколо старої, забираючи функціональність частинами, доки стара не стане непотрібною.
Як це виглядає:
- фасад/маршрутизатор перед системами - проксі, балансувальник, маршрути застосунку - вирішує, яка система обробляє запит;
- обрати шматок - бажано цінний і відносно відокремлений (наприклад, каталог чи звіти);
- реалізувати його в новій системі й перенаправити відповідні запити;
- повторювати, доки старої системи не лишиться;
- вимкнути стару систему.
┌──────────────► нова система (каталог, кошик)
запити ──► маршрутизатор
└──────────────► стара система (решта)
Варіант у межах одного застосунку (наприклад, міграція з самописного PHP на Laravel): Laravel приймає всі запити, нові маршрути обробляє сам, а для невідомих - передає старому коду (fallback-маршрут, що підключає старий фронт-контролер). Модуль за модулем код переїжджає в Laravel.
Що важливо:
- спільні дані - найскладніше. Варіанти: обидві системи працюють з однією базою (простіше, але зв'язує їх), синхронізація подіями, поступова міграція таблиць з шаром сумісності;
- кожен крок дає цінність і може йти в продакшен - немає «року без релізів»;
- можливість відкату: якщо нова частина має проблеми, маршрутизатор повертає трафік на стару;
- порівняння результатів: для критичних частин - запуск обох реалізацій паралельно й порівняння відповідей (shadow traffic) перед перемиканням;
- доводити до кінця: найчастіша проблема - «тимчасово» дві системи на роки. Потрібен план вимкнення старої.
Пов'язані прийоми: Branch by Abstraction - та сама ідея всередині коду (абстракція перед старою реалізацією, нова реалізація за прапорцем), feature flags для поступового перемикання.
Докладніше в документації: Мартін Фаулер: Strangler Fig Application