• Feb 12

Every time I face legacy system modernization, the same thought comes back

It would be much easier to start a next-gen system from scratch.

"It would be much easier to start a next-gen system from scratch."

The problem is that the existing system already works. It carries years of edge cases, integrations, reporting, and revenue. I can’t simply ditch it and start on a greenfield, but I also can’t keep it as-is: complexity grows with every sprint, cognitive load increases, clear team ownership boundaries become impossible, and time to market slowing down.

What worked

Looking into design patterns, I found the Strangler Fig pattern that everyone mentions but in practice, it’s not enough. You also need an Anti-Corruption Layer (ACL). Without an ACL, you can’t keep the legacy system running without regression while new hosts run side by side.

They both allow you to incrementally replace specific pieces of functionality while the legacy system continues to run.

Important note

This kind of service separation should only be done when justified. For example, when you need team ownership boundaries or different hardware requirements. The example here is meant to explain the approach, not to suggest that every monolith should be split.

One caveat

This approach only works for systems where you can introduce a strangler. If you’re dealing with something like a background service “big ball of mud” with no interception point, then the next-gen is the way.

Next step

This guide has every diagram, from the initial monolith to the final state.

If you're designing systems like the ones discussed here, this toolbox might help.

  • Free email delivery

The Software Architect Toolbox

The set of diagram pieces you can use to create awesome architecture visuals. The library package is regularly updated. Every time I find a new artifact or draw one myself, I add it because I think you should have it in your arsenal.

You're signing up to receive emails from Justified Code.