← Back to Design Thinking

Design Thinking

Ambiguity Handling & Problem Framing

How senior engineers ask clarifying questions, reframe vague problems, identify the real vs stated problem, and recognize premature optimization.

Advanced22 min read

Senior engineers don't jump to solutions when the problem is vague. They ask questions, reframe the problem, and separate what's stated from what's actually needed. This skill—ambiguity handling and problem framing—is critical in interviews and in real projects where requirements are always incomplete.


How Seniors Ask Clarifying Questions

The Purpose

  • Reduce ambiguity: Turn "design X" into concrete requirements
  • Reveal constraints: Time, scale, team, budget
  • Identify priorities: What matters most when we can't have everything
  • Uncover hidden requirements: What they didn't say but assume

Question Categories

Scope:

  • "What's in scope for v1? What's explicitly out?"
  • "Are we building for MVP or long-term?"
  • "What features are must-have vs nice-to-have?"

Users & Use Cases:

  • "Who are the primary users?"
  • "What's the main use case we're optimizing for?"
  • "What's the expected user behavior pattern?"

Scale:

  • "What scale are we designing for? Users, requests, data?"
  • "What's the growth trajectory? 10x in a year?"
  • "Read-heavy or write-heavy?"

Non-Functional:

  • "What's the latency requirement? p99?"
  • "What's the availability target?"
  • "Any compliance or security requirements?"

Constraints:

  • "What's the timeline?"
  • "Any existing systems we need to integrate with?"
  • "Team size and expertise?"

Good vs Bad Questions

Bad: "Should we use Kafka?" (Solution before problem)

Good: "What's the throughput and ordering requirement for the event stream?" (Uncovers requirement that drives tech choice)

Bad: "Do we need microservices?" (Leading, binary)

Good: "How many teams will work on this? Do they need independent deploy?" (Reveals org context for architecture)

Bad: "What database?" (Premature)

Good: "What's the consistency requirement? Strong or eventual?" (Drives DB choice)


Reframing Vague Problems

The Pattern

  1. Restate the problem in your own words
  2. Identify the core challenge
  3. Propose a narrowed scope for the discussion
  4. Confirm with the interviewer

Example: "Design a Feed"

Vague: "Design a feed like Twitter."

Reframe: "So we're building an activity feed where users see posts from people they follow, sorted by time. I'll assume we're optimizing for read latency and scale, and we can discuss algorithmic ranking if we have time. Does that match?"

Why it helps: You've made scope concrete. You've stated assumptions. You've given the interviewer a chance to correct. You've prioritized (read latency, scale).

Example: "Design a URL Shortener"

Vague: "Design TinyURL."

Reframe: "We're creating short links that redirect to long URLs. Key operations: create short URL, redirect. I'll assume we need analytics (clicks) and high redirect throughput. Should we also handle custom short URLs or keep it random only?"

Why it helps: You've listed core operations. You've called out a common extension (analytics). You've asked about a scope question (custom URLs) that affects design.


Identifying the Real Problem vs the Stated Problem

The Stated Problem

What the interviewer or stakeholder says: "Design a notification system."

The Real Problem

What they often mean:

  • "Design a system that sends emails and push notifications reliably"
  • "Design for scale (millions of users)"
  • "Design so we can add new channels (SMS, in-app) later"
  • "Design for low latency (notify within seconds)"

How to Uncover the Real Problem

  1. Ask about success: "How do we know this works? What would failure look like?"
  2. Ask about priorities: "If we had to choose between latency and throughput, which matters more?"
  3. Ask about history: "What's broken with the current approach?"
  4. Ask about future: "What might we add in 6 months?"

Example: "Design a Search Engine"

Stated: Design a search engine.

Real problem might be:

  • Full-text search over product catalog (different from web search)
  • Autocomplete / typeahead (different from full results)
  • Relevant for our domain (ranking is custom)
  • Scale: millions of documents (not billions like Google)

Senior move: "When you say search engine, do you mean full-text search over our product catalog, or more like autocomplete as users type? And what's the scale—millions of documents or more?" — Narrows the problem before designing.


Recognizing Premature Optimization

What It Is

Optimizing for a problem you don't have yet. Choosing complex solutions "for scale" when scale is uncertain.

Red Flags

  • "We'll need microservices for scale" (when scale is 10K users)
  • "We need Kafka" (when a queue would do)
  • "We need to shard from day one" (when single DB handles load)
  • "We need multi-region" (when single region works)

Senior Approach

  1. State the assumption: "I'm assuming we're at 1M users. If we were at 100M, I'd change X."
  2. Design for current, plan for growth: Simple now, with a path to scale
  3. Identify the scaling trigger: "When we hit X, we'd add Y"
  4. Defer until needed: "We can add caching later if DB becomes a bottleneck"

Interview Example

Interviewer: "Design a paste-sharing service like Pastebin."

Junior: "I'll use Cassandra for write scale, Redis for caching, Kafka for async processing..."

Senior: "Let me clarify scale. For an MVP, we might have 100K pastes. A single Postgres instance can handle that. I'll start with Postgres and add caching if we see read load. If we hit millions of pastes and high write throughput, we'd consider Cassandra. Does that align with the scale we're designing for?"

Why it's better: Senior didn't over-engineer. Senior stated assumptions. Senior has a path to scale. Senior invited correction.


Interview Examples: Good vs Bad Clarifying Flow

Bad Flow

Candidate: "I'll use microservices. Here's the architecture..." (Jumps to solution)

Interviewer: (Thinks: They didn't ask about scale, consistency, or constraints. This might be over-engineered or wrong.)

Good Flow

Candidate: "Before I dive in, a few questions. What scale are we targeting—users and requests per second? Is this read-heavy or write-heavy? Any latency or availability requirements? And what's in scope for v1—just core paste and retrieve, or also expiration and analytics?"

Interviewer: "10M pastes, 100K redirects per day. Read-heavy. p99 under 100ms. v1 is create, retrieve, optional expiration. Analytics can be phase 2."

Candidate: "Got it. So we're read-heavy, 100K/day is about 1–2 requests per second—very manageable. I'll design for that with room to scale. Single DB + cache should work. Let me walk through the design..."

Why it's better: Candidate scoped the problem. Candidate didn't over-engineer. Candidate tailored the solution to the actual requirements.


Thinking Aloud Like a Senior Engineer

Problem: "Design a rate limiter."

My first instinct: "Redis with sliding window. Or token bucket. Done."

But wait—that's a solution. Let me frame the problem first.

Questions I'd ask:

  • "Rate limit at what level? Per user, per IP, per API key?"
  • "What's the limit? 100 req/min? Configurable?"
  • "Where does this sit? API gateway? Per service?"
  • "What happens when exceeded? 429? Queue? Reject?"
  • "Distributed or single node? Do we need consistency across nodes?"

Reframe: "So we need a distributed rate limiter, likely per user, that returns 429 when exceeded. We need it at the API layer. I'll assume we need accuracy (can't exceed limit) and we have multiple API servers, so we need a shared store like Redis. Does that match?"

Now I can design: Redis with sliding window or token bucket. Single Redis or distributed? Depends on scale. For 10K RPS, one Redis can do it. For 100K, we might need sharding by user. I'll start with single Redis and mention the scaling path.


Best Practices

  1. Ask 3–5 questions before designing
  2. Reframe and confirm to ensure shared understanding
  3. Separate stated from real problem—ask about success and priorities
  4. Avoid premature optimization—design for stated scale, plan for growth
  5. Name assumptions so they can be corrected

Summary

Ambiguity handling and problem framing:

  • Ask clarifying questions in scope, scale, constraints, priorities
  • Reframe the problem in your words and confirm
  • Identify the real problem behind the stated one
  • Recognize premature optimization—defer until you have evidence
  • State assumptions so the interviewer can correct you

FAQs

Q: How many questions is too many?

A: 3–5 is usually right. More than 7 can feel like stalling. Prioritize: scope, scale, and one constraint. You can ask more as you design.

Q: What if the interviewer says "use your judgment"?

A: State your assumptions: "I'll assume X. If it were Y, I'd change Z." Then proceed. They want to see you make reasonable assumptions, not get stuck.

Q: How do I avoid sounding like I'm stalling?

A: Bundle questions: "A few quick scope questions: scale, read/write ratio, and latency target?" Then design. Questions should take 1–2 minutes, not 10.

Keep exploring

Design thinking works best when combined with practice. Explore more topics or apply what you've learned in our system design practice platform.