Every ambitious project, at some point, runs into resistance. Someone in a meeting says "I'm not sure this is the right direction." A peer team quietly stops responding to your pings. A senior engineer keeps raising new concerns every time you answer the old ones. Your manager's manager asks a question in a review that feels like a trap.
Your instinct, when this happens, is to defend. To explain more clearly, to add more slides, to schedule another meeting, to send a longer email. This instinct is natural and it is usually wrong — not because defending your work is wrong, but because you haven't yet diagnosed what kind of resistance you're actually facing.
There are four fundamentally different types of pushback, and they require four fundamentally different responses. Treating a concern like sabotage makes you look paranoid. Treating sabotage like a concern makes you look naive. The first skill of the second half of this book is learning to tell them apart.
The Four Types
Let's be precise. When someone pushes back on your project — your plan, your approach, your timeline, your scope — they are doing one of four things:
Type 01 — Concern
A Genuine Risk You Haven't Seen
The person pushing back has information, experience, or a vantage point that you don't have. They have spotted something real. They are trying to help you, even if they're being clumsy about it.
Signal: "Have you considered what happens when...?" / "Last time we tried this, we ran into X..." / "I'm worried about the dependency on..."
Type 02 — Disagreement
A Different View of the Same Facts
The person sees the same reality as you but draws different conclusions from it. They don't think your approach is the right one. This is a legitimate intellectual disagreement between two reasonable people.
Signal: "I think there's a better way to..." / "I don't agree that X will solve Y..." / "My view is that we should instead..."
Type 03 — Resistance
Friction From Change Itself
The person doesn't want to do the work required, doesn't want their team burdened, or doesn't want to change their existing systems, processes, or habits. The objections are real, but the root cause is not the merits of your plan — it's the cost of change.
Signal: "We're too busy right now..." / "This would require us to redo..." / "Our team doesn't have capacity for..."
Type 04 — Sabotage
An Attempt to Kill the Project
The person doesn't want your project to succeed and is working — consciously or not — to prevent it. This can be about territory, credit, budget, priorities, or personal history. The objections are not meant to improve the project. They are meant to stop it.
Signal: Objections that shift each time you answer them / Silence in meetings + complaints outside them / Escalations that bypass normal channels
The reason this taxonomy matters is simple: the right response to each type is almost the opposite of the right response to the others. A Concern deserves your full attention and a plan update. A Disagreement deserves a structured debate with a clear decision owner. Resistance deserves empathy and a negotiated path. Sabotage deserves escalation — and more importantly, it deserves early detection, because by the time it's fully visible, it has already done damage.
The cardinal sin of handling pushback is applying the wrong response type. The most expensive version: treating sabotage as a concern, giving it endless good-faith engagement, and watching the project die in a fog of "unresolved issues."
What Pushback Is Really Telling You
Before you figure out which type you're dealing with, it helps to understand what drives pushback in the first place. Pushback almost always originates from one of three sources.
1. New Information
The person pushing back knows something you don't. They worked on a similar project three years ago and remember how it ended. They know that the team you're depending on has a hiring freeze and will be half-staffed in Q3. They understand a regulatory constraint that isn't in any document you've read. This is valuable signal. This is the pushback you actually want.
When pushback comes with a specific scenario, a concrete example, or a reference to a past event — treat it like a gift, not an attack. Your job is to extract the information and figure out whether it changes anything.
2. Fear of Cost
Your project is asking something of people. Time, resources, change to existing systems, adoption of new processes, political risk if the project fails. Resistance is almost always a cost calculation. When someone says "we're too busy," what they often mean is "the cost you're asking us to bear is higher than the benefit you're promising us — and we don't fully believe in the promise anyway."
This kind of pushback is not wrong. It's rational self-interest. The response is not to argue about whether the cost is real — it is real — but to work on either reducing the cost or strengthening the case for the benefit.
3. Loss of Something Valued
Some pushback is about identity, ownership, or status. A team that has owned a system for five years does not want to hand it off. An engineer who designed the current architecture does not want to see it declared legacy. A leader who championed the previous approach does not want to be on the wrong side of history.
This is the hardest category because it doesn't look like what it is. People in this situation do not say "I'm upset about losing ownership." They say "I have concerns about the technical direction." The objections are dressed up as technical arguments, but the underlying driver is loss aversion. You can answer every technical argument and discover that new ones appear, because you are addressing the symptom while the disease is still there.
Pattern to Recognize
When someone's objections keep shifting — when every answer you give generates a new, equally large concern — you are almost certainly dealing with loss aversion or sabotage, not genuine technical concerns. Real concerns have a finite number. They don't regenerate.
How to Diagnose Which Type You're Facing
In practice, you often don't know which type you're dealing with right away. The same words — "I have concerns about this approach" — can be a genuine warning from a trusted colleague or the opening move of a sustained campaign to derail your project. Here's how to diagnose it.
Pushback Diagnosis Framework
1
Does the objection contain specific, verifiable information?
If yes — lean toward Concern. The person has something concrete. Verify the information before doing anything else. If the information checks out, it's a real concern. If it doesn't, note that the objection was unfounded and watch whether the pattern continues.
2
Does the person propose an alternative, or just oppose the current plan?
Someone with a genuine Disagreement will usually have an alternative view — even a rough one. Pure opposition without a counter-proposal is a flag. It doesn't prove sabotage, but it weakens the case for Disagreement. Ask directly: "What would you do instead?" Silence or vagueness is informative.
3
Does their objection cost them anything to make?
Resistance is usually rooted in cost. Ask: what does this project require of the person pushing back? If it requires significant work, change, or risk from their team, you are almost certainly looking at Resistance, not Disagreement. This is not bad faith — it's rational. Treat it accordingly.
4
What do they do after you answer the objection?
This is the most reliable diagnostic. A Concern, once genuinely addressed, goes away. A Disagreement, once resolved, either converts to support or produces a clear "disagree and commit." Resistance, when the cost is reduced, usually softens. Sabotage produces a new objection — different in form, identical in function. Track the pattern over time, not any single objection in isolation.
5
Does the pushback happen in public or in private?
Concerns and Disagreements tend to happen in the open — in meetings, in documents, in reviews. Sabotage tends to happen in private conversations, backchannels, escalations that bypass you, and "feedback" delivered to your manager rather than to you. If someone expresses support in your presence and doubt in your absence, the pattern is telling you something.
Type 1: Handling a Genuine Concern
This is the easiest type to handle, and the one that most engineers handle worst — because the instinct, even here, is to defend before you absorb.
When someone surfaces a real concern, the thing you must do first is understand it completely before you respond to it. Ask questions. Repeat it back in your own words. Confirm that your understanding matches theirs. Resist the urge to immediately rebut it, minimize it, or explain why it won't happen.
Why does this matter? Because engineers who defend immediately train their stakeholders to stop raising concerns. If the response to "I'm worried about X" is always an immediate explanation of why X isn't a problem, people stop saying "I'm worried about X." They either suppress it — and then it surfaces at the worst possible time — or they go around you to someone higher up. Neither outcome is good.
The goal, when someone raises a real concern, is to demonstrate that you heard it and that you take it seriously. Even if you ultimately decide the concern is manageable, the person who raised it should feel that it was genuinely considered, not dismissed.
The Standard Response to a Concern
"That's a real issue. Let me think about it and get back to you by [specific date] with how I plan to address it." Then actually do that.
This is not weakness. This is the behavior that builds the kind of credibility where people bring you their concerns early, when you can actually do something about them.
After you've understood the concern, you have three options:
Update the plan. If the concern reveals a genuine gap, fix it. Change the approach, add a mitigation, renegotiate the timeline, or adjust the scope. Document what changed and why. Explicitly credit the person who raised it — not because it's polite, but because it signals that surfacing concerns has a positive return, which means you'll get more of them.
Accept the risk and document it. Sometimes the concern is real but the risk is acceptable given the stakes and timeline. That's a valid choice. But you must make it consciously and you must write it down: "We are aware of this risk. We have decided to proceed because X. The trigger for revisiting this decision is Y." Risk that is acknowledged and documented is fundamentally different from risk that is ignored. If the thing goes wrong, a documented decision shows good judgment. An undocumented one looks like negligence.
Decide the concern is unfounded. Sometimes you investigate and the concern is based on incomplete information or a misunderstanding. That's fine. But you still owe the person a clear, specific explanation of what you found and why the concern doesn't apply. Not "that's not going to happen" — that's dismissal. But "I looked into this, here's what I found, here's why I believe it's handled" — that's a real response to a real concern.
Type 2: Handling a Disagreement
A genuine intellectual disagreement is one of the healthiest things that can happen on a large project. It means someone cares enough to engage, and has enough information to have a real opinion. The danger is not the disagreement itself — the danger is letting disagreement linger without resolution.
Unresolved disagreement is the parent of stalled projects. A team where two senior engineers disagree about the architectural direction, and no one has been willing to force a decision, will produce code that is inconsistent, documentation that contradicts itself, and meetings that circle the same ground every week. The disagreement doesn't go away — it just goes underground and expresses itself as slowness.
The key move when you're facing a disagreement is to make the structure of the disagreement explicit. Most disagreements are actually disagreements about one of three things: facts, values, or predictions.
Disagreements About Facts
Sometimes two people disagree because they have different information. One person thinks the current system can handle 10,000 requests per second. Another thinks it can handle 50,000. One person thinks the migration will take three months. Another thinks it will take twelve. These are empirical questions. They can be resolved by looking at data.
The moment you realize a disagreement is factual, your job is to stop debating and start investigating. "Let's pull the actual load test results." "Let's look at what the last three migrations took." The answer is somewhere findable. Go find it.
Disagreements About Values
Some disagreements are not about facts — they're about what matters more. Is consistency more important than speed? Is simplicity worth the performance cost? Should we optimize for developer experience or operational efficiency? These don't have objectively correct answers. They are judgment calls, and reasonable engineers will draw the line in different places.
The right response to a values disagreement is to make the trade-off explicit, surface the constraints that bound the decision, and then get a decision from whoever owns the decision. Not endless debate — a decision. The most dangerous thing you can do with a values disagreement is to pretend it's a facts disagreement, because you will never find the right data to resolve it.
Disagreements About Predictions
The hardest disagreements are about the future. "This approach will scale." "No it won't." "Users will adopt this." "No they won't." Neither person is wrong yet — the thing hasn't happened. You are both guessing, with varying degrees of evidence and confidence.
The right response to a prediction disagreement is to make the prediction testable. What would we need to see to know which of us is right? Can we build a prototype? Can we run an A/B test? Can we find a proxy for the thing we're predicting? If you can make the disagreement testable, you can resolve it with evidence instead of authority.
From the Field
A payments infrastructure project had two senior engineers locked in a disagreement for six weeks about whether to build the new ledger system as a single-writer database or a distributed log. Both had good arguments. Both were experienced. Neither was going to convince the other.
The project lead finally broke the stall by naming what was actually happening: "We have a prediction disagreement. You think distributed log will be operationally harder than the benefit justifies. He thinks single-writer will hit write bottlenecks within 18 months. We can't know which of us is right from first principles. So here's what we're going to do: we're going to build a prototype of the single-writer approach to the point where we can get a real write latency number under load. If the number is fine, we go that way. If it's not, we revisit."
The prototype took two weeks. The number was fine. The decision was made. Six weeks of circular debate was replaced by two weeks of work and a clear outcome.
The final tool for handling genuine disagreements is the explicit "disagree and commit." Once a decision has been made — through data, through escalation to a decision owner, through whatever process your organization uses — everyone involved must be willing to commit to executing it, even if they personally believe it's the wrong choice.
"Disagree and commit" is not a request for enthusiasm. It is a request for professional behavior. The person who disagrees can and should maintain their view in future conversations where the decision is revisited. But during execution, they must execute the agreed plan with full effort — not passive compliance, not silent obstruction, not "I told you so" preparation.
If someone cannot commit after a decision has been made, that is a separate, much more serious problem — and it may be time to re-diagnose whether you're actually dealing with Type 3 or Type 4.
Type 3: Handling Resistance
Resistance is the most common type of pushback on large projects, and it is almost universally underestimated. Engineers are trained to think about technical feasibility. They are rarely trained to think about the human cost of change — and that cost is the fuel that drives resistance.
Think about what a large cross-team project looks like from the perspective of a team that's being asked to participate. You are minding your own business. You have your own roadmap, your own priorities, your own commitments to your own stakeholders. Then someone shows up with a project that requires your team to do extra work, change systems you've carefully tuned, learn new tools, and expose your work to a risk of failure that you didn't create and can't fully control. Of course you're resistant. That's rational.
The single biggest mistake when dealing with resistance is to argue about whether the work is important. Usually it is important. The person resisting probably even agrees it's important in the abstract. But importance doesn't pay for the cost their team will bear. You need to work on the cost, not the importance.
The Cost Reduction Toolkit
There are several tools available to reduce the cost of participation and thereby soften resistance.
Break the ask into smaller pieces. A team that won't commit to a six-month engagement might commit to a two-week spike. A team that won't rebuild their entire integration might rebuild one endpoint. Getting the foot in the door with something small changes the relationship from "this is a massive burden" to "we're already started, let's keep going."
Do more of the work yourself. The classic form of resistance is "we don't have bandwidth." The counter is: what if I reduce the bandwidth required? Can you take a first pass at their integration and then ask for a review instead of asking them to build it from scratch? Can you write the spec for the change you need so they only have to implement it? Can you provide a reference implementation? This shifts the dynamic from "you are the supplicant asking for a favor" to "I am a partner investing in your success."
Make the benefit concrete and personal. "This is good for the company" is a weak argument for a team that is already overloaded. "This means you can deprecate the legacy system that's been waking you up at 3am for two years" is a strong one. Find the version of the benefit that is specific to the team you're asking — not the abstract company-level benefit, but the real-world thing that gets better for them specifically.
Address the timing. Often resistance is not "I don't want to do this" but "I don't want to do this now." If a team is in the middle of a major launch, pushing on them for capacity is both unproductive and a good way to create lasting resentment. Ask: "When would this be possible? What's your next window?" Sometimes a six-week delay on your end buys you genuine partnership instead of grudging compliance.
The Empathy Move
The most powerful thing you can say to a team that is resisting is: "I understand this is a cost I'm asking you to bear. I want to understand what I can do to make this easier. What would need to be true for this to feel workable?"
Most people are not asked this question. They are usually told why the project is important and why they need to prioritize it. Being asked what would make it easier changes the conversation from confrontation to collaboration.
When Resistance Has a Leader
Sometimes resistance is organized — there is a person leading it, either overtly or quietly. Usually this is a tech lead or manager who has concluded that the cost to their team exceeds the benefit, and who is, consciously or not, doing slow-motion project blocking.
The right move here is to have a direct, one-on-one conversation before the resistance hardens. Not a meeting with multiple stakeholders — a private conversation where you say: "I've noticed we keep running into friction with your team. I want to understand what's really going on from your perspective." Give them the space to be honest. Often, what comes out is a real grievance — something that happened in a previous project, a concern about their team's workload, a worry about being set up to fail — that is completely solvable if you know about it. People are usually not trying to be obstructionist. They are protecting something.
Type 4: Handling Sabotage
Let's be precise about what sabotage means in this context. It does not mean villainy. It does not mean that someone has consciously decided to destroy your project. It means that someone's behavior — whether they are fully aware of it or not — is systematically oriented toward preventing your project from succeeding. The intent is secondary. The effect is what matters.
Sabotage in large organizations usually takes one of several forms: the endless blocker (new concerns appear as soon as old ones are resolved), the passive non-participant (commits in meetings, disappears between them), the backchannel campaigner (expresses doubts and concerns to your manager, to senior leadership, to other team leads — anywhere except to you), and the procedural obstructionist (surfaces compliance issues, process requirements, and organizational rules that weren't mentioned before and may not actually apply).
The danger of sabotage is that it masquerades as concern. It uses the vocabulary of intellectual engagement — "I have concerns," "I need more information," "I'm not sure this is the right approach" — while operating from a motivation that is not about the project's quality at all. This is why diagnosing it is so hard, and so important.
The Distinguishing Marks
You cannot diagnose sabotage from a single interaction. Anyone can raise an objection that generates more objections. Anyone can be busy and non-responsive for a week. Anyone can express a worry to a colleague privately. The signal is the pattern.
Track three things over time. First: do objections resolve? If you have answered ten concerns in six weeks and there are now ten new concerns of equal weight, the concerns are not the problem. Second: does commitment translate into action? If someone agrees in a meeting and then produces nothing, and this happens repeatedly, the verbal commitment is not real. Third: is the communication direct or indirect? If someone is consistently more negative in private than in public — if you keep hearing "I had no idea there were concerns" from people who haven't spoken to you — the communication is going around you for a reason.
What to Do About It
The first move, when you suspect sabotage, is to name what you're observing — directly, privately, and without accusation. Not "you're trying to sabotage this project" — that's an accusation of intent that you can't prove and that will immediately put the other person on the defensive. Instead, name the behavior: "I've noticed that every time we resolve one concern, a new one appears. I want to understand what's really driving that."
Sometimes this conversation reveals that the person has a genuine, large, structural concern that they didn't feel safe raising directly — maybe they think the entire approach is wrong, not just a specific detail, and they didn't know how to say it. That is valuable. If you can uncover it, you can deal with it.
Sometimes it reveals that the person has a grievance that predates your project — something about how they were treated in a previous initiative, or a concern about their team's position after the project completes. That is also valuable and often solvable.
And sometimes the conversation confirms that you are dealing with someone who is working against your project and will not stop. In that case — and only in that case — the right move is escalation. Not a venting session with your manager. Not a complaint to HR. A specific, evidence-based escalation to someone with the authority to make a decision: "I have exhausted direct resolution. Here is the pattern I have observed. Here is what I've tried. Here is what I need to happen."
Escalation Discipline
Escalate precisely once. If you have escalated and your manager or the relevant leader has decided not to act, you have your answer: the organization has decided to let this play out at your level. Escalating again communicates that you can't manage the situation yourself, which is a credibility cost you can rarely afford.
The corollary: before you escalate, be sure. The cost of being wrong — of escalating something that was actually concern or resistance and only looked like sabotage — is significant. You will look like someone who can't tell the difference between a difficult colleague and an enemy.
The "Yes, And" Response
There is a response pattern borrowed from improvisational comedy that is remarkably effective across all four pushback types, because it does something almost no other response pattern does: it keeps the conversation moving forward without either capitulating or shutting down.
In improv, "yes, and" means: I accept what you have introduced, and I add to it. Applied to pushback, it means: I hear your concern, and here is what I'm doing about it. Not "yes, but" — which is agreement followed by dismissal. Not "that's not right" — which is pure defense. "Yes, and" acknowledges the reality of what has been raised and immediately contributes something constructive.
Stakeholder says:
"I'm not sure the timeline is realistic. Three months seems too short for a migration this size."
Defensive response:
"We've done the detailed breakdown. It's definitely achievable. Here's the project plan." [Shows 40-slide deck]
Yes-and response:
"You're right that migrations this size often take longer than expected — and that's exactly why we've built four weeks of buffer into the plan. The biggest risk is the data validation step in week seven. I'd love to walk you through how we're handling that specifically, because I think that's where your concern is most justified."
Notice what the "yes, and" response does. It validates the concern without agreeing that the project is broken. It demonstrates knowledge of the risk. It narrows the conversation to the specific thing that matters most. And it invites further engagement rather than closing it down.
Contrast this with the defensive response, which is technically correct — the plan is detailed and the timeline is achievable — but communicates "I am not taking your concern seriously, I am showing you proof that you are wrong." Even if you are right, you have made the other person feel dismissed, and they will respond accordingly.
When to Update Your Plan and When to Hold Your Ground
One of the hardest judgment calls in handling pushback is knowing when the pushback is right. Not all pushback is wrong. Sometimes the person is right and you should change the plan. Sometimes the person is wrong and you should hold the plan. Knowing the difference is critical, because there are failure modes in both directions.
The engineer who updates their plan in response to every piece of pushback ends up with a plan that has been shaped by whoever pushed the hardest, not by what is actually best for the project. This is called "feedback-driven planning," and it produces monstrous documents that satisfy no one and work for no one.
The engineer who never updates their plan in response to pushback misses real information and alienates the people whose support they need. They develop a reputation for arrogance, which means people stop trying to help them.
The right framework is not "how confident am I in my original plan" but "what is the quality of the argument being made against it?" A pushback that contains specific new information, a concrete past example, or a testable prediction deserves genuine engagement and a willingness to update. A pushback that contains only general doubt, vague discomfort, or a preference for the status quo does not warrant a plan change — though it may warrant a better explanation of why the current plan is right.
Pushback Type
Update the Plan When...
Hold the Plan When...
ConcernGenuine risk raised
The risk is real, significant, and not already mitigated in the plan
The risk is real but acceptable, or is already handled and you failed to communicate it
DisagreementDifferent conclusion from same facts
Their analysis reveals a flaw in your reasoning, or new data contradicts your assumptions
The disagreement is about values or predictions with no available evidence — get a decision from the owner
ResistanceCost-driven friction
You can reduce the cost without compromising the core objective — do so
Reducing the cost would compromise the core objective — negotiate the boundary, not the plan
SabotageSystematic obstruction
The direct conversation reveals a real, addressable grievance underneath the obstruction
The pattern is confirmed — escalate, don't update. Updating rewards obstruction.
The Compounding Effect of Getting This Right
Most of this chapter has been about tactics — how to read a specific kind of pushback, how to respond to it, how to know when to update your plan. But there is something more important than any individual tactic, and it is worth ending on.
The way you handle pushback over time shapes the environment around you. If you handle concerns well — genuinely engaging with them, updating your plans when they reveal something real, crediting the people who surface them — you build an environment where people bring you their concerns early. This is enormously valuable. Early-stage concerns are small and cheap to address. Late-stage concerns that were never raised are catastrophic.
If you handle disagreements well — making the structure explicit, separating facts from values from predictions, getting clear decisions and genuine commitments — you build an environment where intellectual engagement produces outcomes instead of stalling. Your reviews become useful. Your planning sessions become sharp. The people who disagree with you become the most valuable members of your extended team, because they are telling you things you need to hear before they become problems.
If you handle resistance well — with empathy, with a genuine effort to reduce cost, with respect for the reality that you are asking something of people — you build a reputation as someone who is a good partner. Teams will take your calls. Your pings will get responses. When you need a favor in a crunch, you will have the social capital to ask for one.
And if you handle sabotage well — diagnosing it correctly, attempting direct resolution before escalating, escalating precisely when direct resolution is exhausted — you protect your project from one of the most common quiet killers while maintaining your credibility as someone who operates with integrity.
None of this is about being nice. It is about being effective. The principal engineers who consistently ship hard projects are not universally liked. But they are universally trusted to be straight with people — to take concerns seriously, to disagree clearly, to deal with conflict directly rather than through avoidance. That reputation is a force multiplier. It makes the next project easier to launch, easier to staff, and easier to run. And that is how execution compounds.
Chapter Summary
The key principle: Pushback is data. Your job is to diagnose what kind of data it is before you decide how to respond — because the right response to a concern is the opposite of the right response to sabotage.
The Four Types
- Type 1 — Concern: genuine risk, deserves full engagement
- Type 2 — Disagreement: different view, deserves structured debate and a decision
- Type 3 — Resistance: cost-driven friction, deserves empathy and cost reduction
- Type 4 — Sabotage: systematic obstruction, deserves direct naming and then escalation
Common Mistakes
- Defending before absorbing a genuine concern
- Letting a disagreement linger without forcing a decision
- Arguing importance to a team resisting on cost grounds
- Giving good-faith engagement to a pattern that is not acting in good faith
- Updating the plan in response to every piece of pushback regardless of quality
Three Questions for Your Current Project
- For each source of friction you're currently experiencing, which of the four types is it? What evidence are you using to make that diagnosis?
- Are there any patterns of objections you've been treating as Type 1 (Concern) that might actually be Type 3 (Resistance) or Type 4 (Sabotage)? What would you need to observe to know?
- Think of a recent piece of pushback you updated your plan in response to. Was that the right call? What was the quality of the argument — was it specific new information, or general doubt?