SYSTEMS · MODERNIZATION2026-07-08·8 min read

“Let’s just rebuild it from scratch” is the most expensive sentence in software — when to modernize instead, and the rare case for starting over

The system everyone wants to bin still runs the business. Rebuilding it from zero feels like a fresh start and is usually a multi-year detour back to the same place. Modernizing it in place is slower to feel heroic and almost always the right call.

By Felukaa
[ THE SHORT VERSION ]

Every business that runs on custom software eventually arrives at the same meeting. The system is old. It is ugly inside. The person who built it left two jobs ago. Every small change takes too long, and someone — usually the newest, most confident engineer in the room — says the words: "Honestly, it would be faster to just rebuild it from scratch." Everyone nods, because it feels obviously true. The old thing is a mess; a clean start would be so much better. That sentence is one of the most expensive things anyone can say in a software business, and it is almost always wrong.

Here is what the clean-start fantasy leaves out: that ugly old system is ugly because it works. Every strange conditional, every weird special case, every line nobody remembers writing is usually a bug that was found and fixed, an edge case a real customer hit at 2am, a rule the business genuinely needs but never wrote down. That knowledge is not in a document — it is in the code. Throw the code away and you throw the hard-won knowledge away with it. Then you get to rediscover every one of those buried bugs the slow way: in production, with real customers, one painful surprise at a time.

This piece is about the single most consequential decision you will make about a system you already own: telling the case where it has genuinely aged out and needs replacing apart from the far more common case where "rebuild from scratch" is a two-year detour that lands you roughly where you started — minus the money and the years. There is a third door most people in that meeting never see: modernize the thing in place, one piece at a time, without ever taking it offline. That door is almost always the right one.

[ FIGURES ]
Figure 1 · The two ways to replace a system point in opposite directions
TWO WAYS TO REPLACE A SYSTEM YOU HAVE OUTGROWN BIG-BANG REWRITE ✕ Freeze the system, rebuild from zero ✕ Months to years, nothing shippable ✕ No reason v2 beats v1 ✕ One risky switch-over day ✕ Cost Netscape ~3 years and the market it led Same place · minus the years MODERNIZE IN PLACE ✓ System stays live the whole time ✓ Replace one slice at a time ✓ Value ships every quarter ✓ Each step cheap to get wrong ✓ No big-bang switch-over day Modern foundation · no dark tunnel The clean start and the fix are not two grades of the same move — they point in opposite directions.
There are two ways to replace a system you have outgrown, and they are not two grades of the same move. The big-bang rewrite freezes the current system, rebuilds it from zero in the dark, and bets everything on one switch-over day — the move that cost Netscape about three years and the market it led. The incremental path leaves the system running and replaces it a slice at a time, so value ships every quarter and there is never a day the business goes dark.
Figure 2 · A from-scratch rewrite has to run just to stand still
FUNCTIONALITY THE BUSINESS CAN USE TIME → TODAY'S FUNCTIONALITY · PARITY THE PARITY GAP months of work that adds nothing new Old system · kept alive Rewrite · from zero BACK TO EVEN The old system never waits while you rebuild it — the rewrite runs just to stand still.
The cost nobody prices into the meeting: while you rebuild from zero, the old system does not wait. It keeps getting the fixes and features the business needs, so your rewrite has to climb all the way back to today’s functionality before it adds a single new thing. That climb — the parity gap — is months to years of work that leaves you exactly where you already were.
[ EXPLANATION ]

The most famous version of this mistake has a name attached to it. In 2000, watching Netscape rebuild its browser from the ground up, the software writer Joel Spolsky called the decision "the single worst strategic mistake that any software company can make" [1]. The rewrite opened a roughly three-year gap in which Netscape shipped no competitive product, a rival swallowed the market it had once led, and the company effectively did not survive the detour. His core argument is the one that matters for any owner, not just a browser company: when you throw out working code and start over, there is no particular reason to believe the second version will come out better than the first — and while you build it, you ship nothing to the customers who are still paying you.

The deeper reason cuts against every instinct. That old code looks like a mess, but it is a mess that has been tested by reality for years. Each ugly patch is a scar over a real wound — a defect someone hit, an edge case a customer tripped, a tax rule or a refund path or a rounding quirk the business actually depends on. None of that is written down anywhere; it lives only in the lines you are about to delete. A rewrite does not start from the spec you have. It starts from a spec you no longer fully know, because most of what the system does was learned the hard way and never documented. That is why rewrites reliably rediscover old bugs: you are not building the same system again, you are re-learning it in production.

Even when a rebuild does happen, it tends to bloat. Fifty years ago Fred Brooks named the "second-system effect": the second system a team designs is the most dangerous one they will ever build, because they finally get to add every feature they had the discipline to leave out of the first [2]. The lean, focused original — spare precisely because its builders were still cautious — becomes an over-engineered monument to everything the team always wished it had. So the rewrite is not just late. It is often worse than what it replaced: heavier, slower, aimed at a wish-list spec that already moved while it was being built.

This is not a niche engineering worry — it is where the money already goes, and the clearest public numbers come from the one buyer forced to publish them. The US federal government spends about 79 percent of its planned IT budget — on the order of $83 billion a year — just operating and maintaining systems that already exist, rather than building anything new [3]. Some of those systems are more than fifty years old, written in languages almost nobody still learns, a few once running on hardware as old as 8-inch floppy disks [4]. And of the ten most critical legacy systems flagged for modernization in 2019, only three were finished six years later [4]. The lesson is not "government is slow." It is that replacing a load-bearing system is genuinely hard, big-bang replacement stalls often enough that even a near-unlimited budget cannot force it through, and the maintenance meter runs the entire time you argue about it.

The way out is not rewrite-or-suffer — there is a third path, and it has a name too. Martin Fowler calls it the "strangler fig," after the vine that grows around a tree and slowly replaces it until the original is gone [5]. You wrap the old system in a thin routing layer, move one slice of functionality at a time onto new code behind it, and shrink the old system piece by piece until there is nothing left to switch off [6]. The system stays live the entire time. Every step is small enough that being wrong costs a week, not a year, and each step ships something the business can use instead of a promise it will one day. It is less heroic than a grand rewrite and far more likely to actually finish — which is the only quality that matters.

None of this means never rebuild. Full replacement is the right call in a narrow set of cases: when the platform underneath is genuinely dead — unsupported, unsafe, and nobody left who can run it — when the business the system was built for no longer exists, or when the thing is small enough that a rewrite is a few weeks of work, not a few years. The honest tell is scale. A rewrite you can finish before the old system changes underneath you is a rewrite; one that takes years is a bet against a moving target, and you will probably lose it. For anything load-bearing, the default is to modernize in place — and to choose it deliberately, with the parity gap and the second-system effect on the table, not in the heat of the meeting where someone says it would be faster to start over.

[ PERSPECTIVES ]
Camp A — Burn it down and build it right

The old system is a liability, not an asset. It is slow to change, nobody understands it, it sits on foundations that are aging out from under you, and every month you keep it you pay interest in lost velocity and mounting risk. A clean rebuild on a modern foundation, done properly this time, is faster to work in forever after — and forever is a long time. Stop pouring money into a museum piece nobody can safely touch. Rip the bandage off, rebuild it right, and stop apologizing for wanting a foundation you can actually build on. Incremental modernization is just slow death with extra project-management overhead.

Camp B — Never rewrite

A working system is an asset you have already paid for, and its ugliness is encoded knowledge, not waste. The rewrite always takes longer than promised, ships nothing to real customers for years, and arrives to a spec that already moved while you were heads-down building it. There is no evidence version two comes out better and every reason — the second-system effect chief among them — to expect it to repeat the first version’s mistakes and invent fresh ones. Keep the system, fix what actually hurts, harden the parts that are dangerous, and stop romanticizing the blank page. The blank page is where projects go to die.

Camp C — Modernize in place

Both of the camps above are answering a question nobody had to ask. It was never rewrite-or-suffer. Wrap the old system, route one slice of functionality at a time to new code behind it, and keep the whole thing live and shipping value at every step — until the old code is gone without a single big-bang switch-over. You get the modern foundation Camp A wants and the safety Camp B insists on, minus the multi-year dark tunnel neither of them can make disappear. The point is not which side wins the argument; it is that the argument had a third door the whole time.

Where we land

Camp C by default, Camp B as the honest baseline, Camp A only when you can prove the rewrite is small or the platform underneath is truly dead. The instinct to start over is almost always the thrill of a blank page talking, not the math — and the math, once you draw the parity gap, rarely survives the conversation. A load-bearing system that runs your business should be modernized in place, in slices small enough that any single one being wrong costs a week and not a year. We reach for a full rewrite only when we can finish it before the old system moves under us — and we say out loud which case you are actually in, before anyone in the room falls in love with the clean start.

[ OPEN QUESTIONS ]
  1. 01How do you tell a system that has genuinely aged out — dead platform, no one left who can run it — apart from one that is merely ugly and unloved but still quietly doing its job?
  2. 02If most of the business knowledge lives in the old code and not in any document, how do you capture it before you touch anything — and whose job is that unglamorous archaeology?
  3. 03What is the honest way to price a rewrite so the "it will be faster" claim survives contact with the parity gap — the months spent just getting back to what you already have?
  4. 04When you modernize in place, how do you keep the old and new halves in sync across the years they run side by side, without the seam between them hardening into its own permanent system?
  5. 05Who should own the call between rebuild and modernize — the engineers who will do the work and want the clean start, or the operators who carry the risk if the switch-over goes dark?
[ REFERENCES ]
  1. [1]Joel Spolsky — "Things You Should Never Do, Part I" (Joel on Software, 2000): rewriting from scratch is "the single worst strategic mistake that any software company can make"; the Netscape rewrite opened a ~3-year gap with no competitive product.
  2. [2]Second-system effect — Fred Brooks, The Mythical Man-Month (1975): the second system an architect designs is the most dangerous one they build, bloated with every feature held back from the first.
  3. [3]U.S. GAO — GAO-25-107795, "Agencies Need to Plan for Modernizing Critical Decades-Old Legacy Systems" (2025): ~79% of planned federal IT spending (~$83B) goes to operations and maintenance of existing systems, not new development.
  4. [4]U.S. GAO — "Federal Agencies Need to Address Aging Legacy Systems" (GAO-16-696T and follow-ups): legacy systems 50+ years old, obsolete languages and hardware (incl. 8-inch floppy disks); of 10 critical systems flagged for modernization in 2019, only 3 were completed by 2025.
  5. [5]Martin Fowler — "StranglerFigApplication": the incremental modernization pattern that gradually replaces a legacy system piece by piece, avoiding a risky big-bang rewrite.
  6. [6]Microsoft Learn — Azure Architecture Center, "Strangler Fig pattern": incrementally migrate a legacy system behind a routing/facade layer, replacing features one at a time while the system stays in service.
[ Staring at a system everyone wants to bin? ]

Before you rebuild from scratch, let us map the modernize-in-place path — it usually wins.

The urge to start over is almost always more expensive than it looks. We help you tell a system that has truly aged out from one that just needs modernizing in slices — keeping it live, shipping value every step, no multi-year dark tunnel. Fifteen minutes to pressure-test the rebuild-vs-modernize call before you commit a year to it.

Book a free 15-min consultation