Back to blog
Agt 11, 20269 min read
Career

How to Say No to Bad Requirements: A Software Engineer's Guide to Pushing Back (Without Being a Jerk)

System Design Interview

Every engineer knows the feeling. A ticket lands in your queue, you read it twice, and your stomach sinks. The requirement is vague, contradictory, technically unworkable, or all three. You could build exactly what's written and hand back something nobody actually wants. Or you could say something — and risk sounding difficult, negative, or like you're not a "team player."

Here's the good news: pushing back on bad requirements isn't a soft skill nice-to-have. It's core engineering work. The best engineers aren't the ones who say yes to everything — they're the ones who catch problems before they become six-figure rewrites. This guide walks through exactly how to do that without torching relationships or your reputation.

Why Bad Requirements Happen (And Why Saying Nothing Is Worse)

Requirements go bad for predictable reasons: a product manager under deadline pressure, a stakeholder who doesn't know what's technically feasible, a spec written before anyone talked to the team who has to build it, or a request that solves a symptom instead of the actual problem.

Staying silent feels safer in the moment. It isn't. Building the wrong thing quietly is far more expensive than a five-minute uncomfortable conversation — for the business, for the user, and for your own credibility when the rework request comes in three sprints later. Engineers who never push back don't get seen as easygoing; over time, they get seen as order-takers, which is a bad place to be when promotion time comes around.

The Mindset Shift: You're Not Saying No, You're Solving a Problem

The biggest reframe that makes pushing back easier: you are almost never actually saying "no." You're saying "here's a better way to get what you actually need." Bad requirements are usually a proxy for a real goal that got lost in translation. Your job is to surface that goal, not to block the request.

This shift matters because it changes your posture from adversarial to collaborative — and that shows up in your tone, your word choice, and how the other person receives you.

A Framework for Pushing Back Without Being a Jerk

1. Assume good intent and get curious first

Before you object, ask why. Most "bad" requirements make perfect sense once you understand the constraint behind them — a customer commitment, a compliance deadline, a leadership ask. Open with a question, not a critique:

"Help me understand the goal here — is this mainly about reducing support tickets, or is there a deadline tied to a customer commitment?"

This does two things: it often reveals a much better solution than the one written down, and it signals you're trying to help, not obstruct.

2. Separate the requirement from the solution

Stakeholders often hand engineers a solution ("add a button that does X") instead of a problem ("users can't find Y"). Gently pull the conversation back to the underlying problem:

"Just so I build the right thing — what's the user trying to accomplish when they hit this screen?"

Once you're both looking at the actual problem, the "bad" requirement often dissolves on its own, because there's usually a simpler or safer way to solve it.

3. Bring data and trade-offs, not opinions

"This is a bad idea" is an opinion. "This approach adds roughly three weeks and creates a scaling bottleneck at 10x our current load" is a trade-off. Decision-makers can act on trade-offs. They can't act on vibes, and they'll discount pushback that sounds like a personal preference.

Come with specifics: rough time estimates, technical risks, maintenance costs, or edge cases the requirement doesn't account for.

4. Offer alternatives, always

Never push back with an empty hand. Even a rough alternative shows you're invested in the outcome, not just avoiding work:

"The as-written approach would take about a month and lock us into a schema we'll likely regret. Here are two lighter options that get 80% of the value in a week — want to look at those?"

This is the single biggest lever for being taken seriously. People rarely resent an engineer who says "here's a better way." They do resent one who just says "that won't work."

5. Pick your battles

Not every imperfect requirement deserves a fight. Ask yourself: is this a one-way door (hard/costly to reverse) or a two-way door (easy to change later)? Save your pushback capital for one-way doors — architecture decisions, data model choices, anything touching security, compliance, or things that are expensive to undo. Let the small stuff go, even if it's not exactly how you'd do it.

6. Put it in writing — briefly

After a verbal conversation, send a short written recap of the concern, the trade-off, and the agreed path forward. This isn't about covering yourself — it's about making sure everyone remembers the same conversation a month later, which prevents a much worse conflict down the line.

7. Know when to escalate — and how

If you've raised the concern, offered alternatives, and been overruled, you generally have two responsible choices: disagree and commit, or escalate to someone with more context. Escalation isn't going over someone's head — it's making sure a decision gets made with full information. Frame it as seeking clarity, not as a complaint:

"I want to make sure we're aligned before I start — can we get five minutes with [decision-maker] to confirm the trade-off is acceptable?"

Phrases That Work (And Ones to Avoid)

Use:

  • "Help me understand the goal behind this."
  • "Here's a trade-off I want to flag before we commit."
  • "What would make this a two-week job instead of two months?"
  • "I want to build the right thing here — can we align on X first?"

Avoid:

  • "This doesn't make sense."
  • "Whoever wrote this doesn't understand the codebase."
  • "That's not how this should work."
  • Silent compliance, followed by an "I told you so" later.

The difference isn't just politeness — it's that the "use" column keeps the conversation focused on the shared goal, while the "avoid" column makes it about who's right.

What Good Pushback Looks Like in Practice

Bad requirement: "Add real-time sync across all devices by Friday."

Poor response: "That's impossible in that timeframe."

Good response: "Real-time sync touches our data layer in a way that's hard to walk back later, so I want to get this right. True real-time by Friday isn't realistic, but I can get you near-real-time (30-second refresh) by Friday, with full real-time as a fast-follow the week after. Does that work for what you're trying to solve?"

Notice what's happening: the concern is specific, an alternative is offered immediately, and the response ends by handing the decision back to the person who owns the priority — because ultimately, trade-off decisions are often theirs to make, not yours alone.

The Long-Term Payoff

Engineers who push back well — calmly, with alternatives, focused on outcomes — build a specific kind of reputation: the person whose "wait, let's think about this" is worth listening to. That reputation compounds. It means your future pushback gets less resistance, not more, because people have learned it's backed by judgment, not friction for its own sake.

Saying no to bad requirements isn't about being difficult. It's about protecting the thing everyone in the room actually wants: a product that works, shipped without unnecessary pain. Do that consistently, with curiosity and options instead of ultimatums, and you won't be seen as a blocker. You'll be seen as someone worth putting in the room before the requirements are even written.


Looking to build this kind of judgment into your team's process? Start small: add one question to your ticket template — "What problem does this solve for the user?" — and watch how many requirements improve before an engineer ever has to push back at all.

© 2026 Dimas Eka Putra. All rights reserved.
Built with hope by Dimas Eka Putra