Legacy modernization without the big bang
Rewriting a working system from scratch is the riskiest project most companies attempt. Incremental modernization gets you there without betting the business.
The system runs your business. It’s also fifteen years old, three frameworks behind, understood by two people, and quietly shaping every product decision you make - because everyone knows changing it is dangerous. Sound familiar? The instinctive answer is a rewrite: clean slate, modern stack, six months. The graveyard of enterprise software is full of that plan.
Why rewrites fail so reliably
A working legacy system is an encyclopedia of business rules that nobody fully remembers writing: edge cases, regulatory quirks, that one customer’s special invoicing flow. A rewrite has to rediscover all of it while the original keeps evolving underneath. The new system chases a moving target, the ‘six months’ doubles twice, and the business ends up funding two systems while benefiting from one.
The alternative isn’t living with the legacy forever. It’s refusing the single moment of maximum risk (the big-bang cutover) and replacing the system while it keeps running.
The strangler-fig pattern, practically
Named after the fig that grows around a tree until it stands on its own, the approach is simple to state: put a routing layer in front of the legacy system, then move one capability at a time behind it to the new platform. Users never notice. Each migrated slice is small enough to verify thoroughly, and small enough to roll back without drama.
- Map the system into capabilities and rank them by risk and value - the first migration should be meaningful but survivable.
- Introduce a façade (an API gateway, a reverse proxy, sometimes just careful DNS) so traffic can be steered per-capability.
- Migrate a slice, run it in shadow mode against the legacy behavior, compare outputs, then cut it over.
- Keep data synchronized during the transition with verified, reversible replication - this is where discipline pays or costs the most.
- Retire legacy code as slices move, so the old system shrinks instead of becoming a second permanent platform.
What this looks like on a calendar
Realistic incremental modernization is usually a twelve-to-twenty-four-month arc, with a crucial difference from the rewrite: value lands continuously. The first migrated capability ships in weeks, not years. Risky dependencies get retired early. And if the business needs to pause the program for a quarter, you stop at a stable point instead of abandoning a half-built replacement.
The goal isn’t a new system. It’s a business that never had to stop while it got one.
The approach holds for billing systems, logistics backends, and decade-old e-commerce stacks alike. If you’re staring at a legacy estate and every option looks like a cliff, an assessment engagement - codebase, infrastructure, risk map, sequenced plan - is a low-stakes way to see the staircase instead.
Written by the WindowFlow engineering team.
Questions about anything here? [email protected]
