← Uber Interview Insights

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

Senior
May 2026

Summary

Uber system design round for a software engineer role. The whole thing was one long deep-dive into a meeting scheduling system, and they really did go through every layer from data model to concurrency to capacity math.

Questions Asked (8)

Q1

Design a meeting scheduling system for a large organization, including APIs for creating, updating, and cancelling both single and recurring meetings.

System DesignAPI & IntegrationsData Modeling
Author's notes

The recurring meetings part is where I started to drift.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying functional and non-functional requirements, such as scale, recurrence rules, and conflict handling. Then design the data model and APIs for single and recurring meetings, explaining how recurrence is stored and expanded. Finally, discuss scalability, availability, and trade-offs in your design.

Pro tip: Demonstrate maturity by explicitly addressing how you would handle updates and cancellations for recurring meetings—e.g., whether changes apply to a single instance, all future instances, or the entire series—and discuss the data model implications.

1. Clarify Requirements

Ask about scale (number of users, meetings per day), recurrence patterns (daily, weekly, custom), conflict resolution, time zones, and integration with existing systems like calendars.

2. Design Data Model

Define entities: User, Meeting, RecurrenceRule, and MeetingInstance. Explain how recurring meetings are stored (e.g., RRULE) and how exceptions/overrides are handled.

3. Define APIs

Specify RESTful endpoints for creating, updating, and cancelling single and recurring meetings, including parameters for recurrence scope (single instance, this and future, all).

4. Address Scalability and Reliability

Discuss partitioning, caching, asynchronous processing for notifications, and handling high read/write loads. Mention conflict detection and resolution strategies.

5. Discuss Trade-offs and Extensions

Talk about trade-offs between consistency and availability, and potential extensions like integration with video conferencing, reminders, and analytics.

Key Points to Mention

  • Use of iCalendar RRULE standard for recurrence representation
  • Handling of exceptions and overrides for recurring meetings
  • API design for scope of updates/cancellations (single instance vs. series)
  • Time zone handling and daylight saving time
  • Conflict detection and resolution (e.g., double-booking)
  • Scalability considerations: sharding by user or organization, caching frequently accessed data

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

Q2

How would you prevent double-booking of attendees and rooms, and how does your conflict detection algorithm work under concurrent requests?

System DesignTechnical Trade-offsAlgorithms & Data Structures
Author's notes

This is where it got interesting.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the requirements and scale, then propose a layered approach: use database transactions with proper isolation levels or optimistic concurrency control to prevent double-booking, and design a conflict detection algorithm that checks for overlapping time intervals. Explain how you handle concurrent requests using locking, versioning, or distributed locks, and discuss trade-offs between consistency and availability.

Pro tip: Mention that you would use a unique constraint or a conditional write (e.g., INSERT ... WHERE NOT EXISTS) to enforce atomicity at the database level, and consider using a distributed lock service like Redis or ZooKeeper for cross-service coordination. Also, highlight the importance of idempotency keys to handle retries safely.

1. Clarify Requirements and Scale

Ask about the expected number of concurrent users, the acceptable latency, and whether the system is distributed. This helps determine the appropriate consistency model and locking strategy.

2. Design Data Model and Constraints

Propose a schema that includes time ranges for bookings and unique constraints on resources (e.g., room ID, attendee ID) for a given time slot. Mention using database-level constraints to prevent duplicates.

3. Implement Conflict Detection Algorithm

Describe an algorithm that checks for overlapping intervals: for a new booking, query existing bookings for the same resource and check if any overlap. Explain how to do this efficiently with indexing and range queries.

4. Handle Concurrency

Discuss concurrency control mechanisms: optimistic locking (version numbers), pessimistic locking (SELECT FOR UPDATE), or distributed locks. Explain how to avoid race conditions and ensure atomicity.

5. Discuss Trade-offs and Failure Modes

Compare approaches: optimistic vs pessimistic locking, centralized vs distributed locks, and their impact on performance, scalability, and consistency. Mention how to handle failures and retries.

Key Points to Mention

  • Database transactions with ACID properties and appropriate isolation levels (e.g., SERIALIZABLE or REPEATABLE READ).
  • Optimistic concurrency control using version numbers or timestamps to detect conflicts at commit time.
  • Pessimistic locking with SELECT FOR UPDATE to lock rows during the booking process.
  • Distributed locking using Redis, ZooKeeper, or etcd for cross-service coordination.
  • Interval overlap detection using efficient data structures (e.g., interval trees) or database range queries.
  • Idempotency keys to ensure retries do not create duplicate bookings.

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

Q3

How would you implement a free/busy query to find the earliest available time slot across N participants, accounting for time zones and room constraints?

Algorithms & Data StructuresSystem Design
Author's notes

Normalize everything to UTC first, then it's basically an interval merge problem across N sorted lists.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements (e.g., meeting duration, working hours, room features) and then outline a solution that normalizes all busy intervals to UTC, merges them, and scans for gaps that satisfy constraints. Discuss how to incorporate room availability by treating rooms as additional participants with their own busy intervals.

Pro tip: Mention that you would handle edge cases like DST transitions and overlapping intervals by converting to UTC and using half-open intervals [start, end) to avoid off-by-one errors. Also, suggest precomputing and caching busy times for frequently queried participants to improve performance.

1. Clarify Requirements

Ask about meeting duration, participant working hours, room requirements (capacity, equipment), and whether the query is one-time or recurring.

2. Normalize and Merge Busy Times

Convert all busy intervals to a common time zone (UTC), then merge overlapping intervals for each participant and room to create a unified busy schedule.

3. Find Available Slots

Scan the merged busy intervals to identify gaps of at least the required duration, considering working hours and room availability.

4. Optimize and Scale

Discuss data structures (e.g., interval trees, priority queues) and techniques (e.g., caching, parallel processing) to handle large N efficiently.

5. Handle Edge Cases

Address DST changes, partial overlaps, and constraints like buffer times between meetings or room setup/teardown.

Key Points to Mention

  • Time zone normalization to UTC and handling DST transitions
  • Interval merging and gap-finding algorithms (e.g., sweep line, interval trees)
  • Room constraints as additional busy intervals with specific attributes
  • Data structures for efficient querying (e.g., segment trees, priority queues)
  • Caching and precomputation for frequently accessed calendars
  • Scalability considerations for large N (e.g., distributed processing, indexing)

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

Q4

Walk through your data model: what tables or collections would you use, what are the key fields, and would you choose SQL or NoSQL here?

Data ModelingTechnical Trade-offsSystem Design
Author's notes

I went SQL for the core booking and availability data because of the transactional requirements, and floated a NoSQL store for audit logs and notification queues.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the specific domain (e.g., rides, trips, payments) and the access patterns, then propose a hybrid data model that uses SQL for transactional integrity and NoSQL for high-volume, low-latency needs. Walk through the core entities, their key fields, and how they relate, explicitly justifying each storage choice based on scale, consistency, and query patterns.

Pro tip: Uber’s scale demands a polyglot persistence approach—don’t default to a single database. Show you understand that different microservices (e.g., payments vs. driver location) have different data modeling requirements, and mention how you’d handle schema evolution and denormalization for performance.

1. Clarify scope and access patterns

Ask which part of Uber’s system you’re modeling (e.g., trips, drivers, payments) and identify the primary read/write patterns, volume, and latency requirements. This ensures your model addresses the actual problem.

2. Identify core entities and relationships

List the main entities (e.g., Rider, Driver, Trip, Payment) and their relationships (one-to-many, many-to-many). This forms the foundation for both SQL and NoSQL designs.

3. Define key fields and indexes

For each entity, specify essential fields (e.g., trip_id, rider_id, driver_id, status, timestamps) and the indexes needed to support frequent queries. Highlight fields that require uniqueness or foreign-key-like constraints.

4. Choose SQL vs. NoSQL per entity

Justify the storage choice for each entity based on consistency, scale, and query flexibility. For example, use SQL for payments (ACID) and NoSQL for driver location updates (high write throughput, eventual consistency).

5. Address trade-offs and scaling

Discuss trade-offs like normalization vs. denormalization, sharding strategies, and how you’d handle cross-entity queries in a distributed system. Mention caching or materialized views if needed.

Key Points to Mention

  • Polyglot persistence: using both SQL (e.g., PostgreSQL) and NoSQL (e.g., Cassandra, DynamoDB) where appropriate.
  • Access patterns drive design: e.g., geospatial queries for driver locations, time-series for trip events.
  • Consistency requirements: ACID for payments vs. eventual consistency for location updates.
  • Denormalization and indexing strategies to optimize read performance at scale.
  • Sharding and partitioning keys to distribute load (e.g., shard by city or rider_id).
  • Schema evolution and handling migrations in a microservices architecture.

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

Q5

How would you shard and index this system for multi-tenant scale?

System DesignTechnical Trade-offs
Author's notes

Sharding by tenant ID felt obvious and I said so, then talked about secondary indexes on user ID and time range for the free/busy queries.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the multi-tenant requirements: data volume, access patterns, isolation needs, and scale targets. Then propose a sharding strategy (e.g., tenant-based or composite key) and indexing approach (e.g., tenant-prefixed indexes) that balances performance, isolation, and operational simplicity. Discuss trade-offs and how you would handle hotspots, rebalancing, and cross-tenant queries.

Pro tip: At Uber scale, sharding by tenant alone often creates hotspots; consider sharding by a composite key like (tenant_id, user_id) or using consistent hashing with virtual nodes to distribute load evenly. Also, mention that indexes should be tenant-aware to avoid cross-tenant performance interference.

1. Clarify Requirements

Ask about tenant size distribution, read/write patterns, isolation requirements, and expected growth. This ensures your design addresses the actual scale and constraints.

2. Choose Sharding Key

Evaluate tenant_id vs. composite keys (e.g., tenant_id + entity_id) based on access patterns. Discuss how the choice affects data distribution, query routing, and hotspot mitigation.

3. Design Indexing Strategy

Propose tenant-prefixed indexes to keep tenant data localized and avoid cross-tenant scans. Consider covering indexes and secondary indexes for common query patterns.

4. Address Operational Concerns

Explain how to handle rebalancing, resharding, and failure recovery. Mention tools like Vitess or custom sharding layers, and how to monitor for hotspots.

5. Discuss Trade-offs

Compare isolation vs. efficiency, complexity vs. scalability, and consistency vs. availability. Show awareness of Uber's specific challenges like geo-distribution and real-time needs.

Key Points to Mention

  • Tenant-based sharding with composite keys to avoid hotspots
  • Tenant-prefixed indexes and covering indexes for efficient queries
  • Consistent hashing and virtual nodes for even data distribution
  • Cross-tenant query handling and potential need for a separate analytics store
  • Resharding and rebalancing strategies with minimal downtime
  • Isolation levels (shared vs. dedicated resources) and their impact on performance and cost

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

Q6

Describe the full cancellation flow: how do you remove a meeting, propagate notifications, free resources, and keep an audit trail, and can you get cancel operations to O(log n)?

System DesignAlgorithms & Data StructuresAPI & Integrations
Author's notes

Soft delete with a status field, async notification fan-out via a message queue, and a separate audit table that never gets modified after insert.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the scope: is this a single meeting cancellation or a bulk operation? Then walk through the end-to-end flow: API endpoint, state transition, notification fan-out, resource cleanup, and audit logging. Finally, address the O(log n) requirement by proposing a data structure like a balanced BST or skip list for efficient lookup and deletion, and discuss trade-offs.

Pro tip: Emphasize idempotency and failure handling: cancellations must be safe to retry, and partial failures (e.g., notification service down) should not leave the system inconsistent. Mention using a saga or outbox pattern for reliability.

1. Clarify requirements and scope

Ask if cancellation is for a single meeting or a series, and whether it's user-initiated or system-triggered. Confirm expected scale (e.g., meetings per day) and consistency requirements.

2. Design the cancellation API and state transition

Define an endpoint (e.g., DELETE /meetings/{id}) that validates permissions and transitions the meeting to a 'cancelled' state. Ensure idempotency by checking if already cancelled.

3. Propagate notifications and free resources

Use an event-driven approach: publish a 'meeting.cancelled' event to a message queue, which triggers notifications (email, push) and resource cleanup (release rooms, calendars) asynchronously.

4. Maintain an audit trail

Write an immutable audit log entry with who, when, why, and what was cancelled. Store in a durable, append-only store (e.g., Kafka or database) for compliance and debugging.

5. Achieve O(log n) cancellation

Use a balanced BST or skip list keyed by meeting ID or start time to support O(log n) lookup and deletion. For range cancellations, use an interval tree. Discuss trade-offs vs hash tables (O(1) average but no ordering).

Key Points to Mention

  • Idempotency and retry safety: use idempotency keys or check state before mutating.
  • Event-driven architecture with message queues (e.g., Kafka) for decoupled notification and cleanup.
  • Audit trail requirements: immutable, tamper-evident, and queryable (e.g., using a ledger or append-only log).
  • Data structures for O(log n): balanced BST (e.g., Red-Black tree), skip list, or B-tree; compare with hash tables.
  • Handling partial failures: use outbox pattern or saga to ensure atomicity across services.
  • Scalability considerations: sharding by meeting ID or time, and using distributed locks if needed.

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

Q7

What are your nonfunctional requirements: expected QPS, latency targets, caching strategy, consistency trade-offs, and back-of-the-envelope capacity estimates?

System DesignTechnical Trade-offs
Author's notes

I blanked briefly on the capacity math and just started estimating out loud, which is the right move but felt messy.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the functional requirements and scale assumptions, then derive nonfunctional requirements from them. Walk through each dimension (QPS, latency, caching, consistency, capacity) with concrete numbers and trade-offs, justifying your choices based on the use case. Conclude by summarizing how these requirements shape the system design.

Pro tip: Always state your assumptions explicitly and show your math—interviewers care more about your reasoning process than exact numbers. Tie each nonfunctional requirement back to user experience and business impact to demonstrate product sense.

1. Clarify Functional Scope and Scale

Ask questions to understand what the system does, its expected user base, and growth projections. This sets the foundation for estimating QPS and capacity.

2. Estimate QPS and Capacity

Calculate peak and average QPS from daily active users and actions per user. Derive storage, bandwidth, and memory needs using back-of-the-envelope calculations.

3. Define Latency Targets

Set latency SLOs (e.g., p99 < 200ms) based on user expectations and industry benchmarks. Discuss how latency budgets are allocated across components.

4. Design Caching Strategy

Identify cacheable data, choose cache layers (client, CDN, application, database), and define eviction policies and TTLs. Explain how caching reduces latency and load.

5. Analyze Consistency Trade-offs

Discuss CAP theorem and choose between strong and eventual consistency for different data types. Explain how consistency choices affect latency, availability, and complexity.

Key Points to Mention

  • Peak vs. average QPS and how to handle traffic spikes (e.g., autoscaling, load shedding).
  • Latency percentiles (p50, p95, p99) and their impact on user experience.
  • Cache invalidation strategies and trade-offs between freshness and performance.
  • Consistency models (strong, eventual, causal) and their applicability to different features.
  • Back-of-the-envelope calculations for storage, bandwidth, and memory (e.g., using powers of 2).
  • How nonfunctional requirements influence architectural decisions (e.g., sharding, replication, CDN).

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

Q8

How do you handle idempotency, deduplication, and retry logic during create, update, and cancel operations?

System DesignAPI & IntegrationsTechnical Trade-offs
Author's notes

Idempotency keys on the request, stored in a dedup table with a short TTL.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by defining idempotency and its importance in distributed systems, then walk through each operation (create, update, cancel) with concrete strategies like idempotency keys, deduplication windows, and retry policies. Emphasize trade-offs between consistency, latency, and complexity, and tie your answer to real-world scenarios like payment processing or ride requests.

Pro tip: Mention that idempotency is not just about preventing duplicate operations but also about ensuring that retries after partial failures don't corrupt state—use examples like 'exactly-once' semantics via idempotent consumers and idempotent producers.

1. Define Idempotency and Its Scope

Explain what idempotency means in the context of APIs and distributed systems, and why it's critical for operations like create, update, and cancel. Clarify that idempotency ensures multiple identical requests have the same effect as a single request.

2. Apply Idempotency to Create Operations

Discuss using client-generated idempotency keys (e.g., UUIDs) stored server-side with a unique constraint. Explain how to handle duplicate requests by returning the original response or a conflict error, and mention deduplication windows to expire keys.

3. Handle Update and Cancel Operations

For updates, use versioning or conditional writes (e.g., ETags) to prevent lost updates. For cancels, treat them as idempotent by design—if already cancelled, return success. Discuss how to handle partial failures and retries with exponential backoff and jitter.

4. Design Retry Logic and Deduplication

Outline retry strategies: exponential backoff with jitter, max retries, and circuit breakers. Explain deduplication techniques like idempotency keys, request IDs, and message deduplication in queues (e.g., Kafka exactly-once semantics).

5. Address Trade-offs and Edge Cases

Discuss trade-offs: storage overhead for idempotency keys vs. consistency, latency vs. retry aggressiveness, and complexity vs. reliability. Mention edge cases like network partitions, timeouts, and concurrent duplicate requests.

Key Points to Mention

  • Idempotency keys: client-generated unique identifiers stored server-side to detect and deduplicate repeated requests.
  • Deduplication windows: time-bound storage of idempotency keys to balance storage cost and protection against duplicates.
  • Retry strategies: exponential backoff with jitter, capped retries, and circuit breakers to avoid overwhelming services.
  • Conditional writes and versioning: using ETags or version numbers to handle concurrent updates and prevent lost updates.
  • Exactly-once semantics: achieving idempotent producers and consumers in message queues (e.g., Kafka) for reliable event processing.
  • Trade-offs: consistency vs. availability, latency vs. durability, and complexity vs. reliability in distributed systems.

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