I need to share this story because I see a lot of engineers (including my past self) romanticizing the “rewrite from scratch” decision. Here’s what actually happened.
The Setup
18 months ago, we were running a legacy .NET monolith serving 500 enterprise customers in the financial services space. The code was 7 years old, built by contractors who were long gone. Every deployment was nerve-wracking. Every new feature took weeks.
Our board asked: “Can this system scale to 2,000 customers?”
My answer: “Not without serious investment.”
The Decision
We presented two options:
- Incremental refactor: Keep .NET, break apart the monolith gradually, modernize piece by piece
- Full rebuild: Rewrite in Node.js microservices, modern architecture, “done right this time”
The board approved the rebuild. Budget: $1.2M. Timeline: 9 months. We hired 6 new engineers with Node.js experience.
I was so confident this was the right call.
The Reality (9 Months In)
Here’s where we actually are:
What went well:
- New architecture is genuinely better—microservices, proper API contracts, better testing
- Team morale was high during the “greenfield” phase
- We learned a lot about our product by rebuilding it
What went wrong:
- We’re only at ~70% feature parity with the old system
- Customers are frustrated with bugs in the new version
- We missed critical edge cases that the old system handled
- We’re still maintaining the old system alongside the new one (double the work)
- We’ve shipped almost zero new features for 9 months
The Part That Haunts Me
A major customer (15% of our revenue) is threatening to churn because a reporting feature they rely on is “broken” in the new system. It worked fine in the old .NET version, but we didn’t realize they were depending on a specific bug in the date calculation logic.
We could have fixed that in the old system in 2 days. Instead, we’re now debugging microservices communication patterns and data consistency issues.
What I Should Have Done Differently
Looking back, the strangler pattern would have been smarter:
- Keep the .NET monolith running
- Build new features in Node.js microservices
- Gradually extract modules from the monolith one at a time
- Run both systems in parallel for 12-18 months
- Only retire the old system once we’re confident
This would have:
- Let us ship new features during migration
- Reduced risk of missing edge cases
- Kept customers happy
- Validated the new architecture incrementally
The Question I’m Wrestling With
If I could go back, would I still rebuild? Honestly… I don’t know.
The new architecture is better. But was it worth 9 months of zero feature development? Was it worth risking customer churn? Was it worth the team stress of trying to match 7 years of production battle-testing in 9 months?
What Would You Do?
For those who’ve done major rewrites:
- How did you handle the “edge cases we didn’t know existed” problem?
- What was your strategy for maintaining both systems during migration?
- How did you decide when to finally sunset the old system?
- In hindsight, would you have chosen a different path?
I’m sharing this not as a success story, but as a cautionary tale. Maybe someone can learn from my mistakes. ![]()