← DoorDash Interview Insights

DoorDash·Software Engineer·Onsite - System Design / Architecture·Senior

Senior
Jul 2026

Summary

DoorDash frontend-heavy system design round that was way more CSS architecture than I expected. They wanted a full Bootstrap-like utility class system built from scratch, which sounds like a fun side project until you're doing it live with someone watching.

Questions Asked (3)

Q1

Build a responsive grid layout and form using your own Bootstrap-like utility classes, without any external CSS frameworks. Cover mobile-first breakpoints, gutters, nesting, and reusable classes like container, row, and col-*.

System DesignTechnical Trade-offs
Author's notes

I spent too long on the column math and not enough time explaining my breakpoint strategy out loud.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and constraints, then outline a mobile-first architecture using CSS custom properties and a 12-column grid. Explain how you would implement container, row, and col-* classes with breakpoints, gutters, and nesting, and discuss trade-offs like specificity, performance, and maintainability.

Pro tip: Emphasize that you would use CSS custom properties for breakpoints and gutters to make the system easily themeable and maintainable, and mention how you would handle edge cases like nested rows and responsive gutters without bloating the CSS.

1. Clarify Requirements and Constraints

Ask about browser support, desired breakpoints, whether a build step is allowed, and any performance or accessibility requirements. Confirm that the goal is to replicate Bootstrap-like utilities without external frameworks.

2. Design the Grid System

Define a mobile-first 12-column grid using CSS Grid or Flexbox. Use CSS custom properties for breakpoints and gutters, and plan classes like .container, .row, and .col-{breakpoint}-{size}.

3. Implement Core Utilities

Write the CSS for container (max-width, padding), row (display: flex, flex-wrap, negative margins for gutters), and columns (flex-basis, max-width, padding for gutters). Include responsive modifiers via media queries.

4. Handle Nesting and Gutters

Explain how nested rows work by resetting negative margins and ensuring columns inside columns behave correctly. Discuss gutter strategies: padding on columns with negative margins on rows, or CSS Grid gap.

5. Discuss Trade-offs and Extensibility

Compare Flexbox vs CSS Grid, talk about specificity and class naming, and how to keep the system reusable and scalable. Mention potential performance impacts and how to mitigate them.

Key Points to Mention

  • Mobile-first approach: base styles for small screens, then min-width media queries for larger breakpoints.
  • Use of CSS custom properties for breakpoints, gutters, and column counts to enable easy customization.
  • Implementation of container with responsive max-widths and auto margins for centering.
  • Row as a flex container with negative margins to offset column padding for gutters.
  • Column classes using flex-basis and max-width percentages, with responsive modifiers (e.g., .col-md-6).
  • Nesting: how nested rows and columns interact, and resetting margins/padding appropriately.
  • Trade-offs: Flexbox vs CSS Grid, specificity management, and performance considerations.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q2

Using your utility class system, build accessible components including a navbar, buttons, inputs, and validation messages. Demonstrate semantic HTML and accessibility considerations.

System DesignAPI & Integrations
Author's notes

Accessibility is one of those things I think I know better than I actually do.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by outlining the utility class system's design tokens (spacing, colors, typography) and how they map to component styles. Then, walk through building each component with semantic HTML and ARIA attributes, explaining how the utility classes enable consistent, accessible styling. Finally, demonstrate validation messages with proper live regions and error associations.

Pro tip: Emphasize that accessibility is not an afterthought but integrated into the utility system—e.g., using utility classes to enforce focus styles and color contrast. Also, mention testing with screen readers and automated tools like axe to show practical validation.

1. Define Utility System Foundations

Explain the utility class system's tokens for spacing, color, typography, and states (focus, hover, disabled). Highlight how these tokens ensure consistency and accessibility (e.g., color contrast ratios).

2. Build Semantic Navbar

Use <nav> with aria-label, <ul> for links, and skip-to-content link. Apply utility classes for layout and focus styles, ensuring keyboard navigability.

3. Create Accessible Buttons and Inputs

For buttons, use <button> with clear labels and utility classes for states. For inputs, use <label> with for attribute, and utility classes for error/success states. Include aria-describedby for validation messages.

4. Implement Validation Messages

Use aria-live regions for dynamic errors, associate messages with inputs via aria-describedby, and style with utility classes. Ensure messages are announced by screen readers.

5. Test and Iterate

Mention testing with keyboard navigation, screen readers (e.g., NVDA, VoiceOver), and automated tools (axe, Lighthouse). Use utility classes to quickly adjust styles based on feedback.

Key Points to Mention

  • Semantic HTML elements (nav, button, label, input) and their importance for accessibility.
  • ARIA attributes (aria-label, aria-describedby, aria-live) and when to use them.
  • Utility class system design: tokens for spacing, color, typography, and states.
  • Focus management and keyboard navigation (tab order, focus indicators).
  • Color contrast and visual accessibility (WCAG compliance).
  • Testing methodologies: screen readers, automated tools, and manual checks.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q3

Design robust error handling for a form with async submission, covering user-facing states like loading, success, retryable errors, and non-retryable errors, plus how you'd instrument telemetry around these.

System DesignTechnical Trade-offsProduct Analytics & Metrics
Author's notes

This follow-up was the more interesting part of the interview.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and constraints, then walk through the form submission lifecycle, explicitly defining each state and the transitions between them. For each state, describe the UI treatment, error classification (retryable vs non-retryable), and the telemetry events you'd emit to measure success and failure. Conclude by discussing trade-offs and how you'd validate the design.

Pro tip: Tie your telemetry to business metrics like order completion rate and show how you'd use it to detect and diagnose issues in production. Also, mention idempotency keys to prevent duplicate submissions on retry, which is critical for payment flows.

1. Clarify Requirements and Constraints

Ask about the form's purpose (e.g., payment, signup), expected load, and any compliance requirements. Confirm the async submission mechanism (e.g., REST API, GraphQL) and whether offline support is needed.

2. Define States and Transitions

Enumerate all possible states: idle, validating, submitting, success, retryable error, non-retryable error, and timeout. Describe how the UI reflects each state and the allowed transitions (e.g., from submitting to retryable error, then back to submitting on retry).

3. Design Error Handling and Retry Logic

Classify errors into retryable (network, 5xx, 429) and non-retryable (4xx validation, 401, 403). Specify retry strategies (exponential backoff with jitter, max attempts) and how to surface errors to users with clear messaging and recovery actions.

4. Instrument Telemetry and Monitoring

Define key events (submission_started, submission_succeeded, submission_failed) with properties like error_type, retry_count, latency, and form_id. Explain how to aggregate these into metrics (success rate, error rate, p95 latency) and set up alerts.

5. Discuss Trade-offs and Validation

Address trade-offs such as optimistic UI vs. pessimistic, retry aggressiveness vs. server load, and telemetry granularity vs. privacy. Describe how you'd test the design (unit, integration, chaos) and iterate based on telemetry.

Key Points to Mention

  • Idempotency keys to ensure retries don't create duplicate submissions
  • Exponential backoff with jitter for retries to avoid thundering herd
  • User-facing error messages that are actionable and non-technical
  • Telemetry events with context (error codes, latency, retry count) for debugging
  • Monitoring dashboards and alerts for submission success rate and latency
  • Accessibility considerations for loading and error states (ARIA live regions)

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.