Advocacy and Constructive Dissent Questions
Standing up for the right technical or product decision, even when it is unpopular or contested. Covers voicing disagreement respectfully, making the evidence case for a position others oppose, challenging the status quo, advocating for quality and users, escalating to senior leadership when the stakes justify it, committing to a decision once made, and owning it when you turn out to be wrong. Assesses candor, conviction, and the ability to disagree without being disagreeable.
Explain the practical difference between advocating and being argumentative in product contexts. Provide concrete examples of behaviors that illustrate constructive advocacy versus argumentative behavior, describe the likely effects of each on team dynamics and outcomes, and explain tactics you use to ensure your advocacy remains constructive.
Sample Answer
Direct answer
Advocacy stays focused on the idea and the shared goal and keeps updating as new evidence shows up; arguing shifts the focus to winning and treats the other person's position as something to defeat rather than test. The practical dividing line is whether, after the conversation, the other person's standing in the room is still intact and whether you would actually change your mind if the evidence went the other way.
Behaviors that distinguish the two
| Constructive advocacy | Argumentative behavior | |
|---|---|---|
| Focus | The idea and the shared outcome | Being right, winning the exchange |
| Evidence | Cites data, proposes a way to test who is right | Repeats the same claim louder |
| Language | "I recommend X because Y, what am I missing?" | "This is obviously wrong," absolute terms like always/never |
| Response to pushback | Asks a genuine clarifying question | Attacks the person or brings up unrelated history |
| When overruled | Concedes and commits, or proposes one more specific test | Relitigates later, drags in past disagreements |
Effects on team dynamics
Constructive advocacy surfaces more information over time: people keep bringing you their dissenting views because raising one did not cost them anything personally, and decisions get better even on the occasions you personally lose the argument. Argumentative behavior does the opposite: people stop raising concerns around you, meetings become adversarial, and decisions start getting made around you rather than with you, which is worse for you even when you happen to be right more often.
Worked example
In a code review, a reviewer disagrees with a caching strategy that has no invalidation on write. Advocacy version: "I'm concerned this cache can serve stale data after a write under load, here's a small repro showing it. Could we add a TTL or an invalidation hook? Happy to pair on it." (A TTL, or time-to-live, is a timer that automatically expires a cached entry after a set period; an invalidation hook is code that actively clears the cached entry the moment the underlying data changes, instead of waiting for a timer.) Argumentative version: "This is wrong, shipping a cache with no invalidation is amateur." The first version gets the author collaborating on a fix because the concern is about the code, not about them. The second gets a defensive reaction, sometimes even on a point the author privately agrees with, because agreeing now feels like losing.
Trade-offs and pitfalls
Staying constructive does not mean being vague or overly soft, burying the actual concern under hedges is its own failure mode, since the reviewer still has to name the specific problem clearly. The skill is being direct about the issue while staying focused on the work rather than the person, and knowing when you have made your point and it is time to stop repeating it.
Tell me about a time you disagreed with a peer over implementation details (for example: algorithm choice, data model, or API contract). Use the STAR method: explain the situation, how you advocated for your view, what evidence or experiments you used, how you listened to the other side, and the final outcome.
Sample Answer
Direct answer
I use the STAR method (Situation, Task, Action, Result) to structure this kind of story: describe the technical disagreement concretely, show that I came with evidence rather than just an opinion, show that I genuinely listened rather than just waited for my turn to talk, and give a specific outcome, not a vague "we worked it out."
Structured elaboration
The general pattern I follow for implementation-level disagreements:
- Separate the actual point of disagreement from the surface argument. Two engineers arguing about "queue vs. synchronous call" are often really disagreeing about "who owns the operational complexity," which is a different, more resolvable question.
- Bring evidence before asserting a conclusion. A quick load test, a small benchmark, or a spike branch beats a strongly worded opinion.
- Listen for the other person's real constraint, not just their stated position; often a compromise exists that satisfies both people's underlying worry.
- Land on a decision with a stated owner and a revisit trigger if the disagreement was close.
Worked example
Situation: On a backend team, a peer and I disagreed about how to send order-confirmation emails: they wanted a simple synchronous call inside the checkout request; I wanted to decouple it because I'd seen the email provider's latency spike under load.
Task: We needed to pick one approach before the sprint, without blocking checkout on a decision neither of us could fully justify from memory.
Action: I ran a quick load test hitting the email provider's API during a simulated peak window and found its p99 latency (the 99th percentile response time, meaning the slowest 1 percent of requests, which is what actually causes visible timeouts even when the average looks fine) spiking from roughly 200ms to 4 to 6 seconds, well past our checkout endpoint's latency target. I brought that chart to my peer instead of just restating my opinion. They pushed back that a full message queue was more operational complexity than the problem justified, which was a fair point I hadn't fully weighed.
Listening: I asked what specifically worried them about the queue, and it turned out it was the on-call burden of new infrastructure, not the async pattern itself. That let us find a middle path: send the email asynchronously using a background thread pool with retries inside the same service, no new infrastructure, which addressed the latency risk without adding an operational surface to maintain.
I was explicit about what that middle path gives up, rather than presenting it as a free win. An in-process pool holds pending sends in memory, so a crash, a deploy or a restart drops whatever is queued, where a broker would have persisted them and redelivered. We accepted that deliberately: the order itself is already committed before the email is queued, a missed confirmation is recoverable from the orders table by a reconciliation sweep, and we wrote both the gap and the sweep into the ticket so the next person did not have to rediscover the trade the hard way.
Result: We shipped the lighter-weight fix that sprint. Six months later, when traffic tripled, we did add a full message queue, and by then we had real data showing exactly when the thread-pool approach would start to strain, which made that follow-up decision easy instead of contentious.
Trade-offs & pitfalls
The risk in these disagreements is optimizing for "who's right" instead of "what does the team actually need now versus later." A related trap is telling the story as though the compromise had no downside; naming what the cheaper option gives up is what makes a middle path credible rather than a way of ducking the argument. A pure evidence-first debate can also drag on if you keep gathering more data instead of committing once the marginal evidence stops changing the decision; know when you have enough to decide.
A senior engineer posts a proposal in a public Slack channel you disagree with. Describe the best way to respond asynchronously to influence the outcome without appearing confrontational: message structure, when to move to 1:1, and how to surface evidence in a way that encourages dialogue rather than defensiveness.
Sample Answer
Direct answer
Structure the reply to agree with something real first, ask a specific question rather than assert a conclusion, and move to a one-on-one the moment the thread would otherwise turn into extended back-and-forth.
Structured elaboration
Message structure: open by naming what you agree with or the shared goal, then ask a specific, answerable question that surfaces your concern, "what happens to case X under this approach?", rather than stating "this is wrong," and link data rather than asserting it. When to move to a one-on-one conversation: after one round of back-and-forth in the thread if it's not converging, or immediately if the disagreement touches something with real stakes, architecture or a public-facing behavior, that deserves more nuance than a channel allows; "want to grab 15 minutes, I think there's more here than fits a thread" is enough. Surfacing evidence: attach a link, a number, or a small reproducible example rather than a paragraph of argument, since a concrete artifact invites the other person to look and update, while a wall of text invites a wall of text back. Tone: favor questions over statements, and acknowledge the cost of being wrong yourself, "I might be missing something here, but," which lowers the temperature without weakening the substance of the concern.
Worked example
A senior engineer proposed, in a public engineering Slack channel, switching the team's primary datastore for a new service, and several people had already reacted with agreeing emoji. I replied in-thread: "I like that this solves the write-throughput problem we've been fighting. Question though: how does this handle the multi-region reads we need for the EU rollout next quarter? I don't see that covered in the proposal, might be missing it." That got one clarifying reply, then I suggested a quick 15-minute call rather than continue the technical back-and-forth in the channel. On the call it turned out multi-region reads genuinely hadn't been scoped; we added it to the proposal together, and I posted the resolution back in the original thread so the whole channel saw the outcome, not just the two of us.
Trade-offs and pitfalls
Posting a concern publicly can feel like efficient transparency, but it can also make the original poster defensive in front of an audience; watch for defensiveness in the tone of any reply and move to a one-on-one faster if you see it. Always close the loop back in the public thread after a private conversation resolves things, otherwise the channel is left with a disagreement that looks unresolved.
Describe a time you advocated for or against a proposed change during a code review. Include the review comment you wrote (or paraphrase), how you framed your argument (style, tone, evidence), whether you proposed alternatives or compromises, and how the author or team reacted.
Sample Answer
Direct answer
I frame review pushback as a concern to verify, not a verdict, especially for subtle bugs that pass tests and look fine at a glance: state what I noticed, show the evidence, ask rather than assert, and offer a concrete alternative.
Structured elaboration
The framing pattern for review comments that will land well:
- Lead with a question, not a conclusion. "Could this cause X?" invites a conversation; "this is broken" invites defensiveness, even when you're confident you're right.
- Show the evidence inline, ideally a minimal reproduction, so the author can verify it themselves instead of taking your word for it.
- Offer a concrete alternative, not just a flag, so the comment is actionable rather than a dead end.
- Reserve strong, unhedged language for things that are genuinely unambiguous (a security hole, data loss); for subtle behavioral bugs, "I might be missing something" is honest, since these bugs are subtle precisely because they're easy to miss on both sides.
Worked example
Reviewing a pull request, I saw a function defined as def add_item(item, cart=[]), using a mutable list as a default argument. This is the kind of bug that's genuinely subtle: it passes every existing test because the tests each construct their own call site, and it works correctly for the common case. The comment I left: "Question here, not blocking: since cart's default is evaluated once when the function is defined rather than on every call, could this list end up shared and accumulating items across calls that don't pass cart explicitly? I put together a small script that calls this twice without a cart argument and the second call shows leftover items from the first, but I might be missing a guard elsewhere. Happy to pair on this if it's easier than reading the repro."
The author re-ran the repro, confirmed the bug, and thanked me for catching it before merge rather than in production. We agreed on the standard fix: default cart to None and initialize a new list inside the function body if it's not provided. Because the comment read as a shared question with evidence attached rather than an accusation, the author's response was "good catch, fixing it" instead of a defensive back-and-forth.
Trade-offs & pitfalls
Framing everything as a tentative question can undersell a genuinely serious issue, like a security vulnerability, where directness is actually kinder because it avoids ambiguity about severity. The skill is calibrating tone to certainty and stakes: soft and inquisitive for subtle, easy-to-miss bugs where you could plausibly be wrong; direct and specific for anything with real consequences if it ships.
You're in a cross-functional planning meeting when a senior engineer or PM asserts a decision you think is risky. How would you voice your disagreement in that forum without derailing the meeting? Provide a short script or phrasing and explain when you'd request a follow-up deep dive versus pushing the point immediately.
Sample Answer
Direct answer
In the room, the goal is to register a specific, evidence-backed concern without turning the meeting into a debate: name the risk in one or two sentences, then immediately propose a path forward (resolve it in the next two minutes, or take it offline). Whether you push in the moment or ask for a follow-up depends on whether the risk is cheap to check right there or needs real analysis.
Structured elaboration
A short script that works in most cross-functional rooms:
"Can I flag one risk before we lock this in? [name the specific risk in one sentence]. If that's true, [name the concrete consequence]. I don't have the full picture in front of me right now, so either we can spend two minutes checking [the one fact that would resolve it], or I can pull the numbers and we revisit before end of week, whichever works better."
Two things make this land well: naming the risk specifically instead of vaguely ("this feels risky") gives people something concrete to react to, and offering the "resolve now vs. follow-up" choice signals you're not trying to derail the meeting, you're trying to de-risk the decision.
When to push immediately versus request a deep dive:
- Push immediately when the check is cheap (a fact someone in the room already knows, a quick look at a dashboard) or the decision is expensive to reverse once made (a public commitment, an irreversible data migration).
- Request a follow-up when the answer needs real analysis (load testing, a data pull, a design spike) or when pushing further in the room would burn time the meeting doesn't have and nobody present can actually resolve it on the spot.
Worked example
In a planning meeting, the Product Manager proposes shipping a new feature that writes directly into the production users table on a tight timeline, no migration path. As the engineer, I say: "Can I flag one risk before we lock this in? Writing directly into that table risks lock contention during our peak traffic window, since three other services read from it. If that's true, we could see slow page loads platform-wide, not just on this feature. I don't have the exact contention numbers in front of me, so either I run a quick check against last week's traffic logs in the next 20 minutes and we come back to it before this meeting ends, or I follow up by tomorrow morning with real numbers." The Product Manager who proposed it says they would rather see the data before the group moves on, and the senior engineer in the room backs that, on the grounds that twenty minutes now is cheaper than finding out during the peak window. Twenty minutes later I come back with the contention estimate, it turns out to be a real but small risk, and we agree to add a lightweight queue in front of the write instead of blocking the launch.
One detail that made the offer easy to accept: I named who would do the checking and by when, rather than leaving an open action item that the room has to assign. An objection that arrives with its own owner is much harder to read as obstruction.
Trade-offs & pitfalls
Raising more than one objection in a single meeting reads as obstruction even when each point is valid; pick the one that matters most. Softening language too much ("I could be wrong, but maybe, possibly...") makes the concern easy to wave away, so state the risk plainly even while staying respectful. And if you're the most junior person in the room, the same script still works, but be extra deliberate about proposing the follow-up path rather than insisting on resolving it live, since you have less standing to burn the room's time on the spot.
Unlock Full Question Bank
Get access to all 13 Advocacy and Constructive Dissent interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.