CORE CAPABILITY
How to move a system that cannot stop
"We'll cut over in one weekend" usually collapses on Monday morning. We shift traffic gradually and keep every step reversible.
The strangler pattern
A routing layer sits in front of the legacy system, and newly built features are served by the new system while everything else continues to hit the old one. That state is held for months while features move across one by one, and the legacy system is retired when the last one lands.
The point of this approach is that it is always reversible. If the new system misbehaves you revert the routing. A big-bang cutover has no such option.
Prerequisites
Three things are always settled before the first move.
- Data ownership — which system may write to which tables. Once both systems write to the same table, reversal is gone.
- Session and identity — both systems must recognise the same session, or users get logged out mid-migration.
- Observability — during migration you must be able to tell which side served a request. Distributed tracing goes in first.
Data migration
Data moves before the code and more slowly than the code: dual write, a verification window, reads switched over, and only then legacy writes turned off. Each step has a written rollback procedure that we actually rehearse.
A typical migration
- 2025 04
Phase 5 — Legacy retired
After the final feature moves, the legacy system stays read-only for a quarter and is then shut down.
- 2024 11
Phase 4 — Dual write and verification
Both stores are written and compared. Reads do not move until the mismatch count reaches zero.
- 2024 07
Phase 3 — First feature moved
The least-coupled feature goes first. Its purpose is to validate the procedure, not to deliver value.
- 2024 05
Phase 2 — Routing layer
A gateway is placed in front of the legacy system passing everything straight through. Nothing should behave differently yet.
- 2024 03
Phase 1 — Observability first
Distributed tracing and structured logging go in before anything moves. Migrating blind makes root cause unfindable.
- 2024 01
Phase 0 — Survey and boundaries
Code and data dependencies are measured. The documented structure and the real call graph almost never match.
Delivered alongside
-
Containerisation
Runtime versions pinned and images minimised. Clearing base image vulnerabilities is cheapest during the move.
-
DevSecOps pipeline
Dependency scanning and SBOM generation added to the build. Gates start as warnings, not as blocks.
-
Performance budgets
Before and after measured the same way. Numbers, not impressions, end the argument.
Want a second opinion on your migration plan?
Send us the plan you already have and we will point at the risky segments.