There is a moment in the life of many successful software products when someone finally says it: "We need to rewrite this thing."
The developers are frustrated. Releases are getting harder. Bugs seem to appear in places nobody expected. Customers have workflows nobody completely understands anymore. There are integrations nobody wants to touch.
Someone inevitably looks at the old platform and says:
- "If we could just start over..."
- I've seen this story before.
- And sometimes a rewrite really is necessary.
- But quite often, the technology isn't the real problem.
The organization has simply outgrown the way it builds and manages software.
Success Creates Its Own Technical Debt
We normally talk about technical debt as though someone did something wrong.
That's not always fair.
Some technical debt is simply the cost of moving quickly.
A company gets a new customer who needs something immediately. A developer creates a workaround. Sales lands another major customer with slightly different requirements. Another exception gets added.
- The company grows.
- Revenue grows.
- The platform grows.
- And everyone celebrates as they should.
- But something else has been growing quietly in the background.
Complexity.
- The temporary workaround becomes permanent.
- The exception becomes a feature.
- The feature gets another exception.
Before long, nobody remembers exactly why certain things work the way they do. They just know changing them might break something.
That's when healthy growth debt can begin turning into dangerous operational debt.
The Financial Statements May Not Warn You
This is where things become particularly interesting from a leadership perspective.
- A software company can look financially healthy while its technology platform is becoming increasingly unhealthy.
- Revenue may still be growing.
- EBITDA may look good.
- Customer churn may remain low.
- Yet inside the organization, something very different is happening.
- Release cycles are getting longer.
- Developers are becoming increasingly cautious about deployments.
- More engineering capacity is spent fixing problems instead of creating capabilities.
- Customer-specific workarounds multiply.
- New developers take longer to become productive.
And the product roadmap gradually changes from:
- What should we build next?
to:
- What can we safely change without breaking something?
Those are two very different companies.
Low churn doesn't necessarily mean customers love your product, either. Sometimes customers remain because switching platforms is difficult, expensive, or disruptive.
Stable revenue can hide an enormous amount of operational fragility.
The Most Dangerous Phrase May Be "Don't Touch That"
Several warning signs show a platform drifting from innovation into maintenance mode.
- One of my favorites is deployment anxiety.
- Everyone knows that part of the system.
- Maybe only one developer understands it.
- Maybe nobody completely understands it.
- Eventually the institutional knowledge becomes: Don't touch that unless you absolutely must.
That's not just technical debt anymore. That's organizational risk.
Another warning sign is constant firefighting.
- Engineering teams become extremely busy while accomplishing surprisingly little strategic work.
- Everyone is working.
- Everyone is solving problems.
- Everyone is exhausted.
- But the platform isn't really moving forward.
Activity and progress aren't the same thing.
Then Someone Suggests the Rewrite
- At this point, a complete rewrite starts sounding incredibly attractive.
- New architecture.
- New framework.
- Clean database.
- Modern APIs.
- No legacy code.
- No ugly compromises.
- A fresh start.
I understand the appeal.
The problem is that your old application contains something incredibly valuable that rarely appears in an architecture diagram: years of accumulated business knowledge.
- Every strange conditional statement may exist because five years ago a customer discovered an edge case.
- Every unusual workflow may represent a business requirement somebody forgot to document.
- Every integration may contain lessons learned through years of production failures and fixes.
- That ugly old platform isn't merely code.
- It is institutional memory expressed in software.
- When you rewrite it, you aren't simply replacing technology.
- You're attempting to rediscover years, sometimes decades, of business knowledge.
- And while you're doing that, you still have customers using the old system.
- Now you have two platforms to maintain.
Meanwhile, feature development slows because your best people are rebuilding capabilities customers already have.
That's an expensive way to discover that the old software wasn't the only problem.
You Can't Rewrite an Organizational Problem
This is the part I believe technology and business leaders sometimes overlook.
Suppose the original platform suffered from:
- weak product governance,
- constantly changing priorities,
- inadequate QA,
- unclear architectural ownership,
- customer-specific customization,
- interrupt-driven development, and
- no dedicated capacity for modernization.
Now imagine building a brand-new platform...
using the same organization and processes.
- Question: What do we think is going to happen?
- Answer: Eventually you'll have a beautiful new codebase carrying many of the same problems as the old one.
Because you replaced the technology without changing the system that produced it.
A rewrite is not automatically a transformation.
Mature Platforms Evolve
The alternative isn't ignoring technical debt. Quite the opposite.
- Healthy technology organizations treat modernization as part of operating the business.
- They continuously refactor high-risk areas.
- They automate testing and deployment.
- They establish architectural standards.
- They create clear ownership.
- They invest in observability.
- And perhaps most importantly, they resist solving every customer's problem with another piece of custom code.
- Whenever possible, mature platforms become configurable rather than customized.
- That's a subtle distinction with enormous consequences.
- Customization says: We'll change the software for you.
- Configuration says: We designed the platform so it can adapt to you.
One scales. The other eventually becomes a collection of exceptions pretending to be a product.
Engineering Needs Room to Improve the Engine
There is also an uncomfortable economic reality here.
If 100% of engineering capacity is allocated to customer requests, features, and production problems, then effectively 0% is being invested in the future health of the platform.
Eventually, that bill comes due.
Organizations need intentional modernization capacity.
- Not someday.
- Not "when things slow down."
- Because things rarely slow down.
Technical leadership must deliberately balance innovation, stability, and modernization.
That means sometimes saying: "We're going to spend engineering capacity improving something the customer may never directly see."
- Better deployment pipelines.
- Automated testing.
- Architecture improvements.
- Monitoring.
- Refactoring.
- Standardization.
Those things aren't distractions from product development.
They are what make continued product development possible.
Technical Debt Eventually Becomes Financial Debt
This is where the technology conversation becomes a business conversation.
Technical debt doesn't remain technical forever.
Eventually, it appears somewhere on the financial side of the organization.
- Higher support costs.
- Longer development cycles.
- More engineers required to deliver the same amount of functionality.
- Slower customer onboarding.
- Increasing infrastructure costs.
- Reduced innovation.
- Missed opportunities.
- Margin compression.
Eventually, the company realizes it isn't simply maintaining software.
- It's paying interest on years of deferred decisions.
- The Question Leaders Should Be Asking
So instead of immediately asking: "Should we rewrite the platform?"
I think leadership teams should start with several different questions.
- What operational risks are currently hidden beneath stable revenue?
- Are we scaling our architecture or simply scaling our workarounds?
- How much engineering capacity is going toward innovation versus maintenance?
- Are we building a platform, or are we maintaining hundreds of customer-specific exceptions?
And perhaps the most important question: If we built the entire platform again tomorrow but kept the same leadership structure, priorities, processes, and engineering practices, would we eventually end up right back where we are today?
If the answer is yes, the problem probably isn't the codebase.
Technology platforms don't become sustainable because they're new.
They become sustainable because the organizations responsible for them develop the discipline to continuously evolve them.
The goal shouldn't be to build software that never becomes old. That's impossible.
The goal is to build an organization capable of helping its technology grow old gracefully while continuously making it better.
Thanks,
Michael Cronin
Website: https://www.michaelcronin.info
LinkedIn: https://www.linkedin.com/in/michaeltcronin/details/experience/