Every engineering team eventually has this conversation.
The system is difficult to work with. Bugs are increasing. Development feels slower than it used to. New features take longer to deliver.
Someone says what everyone has been thinking:
“We should rewrite it.”
The idea is immediately appealing. A fresh start. A clean codebase. A modern architecture. An opportunity to fix years of accumulated mistakes. The future suddenly looks simpler.
And that is precisely why rewrite discussions deserve careful scrutiny. Because the desire to rewrite is often strongest when our judgement is most vulnerable.
Prefer a video instead of reading? Here it is.
Rewrites Are Usually About More Than Code
Teams rarely propose rewrites because of code alone. The code is simply the visible symptom. Beneath the discussion are frustrations that have accumulated over time.
Engineers are tired of working around limitations. Technical debt feels overwhelming. Development feels slower than it should. The system no longer reflects how the team would design it today. These frustrations are real.
But frustration is not a sufficient reason to rewrite a system. Before discussing solutions, it is worth asking a different question:
What problem are we actually trying to solve?
Start With the Problem
Rewrite discussions often begin with a proposed solution.
“We should rewrite the platform.”
“We need a new architecture.”
“We should start over.”
Good engineering judgement reverses the sequence.
The first question is not whether a rewrite is necessary. The first question is:
What specific problem are we trying to solve?
For example:
- Are releases becoming slower?
- Is reliability deteriorating?
- Is the system difficult to understand?
- Is development velocity declining?
- Is scaling becoming impossible?
Different problems require different solutions. And not all of them require a rewrite.
Not Every Pain Is a Technical Problem
One reason rewrites are attractive is that they promise a technical solution to many different frustrations. But some frustrations are not technical.
A team struggling to deliver may have unclear priorities. A system that feels difficult to change may suffer from weak testing practices. A slow development process may be caused by organizational bottlenecks rather than software architecture.
A rewrite cannot solve problems that were never technical to begin with. This is one reason so many rewrites fail to deliver their expected benefits. The old system disappears. The original problems remain.
Define What Success Looks Like
Even when the problem is real, another question remains.
How will we know the rewrite succeeded?
This question is surprisingly difficult to answer.
Consider three teams discussing a rewrite. One defines success as improved scalability. The other defines success as faster development. The third defines success as reduced operational complexity.
All three goals are reasonable. But they may lead to very different decisions. Good engineering discussions make success criteria explicit. Without a clear definition of success, it becomes impossible to evaluate whether a rewrite is actually the right solution.
Rewrites Create New Problems
Teams often focus on the shortcomings of the existing system. What receives less attention is the cost of replacing it.
The current system contains more than code. It contains years of decisions, edge cases, operational knowledge, and lessons learned. Some of that knowledge is undocumented. Some of it is invisible.
Many teams underestimate how much knowledge is embedded in the existing system. The result is that old problems reappear in new forms.
The Existing System Has One Advantage
It already works. This sounds obvious. Yet, it is easy to forget during rewrite discussions.
The current system may be frustrating. It may contain technical debt. It may be imperfect. But it has one important property. It is running.
Customers use it. Engineers understand it. Operational teams support it. The rewrite does not start from the same position. It must earn that reliability over time.
Good engineers remember that replacing a working system introduces risk, even when the replacement appears superior on paper.
Sometimes a Rewrite Is the Right Decision
This article is not an argument against rewrites.
Some systems genuinely reach a point where incremental improvement is no longer practical. Architectural limitations become fundamental. Maintenance costs become unsustainable. Business requirements change dramatically.
In these situations, a rewrite may be the best available option.
But notice the difference. The decision emerges from a clearly understood problem, a well-defined outcome, and an honest assessment of alternatives. It does not emerge from frustration alone.
Why This Matters
Engineering judgement often reveals itself in moments of uncertainty. Rewrite discussions are one of those moments. The decision is rarely about code. It is a decision about risk, trade-offs, assumptions, time, and most importantly, the future.
Good engineers resist the temptation to ask:
“Can we rewrite the system?”
Instead, they ask:
“What problem are we trying to solve, and is a rewrite the best way to solve it?”
Those are not the same questions. And the quality of the answer often determines the quality of the decision.
Disagreement Is Not a Problem
Many teams treat disagreement as something to avoid. Meetings become exercises in quickly reaching consensus. Dissenting opinions are softened or left unspoken. Difficult conversations are postponed. This approach feels comfortable, but it is dangerous.
Most engineering failures are not caused by too much disagreement. They are caused by too little. When people stop challenging assumptions, questioning decisions, or raising concerns, blind spots grow. Problems remain hidden. Weak ideas go untested.
Healthy disagreement is not a threat to good engineering. It is one of its requirements.
The Goal Is Not To Win
One of the most common mistakes engineers make is treating disagreement as a competition.
The discussion becomes focused on proving who is right. Evidence is selectively presented. Positions become entrenched. People defend their ideas rather than examine them. That’s when the conversation stops being about the problem, and becomes about the participants.
Good engineers approach disagreement differently. Their goal is not to win. Their goal is to understand. They recognize that every disagreement contains information. Someone is seeing something differently. The first task is to understand what that is.
Seek the Strongest Version of the Other Argument
When disagreements become emotional, engineers often attack the weakest version of the opposing view. That is easy. It is also unproductive.
A better approach is to ask:
Why might a reasonable person believe this?
What concerns are they seeing that I am not?
The strongest engineering discussions occur when participants genuinely try to understand the best version of the opposing argument. In the process, they sometimes discover blind spots in their own thinking or options they had overlooked.
Most Disagreements Are About Assumptions
Technical debates often appear to be disagreements about solutions. In reality, they are frequently disagreements about assumptions.
Consider a discussion about scaling a system. One engineer argues for a more sophisticated architecture. Another argues for keeping things simple. The architecture itself may not be the real source of disagreement. The real disagreement may be hidden underneath.
One engineer assumes rapid growth. The other assumes moderate growth. Once those assumptions become visible, the discussion changes. The conversation moves from defending solutions to examining the beliefs that produced them.
Good engineers learn to identify assumptions early.
Make Sure You Are Solving the Same Problem
Sometimes engineers disagree because they are solving entirely different problems. One engineer is optimizing for scalability. Another is optimizing for usability. One is focused on reliability while the other is focused on speed of delivery.
At first glance, the disagreement appears to be about the solution. But often the real difference lies in the problem each person believes needs solving.
Every solution is built around one or two core problems. Good engineering discussions make those problems explicit. Before debating architectures, tools, or implementation details, it is worth asking:
What problem are we trying to solve?
Why does this problem matter?
How does this solution address it?
And perhaps most importantly:
Does it actually solve the problem we care about most?
These questions often reveal that two engineers are evaluating solutions against completely different criteria.
One is asking, “Will this scale in three years?”
The other is asking, “Can we deliver this in three months?”
Both questions are reasonable. But until the underlying problem is clarified, the disagreement will continue. Good engineers understand the problem before defending the solution. After all, the best solution to the wrong problem is still the wrong solution.
Define What Success Looks Like
Even when engineers agree on the problem, disagreements can persist. The reason is often simple. They have different ideas about what success looks like.
Consider a discussion about a new architecture. Everyone agrees that the current system has scaling limitations. The problem is clear. Yet the debate continues. Why?
Because each engineer is optimizing for a different outcome.
One wants maximum scalability.
Another wants simplicity.
A third wants faster delivery.
A fourth wants lower operational risk.
The disagreement is no longer about the problem. It is about success.
Good engineers make success criteria explicit. Before debating solutions, they ask:
What outcome are we trying to achieve?
And, how will we know if this decision worked?
These questions transform abstract discussions into concrete evaluations. Instead of arguing about whether a solution is good, teams can ask whether it moves them closer to the outcome they care about.
Many engineering debates become easier once success is clearly defined. Not because everyone suddenly agrees. But because everyone is working towards the same goal.
Separate Ideas From Identity
One reason disagreements become difficult is that engineers become attached to their ideas. The architecture becomes my architecture. The proposal becomes my proposal. Criticism of the idea feels like criticism of the person. This creates defensiveness which makes learning difficult.
Good engineers hold their ideas lightly. They invest deeply in understanding the problem, and not defending a particular solution.
The best engineers I have worked with often changed their minds during discussions. Not because they lacked conviction, but because they cared more about finding the right answer than protecting their ego.
Respect Matters More Than Agreement
Teams do not need perfect agreement to function well. They need trust. Trust allows engineers to disagree openly. It allows concerns to be raised without fear, and difficult conversations to happen without becoming personal.
Respect is the foundation of trust. You can strongly disagree with someone while still treating them with respect. You can challenge an idea without dismissing the person behind it.
Some of the strongest engineering teams are not those that agree the most. They are those that disagree well.
Decisions Must Eventually Be Made
Healthy disagreement has limits. At some point, analysis must give way to action. Endless debate is not judgement. Neither is avoiding disagreement entirely. The goal is not to keep every option open forever. It is to improve the quality of the eventual decision.
Once a decision is made, good engineers commit to it, even when it wasn’t their preferred option. Because, the discussion was about finding the best path forward, not securing a personal victory.
Why This Matters
As engineers become more senior, the problems they face become less technical and more contextual. The answers become less obvious, and disagreement becomes more common. In this environment, the ability to disagree well becomes a critical professional skill.
Not because disagreement is valuable in itself. But because it helps teams uncover assumptions, challenge weak ideas, and make better decisions. The goal is not to eliminate disagreement. It is to make disagreement productive.
Good engineers do not avoid disagreement. They use it to improve their thinking.
