Module 4: Technical Leadership Without Authority

5. Disagree and commit

Overview

By the end of this lesson you'll know what to do in the most delicate moment of leadership without authority: when the architect disagrees with a decision the team is going to make, and can't (nor should) impose themselves. This moment is a double trap. On one side, if the architect always caves so as not to make things awkward —swallows their disagreement, says nothing— then their judgment, which was one of the reasons for their value, stops protecting the system: bad decisions pass without anyone questioning them. On the other, if the architect blocks every decision they disagree with —re-litigates, insists, won't let things advance until they win— then they become a brake worse than the bottleneck, and burn the trust that was their only lever. The way out of the trap has a name and it's the heart of this lesson: disagree and commit —disagree thoroughly in the discussion and genuinely commit to the decision, even if it's not the one you wanted—. It's not caving (you do disagree, seriously) nor is it blocking (you commit, seriously); it's the discipline of separating the moment of disagreeing from the moment of executing, and honoring both.

This matters because most architects fail at one of the two extremes, and both are expensive in different ways. The one who caves is pleasant and dangerous: the team likes them but the system degrades, because the only voice with a cross-cutting view stays silent exactly when it should have spoken. The one who blocks is rigorous and toxic: they're right often but no one can stand them, because they turn every decision into a war of attrition. And here's the counterintuitive part this lesson measures: disagreeing-and-blocking does as much harm as not disagreeing at all —the one who blocks slows the team so much that the cost of their objections (even if they're correct) exceeds their benefit—. Disagree-and-commit is the middle point almost no one practices well because it requires something psychologically hard: committing genuinely to a decision you believe is wrong, without sabotaging it in silence or resurrecting the discussion every week. This lesson makes it concrete and measures it.

Connection with the module: this is the second of the four practices, and the one that protects the rest. Lesson 2 said the lever is to influence; lesson 3, that it's paid from trust; lesson 4 made few decisions reach the architect. This lesson is about how to behave in those few when they disagree —because disagreeing badly burns the trust (lesson 3) that makes all influence possible (lesson 2)—. It's also the brake that lesson 4 doesn't reach: the guardrails prevent the architect from being the bottleneck by approving everything; disagree-and-commit prevents them from being the bottleneck by blocking everything. And it sets up the two that follow: the load-bearing conversations (lesson 6) are where you disagree well (in private, thoroughly, before the meeting), and consensus (lesson 7) is what's built when disagree-and-commit is done well and repeatedly. If lesson 4 said "don't be the gate that approves", this one says "don't be the wall that blocks either —disagree and commit—".

The rowing team: you argue on the shore, you row together in the water

Think about it with a rowboat with eight rowers and a coxswain. Before setting off, on the shore, there's a legitimate discussion: do we go out through the left channel, which is shorter but with the current against us, or through the right, longer but with the current in our favor? Each rower weighs in, the coxswain listens, it's debated thoroughly —it's the right moment to disagree, and disagreeing well improves the decision—. At some point it's decided: right. And here comes what makes or breaks the team: once the boat is in the water, everyone rows to the right —including those who wanted the left—. Because a rowboat has a brutal property: it only advances if the eight row coordinated in the same direction. The rower who, resentful at not having won, keeps rowing to the left "to prove they were right", doesn't get to go left —they get the boat to spin in circles, get stuck, and reach nowhere—. Their disagreement, legitimate on the shore, becomes sabotage in the water.

Now imagine the other extreme. A rower who never disagrees on the shore —swallows their doubts, doesn't say the right channel has a log across it that they saw yesterday—. The boat goes out to the right, crashes into the log, and everyone wonders why no one warned them. Their silence on the shore, which seemed like cooperation, was actually a failure: they kept the information that would have improved the decision. Between the rower who blocks in the water and the one who stays silent on the shore, the boat is doomed both ways —one makes it spin in circles, the other crashes it into the log—.

The healthy rower does both things in their moment: disagrees strongly on the shore (says the thing about the log, defends their channel, makes sure their objection is heard) and rows committed in the water (once decided, rows where the boat goes, with all their strength, even if it wasn't their choice). That's disagree-and-commit: the shore is for disagreeing, the water is for committing, and confusing the two moments —disagreeing in the water (sabotage) or committing before the shore (silence)— sinks the boat. The architect is a rower with a voice that weighs more —their cross-cutting view is like having seen the log—, and that's why their discipline of disagree-on-the-shore-and-row-in-the-water matters even more: if they stay silent, the boat loses its best information; if they block in the water, the strongest boat on the river spins in circles. This lesson measures the three behaviors.

Worked example: the blocker, the one who caves, and the one who commits

We model six decisions Mercado's squads are going to make. The architect disagrees on three of them. Of those three, one is really wrong —their objection would improve the result— and two are just their preference (they'd have done something else, but the team's is also valid). We compare three architect behaviors by measuring the total time in weeks to close the six decisions, how many objections were voiced, and how many of the bad decisions were stopped in time.

# "Disagree and commit": disagree in the discussion, commit to the decision.
# We compare 3 architect behaviors facing 6 squad decisions.
# The architect DISAGREES on 3 of the 6. Of those 3, 1 is really wrong
# (their objection would improve the result) and 2 are just their preference.

DECISIONS = 6
DISAGREES = 3
FLAWED_AMONG_DISAGREES = 1   # of the 3 they object to, 1 is really wrong

# weeks it takes to close a decision according to the behavior:
WEEKS_SMOOTH = 1     # frictionless decision: closes in 1 week
WEEKS_BLOCK = 4      # the architect re-opens it over and over
WEEKS_COMMIT = 2     # 1 week to state the objection thoroughly, then commit

def blocker():
    # re-litigates every decision they don't like; consumes 4 weeks on each.
    weeks = (DECISIONS - DISAGREES) * WEEKS_SMOOTH + DISAGREES * WEEKS_BLOCK
    concerns_voiced = DISAGREES
    flawed_caught = FLAWED_AMONG_DISAGREES
    return weeks, concerns_voiced, flawed_caught

def pushover():
    # never disagrees out loud: everything closes in 1 week, but 0 objections.
    weeks = DECISIONS * WEEKS_SMOOTH
    concerns_voiced = 0
    flawed_caught = 0                       # the bad decision passes with no flag
    return weeks, concerns_voiced, flawed_caught

def disagree_and_commit():
    # states the objection ONCE (thoroughly), then commits: 2 weeks.
    weeks = (DECISIONS - DISAGREES) * WEEKS_SMOOTH + DISAGREES * WEEKS_COMMIT
    concerns_voiced = DISAGREES
    flawed_caught = FLAWED_AMONG_DISAGREES  # the bad one went on record and is mitigated
    return weeks, concerns_voiced, flawed_caught

rows = [("BLOCKER", blocker()), ("PUSHOVER", pushover()),
        ("DISAGREE_COMMIT", disagree_and_commit())]

print(f"{DECISIONS} decisions; the architect disagrees on {DISAGREES} (1 of them really wrong).")
print()
print(f"{'behavior':<17}{'weeks':>7}{'concerns_voiced':>17}{'flawed_caught':>15}")
print("-" * 56)
for name, (w, c, f) in rows:
    print(f"{name:<17}{w:>7}{c:>17}{f:>15}")
print()
print("BLOCKER : slows everything (15 wks) and burns the team re-litigating what was settled.")
print("PUSHOVER: fast (6 wks) but silences the one objection that mattered -> bad one in prod.")
print("DISAGREE_COMMIT: 9 wks, states the objection ONCE, and commits even if they don't win.")

What to expect. Running it:

6 decisions; the architect disagrees on 3 (1 of them really wrong).

behavior           weeks  concerns_voiced  flawed_caught
--------------------------------------------------------
BLOCKER               15                3              1
PUSHOVER               6                0              0
DISAGREE_COMMIT        9                3              1

BLOCKER : slows everything (15 wks) and burns the team re-litigating what was settled.
PUSHOVER: fast (6 wks) but silences the one objection that mattered -> bad one in prod.
DISAGREE_COMMIT: 9 wks, states the objection ONCE, and commits even if they don't win.

Read the three rows as the three architects you could be, because the point is that the right one is neither the fastest nor the most rigorous.

The BLOCKER achieves what seems like the goal —states the 3 objections and stops the one decision that was wrong (flawed_caught = 1)— but look at the cost: 15 weeks to close six decisions. Each decision they disagree with they re-litigate (4 weeks each instead of 1), because they don't commit: they insist, reopen it, discuss it again in the next meeting, won't let things advance until they win or exhaust everyone. And the number of weeks underestimates the real damage, because it doesn't measure what lesson 3 would measure: each re-litigation spends trust. The team starts avoiding the architect, not inviting them to the discussions "so they don't jam them", and their cross-cutting view —which was valuable— becomes a toll everyone wants to dodge. The blocker is right often and still loses, because the cost of their way of being right exceeds the benefit of their correct calls.

The PUSHOVER is the opposite and their trap is that they look good in the first column: 6 weeks, the fastest of the three —everything flows because they never object to anything—. But look at the other two columns: concerns_voiced = 0 and flawed_caught = 0. The one who caves voiced no objection, so the one decision that was really wrong passed with no flag and reached production. Their speed is false: they closed six decisions fast, but one of them was a bomb their silence let get armed. The cost doesn't appear in the 6 weeks; it appears later, when the bad decision explodes and someone asks "didn't the architect see this coming?" —and yes they saw it, and they stayed silent—. The pushover trades the short-term conflict for the long-term disaster.

The DISAGREE_COMMIT is the middle point, and you have to read its numbers carefully because its virtue is in the balance, not in winning any column. 9 weeks: slower than the pushover (6) but much faster than the blocker (15). concerns_voiced = 3: they voiced the three objections, just like the blocker —they stayed silent on nothing—. flawed_caught = 1: they stopped the decision that was wrong, just like the blocker —their cross-cutting view protected the system where it mattered—. The difference from the blocker is in how they disagreed: they stated each objection once, thoroughly (that's why 2 weeks per decision, not 1: there's a real discussion), and then they committed to what was decided —without re-litigating, without sabotaging—. They got the blocker's benefit (all objections heard, the flaw stopped) without their cost (they didn't stop everything, didn't burn the team). And they beat the pushover where it matters: the bad decision didn't pass, because they did speak.

Here's the lesson made into a number, and it dismantles the false dilemma: you don't have to choose between protecting the system (blocking) and not slowing the team (caving) —disagree-and-commit does both—. The blocker believes the only way for their objection to count is never to cave; the pushover believes the only way not to slow things is never to object. Both are trapped in the same false dilemma: they believe disagreeing and committing are incompatible. They're not. You can state your objection with full force (disagree) and, if the decision is made against you, row where the boat goes (commit). Disagree-and-commit separates the two moments —the shore and the water— and honors both: disagree when it's time to discuss, commit when it's time to execute. The 9 weeks against the blocker's 15 are what that discipline costs, and against the 1 flawed the pushover let through, it's what it's worth.

An honest nuance about the model. The week numbers (1, 2, 4) are illustrative, and the model does not capture the blocker's greatest cost —the burned trust, which lesson 3 does model— nor the pushover's greatest cost —the magnitude of the bad decision's disaster in prod, which can be enormous—. That is, the model is conservative with both extremes: in reality, the blocker is worse than 15 weeks (because they're also left with no influence) and the pushover is worse than "1 flawed" (because that 1 can cost a major incident). Disagree-and-commit wins by more than the model shows. What the model does capture cleanly is the shape: the middle point isn't a lukewarm average between blocking and caving; it's a third thing —disagree and commit— that takes the good of each extreme and leaves the bad.

Deep dive: what disagree and commit is and isn't

The phrase comes from Jeff Bezos's 2016 letter to Amazon shareholders, where he proposes it as a tool to make decisions fast without sacrificing honest disagreement. It's worth taking apart because it's easy to cite and hard to practice, and almost everyone misinterprets it in one of two directions.

It's not caving in disguise. The most common mistake is using "disagree and commit" as an elegant way to surrender: "well, I don't agree, but I commit" said without having really disagreed —without stating the objection thoroughly, without giving the information, without defending the position—. That's the pushover with a pretty phrase on top. Disagree-and-commit requires the real disagree: Bezos is explicit that first you have to express the disagreement with full force, give the arguments, make sure the objection was heard and understood. The commitment comes after a genuine disagreement, not instead of it. If you didn't really disagree, you're not doing disagree-and-commit; you're caving.

It's not "commit" with your fingers crossed. The other mistake is faking the commitment: saying "I commit" and then sabotaging in silence —executing at half power, reminding everyone "I said this wasn't going to work", resurrecting the discussion at every retrospective, waiting for it to fail so you can say "I told you so"—. That's the blocker hidden behind the verbal commitment, and it's worse than open blocking because it's dishonest. The real commit means rowing where the boat goes with all your strength —giving someone else's decision the best chance of working, even working to make it work better than your own option would have—. Bezos says it about a case of his own: he wasn't convinced by a project, said "disagree and commit", and then supported it completely —not grudgingly—. Half-commitment isn't commitment.

Why it works: it separates the quality of the decision from the speed of execution. The genius of the formula is that it resolves a tension that seems unresolvable. You want high-quality decisions (which require honest disagreement, people who say "I think this is wrong") and fast execution (which requires that, once decided, everyone pushes in the same direction). They seem incompatible: if you let people disagree, doesn't everything slow down? Disagree-and-commit reconciles them by putting them in different moments: disagree in the decision phase, commit in the execution phase. The shore and the water. That way you get the quality (the disagreement improved the decision) and the speed (once decided, no one sabotages it). The bad decision is stopped on the shore (because someone disagreed thoroughly); the decision made advances without friction in the water (because everyone committed).

The architect's special case: when the disagree should escalate instead of commit. There's a nuance that Bezos's formula, meant for normal decisions, doesn't fully cover, and the architect has to know it. Disagree-and-commit applies to decisions where the disagreement is of preference or reasonable judgment —the two of the three in the example where the team's option was also valid—. But there's a rare kind of decision where committing would be irresponsible: when the architect sees a grave, irreversible risk the team isn't seeing —"this is going to expose customer data", "this leaves us with no way to revert if it fails on Black Friday"—. In those cases, disagree-and-commit isn't "commit to what you believe is a disaster"; it's disagree and escalate —take the objection, with data, to whoever does have the authority to stop it (the manager, the committee), transparently and once—. The difference from blocking is that escalating is a single and open move (you raise the grave risk at the right level and accept its verdict), not a perpetual re-litigation. The rule: commit to the decisions that are different from yours but not catastrophic; escalate (once, transparently) the ones that are genuinely dangerous and irreversible. Confusing the two —escalating every preference (blocking) or committing to a visible disaster (negligence)— is the error. Disagree-and-commit is for normal disagreement, which is the vast majority; escalation is for grave risk, which is rare.

Common mistakes

Caving without disagreeing and calling it "disagree and commit" (of the disguised pushover). What happens: the architect swallows their objection so as not to make things awkward, says "I commit" without having said why they disagreed, and the bad decision passes with no flag. Why it happens: avoiding conflict feels cooperative, and "disagree and commit" gives a noble excuse to stay silent. How to spot it: if you "commit" to decisions without having stated your objections thoroughly first, you're not doing the formula —you're caving—. How to fix it: the disagree is mandatory and goes first; state the objection with full force, give the data, make sure it was heard, and then commit if the decision goes against you. Without the real disagree, the commit is worthless.

Committing verbally and sabotaging in silence (of covert blocking). What happens: the architect says "I commit" and then executes at half power, reminds everyone "I said it wasn't going to work", and waits for it to fail to collect on the "I told you so". Why it happens: they didn't really accept the decision, but open blocking is frowned upon, so they block underneath. How to spot it: if your commitment comes with reservations said to third parties, half-hearted effort, or a secret wish for the decision to fail, it's covert blocking. How to fix it: the real commit is rowing with all your strength where the boat goes —giving someone else's decision the best chance, even improving it—; if you really can't commit because the risk is grave and irreversible, don't sabotage: escalate openly once and accept the verdict.

Re-litigating every preference as if it were a grave risk (of the chronic blocker). What happens: the architect treats every decision they disagree with as if it were catastrophic, reopens it over and over, and slows the team over differences that were mere judgment. Why it happens: they confuse "I'd have done it differently" with "this is a disaster"; they don't distinguish preference from real risk. How to spot it: if you escalate or block most of your disagreements, and most turn out to be preferences of yours that also worked, you're the chronic blocker. How to fix it: reserve the blocking/escalation for the grave, irreversible, and unseen risk (rare) and commit to everything else (the majority); ask yourself before blocking "is this a disaster or is it that I'd have done it differently?" —if it's the latter, disagree once and commit—.

Exercises

Exercise 1 — Commit or escalate? For each architect disagreement, say whether it warrants disagree-and-commit (disagree and commit) or disagree-and-escalate (take the objection to the level with authority), and why: (a) the catalog squad decided to use a message queue different from the one the architect would have chosen, both mature and proven; (b) the payments squad decided to store the full card numbers in its database unencrypted, to "simplify"; (c) the orders squad decided an endpoint-naming style the architect finds ugly but is internally consistent.

See solution
  • (a) Different message queue, both mature → disagree-and-commit. It's a disagreement of reasonable preference: the team's option is also valid and proven, and the cost of being wrong is low and reversible (the queue can be changed later if needed). The architect states why they'd have chosen the other (once, with their reasons), and if the squad keeps theirs, they commit —they row there—. Blocking this would be the chronic blocker spending trust on a preference.

  • (b) Storing full cards unencrypted → disagree-and-escalate. This isn't preference; it's a grave risk (exposure of sensitive data, probable violation of PCI-DSS and of the law), and potentially irreversible (if there's a breach, the damage is done). Committing to this would be negligence. The architect disagrees with data (the security standard, the legal risk) and, if the squad insists, escalates —takes the objection to the manager or the security lead, transparently and once—. It's not perpetual blocking; it's raising a real risk at the level that can stop it.

  • (c) Ugly but consistent naming style → disagree-and-commit (or not even disagree). It's the purest preference: the architect finds it ugly, but it's internally consistent and has no technical consequences. Here it's barely worth disagreeing —spending trust on this is a terrible investment—. If anything, a soft comment ("I'd use another convention, but yours is consistent, go ahead"), and commit. Blocking over aesthetics is the archetype of the blocker who burns their balance on trifles (lesson 3).

The rule: escalate only the grave, irreversible, and team-unseen risk (rare: case b); commit to everything that's preference or reasonable judgment (the majority: cases a and c). Confusing them —escalating aesthetics or committing to the security breach— is the error.

Exercise 2 — The blocker's hidden cost. The model says the blocker takes 15 weeks against the 9 of disagree-and-commit, and that both stop the same bad decision (1) and voice the same objections (3). An architect concludes: "so the blocker is only 66% slower, but achieves the same; it's not that bad". What cost is the model not capturing that makes the blocker much worse than the 15 weeks suggest?

See solution

The model captures the cost in time (15 against 9 weeks) but doesn't capture the cost in trust, which is the one that really sinks the blocker —and that lesson 3 does model—. Every time the blocker re-litigates an already-discussed decision, they make a withdrawal from their trust account with the team: they exhaust them, frustrate them, and teach them that bringing a decision to the architect means a weeks-long battle. The consequences, none visible in the 15 weeks:

  • The team starts avoiding them. They stop inviting them to the discussions "so they don't jam them", make decisions without them, and their cross-cutting view —which was their value— stops being applied exactly in the decisions that most needed it. The blocker self-excludes from the system they wanted to protect.

  • Their balance runs out for the battles that matter. They spent so much trust blocking preferences that, when the truly grave decision arrives (the irreversible risk they should escalate), no one listens anymore —"this one blocking again"—. The chronic blocker loses credibility exactly for the case where their objection was vital.

  • The measurement underestimates both sides. As the lesson's nuance noted, the model is conservative: the blocker is worse than 15 weeks (because they're also left with no future influence), not just a little slower. The 15 weeks are the visible tip; underneath is the architect's career burning.

So "only 66% slower" is reading the only column the model shows and ignoring the one it doesn't. The blocker doesn't pay their cost in weeks; they pay it in the trust that was their only lever —and without it, not even their correct objections move the team (lesson 3)—. Disagree-and-commit isn't "a bit faster"; it's sustainable, and blocking isn't.

Exercise 3 — Practice the real commit. The architect disagreed with orders building its own cache solution instead of using the shared one. They stated their reasons thoroughly (more code to maintain, risk of inconsistencies), but the squad, after listening to them, decided to build their own for reasons that are also valid (specific needs of their case). It's not a grave or irreversible risk. Describe what a "real commit" is here in concrete actions, and what a "fake commit" (covert blocking) would be that the architect must avoid.

See solution

Real commit (what they should do):

  • Accept the decision out loud and without reservations before the squad: "I stated my doubts, you decided with good reasons, let's go with the own cache and I give it my full support". No "but let it be on record that I..." or reservations for the minutes.
  • Help make their own cache the best it can be. Since they disagreed precisely over the risks (maintenance, inconsistencies), the real commit is putting that knowledge at the service of someone else's decision: helping them design the cache to minimize exactly those risks they saw —review the design to avoid the inconsistencies, suggest how to bound the maintenance—. Their objection, instead of a "no", becomes a contribution that makes better the option they didn't choose.
  • Don't resurrect the discussion. Don't raise again "we should have used the shared one" at every retrospective or every time the own cache has a problem. The decision was made; the moment for disagreeing (the shore) already passed; now you row (the water).
  • Record the why, without resentment. If anything, a neutral ADR that documents that the shared cache was evaluated and the own one was chosen for such reasons —for the future, not to collect on the "I told you so"—.

Fake commit (covert blocking, what they must avoid):

  • Saying "I commit" and then giving the own cache the minimum effort, or refusing to help ("it's their decision, let them figure it out").
  • Reminding people, every time a cache bug comes up, that "I said this would happen".
  • Hoping (and deep down wishing) the own cache fails, to be right.
  • Bringing the topic back at every meeting until the squad is worn down enough to "reconsider".

The underlying difference: the real commit gives someone else's decision the best chance of working —even works to make it work better than it would have without their help—; the fake commit works, consciously or unconsciously, for someone else's decision to fail and vindicate the architect. One rows where the boat goes with all their strength; the other rows surreptitiously backward. And the real commit has an enormous trust benefit (lesson 3): an architect who disagrees thoroughly and then genuinely supports the opposite decision earns a respect no "I was right" would give them.

Summary and next step

In this lesson you learned the second practice of leadership without authority: disagree and commit —disagree thoroughly and commit to the decision even if you don't win—. With the rowing team you saw that the shore is for disagreeing (say the thing about the log, defend your channel) and the water is for committing (once decided, row there with everyone), and that confusing the moments sinks the boat —disagreeing in the water is sabotage, staying silent on the shore is a failure—. And you measured it by executing: over six decisions, the blocker slows everything (15 weeks) and burns the team, the one who caves is fast (6 weeks) but lets the bad decision pass with no flag, and disagree-and-commit (9 weeks) gets the good of both —states the three objections, stops the one that was wrong, and doesn't slow the team— because it separates disagreeing from executing. You understood what the formula isn't (neither caving in disguise nor committing with fingers crossed), why it works (it separates decision quality from execution speed), and the architect's special case: escalate —once, transparently— the grave and irreversible risk, commit to everything else.

Before moving on you should be able to: explain why the blocker and the one who caves fail in opposite but equally expensive ways; distinguish a real commit from a covert block; distinguish when to commit from when to escalate; and explain why the blocker's real cost isn't in the weeks but in the trust.

What follows is where all this happens —where you disagree well, where trust is built, where things are really decided—. In lesson 6 you'll see the load-bearing conversations: the hallway, the technical 1:1, the design review, the conversations that hold up the architecture like the beams that hold up a house. You'll measure why a decision that aligns five squads gets deferred when it's raised cold in a big meeting and gets decided when it was pre-agreed in the prior 1:1s —why the meeting only ratifies what was already held up in the conversations—. It's the step from "I know how to disagree and commit" to "I know in which conversations that really happens".

Resources

  • Jeff Bezos — Amazon Shareholder Letter 2016 — the source of "disagree and commit": Bezos explains the tool with his own example of committing to a project he wasn't convinced by. Short and direct; the origin of this lesson.
  • L. David Marquet — Turn the Ship Around! — on how decisions are built where people disagree safely and then execute committed; the leadership that invites honest disagreement without losing the coordination.
  • Will Larson — Staff Engineer — on how the senior engineer picks their battles and sustains disagreements without becoming a blocker; the practical application of disagree-and-commit to the technical role without authority.
  • Martin Fowler — Software Architecture Guide — material on team architecture decision-making and why the effective architect cultivates productive disagreement instead of imposing themselves; good conceptual context on deciding with others.