LeadDoing the work

How to Disagree with Your Manager About Architecture

Framing, evidence, and a fallback — technical opinions without making it personal

#SoftwareEngineering #SoftwareArchitecture #Communication #ManagingUp #Career

Same call. One path is an argument; the other is a decision.
Same call. One path is an argument; the other is a decision.

Most engineers know how to argue about architecture. You've been in the room: latency graphs, a Mermaid diagram, a confident "this won't scale," and a manager who hears something else entirely — a challenge to their call, their timeline, or their competence.

Few know how to disagree upstairs without turning the diagram into a referendum on who is right.

The failure mode is specific. You win the whiteboard and lose the working relationship — or you go quiet, ship the path you hate, and smuggle sabotage into every standup afterward. Neither is a technical opinion. Both are personal, whether you meant them to be or not.

The Personalization Trap

Disagreement becomes personal the moment the subject shifts from the decision surface to status.

"You're wrong" is status. "This option fails under the latency budget we already promised sales" is a decision surface.

Same content. Different target. Easy to miss in the moment — especially when you're sure.

Architecture calls already carry ego. You drew the boxes. They own the delivery date. Someone's preference is about to lose. Open with identity — "I've done this before," "any senior engineer would know" — and you've invited a status fight no Kafka topology will win.

It's not that managers are fragile. It's that your first sentence told them the topic was them.

There's a quieter trap too: you're not disagreeing with the architecture — you're disagreeing with not being consulted. Process complaint, design-review costume. Sort that before you open the laptop. Process belongs in a 1:1 about how decisions get made. Architecture belongs on the decision surface. Mix them and you sound personal even when the topology is right.

The Three-Move Protocol — Framing, Evidence, Fallback

Treat the pushback as a packet, not a vibe. Three moves. In order. Skip one and the other two start sounding like politics.

Framing — name the decision surface

Start with the shared goal and the constraints that are already true — not the ones you wish were true.

"We both need checkout live for the partner launch. We've got six weeks, two teams, and no appetite for a shared on-call rotation yet."

That sentence is the frame. Everything after it is options inside the frame.

Without it, your alternative reads as a veto of their plan. With it, you're arguing about paths to a goal they already own.

Amazon's version of this obligation is blunt: challenge decisions when you disagree — even when it's uncomfortable — and don't paper over dissent for social cohesion. The useful half for ICs is the first clause. The second half — commit wholly once the call is made — only works if you actually made the challenge first.

Evidence — shape it for their constraints

Peer-impressive evidence often fails upstairs.

Right metrics. Wrong audience.

A p99 chart that ignores headcount, a purity argument that ignores the launch date, a "best practice" slide that ignores the three teams already mid-migration — those are credentials. They are not evidence for the person who owns delivery risk.

Evidence that moves a manager survives their constraints: timeline, blast radius, who pages at night, what reversibility looks like, what happens if you're wrong. Make the case with data that speaks to those constraints — not jargon theater aimed at impressing peers in the next channel over.

If your graph can't speak to their constraint, leave the graph. Bring the constraint conflict instead.

Fallback — the safety rail that keeps it technical

This is the move most "disagree productively" posts skip.

A fallback is a reversible next step that still advances the shared goal if they don't take your preferred path — spike for two weeks, feature flag the shared path, ADR the risk and revisit after the launch, own the shared service with a sunset date.

Without a fallback, pushback reads as obstruction.

No plan isn't conviction. It's a veto with better vocabulary.

With a fallback, you're offering a decision surface: preferred path, acceptable path, what you'd need to sleep at night on the path you dislike.

Where this goes wrong in the room: you invent a fake fallback you'll never support — "sure, we can spike for two weeks" when you have no intention of staff for the spike — or you offer a fallback so weak it is sarcasm ("we could also rewrite everything in Rust by Thursday"). Both read as bad faith. A fallback you won't own is worse than no fallback.

Same architecture fight. Bad rewrite, then good.

Bad. "A shared monolith service for three teams is a bad idea. We'll couple deployments, fight over the schema, and nobody will own latency. We should do separate services. That's what good architecture looks like."

Good. "Shared goal: three teams shipping partner features by June without a shared on-call dumpster fire. Constraint: we don't have staff for a platform team yet.

  • Option A — separate services now. Higher upfront cost. Cleaner ownership. Launch risk if we underestimate integration.
  • Option B — shared service with hard boundaries. Faster demo. Coupling risk. I'd want an ownership charter, a sunset trigger, and a written blast radius.
  • Recommendation: A if we can slip two weeks; B with the charter if the date is fixed.
  • Fallback if we pick B: I own the shared module for one quarter, we ADR the coupling risks, and we revisit extraction when the third team joins — not when it hurts."

One of these is a status challenge. The other is a decision packet.

Anticipate the Obvious Objections

You might worry the three moves make you look political.

They make you look like someone who can hold a technical opinion and still ship. The political move is the hallway veto — Slack after the call, slow-walking the path you lost, collecting "I told you so" screenshots. Status work. Engineering hoodie optional.

"Just disagree and commit already" — you'll hear that before you've been heard.

Commit is the second half of the phrase. After a real challenge. Not instead of one. Premature commit is how bad architecture gets unanimous nodding and private despair. Decision not final? Finish the three moves. Decision final? Stop lobbying.

They're the boss — why bother?

Because reversible and irreversible calls are not the same size. Plenty of architecture choices are two-way doors — walk them back with pain, not catastrophe. Those get a light process. Burn stamina on a naming convention while saving backbone for the irreversible data model, and you stay useful upstairs. Full protocol is for one-way doors and high blast radius.

Sometimes the fight isn't architecture at all — it's the calendar wearing a C4 diagram. If the real conflict is "June is fixed and staff isn't," say that. Arguing microservices vs monolith while fighting a date is how both of you waste an hour and leave angrier.

When Evidence Doesn't Move Them — Commit Cleanly

Sometimes you run the protocol and they still pick the path you dislike.

That is allowed. That is often correct — they have budget, partner pressure, or a risk model you don't see.

What you do next is the difference between a technical disagreement and a personal war.

Correct isn't the same as useful. Winning the design and poisoning the relationship is still a failed disagreement.

Write it down. A short architecture decision record is enough: context (including the political and delivery forces, named neutrally), the decision, the alternatives considered, the consequences you accept — including the ugly ones. You're not building a prosecution file. You're leaving a trail so the next person doesn't have to choose between blind acceptance and blind reversal. Making that record something people actually open in review is a separate craft — still worth the page.

Then commit. Own the path. No pocket veto. No "I told you so" when the shared service pages at 11pm — you raise the incident like it was your idea, because for execution purposes it is.

What you refuse afterward: quiet sabotage, withholding the warning you already gave, and turning every standup into a rerun of the lost meeting.

The failure mode after a clean loss is subtler than open defiance. You implement Option B at half effort. You document every wart in the ticket comments and none of the mitigations. You tell peers "well, I warned them" while the launch still needs you. That isn't integrity. It's a personal score, paid for by the team.

If the risk is irreversible — safety, compliance, data loss you can't restore — escalate the risk and the decision record, not the personality. Escalation for bruised ego is how you spend career capital once.

The Packet, One More Time

Go back to the shared-service call.

You don't need them to confess the diagram was wrong. You need a frame they recognize, evidence that speaks to June and on-call, and a fallback that lets the company move if they still pick Option B.

Run the three moves. Lose cleanly when you lose. Write the ADR. Ship the path.

Technical opinion. Not a referendum on you.

More in Lead

← Back to hub