Application modernization
Moving legacy applications forward without a rewrite that never lands.
What is it?
Full rewrites have a poor track record: they take longer than promised and the old system keeps changing underneath. We prefer incremental modernization, carving functionality out of the legacy application piece by piece while it stays in production and keeps earning.
The default pattern is the strangler fig: place a facade in front of the legacy application, route one capability at a time to new implementations, and shrink the old system until retiring it is uneventful. The constraint is usually data, not code. Two systems writing the same tables cannot be separated until ownership is split, so the sequencing question is which data each extracted capability owns and how consistency is maintained during the overlap.
Our services
What’s covered
- Strangler-fig routing
- A facade in front of the legacy app so traffic moves to new code path by path
- Monolith decomposition
- Carving out bounded contexts that can be deployed and scaled independently
- Database decoupling
- Breaking the shared database that usually blocks any real separation of services
- Legacy interfaces
- Mainframe, AS/400 and older middleware wrapped behind modern APIs
- Re-platforming
- Moving workloads to containers or managed services where a rewrite is not justified
Business problems we solve
Our delivery approach
- 01Assess honestlySome systems should be modernized, some replaced, and some left alone. We say which is which before anyone commits budget.
- 02Put a seam inA routing layer in front of the legacy system lets new functionality be served from new code without the caller knowing or caring.
- 03Migrate by sliceOne capability at a time, each released and verified. The legacy system shrinks rather than being switched off in one event.
- 04Decommission deliberatelyOld paths come out once traffic is proven to have moved, with the evidence to show it.
Solutions & project types
Examples of the work we take on in this area. These describe project shapes, not named client engagements.
Technologies & platforms
Patterns
- Strangler fig
- Anti-corruption layer
- Branch by abstraction
- Change data capture
Runtime targets
- Kubernetes
- AWS ECS
- Azure App Service
- Oracle Cloud Infrastructure
Data
- PostgreSQL
- Oracle Database
- SQL Server
- Debezium
- AWS DMS
Legacy interfaces
- SOAP / WSDL
- IBM MQ
- CICS
- AS/400
- Flat file batch
Verification
- Contract tests
- Traffic shadowing
- Reconciliation jobs
Where to start with application modernization.
Secondary to the work itself, but genuinely useful if you are building the skill. Every link goes to official documentation or an official channel.
Beginner
- Read and safely change unfamiliar code
- Characterisation tests around untested behaviour
- Basic refactoring moves and when they are safe
- Version control discipline on long-lived work
Intermediate
- Strangler fig and anti-corruption layer patterns
- Domain-driven design and bounded contexts
- Change data capture and dual-write pitfalls
- Feature flags and branch by abstraction
- Traffic shadowing to compare old and new
Advanced
- Splitting a shared database without downtime
- Distributed consistency during a migration window
- Data reconciliation and provable cutover
- Sequencing a multi-year programme so value lands early
Official documentation
Official video channels
Certifications
- AWS Certified Solutions Architect – Professional
- Microsoft Certified: Azure Solutions Architect Expert
- Oracle Cloud Infrastructure Architect Professional
Practice projects
- Put characterisation tests around a module before changing it
- Route one endpoint through a facade to a new implementation
- Use change data capture to keep two stores in step during a migration
- Shadow production traffic to a new service and diff the responses
- Write a reconciliation job proving both systems agree before cutover
Questions we get asked.
Is a rewrite ever the right answer?
Occasionally — small systems, or where the domain has changed so much the existing model is wrong. For anything large and actively used, incremental extraction has a far better record.
How long does this take?
It depends on coupling and how much the legacy system still changes. The point of the incremental approach is that you get working slices throughout rather than waiting for one date.
Can we modernise and add features at the same time?
Yes, and usually you must, because the business will not pause. The sequencing just has to account for it rather than pretending there is a freeze.
What if the legacy system has no tests?
That is the normal starting position. We add characterisation tests around current behaviour first, so there is something to verify against before anything moves.
Related services.
Talk to our experts about application modernization.
Tell us where you are. A specialist will read it and reply within one business day.
