Loading content...
If iteration is the engine of design improvement, feedback is the fuel. Without external input, your iterations are powered only by your own perspective—a perspective that, no matter how experienced, has blind spots.
The best designers actively seek feedback from multiple sources, evaluate it systematically, and incorporate it thoughtfully. They understand that feedback isn't criticism to defend against but information that accelerates learning and improves outcomes.
This page explores the art and science of feedback incorporation—a skill that distinguishes good designers from great ones.
By the end of this page, you will understand where valuable feedback comes from, how to evaluate feedback without emotional reaction, and how to incorporate feedback systematically into your design process. You'll learn to treat feedback as a design accelerant rather than a threat.
Design feedback comes from multiple sources, each offering different perspectives and value. Understanding these sources helps you proactively seek the right kind of feedback at the right time.
The Feedback Ecosystem:
Think of design feedback as coming from concentric circles, each with distinct characteristics:
| Source | What They See | Value They Provide | When to Seek |
|---|---|---|---|
| Yourself (Self-Review) | Internal consistency, completeness, obvious issues | First-pass quality control, catches obvious mistakes | Immediately after drafting, before showing others |
| Peers / Fellow Engineers | Technical details, implementation concerns, code-level issues | Practical feasibility, pattern recognition, alternative approaches | After self-review, during early design phase |
| Senior Engineers / Architects | Strategic fit, system-wide implications, non-obvious trade-offs | Experience-based insights, organizational context, long-term vision | After peer feedback, when design is taking shape |
| Product / Domain Experts | Business logic accuracy, use case coverage, domain subtleties | Requirements validation, edge case identification, priority guidance | Throughout design, especially for domain model validation |
| The Requirements Themselves | Gaps in understanding, ambiguities, missing constraints | Clarity on scope, boundary conditions, success criteria | Continuously—requirements are a dialogue, not a document |
| Future Maintainers (Imagined) | Clarity, documentation, cognitive load, onboarding difficulty | Simplicity pressure, documentation needs, team scalability | During documentation phase, when evaluating complexity |
Self-Review: The First Feedback Loop
Before seeking external feedback, conduct a thorough self-review. This isn't just about catching typos—it's about engaging critically with your own work.
Effective self-review questions:
If time permits, let your design sit for a day before self-reviewing. Fresh eyes—even your own—catch issues that urgency blinds you to. This 'time gap' is one of the most effective self-review techniques available.
Peer Feedback: The Engineering Lens
Peer engineers provide a technical perspective that's invaluable for catching implementation concerns and identifying alternative approaches. They see your design through the lens of "how would I build this?"
What peers are good at catching:
What peers might miss:
Senior/Architect Feedback: The Strategic Lens
Senior engineers and architects bring experience that's hard to replicate. They've seen patterns succeed and fail across multiple projects and understand how local design decisions impact system-wide properties.
What senior engineers and architects are good at catching:
How to approach them:
Each feedback source has strengths and blind spots. A peer might catch a testing issue that a senior architect wouldn't notice. A domain expert might identify a business logic flaw that no engineer would catch. Seek diverse feedback, not just convenient feedback.
Getting valuable feedback isn't just about asking for it—it's about creating conditions where honest, useful feedback can emerge. This requires deliberate effort on your part.
The Feedback Paradox:
People are naturally reluctant to give negative feedback. They worry about hurting relationships, being wrong, or the effort of a potential conflict. As a result, the default feedback you receive will often be too positive—not because your design is perfect, but because people are being polite.
To get genuinely useful feedback, you need to actively work against this tendency.
Techniques for eliciting honest feedback:
The Anti-Patterns of Seeking Feedback:
Just as there are good techniques, there are practices that shut down useful feedback:
| Anti-Pattern | Why It Fails | Better Approach |
|---|---|---|
| Presenting design as final | Implies feedback isn't welcome; decisions already made | Present as draft; emphasize you're seeking input |
| Getting defensive immediately | Punishes honest feedback; trains people to be vague | Thank them first; engage with the substance later |
| Asking only sympathetic reviewers | Creates echo chamber; misses critical issues | Seek out skeptics and people with different perspectives |
| Ignoring feedback visibly | Discourages future input; wastes reviewer's time | Acknowledge all feedback; explain what you adopted and why |
| Asking when too finished | Too late to change; feedback becomes frustrating | Seek feedback early, when changes are still easy |
| Overwhelming with detail | Reviewer can't identify what's important | Summarize key decisions; let them drill down if interested |
The earlier you seek feedback, the more valuable it is. Feedback on a sketch is easy to incorporate; feedback on a detailed design requires more rework. Don't polish before sharing—share early and often.
Not all feedback is created equal. Some is insightful and actionable; some is based on misunderstanding; some reflects personal preferences rather than objective quality. The skill lies in evaluating feedback systematically rather than reacting emotionally.
The Feedback Evaluation Framework:
When receiving feedback, process it through a structured filter:
123456789101112131415161718192021222324252627282930313233
// For each piece of feedback, evaluate across these dimensions: interface FeedbackEvaluation { // 1. UNDERSTANDING // Does the reviewer understand the context correctly? correctContextualUnderstanding: boolean; clarificationNeeded: string[]; // 2. VALIDITY // Is the concern technically valid? technicallyValid: boolean; evidenceProvided: string[]; // 3. RELEVANCE // Does the concern apply to our constraints? relevantToOurContext: boolean; assumptionsMade: string[]; // 4. SEVERITY // How important is this issue? severity: 'critical' | 'major' | 'minor' | 'nitpick'; impactIfIgnored: string; // 5. ACTIONABILITY // Can we do something about it? actionable: boolean; suggestedAction: string; costToAddress: 'low' | 'medium' | 'high'; // 6. DECISION decision: 'implement' | 'defer' | 'discuss further' | 'acknowledge but decline'; rationale: string;}Let's walk through each dimension:
1. Understanding
First, check whether the reviewer understood the context correctly. Feedback based on misunderstanding isn't invalid—it indicates a communication problem—but the solution might be clarification rather than design change.
Example: "You should use a queue here instead of calling directly."
Check: Does the reviewer know about the latency requirements that make async processing unsuitable? If not, the feedback indicates you need to document your constraints better, not necessarily change the design.
2. Validity
Assume the reviewer understood correctly. Is the concern technically valid? Would the issue they describe actually occur?
This requires separating the technical claim from the suggested solution. A reviewer might correctly identify a problem but suggest an impractical solution. The problem identification is valid even if the solution isn't.
3. Relevance
Valid concerns might not be relevant to your specific context. A concern about handling 10 million users might not apply to an internal tool with 50 users. A concern about database deadlocks might not apply if your operations are read-only.
Be honest here—don't dismiss valid concerns as irrelevant just because addressing them is inconvenient.
4. Severity
For relevant, valid concerns, assess impact:
5. Actionability
Can you actually address this concern given your constraints? Consider:
Some valid concerns are best documented as "known limitations" rather than addressed, especially when addressing them would introduce disproportionate complexity.
6. Decision
Based on your evaluation, decide:
For any feedback you don't implement, document why. This isn't defensiveness—it's creating a record of considered trade-offs. Six months from now, when someone raises the same concern, you can point to the documented reasoning rather than re-evaluating from scratch.
How you respond to feedback affects both the current design process and your reputation as a collaborator. Professional response to feedback is a skill that compounds over time.
The First Response:
Whatever your internal reaction to feedback, your visible first response should be positive:
Even if you ultimately disagree with the feedback, this initial response creates space for productive discussion.
The Middle: Engaging with Substance
After acknowledging the feedback, engage with its substance:
The Closing: Confirming Resolution
Feedback discussions should have clear endings:
Handling Feedback You Disagree With:
Disagreement is healthy, but how you handle it matters:
How you handle feedback today affects what feedback you receive tomorrow. Engineers who respond professionally to criticism build reputations as collaborative designers—and receive more (and better) feedback. Those who respond defensively find their requests for review politely declined or answered with superficial praise.
Once you've evaluated and accepted feedback, you need to incorporate it effectively into your design. This requires technique, especially when feedback suggests fundamental changes.
Levels of Feedback Incorporation:
Feedback can require changes at different levels of the design. Recognizing the level helps you scope the work:
| Level | Examples | Scope of Change | Approach |
|---|---|---|---|
| Surface | Naming, documentation, diagram clarity | Minimal, cosmetic | Quick fixes, no architectural impact |
| Local | Method signature, class responsibility detail | Single class or small cluster | Evaluate impact on immediate collaborators |
| Pattern | Strategy vs Template Method, Observer vs Callbacks | Multiple classes, relationship changes | Re-evaluate pattern applicability; may require restructuring |
| Structural | Entity model, core abstractions | Design-wide impact | May require significant rework; consider if scope allows |
| Foundational | Core assumptions about the problem | Complete redesign | Step back; question requirements understanding; restart if needed |
Technique: Incremental Integration
When feedback requires substantial change, don't try to address it all at once. Use incremental integration:
This approach prevents the common failure of over-reaching changes that introduce new problems while solving old ones.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
// Feedback: "Your OrderProcessor has too many responsibilities. // It handles validation, pricing, inventory, and notifications." // WRONG: Try to fix everything at once// This leads to rushed abstractions and new bugs // RIGHT: Incremental integration // Iteration 1: Extract validation (the clearest concern)class OrderValidator { validate(order: Order): ValidationResult { /* ... */ }} class OrderProcessor { constructor(private validator: OrderValidator) {} process(order: Order): void { const validation = this.validator.validate(order); // ... rest stays the same for now }} // Iteration 2: Extract pricing (next clearest)class PricingCalculator { calculate(items: OrderItem[], discounts: Discount[]): Price { /* ... */ }} // Iteration 3: Extract inventoryclass InventoryReserver { reserve(items: OrderItem[]): ReservationResult { /* ... */ }} // Iteration 4: Extract notificationsclass OrderNotifier { notifyOrderPlaced(order: Order): void { /* ... */ }} // Final: OrderProcessor orchestratesclass OrderProcessor { constructor( private validator: OrderValidator, private pricer: PricingCalculator, private inventory: InventoryReserver, private notifier: OrderNotifier ) {} process(order: Order): ProcessingResult { const validation = this.validator.validate(order); if (!validation.isValid) return ProcessingResult.failed(validation); const reservation = this.inventory.reserve(order.items); if (!reservation.success) return ProcessingResult.failed(reservation); const price = this.pricer.calculate(order.items, order.discounts); order.setFinalPrice(price); this.notifier.notifyOrderPlaced(order); return ProcessingResult.success(order); }}Tracking Feedback Incorporation:
For designs that receive substantial feedback, maintain a simple tracking document:
1234567891011121314151617
# Design Feedback Log: Order Processing System ## Reviewed by: Sarah Chen (Senior Engineer) - 2024-01-15 | # | Feedback | Severity | Decision | Status | Notes ||---|----------|----------|----------|--------|-------|| 1 | OrderProcessor has too many responsibilities | Major | Implement | Done | Extracted 4 classes || 2 | Consider async for notifications | Minor | Defer | Documented | V2 if latency becomes issue || 3 | Missing retry logic for inventory | Major | Implement | Done | Added RetryableReserver || 4 | Naming: 'process' is too vague | Minor | Implement | Done | Renamed to 'submitOrder' | ## Reviewed by: Product Owner - 2024-01-16 | # | Feedback | Severity | Decision | Status | Notes ||---|----------|----------|----------|--------|-------|| 5 | Need to support partial orders | Major | Discuss | Pending | Clarifying with stakeholders || 6 | Gift orders need different flow | Major | Implement | In Progress | Adding OrderType abstraction |Your feedback log is valuable design documentation. It shows future maintainers that the design was reviewed, what concerns were raised, and how they were addressed. This builds confidence in the design and prevents relitigating settled decisions.
In LLD interviews, the interviewer's questions and comments are feedback. How you receive and incorporate that feedback is a major part of what's being evaluated.
Interview Feedback Patterns:
Interviewers provide feedback in various forms, each requiring a different response:
Demonstrating Feedback Receptiveness:
Good candidate behavior:
Concerning candidate behavior:
Interviewers are simulating what it would be like to work with you. If you're defensive about feedback in a 45-minute interview, they'll assume you're defensive in day-to-day work. Being coachable is often as important as being correct.
When You Disagree with Interview Feedback:
Sometimes an interviewer's suggestion isn't actually better. You can respectfully disagree, but how you do it matters:
Remember: the interviewer might be testing whether you can disagree professionally, or they might be testing whether you can follow guidance. Either way, being collaborative is correct.
Feedback incorporation is a skill that amplifies your design abilities. Let's consolidate the key insights:
What's Next:
With iteration and feedback covered, we now turn to one of the most nuanced skills in design: making trade-off decisions. Every non-trivial design involves trade-offs between competing concerns. The next page explores how to recognize, evaluate, and decide on trade-offs with confidence.
You now understand how to gather, evaluate, and incorporate feedback systematically. This skill accelerates your growth as a designer by leveraging the perspectives of others. In the next page, we'll tackle the art of making explicit trade-off decisions.