September 29, 2026
Every time someone in a meeting says "we should rewrite this in X," the room fills with a specific kind of relief. Finally, a clean solution to everything that annoys us. The code is old, we don't like the framework, deploys are slow, so we'll rebuild it from scratch and it'll be pristine. The problem is that this sentence almost never survives contact with a calculator. It survives the feelings test, and those are two very different things.
The classic example every senior knows is Netscape. In the late nineties they decided to rewrite their browser from scratch instead of cleaning up the existing code. The result: they went years without shipping a competitive version, and Internet Explorer took the market in the meantime. Joel Spolsky summed it up in a line that's been quoted for twenty years: rewriting code from scratch is the single worst strategic mistake a company can make. It hasn't aged out. Today, instead of "let's rewrite it in C++," people just say "let's rewrite it in a different frontend framework."
A rewrite looks cheap because you only count development time. New app, X months, done. But that isn't the cost. The cost is the difference between two worlds, the one where you rewrote and the one where you didn't, across that entire stretch of time.
While you rewrite, the old app still has to run. Someone maintains it, fights fires, ships urgent fixes. Those fixes then have to land in the new version too, so you do the same work twice. The features the market wants don't ship because the team is busy, and that opportunity cost is the line nobody puts in the spreadsheet. Meanwhile the old app holds years of accumulated edge-case handling that nobody remembers anymore. The weird conditional for users from one country, the import format three people use but who happen to pay the most. All of it has to be rediscovered, because the clean new code doesn't have those patches, and the reality that produced them hasn't gone anywhere.
If you want a rough anchor, industry data consistently shows the same pattern: a big-bang rewrite costs several times more than an incremental migration and carries a much higher rate of schedule overruns. The exact multiplier depends on the project, but the direction is never in doubt. A rewrite is more expensive and riskier than it looks on paper, every time.
It's not that you should never migrate. You should, but for the right reasons, and "we don't like it" isn't one of them. A legitimate reason is when a framework or language falls out of support and security patches stop. At that point you're not choosing whether to pay, only when. It's legitimate when the current stack measurably holds you back, say you can't hire because nobody works in that technology anymore, or the license costs you serious money. And it's legitimate when a new platform unlocks a capability the old one simply doesn't have, and that capability brings measurable revenue.
Notice the word "measurable." If you can't express the reason for the migration as a number, the cost you avoid or the revenue you unlock, then it isn't a business reason, it's an aesthetic one. Aesthetics matter for the team, but they don't fund themselves.
The debate is almost always framed as a choice between two poles: rewrite everything or touch nothing. Both poles have a documented list of failures. The real unit of decision isn't the whole system, it's the component. Instead of asking "should we rewrite the app," ask "which one part actually gets in our way, and can we replace just that while the rest keeps running."
The pattern that makes this possible is what Martin Fowler named the strangler fig, after the fig that grows around a host tree, takes over its structure, and leaves it hollow. In practice you put a routing layer in front of the old app and move traffic to the new code piece by piece. One module, validate against real production traffic, then move on or roll back by changing a single routing rule. There's never a "now we shut off the old, flip on the new, and pray" moment. You ship the whole time, the risk is broken into small pieces, and you can stop at any point because what you've already moved delivers value on its own.
On one inherited e-commerce project, that approach was the difference between a disaster and a calm migration. We didn't touch checkout while replacing the catalog, because checkout works and makes money, and the catalog was what was actually slowing things down. Once you learn to think in components, you discover half the system doesn't need migrating at all.
Migrating to a new framework rarely pays off as one grand gesture. It almost always pays off as a series of small, measurable steps, if it pays off at all. Before you sign off on a rewrite, build a table with the rewrite cost, the opportunity cost, and the revenue you genuinely unlock. If the numbers don't clear, you're rewriting because you don't like the code. That's understandable, but it isn't a business case.
Related:
Thinking about a migration or a rewrite and not sure it's worth it? Contact us and we'll help you calculate the real cost before you bury months in work that maybe didn't need doing.
