
Key takeaways
An application modernization strategy is a sequencing and funding decision, not an architecture one. Which pattern each application gets, rehosting, replatforming or refactoring, is a separate call made later and one application at a time.
Gartner predicted in June 2026 that more than 70% of mainframe exit projects started that year will fail to produce the intended benefits, because teams overestimate what generative AI can do with complex legacy code.
Shopify spent three years splitting a 2.8 million line Ruby monolith into 37 components and deliberately chose clear ownership over finished boundaries. A boundary nobody owns rots again.
Write the stopping rule before the first slice starts. A program with no definition of done becomes a permanent budget line, and permanent budget lines get cut in the first bad quarter.
An application modernization strategy is a sequencing and funding plan for an estate, not an architecture decision for one application. It answers four questions: which systems you're deliberately leaving alone, what order the rest moves in, how each piece pays for the next, and when the program is finished. The technology choices sit underneath it and change from application to application.
That distinction is the whole game, and it's the one most strategy documents skip. They open with an inventory, run an assessment, land on a pattern, and call the result a strategy. What they've actually produced is an architecture opinion with a project plan stapled to it. The order stays unexamined, the funding stays annual, and nobody has written down what "done" looks like.
What is an application modernization strategy?
An application modernization strategy is the plan that decides which parts of a software estate change, in what order, paid for how, and until when. It operates at the portfolio level. It does not decide whether a given service gets rehosted, replatformed or refactored, because that decision depends on the service and can only be made sensibly once the order is set.
Keeping those two layers apart matters more than it sounds. The per-application decision is well documented and reasonably mechanical: you look at the amount of change a service needs and pick from a known set of options, which we've broken down in replatforming vs. refactoring vs. rehosting. The portfolio decision has no equivalent playbook, which is why it tends to get quietly replaced by whichever system the loudest team wants to rebuild.
So the useful test for a strategy document is simple: if you can read it end to end and still not know what the team is working on in six months, or what they've been told not to touch, it isn't a strategy. It's an assessment.
Why do modernization programs fail before the code changes?
Modernization programs fail early because the work starts before the sequence exists. Starting is politically easy: there's always a team ready to rebuild something, always a vendor with a proposal, always a system everyone agrees is bad. Choosing an order is politically hard, because an order means telling most of the organization that its problem isn't next.
The clearest public evidence for this comes from the U.S. federal estate. In July 2025 the Government Accountability Office reviewed the 11 systems it considered most in need of modernization, across ten agencies. They ranged from 23 to 60 years old. Eight ran on outdated programming languages such as COBOL, four sat on unsupported hardware or software, and seven carried known cybersecurity vulnerabilities. Only three of the 11 had fully documented modernization plans containing all the key elements.
The detail worth sitting with is the next one: of the eight systems without a complete plan, seven already had modernization underway. The federal government spends over $100 billion a year on information technology, roughly 80% of it maintaining what already exists. So this isn't a story about agencies that can't get started. It's a story about work that started without anyone deciding the order, which is the same failure mode we see in a 200-person product company, minus the congressional hearings.
The seven steps, and what each one has to produce
A modernization strategy is finished when it has produced seven artifacts. Each step ends with a decision written down and something a reader outside the team could act on. If a step produces a slide instead of a decision, it isn't done.
Step | The decision | What it produces | Go/no-go |
|---|---|---|---|
1 | What stays as it is | A named list of systems out of scope | Someone senior has signed the list |
2 | What the program is timed against | A business event with a date | The date exists without the program |
3 | Which slice goes first | One service, in production, reversible | It can be finished in a quarter |
4 | How much change each application needs | Pattern per application | The choice survives a cost question |
5 | How the work is paid for | A measurable release per slice | Slice one funds slice two |
6 | Who owns each boundary afterward | Named team per component | The team exists after the program |
7 | When it's over | A written stopping rule | It can be met, and it can fail |
The steps run in that order for a reason. Steps 1 and 2 are cheap and unpopular, steps 3 to 6 are where the money goes, and step 7 is the one that gets written retroactively if you don't do it first.
Step 1: Decide what you're not modernizing
The first output of a modernization strategy is a list of systems you've agreed to leave alone. Not "phase two", not "later". Out of scope, named, signed. Every application you keep nominally in scope consumes planning attention, review cycles and executive patience, and the estate almost always contains systems that should be retired or simply retained as they are.
The retire and retain options are part of the standard set of modernization patterns, and they're the two that get skipped because neither produces anything to demo. That's exactly why they belong in step one rather than in the per-application assessment: once a program has momentum, "leave it alone" stops being an acceptable answer.
The uncomfortable part is that this is a business decision wearing technical clothes. A system nobody will fund is a system you've decided to retain, whether or not anyone says so out loud. Writing that down early is unpleasant, and it's cheaper than discovering it in month nine.
Step 2: Sequence against a business event, not a dependency graph
The order of a modernization program should come from a date the business already has: a contract renewal, a regulatory deadline, an end-of-support notice, a market entry, an acquisition close, a product launch. Dependency graphs tell you what's technically possible to move first. They don't tell you what's worth moving first, and they have no opinion about what the company is trying to do this year.
This is the step that turns a technical program into a funded one. A modernization slice tied to a payment provider contract that expires in eleven months has a sponsor, a deadline and a number attached to missing it. The same slice tied to "reducing technical debt" has a well-argued document and no calendar. Both are real work. Only one of them survives a budget review, which is worth understanding before you write the plan rather than after.
Sequencing this way also changes the shape of the estate map. Instead of a dependency tree, you get a timeline with a handful of immovable dates on it, and the technical dependencies become constraints on how you hit those dates rather than the thing setting the order.
Step 3: Pick a first slice that has to prove something
The first slice of a modernization program exists to produce evidence, not value. Its job is to demonstrate that the team can move a real service, carrying real production traffic, and reverse the move if it goes wrong. Value is welcome. It just isn't the point, and treating slice one as a value delivery is how programs pick something too big to finish.
Four criteria hold up well. The slice should be finishable in a quarter, so the evidence arrives while the sponsor still remembers agreeing to it. It should carry live traffic, because a service nobody uses proves nothing. It should be reversible at every step, which is a property of how you move it rather than what you move: we've written up the mechanics in migration of legacy systems. And it should belong to a team that will still exist when the program ends.
That last one is the criterion people argue with. It sounds like an organizational nicety. It's the difference between a boundary that holds and a boundary that gets bypassed by the first person who needs a shortcut and can't find anyone to ask.
Step 4: Choose the amount of change one application at a time
The pattern each application gets, rehosting, replatforming, refactoring, or one of the other standard options, is decided per application and only after the sequence exists. Deciding it earlier means choosing an approach for systems you may never touch, which is a reliable way to spend an assessment budget on documents that expire.
We've covered how to make that call, including where retiring, retaining, repurchasing and relocating fit, in replatforming vs. refactoring vs. rehosting. The short version for a strategy document: most programs use more than one pattern, and a program that has picked a single pattern for an entire estate has usually picked a vendor rather than a strategy.
One level up from individual services, at the product level, the choice tends to reduce to three shapes. We set them out in 2024 as three effective approaches to a technology stack revamp: overhaul the product in place, build a new one beside it and keep the old one running, or evolve it feature by feature.
We've run all three. ClearanceJobs, a US career platform, took the overhaul route in 2016, rebuilding a legacy web platform end to end while thousands of daily users kept being served throughout, with mobile apps following in 2021. DoneDone took the parallel route: DoneDone Classic stayed live while DoneDone 2 was built next to it from summer 2018 to launch in April 2019, moving off a monolithic .NET application to a Vue.js single-page app behind feature toggles. LegalNature took the iterative route, moving from a monolithic Rails application to a Vue.js single-page app page by page on a shared Design System.
Those are three different bets rather than three flavors of one. An overhaul concentrates the risk in a single release and buys the cleanest result. Building beside it protects the existing revenue and, as we wrote at the time, leaves you supporting two codebases for as long as the old product has customers. Iterating is the least disruptive and the easiest to abandon halfway, which is either its best property or its worst depending on whether step 7 exists.
One thing to hold onto here. The cost of the pattern is not the cost of the decision. A refactor that takes two quarters and lands cleanly is cheaper than a rehost that takes six weeks and leaves the same technical debt sitting on newer infrastructure with a higher monthly bill.
Step 5: Make each slice fund the next
Every slice should release something measurable that the next slice can be paid for with: license or infrastructure cost removed, incident hours recovered, onboarding time cut, release cadence improved. The point isn't accounting theater. It's that a program funded by its own results doesn't have to win an argument every January.
The mechanics are duller than they sound. Pick one number per slice before the work starts, take the reading beforehand, and take it again when the slice lands. It doesn't have to be a cost line. A release cadence that moves from monthly to weekly is a number a sponsor can hold, and so is the count of hours a team spent on incidents last quarter. What matters is that the reading exists before the work, because a measurement taken afterward is an argument rather than evidence.
The friction is that most finance functions don't recognize avoided cost. A decommissioned system that removes an annual license fee is easy to show. A team that stops losing two days a week to a fragile deploy pipeline is real money that appears on no line anywhere. So the number you pick should be one the business already reports, even when it's a cruder measure of the work than the one you'd choose yourself: a mediocre metric someone already trusts beats a precise one you have to defend.
Each slice that pays for itself makes the next one easier to approve, and that's the only funding model that survives a bad quarter.
Step 6: Move ownership with the boundary
When a component moves, a named team has to move with it. A modernization program that creates clean boundaries without assigning them re-creates the original problem in newer syntax, because the thing that made the old system hard to change was rarely the language. It was that no one person could say yes.
Shopify's account of splitting its monolith is the most honest public write-up of this. Over three years, working on a Rails codebase of more than 2.8 million lines of Ruby and 500,000 commits, the team reached 37 components. At the start, as engineer Philip Müller described in 2020, "every component depended on over half of all the other components", with circular dependencies throughout. They chose to accept incomplete boundaries in exchange for clear ownership, and they moved from mandates to tooling, replacing custom analysis with Packwerk and custom validation with Sorbet, after early patterns "didn't increase developer ability or motivation".
The lesson they drew is the one worth stealing: a central team can't push change through against the momentum of hundreds of developers. It can make the right thing easier to do than the wrong thing. That's an organizational design problem sitting in the middle of what looks like an architecture program, and it's why step 6 is a step rather than a footnote.
Step 7: Write the stopping rule before you start
A modernization strategy needs a written definition of when it's over, agreed before the first slice begins. It can be a threshold, a date tied to the business event from step 2, or a budget ceiling. What matters is that it's something the program can actually meet, and something it can visibly fail to meet.
Programs without a stopping rule don't end. They become a standing line item, and a standing line item with no completion criteria is the easiest thing on the budget to cut when the quarter turns. The irony is familiar: the programs most likely to be cancelled for lack of results are the ones that never defined what a result was.
There's a second reason to write it early. A stopping rule forces the scope conversation into step 7 rather than month fourteen, and scope conversations are much cheaper before anyone has built anything. If the honest stopping rule is "when these four services are off the mainframe and the license lapses", then the strategy is four services long, and everything else belongs on the step 1 list.
How has AI changed application modernization in 2026?
Generative AI has made the mechanical part of modernization dramatically cheaper and has not touched the sequencing problem, which means the sequence now accounts for more of the outcome than it used to. Code translation, test generation and documentation recovery are all faster. Deciding what to translate, in what order, and how you'll know it worked is exactly as hard as it was.
Gartner put a number on the gap. On 18 June 2026 it predicted that more than 70% of mainframe exit projects initiated in 2026 will fail to produce the intended benefits, because of an overestimation of generative AI tooling capabilities. Alessandro Galimberti, VP Analyst, described "a widening gap between the marketing promise of GenAI and its real-world ability to transform and migrate complex legacy code". The same release predicts that by 2030, 75% of mainframe exit vendors will pivot or cease operations as expectations reset.
The 2025 DORA report points at the mechanism. Across nearly 5,000 technology professionals, 90% reported using AI at work and more than 80% believed it made them more productive, while 30% reported little or no trust in AI-generated code. AI adoption showed a positive relationship with delivery throughput and a negative one with delivery stability. The report's framing is blunt: "AI doesn't fix a team; it amplifies what's already there."
Read those two findings together and the conclusion for a modernization strategy is uncomfortable but useful. If your sequencing is good, AI will get you through it faster. If your sequencing is bad, AI will get you into trouble faster, and it will do so while everyone involved feels more productive than usual.
Why the shortest list in the plan matters most
Of the seven artifacts a modernization strategy produces, the one that predicts the outcome is the shortest: the list of systems you agreed not to touch. It's the only one that costs something to write, because every name on it is a team told to wait and a problem left unsolved on purpose. Everything downstream, the order, the funding, the stopping rule, is easier once that list exists and impossible while it doesn't.
That's also why a strategy isn't finished when the assessment is. Legacy modernization is less a program than a habit an organization either builds or doesn't. The estates that get healthier are the ones where somebody, once a quarter, is willing to say out loud which systems aren't next.
Frequently asked questions
An application modernization strategy is a portfolio-level plan that decides which systems change, in what order, funded how, and until when. It sits above the per-application decision of whether to rehost, replatform or refactor. A strategy that only names a target architecture, without an order and a stopping rule, is an assessment rather than a strategy.
Seven: decide what stays as it is, sequence the rest against a business event with a real date, pick a first slice that proves the team can move a live service reversibly, choose a pattern per application, make each slice release something measurable that funds the next, assign a named owner to every boundary you create, and write a stopping rule before the work starts.
A legacy modernization strategy sequences an estate. A migration moves one system. The strategy decides that the billing platform goes before the customer portal and why; the migration decides how billing moves without stopping the business. Confusing them produces plans that describe a cutover in detail and never explain the order.
Long enough that the honest answer is per slice, not per program. A useful constraint is that the first slice should be finishable within a quarter, so the evidence arrives while the sponsor still remembers approving it. Programs quoted as a single multi-year number tend to be the ones without a stopping rule.
No. A big-bang program concentrates all the risk on one date and removes the option to learn between slices. It also requires the organization to hold a single set of priorities steady for years, which almost none can. Incremental sequencing, with each slice reversible and funded by the last, is slower on paper and faster in practice.
AI can accelerate the mechanical work: translating code, generating tests, recovering documentation. It doesn't decide sequence, ownership or acceptance criteria. Gartner predicted in June 2026 that more than 70% of mainframe exit projects started that year will fail to deliver intended benefits because teams overestimate what generative AI tooling can do with complex legacy code.
Per slice, against something the business already tracks: infrastructure or license cost removed, incident hours recovered, onboarding time, release cadence, time from request to production. A strategy that can only be measured at the end of the program can't be corrected during it, which is the same as not being measured.

Tiago Coelho
CTO
As CTO of Pixelmatters, Tiago Coelho leads the engineering organization, wrote the handbook and quality standards it ships against, and is rebuilding delivery around AI. He writes on technology strategy and engineering leadership.
Share this article


