Design Uber
Problem Statement
Design a system like Uber. The system should be highly available, scalable to millions of users, and handle the core use cases including driver matching, real-time gps, surge pricing, trip lifecycle.
Step 1 — Clarifying Questions
Start by asking the right questions to narrow scope. What is the expected user base? What are the latency requirements? Read vs write ratio? Geographic distribution?
Step 2 — Requirements
Define functional requirements (core features the system must support) and non-functional requirements (scale, performance, availability, consistency).
Step 3 — Capacity Estimation
Calculate QPS, storage requirements, bandwidth needs, and memory requirements. Work through the numbers with real estimates to size the system properly.
Step 4 — High-Level Design
Draw the architecture — clients, load balancers, application servers, caches, databases, message queues. Every component justified with a reason.
High-level architecture diagram
Interactive, zoomable system diagram with annotated components
Step 5 — Deep Dives
Explore key technical decisions: database choice, caching strategy, data model design, specific algorithms, consistency guarantees, failure handling.
Step 6 — Trade-offs & Alternatives
Discuss alternatives considered, why you chose one approach over another, and what you'd change if requirements shifted.
Common Mistakes
- ×Not clarifying requirements upfront — jumping straight to solution
- ×Over-engineering the initial design with unnecessary complexity
- ×Ignoring non-functional requirements like scalability and availability
- ×Not discussing trade-offs between different approaches
- ×Forgetting to estimate capacity and size the system properly
Practice this in mock interview mode
Premium: 45-minute timed session with hidden answers and rubric evaluation.
Get Premium →