When Modernizing Wins: The Third Option That Beats Build and Buy
Modernizing beats building and buying when the system's real value is the business logic embedded in it — the pricing, underwriting, or fulfilment rules refined over years and written down nowhere but the running code. Building or buying forces you to re-derive that logic from scratch, usually in production; modernizing carries it forward incrementally, each slice proven to behave identically to the original before it goes live, so the transformation de-risks itself instead of betting everything on one cutover.
Part 4 ended on a pivot, and this final part takes it seriously. Every option the series has weighed so far — build, buy, buy-then-extend, partner, low-code — shares one silent assumption: that the system you have is the problem. The thing to get past. The liability you replace, whether you replace it by writing new code or by licensing someone else’s. Reversibility analysis assumes it, TCO worksheets assume it, the decision matrix assumes it. It is baked so deep into how these choices get framed that almost nobody says it out loud.
For a large and expensive class of system, that assumption is exactly backwards. The system is not the problem. It is the single most valuable asset the business owns, and the reason it looks like a problem is that it has been neglected, not that it is wrong. This is the third option the build-vs-buy question keeps trying not to see: keep the system, and transform it. When it applies, it beats both build and buy — not by a little, and not on sentiment. It wins on the same TCO, fit, and risk terms the rest of the series has been using. This is the case for it, made concretely, and it is where the series lands.
The system as asset: when the logic is the product
Start with what “the business logic is the value” actually means, because it gets said so often that it has gone soft.
Some systems are valuable because of what they are — a clever architecture, a fast data store, a slick interface. Those are replaceable; a better one comes along and you swap it. Other systems are valuable because of what they know, and what they know is not in any document. It is the accumulated set of rules the system has absorbed over its life: every pricing exception, every eligibility check, every “we always handle this customer’s returns differently,” every branch added the week after something went wrong in production. The code is not an implementation of a specification that lives somewhere else. The code is the specification. It is the only complete, current, authoritative statement of how the business actually operates, and it happens to be executable.
That is what makes it an asset rather than a cost. A twenty-year-old policy administration system, a claims adjudication engine, a rating engine, an order-fulfilment core, a benefits-calculation module in a payroll platform, a trade-settlement pipeline — these are not valuable because the COBOL or the Visual Basic or the early-2000s Java is good. Most of it isn’t. They are valuable because they encode thousands of correct decisions that the business relies on being correct, and that no living person could fully re-specify. The tribal knowledge that would normally live in senior employees’ heads has, in these systems, been externalized into code and then run millions of times against reality. Every edge case that ever mattered has already been found and handled, because if it hadn’t been, a customer or a regulator would have forced the issue years ago. The system has been debugged by two decades of production traffic. You cannot buy that. You can only inherit it or throw it away.
This is the specific condition under which modernizing wins. Not “the system is old.” Not “we’re attached to it.” The condition is: the behavior of this system is a competitive asset, its rules are correct and load-bearing, and they exist in complete form only in the running code. When that is true, the question stops being “build, buy, or modernize” as three peers and becomes “preserve this asset, or destroy it and try to rebuild what it knew.” Framed that way, most people’s instinct flips — and their instinct is right.
What a rewrite actually signs up for
Both build and buy destroy the asset. That is not rhetoric; it is the mechanism, and it is worth being precise about because it is the mechanism that sinks these projects.
A greenfield build and a purchased package both begin from a written statement of what the system should do — a requirements document, an RFP, a product’s feature list. That statement describes the system the business thinks it has. It is the happy path: quote a policy, price the order, adjudicate the claim, run the payroll. It is accurate as far as it goes, and it goes about as far as the demo. The value of the old system is almost entirely in the part the requirements don’t capture: the exceptions. The surcharge that applies only in one state, only when a prior-coverage gap exceeds a specific threshold, and only if a particular deferment flag is off — a rule someone added after a compliance inquiry in 2013, that no current employee can explain, that a quarterly audit silently depends on. Multiply that by the thousand such rules a mature core system carries, and you have the actual product. None of them are in the requirements. All of them are in the code.
So a rewrite — whether you build it or the vendor’s implementation team builds it against your customizations — signs up to re-derive twenty years of edge cases from scratch. The requirements get you the 80% that was never the hard part. The remaining 20% has to be recovered the only way it can be when there is no specification: by discovering each rule the moment its absence causes a problem. And because the new system is live by the time you discover them, “the moment its absence causes a problem” means in production, against real customers, one incident at a time. A mispriced book of business. A wrongly denied claim. A compliance breach that surfaces at audit. Each one is a rule the old system got right and the new one didn’t know about, rediscovered the expensive way.
This is why a rip-and-replace and a full rewrite are the same bet wearing different clothes — refactoring versus rewriting is the in-place version of the same fork, and it fails for the same reason. Both discard a working, fully-specified-in-code asset and gamble that a new system can re-earn everything the old one already knew, on a schedule, without the two decades of production traffic that taught the old one in the first place. It is a large part of why up to 70% of digital transformations fail to deliver on their objectives (BCG, 2023). The failure is rarely the new technology. The new stack usually works fine. The failure is that the new system does not know what the old system knew, and closing that gap in production is slower, costlier, and riskier than anyone costed at the start.
Notice that this tax falls on build and buy equally for the differentiated core. A vendor package doesn’t escape it — it just relocates it into customization, integration, and the migration of behavior the package can’t natively express. The “buy it off the shelf” economics erode exactly as fast as you push your real rules into the product, because your real rules are the part the product was never built to hold. The industry-specific versions of this trade-off make it concrete: see how it plays out for Oracle Forms core systems and for insurance policy and claims cores, where the “buy a modern platform” pitch runs straight into logic no platform ships with.
Why modernization keeps losing an argument it should win
If modernizing preserves the asset that build and buy destroy, why does it so often lose the room? Because it has earned a genuinely bad reputation, and pretending otherwise is how you sell a project that fails.
The word “modernization” has been attached to some of the worst programs in enterprise IT: multi-year, boil-the-ocean re-platforming efforts that consumed enormous budgets and delivered a system that did exactly what the old one did, a bit slower, eighteen months late. When a CFO hears “modernize the core,” that is the memory it triggers — open-ended scope, no visible milestones, a team disappearing into a legacy codebase and emerging years later with a promise. Against that, “buy a finished SaaS product” sounds like adult supervision. It has a price, a date, a demo you can click. The honest problem with modernization as usually practiced is that it offers preservation of the asset but no answer to the risk objection — and the risk objection is the one that decides budgets.
So the case for modernizing only holds if it can answer that objection concretely. Not “trust us, incremental is safer,” but a specific mechanism that converts the open-ended, all-or-nothing modernization program into something bounded, milestone-driven, and reversible at every step. That mechanism exists, it is well established, and it is the reason modernize can now win the argument on the same risk terms that used to disqualify it.
The mechanism: strangler-fig plus parity validation
Two techniques, used together, are what turn “modernize” from a leap of faith into the lowest-risk option on the table.
The strangler-fig pattern — Martin Fowler’s name for it, after the vine that grows around a host tree until it can stand on its own and the host rots away — replaces a system incrementally instead of all at once. You put a facade in front of the legacy system so that every caller goes through a stable interface. Then you pick one capability — one screen, one calculation, one service — reimplement it on the modern stack behind that facade, and route just that capability to the new code. Everything else still runs on the legacy system, untouched. You repeat, capability by capability, until nothing routes to the legacy system anymore and it can be switched off. There is no cutover day. There is no weekend where the whole business bets on a migration completing. The old system keeps running the parts you haven’t moved yet, as a working fallback, the entire time. This is the spine of any credible incremental modernization, and it is what a serious legacy application migration engagement is built around.
Strangler-fig solves the sequencing risk — you never have to move everything at once. But it does not, by itself, solve the correctness risk, and correctness is the whole problem for a system whose value is its embedded logic. Reimplementing a slice on a modern stack still means rewriting that slice’s rules, which means it can still get the edge cases wrong. That is where the second technique earns its place.
Parity validation proves that each reimplemented slice behaves identically to the original before it carries real traffic. Instead of writing the new pricing logic and hoping you captured every rule, you run the new implementation and the legacy implementation against the same inputs and compare their outputs, exhaustively. Real historical inputs replayed through both. Live production requests shadowed to the new code in parallel with the old — a technique Martin Fowler calls a parallel run, and the pattern behind tools like GitHub’s open-source Scientist library, which runs a new code path alongside the trusted one and reports every divergence. Where the outputs match, the new slice is proven correct against the only authority that exists: the behavior of the system that already runs the business. Where they diverge, you have found an edge case — and you have found it as a line in a diff, in a test harness, before a single customer was affected, rather than as a production incident three months after go-live.
Read what that does to the rewrite tax from two sections ago. The unwritten twenty years of edge cases don’t vanish — nothing makes them vanish, they are real rules the business depends on. But parity validation changes where and when you discover them. Instead of surfacing one at a time in production, at customer expense, they surface as output mismatches in an automated comparison you run before cutover. The rediscovery still happens; it just happens safely, cheaply, and against a ground truth, which is the entire difference between a modernization that works and a rewrite that fails. This is the discipline ModernLift’s parity validation is built to enforce: every migrated behavior proven to match the legacy before it goes live, so “modernize the differentiated core” stops being the risky option and becomes the one with an actual safety proof attached.
Put the two together and the shape of the risk inverts. A big-bang build or buy concentrates all the risk on one future date and offers no way back once you’ve committed. Strangler-fig plus parity spreads the risk across many small, individually-proven, individually-reversible steps, each behind a flag, each rolling back to a known-good legacy fallback if the new slice misbehaves. Not a multi-year rewrite you have to believe in — proven slices shipping every few weeks, each one carrying a piece of the asset forward intact.
What this does to the build-vs-buy math
This is the series conclusion, so tie it back to the four decisions that led here, because modernize is not a separate topic bolted onto the end. It is the option the first four parts kept pointing at.
On cost (Part 2’s TCO): modernize is the only path that starts from an asset you already paid for rather than a blank repository or a fresh license. There is no initial-build line and no re-implementation-of-known-behavior line, because the behavior is already there and being carried forward, not rebuilt. Spend is incremental against a system that keeps earning the whole time, and it lacks the thing that blows up build-and-buy budgets: the long, invisible tail of rediscovering behavior in production. Plug your own system into the legacy cost calculator and the gap that opens is usually this one.
On fit (Part 3’s matrix): the “preserves existing business logic and data” criterion — the one build scores low on and buy scores lowest — is the criterion modernize is built to max out. And the matrix’s honesty rule bites here: if that criterion carries real weight because the logic is your differentiator, a low score on it is disqualifying on its own, no matter how well build or buy scores on cost or time-to-value. That is the matrix telling you to modernize, if you weighted it before you scored it.
On reversibility (Part 4): incremental modernization is, by construction, the most reversible path there is. Each slice is small, proven at parity, and behind a flag, so a wrong step rolls back to the legacy fallback rather than to a failed cutover with no way home. Part 4 priced the exit cost of every option; modernize done this way has the lowest exit cost at every single step, because there is always a working system underneath.
So the four analytical passes of this series — frame, cost, matrix, reversibility — do not point at four different answers. For a system whose value is its embedded logic, they all point at the same one: carry the asset forward. Modernize looked like the underdog because its usual practice couldn’t answer for risk. With strangler-fig and parity it can, and once it can, it stops being the sentimental choice and becomes the one the numbers were pointing at the whole time.
When modernizing is the wrong answer
The case above is strong precisely because it is bounded. A page that argued modernize-always would be as dishonest as the vendor decks that argue buy-always, and you should trust it less. Modernize is the wrong answer, clearly, in three situations.
When the function is a commodity. If the capability looks essentially the same across your whole industry — payroll, email, expense management, generic CRM or ERP modules — a mature product almost certainly does it better than your aging bespoke code, and paying to preserve differentiated engineering for undifferentiated work is hard to justify. Buy it. The whole series has said so; modernize earns its keep only on the differentiated core.
When the platform is a genuine dead end and the logic isn’t worth the rescue. Sometimes the runtime, language, or hardware is truly at the end of the road with no viable in-place path forward, and the logic it carries isn’t differentiated enough to be worth migrating the rules. Then replacement is honest. Note the and: a dead platform carrying valuable logic is still a modernize case — the goal shifts to migrating the rules forward onto a live platform, not abandoning them.
When the business has decided to change how it works. If leadership has deliberately chosen to drop the customization that made the system special and adopt an industry-standard process — a real strategic decision, not a fatigue-driven one — then the embedded logic is no longer an asset to preserve. It is a constraint to shed, and a package that imposes the standard process is the point.
The full keep-or-discard test — the commodity-versus-competitive question that settles most of these, plus the two follow-ups that sharpen it — is its own decision, and this page deliberately does not re-derive it. Modernize vs Replace is the detailed treatment; read it as the companion to this one. This page is the affirmative case, from inside the build-vs-buy series, for the situation where that test comes back “keep.” That page is the test itself.
Where the series lands
Five parts, one decision. Part 1 framed it honestly and refused to let it collapse into a two-way build-or-buy choice, because the real question underneath is whether a capability is core or context. Part 2 put a real three- and five-year TCO on each path and showed the sticker price is the smallest number in the decision. Part 3 turned the trade-off into a weighted matrix you score function by function, with the rules that stop a matrix from rationalizing the answer you already wanted. Part 4 priced the exit — how hard each choice is to unwind — and mapped the hybrid paths that keep your options open. And this part named the case those four kept circling: when the system you have is the asset, not the problem, transforming it beats replacing it, and strangler-fig plus parity validation is what makes that transformation the low-risk option rather than the leap of faith it used to be.
The whole series reduces to one discipline: decide function by function, be honest about what each function is worth and what it already knows, and refuse to throw away a working asset just because it is old. Buy the commodity edges. Build or partner on the genuinely new. And carry the differentiated core forward incrementally, each slice held to parity before it ships — because that is where the value is, and it is the one part no build and no purchase can hand back to you once it’s gone.
If you already suspect that the system running your business is an asset your team has been treating as a liability, that instinct is usually right — and it is a scopable one. A discovery call turns “carry the logic forward, don’t rebuild it” from a hunch into a concrete plan: which slices to move first, what parity looks like for your rules, and what the incremental path actually costs against the build-or-buy alternatives you now know how to price.
Frequently asked questions
- When does modernizing beat building or buying?
- When the system encodes differentiating business logic — rules refined over years that live nowhere but the code — and that logic is what the business competes on. Build and buy both discard the existing system and force you to re-derive its behavior; modernizing preserves it and improves the system around it. If the function is a commodity an off-the-shelf product handles well, buy instead. The deciding question is whether the logic is the asset or the liability.
- Isn't modernizing slower and riskier than buying a finished product?
- That is the reputation, earned by multi-year re-platforming programs that changed nothing. Done incrementally it is the opposite. A strangler-fig approach replaces the system one capability at a time behind a stable interface, and parity validation proves each replaced slice behaves identically to the original before it goes live. Risk arrives in small, reversible increments you can roll back — not concentrated in a single big-bang cutover you cannot undo.
- What is strangler-fig modernization?
- A pattern named by Martin Fowler after the strangler fig vine, which grows around a host tree until it can stand on its own and the host is gone. In software you put a facade in front of the legacy system, route one capability at a time to a new implementation behind that facade, and repeat until nothing routes to the legacy and it can be switched off. There is no cutover day — the old system is retired gradually, in production, with a working fallback the whole way.
- Why do rewrites re-derive years of edge cases?
- Because the edge cases were never written down anywhere except the code and its behavior. The requirements a rewrite works from describe the happy path; the value sits in the exceptions — the surcharge that applies only when three conditions coincide, the rule added after a regulator's inquiry a decade ago that no current employee can explain. A new build or a bought package has to rediscover each of those, usually one production incident at a time.
- When is modernizing the wrong answer?
- When the function is a commodity an off-the-shelf product does better — payroll, email, generic CRM — where paying to preserve bespoke code is hard to justify. Or when the platform is a genuine dead end with no migration path and the logic on it is not differentiated. Or when the business has deliberately decided to abandon the customization that made the system special. The keep-or-discard test is its own decision, covered in full in Modernize vs Replace.