Disagreeing With a Technical Decision Without Burning Bridges
by Eric Hanson, Backend Developer at Clean Systems Consulting
The Disagreement That Became a War
Your team decided to use MongoDB for the new service. You think PostgreSQL is the right choice. You say so in the design review. The decision holds. You bring it up again in the next sprint planning. The decision holds. You mention it in a PR review. Someone says "we already decided this." You feel unheard. The relationship with the decision-maker becomes strained. The MongoDB service ships. It works fine for a year, then has data integrity issues that a relational model would have prevented.
In this scenario, you may have been right about the technical decision. You almost certainly handled the disagreement poorly. Both things can be true.
Disagreement Is Not an Outcome, It's a Process
The goal of expressing a technical disagreement is not to win. It is to ensure that the decision-making process is informed by the best available information. If the decision is made and you have provided your reasoning completely, you have done your job — regardless of the outcome.
This reframe changes the approach. The question is not "how do I get the decision changed?" but "how do I ensure my concern is understood and seriously considered?"
The Structure of a Useful Technical Objection
An objection that can be seriously considered has specific properties:
It is about the decision, not the decision-maker: "I have concerns about this approach" is separable from the people involved. "I don't think this is a good decision" targets the work. "I think this is the wrong call" can sound like a judgment of the person who made it.
It states the concern specifically: "I'm worried about this" is a feeling. "I'm concerned that MongoDB's lack of multi-document transactions means we can't guarantee consistency between the order and the inventory records in the same write, which will lead to data inconsistency under concurrent load" is a concern that can be addressed, refuted, or mitigated.
It proposes an alternative or asks a question: "Have we thought about how we'll handle cross-document consistency?" is more productive than "I think this is wrong." It invites the decision-maker into a problem-solving conversation rather than a position defense.
It acknowledges uncertainty: If you're not certain you're right — and you often shouldn't be — acknowledging it is more credible and less adversarial. "I might be missing something, but I can't see how we'd handle..." is a different posture than "this definitely won't work."
The Escalation Hierarchy
There is an appropriate sequence for technical disagreement:
-
State the concern once, with reasoning: In the design review, the PR, the discussion thread. Complete, specific, with your reasoning. If you're heard and the decision holds, move to step 2.
-
Request a second opinion: Ask whether a third party — another engineer, the technical lead — would be willing to weigh in. This is not going over someone's head. It's requesting additional input on a genuinely uncertain technical question.
-
Accept and document: If the decision stands after full consideration, accept it. Document your concern — in an ADR comment, in the PR thread — so there's a record of the concern and the reasoning that overrode it. If the concern materializes as a production problem, the documentation is useful for the post-mortem. If it doesn't, you have evidence that your concern was considered and discarded for valid reasons.
-
Disagree and commit: Amazon's "disagree and commit" principle. You made your case. The decision was made. You commit to making the chosen approach work as well as possible.
What you don't do: relitigate the decision in subsequent meetings, express passive skepticism in PRs about the chosen approach, say "I told you so" when problems arise.
When the Disagreement Is About Values, Not Facts
Some technical disagreements are not about facts but about values — priorities that different engineers weight differently. "We should prioritize performance" vs. "We should prioritize simplicity." These are not resolvable through technical argument because they're not technical arguments.
When a disagreement is about values, name it. "I think we're weighting performance over simplicity differently here — I'm prioritizing simplicity because the team is small and the performance requirements aren't established. Can we talk about what the actual requirements are?" This reframes the disagreement as a requirements question, which is answerable.
The Practical Takeaway
Before your next technical disagreement, write out your concern as one specific sentence that describes a concrete risk or problem with the proposed approach. Present that sentence. If the response addresses your concern with information you didn't have, update your position. If it doesn't, ask one more question. After two exchanges, if the decision stands, accept it and document your concern. Move on. The relationship you preserve is worth more than the argument you win.