← Uber Interview Insights

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

SeniorPrefer not to say
May 2026

Summary

System design round at Uber for a frontend engineer role, centered entirely on designing an online calendar service like Google Calendar. Heavy emphasis on the client-side architecture, not just backend services. A lot to cover and the recurrence model alone could eat your whole session if you're not careful.

Questions Asked (5)

Q1

Design an online calendar service (like Google Calendar) that supports individual and shared calendars, with event CRUD across day/week/month/agenda views, attendee invites, recurring events with exceptions, time zones, reminders, conflict detection, and free/busy checks. Weight the design toward the frontend client experience.

System DesignTechnical Trade-offsAPI & Integrations
Author's notes

This is the whole question, basically.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and prioritizing frontend concerns like rendering performance, state management, and offline support. Then outline a component architecture and data flow, and discuss trade-offs for recurring events, time zones, and real-time updates. Finally, cover API integration and conflict detection from the client perspective.

Pro tip: Emphasize optimistic UI updates and client-side caching to make the calendar feel instant, and discuss how you'd handle time zone conversions and recurring event exceptions without over-fetching data.

1. Clarify Requirements & Scope

Ask questions to understand scale, supported views, offline needs, and real-time collaboration expectations. Focus on frontend constraints like rendering large date ranges and handling user interactions.

2. Define Frontend Architecture

Propose a component hierarchy (e.g., CalendarGrid, EventModal, AgendaList) and state management (e.g., Redux, Zustand). Discuss how to efficiently render day/week/month views with virtualization and memoization.

3. Design Data Flow & API Integration

Outline how the client fetches and mutates events via REST/GraphQL, including optimistic updates and error handling. Address recurring events by expanding them client-side or using a recurrence rule parser.

4. Handle Complex Features

Explain strategies for time zone conversion (using libraries like Luxon), conflict detection (client-side checks before submission), and free/busy queries (debounced API calls).

5. Discuss Trade-offs & Performance

Compare client-side vs server-side recurrence expansion, caching strategies, and real-time updates via WebSockets. Highlight how choices impact user experience and scalability.

Key Points to Mention

  • Virtualized rendering for large date ranges to maintain 60fps scrolling.
  • Optimistic UI updates for event CRUD to make the app feel responsive.
  • Client-side caching and normalization of event data to avoid redundant API calls.
  • Time zone handling: store UTC, convert to user's local time zone for display, and handle DST.
  • Recurring events: use RRULE (iCal) and handle exceptions (EXDATE) on the client or server.
  • Conflict detection: check overlapping events client-side before submission and show warnings.

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

Q2

How would you implement 'edit this and all following events' on a recurring series at the data model level, and what does it cost in extra rows or rule splits?

Data ModelingSystem DesignTechnical Trade-offs
Author's notes

This one tripped me up more than I expected.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the requirements and constraints of the recurring event system, then propose a data model that supports efficient 'edit this and all following events' operations. Discuss the trade-offs between different approaches, focusing on the cost in extra rows or rule splits, and how to handle exceptions and overrides.

Pro tip: Mention that you would store the recurrence rule as a string (e.g., RRULE) and split the series at the edit point, creating a new rule for the future events. This shows awareness of real-world implementations like those in calendar apps.

1. Clarify requirements and constraints

Ask about the expected scale, frequency of edits, and whether the system needs to support complex recurrence patterns. This ensures your solution aligns with the actual use case.

2. Propose a baseline data model

Describe a model where a recurring event is represented by a single row with a recurrence rule (e.g., RRULE) and a start date. Exceptions are stored as separate rows or overrides.

3. Explain the edit operation

For 'edit this and all following', split the original series at the edit point: truncate the original rule to end before the edit, and create a new series starting at the edit with the modified rule.

4. Analyze cost and trade-offs

Discuss the extra rows or rule splits: each edit creates a new series row, and potentially many exception rows. Compare with alternative models like materializing all instances.

5. Address edge cases and optimizations

Cover handling of exceptions, time zones, and how to efficiently query the series. Mention indexing strategies and potential caching.

Key Points to Mention

  • Use of recurrence rules (e.g., RRULE) to store patterns compactly
  • Splitting the series at the edit point to create a new rule for future events
  • Storing exceptions or overrides as separate rows linked to the series
  • Trade-offs: extra rows vs. materializing all instances; query complexity
  • Handling time zones and daylight saving time
  • Indexing and query performance for retrieving events in a range

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

Q3

A shared team calendar has 50,000 events visible in a single month and the month view is janky. How do you diagnose and fix both the frontend rendering and the data fetch path?

Root Cause AnalysisSystem DesignTechnical Trade-offs
Author's notes

Felt more comfortable here.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by profiling the current implementation to separate rendering bottlenecks from data fetching issues, then propose targeted optimizations for each. Emphasize a systematic approach: measure, hypothesize, test, and iterate, while considering trade-offs like virtualization vs. pagination and caching strategies.

Pro tip: Mention that you'd first check if the backend can support server-side aggregation or filtering to reduce payload size, as frontend fixes alone won't solve 50k events. Also, highlight the importance of setting performance budgets and monitoring to prevent regressions.

1. Profile and Measure

Use browser DevTools (Performance, Network) and React Profiler to identify rendering bottlenecks and data fetch inefficiencies. Measure metrics like FPS, time to interactive, and payload size.

2. Optimize Data Fetching

Reduce payload by fetching only necessary data (e.g., via GraphQL or REST with fields), implement pagination or infinite scrolling, and use caching (HTTP cache, in-memory) to avoid redundant requests.

3. Optimize Rendering

Virtualize the list to render only visible events, use memoization to prevent unnecessary re-renders, and consider canvas/WebGL for complex visualizations if DOM is too slow.

4. Consider Architectural Changes

Evaluate moving aggregation to the backend (e.g., precomputed summaries) or using Web Workers for heavy computations. Discuss trade-offs like complexity vs. performance gains.

5. Validate and Monitor

A/B test changes, set performance budgets, and add monitoring (e.g., RUM) to ensure improvements are sustained and catch regressions early.

Key Points to Mention

  • Virtualization (e.g., react-window, react-virtualized) to render only visible events
  • Data pagination or infinite scrolling with cursor-based pagination
  • Caching strategies (HTTP caching, client-side cache like React Query)
  • Memoization (React.memo, useMemo, useCallback) to avoid unnecessary re-renders
  • Web Workers for offloading heavy computations
  • Backend aggregation or filtering to reduce payload size

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

Q4

How do you efficiently compute free/busy availability across 20 attendees for a 30-minute meeting slot, and what do you precompute versus compute on demand?

System DesignAlgorithms & Data Structures
Author's notes

Precompute free/busy bitmaps or interval lists per user per day, invalidate on write.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the problem scope: are we dealing with a single query or many? Then outline a two-phase approach: precompute each attendee's busy intervals into a normalized, sorted structure (e.g., merged intervals per day), and on demand, intersect these intervals to find common free slots of at least 30 minutes. Emphasize trade-offs between precomputation (e.g., caching merged intervals) and on-demand computation (e.g., using a sweep-line algorithm) based on query frequency and data volatility.

Pro tip: Mention that you'd represent busy times as half-open intervals [start, end) to avoid off-by-one errors, and that you'd use a min-heap or sorted arrays to efficiently merge intervals across attendees. Also, discuss how you'd handle time zones and recurring events, as these are common pitfalls in scheduling systems.

1. Clarify requirements and constraints

Ask about the number of queries, data update frequency, time zone handling, and whether attendees have recurring events. This determines the precomputation strategy.

2. Precompute per-attendee busy intervals

For each attendee, fetch their busy times and merge overlapping intervals into a sorted list of disjoint intervals. Cache this per day or per week, invalidating on updates.

3. On-demand: find common free slots

Given a set of attendees, merge their busy intervals using a sweep-line or k-way merge, then compute gaps between merged busy intervals. Filter gaps that are at least 30 minutes.

4. Optimize for performance

Use binary search to quickly find relevant intervals for a given time window. For many attendees, consider parallelizing the merge or using a bitset representation for fine-grained time slots.

5. Discuss trade-offs and scalability

Explain when to precompute (e.g., daily batch) vs compute on demand (e.g., real-time queries). Mention caching strategies and how to handle large numbers of attendees.

Key Points to Mention

  • Interval merging and intersection algorithms (e.g., sweep-line, k-way merge)
  • Data structures: sorted arrays, min-heaps, interval trees, bitsets
  • Time complexity: O(n log n) for sorting, O(n) for merging, and how it scales with attendees
  • Caching strategies: precompute per-attendee merged intervals, invalidate on calendar updates
  • Handling time zones and daylight saving time
  • Edge cases: overlapping busy times, all-day events, attendees with no busy times

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

Q5

A user in New York creates a weekly 9am recurring event, then moves to Tokyo. What happens to past and future instances, and what's the correct product behavior?

Technical Trade-offsProduct Sense & IdeationSystem Design
Author's notes

Anchoring the recurrence in the event's original local time zone is the whole key here.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the core ambiguity: whether the event's time is anchored to the user's local time zone or to a fixed absolute time. Then walk through the implications for past and future instances, and propose a product behavior that balances user expectations with technical feasibility.

Pro tip: Mention that past instances should remain unchanged to preserve historical accuracy, while future instances should adapt to the user's new time zone to avoid missed events—this shows you consider both data integrity and user experience.

1. Clarify the time zone model

Determine if the recurring event is stored in UTC or in the user's local time zone. This decision dictates how the event behaves when the user changes time zones.

2. Analyze past instances

Past instances should not be altered because they already occurred at a specific absolute time. Changing them would create confusion and data inconsistency.

3. Analyze future instances

Future instances should ideally adjust to the user's new local time zone to maintain the intended local time (9am) for the user, but this depends on the product's design and user expectations.

4. Propose correct product behavior

Recommend that the event's time zone be updated to the user's new time zone, so future occurrences happen at 9am Tokyo time, while past occurrences remain at their original times.

5. Discuss trade-offs and edge cases

Consider scenarios like shared events, daylight saving time, and user control over time zone settings. Highlight the trade-offs between simplicity and user-centric design.

Key Points to Mention

  • Time zone handling in recurring events (UTC vs. local time)
  • Immutability of past events for historical accuracy
  • User expectation to maintain local time (9am) after relocation
  • Impact on attendees in different time zones if the event is shared
  • Daylight saving time transitions and their effect on recurrence
  • Product decision: whether to auto-adjust or prompt the user to confirm the change

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