Software Modernization Without a Rewrite: The Options Between Leaving It Alone and Starting Again
Software modernization is not a binary choice. The steering committee framing it as "rewrite or do nothing" is missing six or seven options that sit between those two positions, each with a different price, a different risk profile, and a different answer to the question of whether the system deserves the investment at all. The rewrite is usually the most expensive option. It is also, in most portfolios, the least common right answer.
This matters because the conversation inside most organisations has collapsed to two positions. Somebody in IT is pushing for replacement. Somebody in finance is refusing to fund it. The result is another year of deferred maintenance, another line in the technical debt report, and no one any clearer on what the system actually needs. The intermediate options never get named, so they never get costed, and the debate stays stuck.
This post names them. It gives you a framework for thinking about software modernization that does not begin with "build a replacement" and does not end with "carry on and hope". It is structured around the decisions you will actually face, in the order you should face them.
What does software modernization mean in practice?
The term is used loosely, which is part of the problem. A vendor proposing "modernization" may mean anything from moving a server to the cloud to rebuilding the application from scratch in a new language. Those two things cost different orders of magnitude and carry entirely different risks. Treating them as the same category is how budgets get surprised.
A more useful definition starts with what problem you are trying to solve. The problems worth solving through modernization generally fall into three categories.
The first is operational cost: the system is expensive to run, requires specialist skills that are hard to hire, or consumes disproportionate support effort relative to the value it delivers.
The second is change constraint: the system cannot be modified quickly enough to keep up with what the business needs to do, or changes to it carry an unacceptable risk of breaking something else.
The third is integration debt: the system cannot communicate with modern tools and platforms without custom connectors that are themselves becoming maintenance liabilities.
If a system does not have at least one of these three problems in a material way, the case for modernization has not been made yet. That is not a reason to avoid the conversation. It is a reason to insist that the conversation start with evidence.
What are the options between leaving a system alone and replacing it?
The most widely used classification in this space comes from Gartner's TIME model (Tolerate, Invest, Migrate, Eliminate) and from the pace-layering framework that sits alongside it. Both are useful for portfolio decisions. Neither tells you, at the system level, which technical approach to take. That requires a second layer of thinking.
Re-hosting is sometimes called "lift and shift". You move the system from one infrastructure environment to another, typically from on-premise hardware to a cloud provider, without changing the application code. The system runs the same way it always did, just somewhere else. This reduces infrastructure operating costs and extends the runway for a system that works fine but sits on hardware approaching end-of-life. It does not resolve technical debt inside the codebase. It buys time.
Re-platforming goes one step further. The runtime environment changes, perhaps moving from an old application server to a managed container platform, with modest code changes to accommodate the new environment. The core logic stays intact. The benefit is a modern, supportable operating environment. The risk is that code which was never designed for a different runtime sometimes behaves unexpectedly when you move it, and "minimal code changes" has a way of expanding on contact with reality.
Refactoring changes the internal structure of the code without changing what it does from the outside. This is the approach Martin Fowler's writing addresses most directly: improving the design of existing code as an ongoing discipline rather than a one-time project. For a system that must remain in service, refactoring is how you reduce the cost of future changes. It does not deliver new features. It is engineering maintenance, and it is chronically underfunded because it produces nothing the business can demonstrate to a steering committee.
Re-architecting is a more substantial intervention: restructuring the system's internal design, often by decomposing a monolith into smaller, more independent components. This is where the strangler fig pattern lives. Rather than rewriting the system, you build new components alongside it and gradually shift responsibility from old to new, retiring the original piece by piece. The original system stays live throughout. The transition is incremental. The risk of a single catastrophic failure is lower than with a full replacement.
Full replacement sits at the far end. Build a new system, migrate data and users, retire the old one. This is the highest-risk option. It is also sometimes the right one, particularly when the original system's design is so constrained that no incremental approach can reach a point worth reaching. But it should be chosen last, not first.
When does re-hosting deliver enough value on its own?
This is where "leave it alone" needs unpacking, because "leave it alone" does not always mean "do nothing". Sometimes it means "move it to a stable place and stop touching it". A system that has run without significant incident, that is used by a small and predictable set of users, and that is approaching infrastructure end-of-life is a re-hosting candidate, not a rewrite candidate.
The economic case is straightforward. Re-hosting projects are typically scoped and priced in weeks, not years. They do not require the original development team. They do not require a parallel migration project. And they extend the useful life of a working system without introducing the risk of rebuilding it.
The mistake organisations make is using an infrastructure refresh as the trigger for a much larger conversation about replacing the system. Sometimes that conversation is worth having. But the two decisions should be made separately. If the infrastructure needs replacing and the system works, re-host first and evaluate the system independently. Do not let an urgent infrastructure deadline force a hasty decision about the application.
The numbers here are worth understanding. According to McKinsey's research on cloud migration, organisations that pursue a disciplined lift-and-shift as a first phase, before attempting optimisation, reduce migration risk and reach production environments faster than those attempting to modernize and migrate simultaneously. The two interventions compound each other's complexity when done together. Done in sequence, each is more manageable.
When does refactoring become the right answer, and when does it stop being one?
The practical test for refactoring is this: can a competent developer, given the codebase today, make a change to one part of it with reasonable confidence that nothing unrelated will break? If yes, refactoring is probably the right tool. If no, the problem may be structural rather than surface-level.
A codebase where every change requires touching dozens of files, where there are no automated tests to catch regressions, and where the people who originally understood the system have left, is a codebase where refactoring alone will not get you to a maintainable place within a budget any steering committee will approve. That is not a reason to give up on the system. It is a reason to be honest about whether refactoring is the entry point or whether re-architecting needs to come first.
The Standish Group's CHAOS reports, which track technology project outcomes across thousands of engagements, consistently show that large, single-phase projects have lower success rates than phased ones. The 2020 report found that projects classed as "large" (by scope, budget, and duration) succeeded at a materially lower rate than small and medium projects. This is not an argument against large ambitions. It is an argument for breaking them into phases, each of which delivers something independently useful.
Refactoring fits naturally into a phased approach because it can be done incrementally, by the team maintaining the system, as a continuous practice rather than a discrete project. The discipline is embedding it into normal development work rather than treating it as something that requires a separate budget and a separate team.
How do you choose between incremental displacement and full replacement?
The strangler fig pattern, described by Martin Fowler in his writing on legacy displacement, works by building new functionality alongside an existing system. Over time, traffic and responsibility shift from the old system to the new components until the original can be retired. The name comes from a vine that grows around a tree and eventually replaces it.
The pattern is attractive precisely because it avoids the "big bang" replacement that has ended so many modernization programmes badly. The original system stays live. Users experience continuity. If a new component does not work, the old system is still there. The risk is bounded at each step.
But the pattern has conditions, and it fails when those conditions are absent.
The first condition is that the new components can be built independently of the old system's internals. If the old system's data model is so tangled that every new component has to call back into the original, you are not building a replacement, you are building a wrapper that now carries two sets of complexity.
The second condition is that the boundary between old and new can be drawn clearly enough to route traffic deliberately. Some systems are so integrated with everything around them that isolating a seam to build against requires as much work as a replacement would.
The third condition is organisational: someone has to own the boundary and police it. Incremental displacement projects fail when two teams are both "owning" a function and neither is willing to retire the old version.
Full replacement is not automatically wrong. For a system that has accumulated so many layers of historical logic that no clean seam can be found, and where the cost of running the two systems simultaneously exceeds the cost of a faster, single transition, replacement may be the more economical path. The honest analysis prices both options over the same time horizon, including the cost of the transition period, the cost of parallel running, and the cost of failure at each stage.
The question that cuts through most of this debate is: what does it cost the business if the transition takes twice as long as planned? A re-hosting project that takes twice as long is an inconvenience. A full replacement that takes twice as long is a programme crisis. The answer to that question should inform how much execution risk you are willing to accept.
When is the right answer to leave the system alone?
This is the recommendation that never appears in a vendor's proposal, because there is nothing to sell if the answer is "leave it alone". But it is a real answer, and in a typical enterprise portfolio, it applies to more systems than most modernization programmes acknowledge.
Gartner's application portfolio management guidance identifies the "Tolerate" category precisely for this reason: systems that are not ideal but that perform their function without causing problems. The discipline is not to mistake "tolerable" for "worth investing in" in either direction. A system in the Tolerate category should not get modernization budget. It should also not get replacement budget. It should get operational monitoring and an agreed review date.
The Konnectedly approach to portfolio assessment starts with this question for every system: what is the actual cost of leaving this exactly as it is? Not the cost the IT team estimates, which often includes aspirational improvements alongside genuine maintenance. The bare cost of running it, supporting it, and working around its limitations for another three years. That number, compared against the cost of each modernization option at the same time horizon, is the only honest basis for a decision.
For some systems, the comparison is obvious. For others, it is genuinely close, and the right decision depends on factors outside the technical: whether the market is changing in ways that will force the system to change regardless, whether a competitor's capability is predicated on something the current system cannot support, or whether a regulatory requirement is coming that the system cannot meet.
A system that scores well on all three of those factors - stable, low-cost, no forcing function on the horizon - belongs in the leave-it-alone category. Document the decision. Set a review date. And direct the modernization budget at the systems where it will actually change something.
Frequently Asked Questions
What is software modernization?
Software modernization is the process of updating a system's architecture, codebase, infrastructure, or interfaces to make it more maintainable, scalable, or cost-effective, without necessarily replacing it. It includes options ranging from re-hosting and re-platforming through to refactoring and re-architecting, each with different cost and risk profiles.
Does software modernization always require a full rewrite?
No. A full rewrite is one option at the far end of a spectrum. Most systems have intermediate paths: running them on modern infrastructure without touching the code, wrapping them behind a new interface, or incrementally replacing components while the original system stays live. A rewrite is usually the highest-risk choice, not the default one.
What is the difference between re-hosting, re-platforming, and refactoring?
Re-hosting moves a system to new infrastructure without changing the code. Re-platforming changes the runtime environment with minimal code changes. Refactoring restructures the code internally without changing its external behaviour. Each step further along that list costs more and carries more risk, but also delivers more long-term improvement in maintainability.
How do you decide which modernization approach is right for a specific system?
The decision depends on four factors: how long the system is expected to remain in use, how frequently it needs to change, what the cost of running it is today, and whether its current architecture blocks changes the business needs. A system that is stable, low-change, and cheap to run is often best left alone rather than modernized.
What does software modernization typically cost?
Costs vary enormously by approach. Re-hosting is the cheapest, often a one-time infrastructure project measured in weeks. Refactoring is priced by the complexity of the codebase and is usually an ongoing programme cost. Full re-architecting or replacement can run into millions for a mid-sized enterprise system. The figure that matters most is not the modernization cost but the total cost of leaving the system in its current state over three to five years.
What is the strangler fig pattern in software modernization?
The strangler fig pattern involves building new functionality alongside an existing system and gradually routing traffic away from the old system until it can be retired. It is named after a vine that grows around a tree and eventually replaces it. The advantage is that the original system stays live throughout, reducing the risk of a big-bang replacement failing mid-transition.
How long does a software modernization project take?
Re-hosting can take weeks. Incremental refactoring is a programme measured in quarters. Full replacement of a core system typically takes two to four years for a mid-sized organisation. The Standish Group's CHAOS reports consistently show that large, single-phase technology projects have lower success rates than phased, incremental ones - which is an argument for approaches that deliver value before the whole job is done.
When should a system be left alone rather than modernized?
When it is stable, rarely changed, cheap to operate, and not blocking anything the business needs to do differently. A system that has been running without incident for years, that only a defined user group relies on, and that interfaces cleanly with everything around it may be the safest system in the portfolio. The cost of touching it may exceed any benefit the modernization would deliver.
An independent assessment of your application portfolio will tell you which systems belong in each category - re-host, refactor, displace, replace, or leave alone - with the cost of each option at the same time horizon.
Book a call →Questions
- What is software modernization?
- Software modernization is the process of updating a system's architecture, codebase, infrastructure, or interfaces to make it more maintainable, scalable, or cost-effective, without necessarily replacing it. It includes options ranging from re-hosting and re-platforming through to refactoring and re-architecting, each with different cost and risk profiles.
- Does software modernization always require a full rewrite?
- No. A full rewrite is one option at the far end of a spectrum. Most systems have intermediate paths: running them on modern infrastructure without touching the code, wrapping them behind a new interface, or incrementally replacing components while the original system stays live. A rewrite is usually the highest-risk choice, not the default one.
- What is the difference between re-hosting, re-platforming, and refactoring?
- Re-hosting moves a system to new infrastructure without changing the code. Re-platforming changes the runtime environment with minimal code changes. Refactoring restructures the code internally without changing its external behaviour. Each step further along that list costs more and carries more risk, but also delivers more long-term improvement.
- How do you decide which modernization approach is right for a specific system?
- The decision depends on four factors: how long the system is expected to remain in use, how frequently it needs to change, what the cost of running it is today, and whether its current architecture blocks changes the business needs. A system that is stable, low-change, and cheap to run is often best left alone.
- What does software modernization typically cost?
- Costs vary enormously by approach. Re-hosting is the cheapest, often a one-time infrastructure project. Refactoring is priced by the complexity of the codebase. Full re-architecting or replacement can run into millions for a mid-sized enterprise system. The figure that matters most is not the modernization cost but the total cost of leaving the system in its current state over three to five years.
- What is the strangler fig pattern in software modernization?
- The strangler fig pattern involves building new functionality alongside an existing system and gradually routing traffic away from the old system until it can be retired. It is named after a vine that grows around a tree and eventually replaces it. The advantage is that the original system stays live throughout, reducing the risk of a big-bang replacement failing.
- How long does a software modernization project take?
- Re-hosting can take weeks. Incremental refactoring is a programme measured in quarters. Full replacement of a core system typically takes two to four years for a mid-sized organisation. The Standish Group's CHAOS reports consistently show that large, single-phase technology projects have lower success rates than phased, incremental ones, which is an argument for approaches that deliver value before the whole job is done.
- When should a system be left alone rather than modernized?
- When it is stable, rarely changed, cheap to operate, and not blocking anything the business needs to do differently. A system that has been running without incident for a decade, that only a few people use, and that interfaces cleanly with everything around it may be the safest system in the portfolio. The cost of touching it may exceed any benefit.