Imagine you're responsible for a 15-year-old government application that processes thousands of citizen benefit applications daily. The system runs on outdated technology, lacks proper documentation, and is increasingly difficult to maintain. You know it needs modernization, but a service interruption could mean citizens don't receive critical benefits on time. What's your next move?
This scenario plays out across government agencies every day. Critical citizen services often run on decade-old software, creating vulnerability to security breaches, performance issues, and system failures. When these systems falter, real people face real consequences.
The pitfall of the “Big Bang” rewrite
If a vendor promises to rewrite your entire legacy software system for a fixed cost, it should prompt careful scrutiny. A Big Bang rewrite replaces an entire legacy system with a single big deployment. While the idea of starting brand new is tempting, a full system overhaul comes with significant risks. Many organizations underestimate the complexity of their legacy system, leading to unrealistic timelines, spiralling costs, and projects that fail before completion.
Legacy systems are deeply woven into government operations, often connected to multiple agencies, regulations, and decades of historical data. Replacing these systems all at once demands extensive planning, rigorous testing, and a flawless transition which is an outcome rarely achieved in large-scale government projects. The reality is that unexpected interdependencies, missing documentation, and unanticipated stakeholder needs can derail even the most well-intentioned full rewrites.
Beyond technical challenges, a “Big Bang” rewrite can disrupt critical services. Government systems support essential functions such as benefits administration, licensing, and public safety. A failed transition can mean loss of access to these services, creating frustration for both internal teams and the citizens who rely on them. Given these risks, a more strategic, phased approach is necessary. This is where incremental modernization strategies like the Strangler Pattern and Self-Contained Systems (SCS) come in.
Choosing incremental wins over risky overhauls
An effective strategy for modernizing legacy systems involves breaking the transformation into smaller, manageable phases. This reduces risk, maintains continuity, and allows teams to adapt as they progress. Two key patterns that support this incremental approach are the Strangler Pattern and Self-Contained Systems (SCS).
The Strangler Pattern
Inspired by the strangler fig tree, this approach gradually replaces parts of a legacy system over time. It does this by introducing a proxy or intermediary layer that intercepts requests and redirects them to new components. This approach enables teams to gradually transition functionality without disrupting existing public services, ensuring continuity for users.
Key benefits of the Strangler Pattern include:
- Reduced risk of large-scale failures associated with full rewrites
- Critical government services can remain operational throughout the transition.
- Teams can adapt as they progress, incorporating lessons learned into subsequent iterations.
- Costs are spread over time, avoiding a massive upfront investment while allowing for iterative improvements—ensuring government budgets are used efficiently without disrupting services.
- Smoother adoption among users and stakeholders, reducing resistance and improving transition effectiveness.
Strangler Pattern example: Kernaghan Adjusters modernization
Kernaghan Adjusters faced the challenge of modernizing a mission-critical claims management system without downtime. Their legacy system, KEA, was built on Classic ASP and VB6, making it difficult to maintain and extend. Our modernization effort focused on an iterative replacement strategy using modern web technologies like Vue.js and .NET Core.
By applying the Strangler Pattern, the team introduced an intermediary layer that redirected select functionalities from the legacy system to new, modular components. Over time, these components fully replaced the old system, ensuring a smooth transition without disrupting business operations.
This approach allowed the modernization process to occur incrementally, reducing the risk of service interruptions and costly rewrites. Over an 18-month period, the team rolled out eight major releases and 20 hotfixes, allowing for continuous improvements while maintaining system stability. By adopting this incremental strategy, the project minimized risk, avoided service disruptions, and provided immediate value to users at each stage.
Self-Contained Systems (SCS)
SCS is an architectural style that structures software into independent components, each handling a specific business domain end-to-end. Unlike microservices, SCSs are larger in scope but remain independent, avoiding runtime dependencies on the monolith.
Key benefits of SCS include:
- Reduced interdependencies as each system is self-contained, limiting cascading failures.
- Each module can be upgraded or scaled independently, reducing maintenance costs and allowing for more agile changes without affecting the entire system.
- Teams can adopt new technologies suitable for their own domain without a full system overhaul.
- Smaller, autonomous teams can iterate more quickly on their respective SCSs, enabling faster feature development and deployment.
Strangler Pattern + SCS
While both the Strangler Pattern and SCS offer significant benefits on their own, combining these two approaches provides an optimal balance of incremental modernization and system independence. The Strangler Pattern allows for a gradual transition, reducing risks associated with large-scale migrations, while SCS ensures that new components are autonomous and maintainable.
Strangler Pattern + SCS example: Alberta Child Care modernization
The Government of Alberta partnered with OXD to modernize their Child Care Subsidy system. The previous system required applicants to use outdated browser versions and lacked a seamless digital experience. By leveraging the Strangler Pattern, the team ensured continuity of operations while replacing the aging system in phases. Old components were gradually replaced with new services, ensuring that the legacy system remained operational while modernization progressed.
Additionally, the project adopted Self-Contained Systems (SCS) by structuring the child care management system into independent modules that handled specific business functions and focused on specific user needs. This allowed for isolated development, testing, and deployment of new features without affecting other components of the system.
This phased approach prevented service disruptions, reduced technical debt, and cut processing times from five days to under three—demonstrating how governments can improve efficiency while maintaining stability.
Choosing the right modernization approach
Organizations need to determine the best path for modernization based on system complexity, business priorities, and risk tolerance. In our examples, our choice between using only the Strangler Pattern or combining Strangler with SCS depended on several factors.
Why we chose the Strangler Pattern for Kernaghan
- The system was tightly integrated and could not be easily split into distinct business domains.
- It was essential not to cause disruption for users, so a gradual replacement of the system was necessary to keep it operational.
- It allowed us to release immediate performance and maintainability improvements since we modernized in stages.
- The legacy system was large but functionally cohesive, making domain separation unnecessary.
Why we chose the Strangler Pattern + SCS for Alberta Child Care
- The system had a clear, separable business domain (e.g. Subsidy applications, Certifications).
- Long-term scalability was required with a need to reduce future technical debt.
- Different teams needed autonomy to develop and deploy independent features. Initially, we had one team working on the modernization but we knew that eventually other teams would be involved as well.
- There was a need to adopt modern technologies and have the flexibility to tailor that technology choice to the team and SCS component involved.
Modernizing legacy systems is complex… but it doesn’t have to be risky.
It’s important to understand the needs of your organization, legacy system, and users before taking on a modernization project. While there are several ways to approach modernizing legacy systems, using an incremental approach like the Strangler Pattern and optionally combining it with Self-Contained Systems, reduces risk and increases success rates. By leveraging strategic modernization techniques and industry best practices, governments can ensure their technology landscape evolves in alignment with future needs, providing resilient, efficient, and adaptable services for the public.
Sign up for our newsletter below to get our latest insights, case studies, and news delivered straight to your inbox.