← LinkedIn Interview Insights

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

Senior
May 2026

Summary

LinkedIn system design round for a software engineer role, centered entirely on designing a calendar backend. Pretty deep dive, they pushed hard on recurrence and the notification pipeline specifically.

Questions Asked (5)

Q1

Design the backend for a calendar service supporting event creation, invitations, recurring events, reminders, and free/busy availability across users.

System DesignData ModelingTechnical Trade-offs
Author's notes

This is the kind of question where you think you know where to start and then realize five minutes in that you've already painted yourself into a corner.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying functional and non-functional requirements, then design a data model that handles events, invitations, and recurring events efficiently. Propose a scalable architecture with separate services for event management, reminders, and availability, and discuss trade-offs in consistency, storage, and query performance.

Pro tip: Emphasize how you would handle recurring events and time zones, as these are common pitfalls. Also, discuss how to efficiently compute free/busy across many users, possibly using a separate availability service with caching.

1. Clarify Requirements

Ask about scale (users, events per user), consistency needs, supported recurrence patterns, reminder channels, and availability query patterns. Define core entities and relationships.

2. Design Data Model

Propose schemas for events, invitations, recurring events (using RRULE or similar), and reminders. Discuss storage choices (SQL vs NoSQL) and indexing for efficient queries.

3. Architect Services

Outline microservices for event management, notification/reminders, and availability. Describe how they interact, including APIs and data flow.

4. Handle Recurring Events and Reminders

Explain how to expand recurring events on-the-fly or precompute instances, and how to schedule reminders reliably using a job queue or scheduler.

5. Compute Free/Busy and Discuss Trade-offs

Describe how to aggregate availability across users, possibly using a separate service with caching. Discuss trade-offs in consistency, latency, and cost.

Key Points to Mention

  • Use of RRULE (RFC 5545) for recurring events and strategies for efficient expansion
  • Time zone handling and storage in UTC with user-specific display
  • Data partitioning and indexing for scalable event queries
  • Asynchronous processing for reminders using message queues (e.g., Kafka, RabbitMQ)
  • Caching strategies for free/busy queries (e.g., Redis) and eventual consistency
  • Trade-offs between SQL and NoSQL for calendar data (e.g., strong consistency vs scalability)

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

Q2

An organizer edits the time of one occurrence in a weekly recurring event that 200 people have already accepted. Walk through what gets written and what each attendee sees, including the 'this event only', 'this and following', and 'all events' options.

System DesignData ModelingTechnical Trade-offs
Author's notes

This was the hardest follow-up.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the data model for recurring events, distinguishing between the series definition and individual occurrences. Then walk through each edit option, explaining what data is written (e.g., exceptions, new series) and how attendees' calendars are updated, considering factors like notification and consistency.

Pro tip: Mention the importance of idempotency and conflict resolution when propagating changes to attendees, and discuss how to handle partial failures (e.g., some attendees not receiving updates) to demonstrate production maturity.

1. Clarify the data model

Explain how recurring events are stored: a series with a recurrence rule (RRULE) and individual occurrences, possibly with exceptions. Mention that occurrences can be overridden or detached.

2. Analyze 'this event only'

Describe that an exception is created for that specific occurrence, overriding the original time. The series remains unchanged; only that occurrence is modified. Attendees see the updated time for that instance only.

3. Analyze 'this and following'

Explain that the original series is truncated before the edited occurrence, and a new series is created from that point with the new time. Attendees see the change for the edited occurrence and all future ones.

4. Analyze 'all events'

Describe that the entire series' recurrence rule is updated, affecting all occurrences (past and future, or just future depending on policy). Attendees see the new time for all instances.

5. Discuss propagation and attendee experience

Cover how changes are propagated: notifications, calendar sync, and potential conflicts. Mention that attendees may see updates via invites or calendar sync, and consider edge cases like attendees who declined.

Key Points to Mention

  • Data model: series vs. occurrence, use of RRULE and exceptions (EXDATE, RECURRENCE-ID)
  • Idempotency and atomicity of updates to avoid partial writes
  • Notification strategy: when to send updates (e.g., only for significant changes)
  • Handling of past occurrences: whether to update them or only future ones
  • Scalability: efficient storage and querying for large recurring events with many attendees
  • Conflict resolution: what if an attendee has already modified their copy?

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

Q3

How would you implement an efficient free/busy and conflict check across 30 attendees without scanning each person's full event history?

System DesignTechnical Trade-offs
Author's notes

Went with a materialized free/busy index sharded by user and time bucket.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements (e.g., time range, recurrence, time zones) and then propose a precomputed index of busy intervals per user, stored in a time-bucketed structure. For the conflict check, merge intervals from all attendees using a sweep-line or interval tree, avoiding full history scans by querying only the relevant time window.

Pro tip: Mention that you would store busy intervals as immutable, compressed blocks (e.g., 15-minute granularity) and use a distributed cache like Redis with TTL to handle high read throughput, while ensuring consistency via versioning or event sourcing.

1. Clarify requirements and constraints

Ask about the time range, number of attendees, expected query rate, time zone handling, and whether recurring events or all-day events need special treatment. This ensures the solution fits the actual use case.

2. Design a precomputed busy-interval index

Propose storing each user's busy intervals in a time-bucketed or interval-tree structure, updated asynchronously when calendar events change. This avoids scanning full event history at query time.

3. Implement efficient conflict detection

For a given time window, retrieve only the relevant busy intervals for each attendee (e.g., via range query) and merge them using a sweep-line algorithm to find overlaps. Use a min-heap or sorted list for O(n log n) complexity.

4. Optimize for scale and latency

Discuss caching (e.g., Redis) of merged busy intervals for frequent queries, sharding by user ID, and using approximate data structures (e.g., Bloom filters) for quick negative checks. Consider eventual consistency trade-offs.

5. Address edge cases and trade-offs

Cover time zones, daylight saving, recurring events, privacy (only expose busy/free, not details), and failure modes (e.g., stale cache). Explain how you would monitor and update the index.

Key Points to Mention

  • Time-bucketed or interval-tree indexing to avoid full history scans
  • Sweep-line algorithm for merging intervals and detecting conflicts
  • Caching layer (e.g., Redis) with TTL and versioning for consistency
  • Sharding by user ID and asynchronous index updates
  • Handling time zones, recurring events, and all-day events
  • Privacy considerations: only expose free/busy, not event details

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

Q4

A user in the America/New_York timezone sets up a recurring 9am standup. How do you store and expand the recurrence rule so it keeps firing at local 9am even across daylight saving transitions?

System DesignTechnical Trade-offs
Author's notes

Store the rule with the timezone name, not a UTC offset.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying that recurrence rules should be stored in a timezone-aware format, such as an RRULE with a TZID parameter, rather than as fixed UTC timestamps. Then explain that expansion must be done in the user's local timezone to preserve the local wall-clock time, and finally convert each occurrence to UTC for scheduling. Emphasize handling DST transitions by using a robust timezone library and considering edge cases like non-existent or ambiguous times.

Pro tip: Mention that you would store the IANA timezone identifier (e.g., 'America/New_York') and use a library like java.time or pytz to handle DST correctly, and that you would test with DST transition dates to ensure correctness. Also, note that some systems store the recurrence rule in UTC but adjust for DST, which can cause drift—so always anchor to local time.

1. Clarify requirements and constraints

Ask about the expected behavior across DST transitions: should the event always fire at 9am local time, or is a fixed UTC time acceptable? Also consider if the user might change timezones.

2. Choose a storage format

Store the recurrence rule with the timezone identifier (e.g., 'FREQ=DAILY;BYHOUR=9;BYMINUTE=0;TZID=America/New_York') or store the local time and timezone separately. Avoid storing as UTC-only.

3. Expand occurrences in local time

Use a timezone-aware library to generate occurrences in the user's local timezone, ensuring that 9am local is preserved even if the UTC offset changes.

4. Handle DST edge cases

Address non-existent times (e.g., 2:30am on spring-forward) and ambiguous times (e.g., 1:30am on fall-back) by defining a policy, such as shifting forward or skipping.

5. Convert to UTC for scheduling

After expanding in local time, convert each occurrence to UTC for storage in the job scheduler, ensuring the correct instant is triggered.

Key Points to Mention

  • Use IANA timezone identifiers (e.g., America/New_York) instead of fixed offsets.
  • Store recurrence rules in a format that includes the timezone, like iCalendar RRULE with TZID.
  • Expand occurrences using a timezone-aware library (e.g., java.time, pytz, moment-timezone) to respect local wall-clock time.
  • Convert each occurrence to UTC for scheduling, but only after local expansion.
  • Handle DST transitions: non-existent times (spring forward) and ambiguous times (fall back) with a defined policy.
  • Consider caching expanded occurrences and updating them when timezone rules change.

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

Q5

Reminder workers fall behind during a traffic spike. How do you prevent reminders from being dropped or firing hours late, and how do you avoid duplicates when a worker retries?

System DesignTechnical Trade-offs
Author's notes

Time-bucketed queue was the core idea: workers pull only the reminders due in the current minute bucket rather than scanning everything.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the scale and requirements, then propose a decoupled, horizontally scalable architecture using a durable queue and idempotent workers. Emphasize trade-offs between consistency, latency, and cost, and explain how you would handle retries and duplicates.

Pro tip: Mention that at LinkedIn's scale, you'd likely use Kafka for durable queuing and a deduplication store like Redis with TTL, but always tie back to the core principles of idempotency and backpressure.

1. Clarify Requirements and Constraints

Ask about scale (reminders per second), latency tolerance (how late is acceptable), and consistency needs (exactly-once vs at-least-once).

2. Design for Scalability and Durability

Propose a distributed queue (e.g., Kafka) to buffer reminders during spikes, with multiple workers consuming in parallel. Ensure messages are persisted and replicated.

3. Ensure Idempotency and Deduplication

Use a unique reminder ID and a deduplication store (e.g., Redis with TTL) to track processed reminders. Workers check before processing and mark after success.

4. Handle Retries and Failures

Implement retry logic with exponential backoff and dead-letter queues. Ensure that retries do not cause duplicates by relying on idempotent operations.

5. Monitor and Scale Dynamically

Set up monitoring for queue depth and worker lag, and use auto-scaling to add workers during spikes. Consider backpressure to avoid overwhelming downstream systems.

Key Points to Mention

  • Use of a durable, distributed message queue (e.g., Kafka) to handle traffic spikes
  • Idempotent worker design with unique reminder IDs and deduplication store
  • At-least-once delivery with idempotency to achieve effectively-once processing
  • Retry mechanisms with exponential backoff and dead-letter queues
  • Auto-scaling workers based on queue depth and monitoring
  • Trade-offs between latency, consistency, and cost

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