Use the 45-minute RADAD framework: Requirements, API, Data model, Architecture, Deep dive to ace any system design interview.
Published April 19, 2025
System design interviews are open-ended. Without a framework, it's easy to dive too deep too fast or miss key areas. Use this 45-minute structure consistently.
| Phase | Time | What you're doing |
|---|---|---|
| R — Requirements | 5 min | Clarify functional + non-functional requirements |
| A — API Design | 5 min | Define the interface (REST endpoints or events) |
| D — Data Model | 5 min | Schema, DB choice |
| A — Architecture | 10 min | High-level component diagram |
| D — Deep Dive | 20 min | Scale bottlenecks, edge cases, tradeoffs |
Functional Requirements — what does the system do?
"Design Twitter/X"
Clarify:
- Can users post tweets? Reply? Retweet?
- Home timeline feed? How many tweets?
- Direct messages? Search? Trending topics?
- Which features are in scope for this interview?
→ "I'll focus on posting tweets and home timeline"
Non-Functional Requirements — how well must it perform?
- Scale: 300M DAU, 500M tweets/day
- Latency: timeline load < 200ms p99
- Availability: 99.99% (< 1 hour/year downtime)
- Consistency: eventual OK for timeline, strong for counters?
- Read:Write ratio? (usually high read for social)
Tweets/day: 500M
Tweets/second: 500M / 86400 ≈ 6000 writes/sec
Reads/second: 6000 × 100 (read-heavy) = 600,000 reads/sec
Storage:
Tweet: 140 chars ≈ 280 bytes
500M/day × 280 bytes = 140GB/day → 50TB/year
POST /api/v1/tweets
Body: { text, mediaIds[] }
Returns: { tweetId, createdAt }
GET /api/v1/timelines/home
Params: userId, cursor, limit=20
Returns: { tweets: [...], nextCursor }
GET /api/v1/users/{userId}/tweets
Params: cursor, limit
Draw a box diagram:
Client → CDN → Load Balancer → [Tweet Service | Timeline Service | User Service]
↓ ↓
[DB/Cache] [Redis Timeline Cache]
↓
[Message Queue] → [Fan-out Worker]
Pick 2-3 hard problems to discuss deeply: