Перейти к содержанию

Interview playbook

Как пройти system-design собеседование. Тайминг, последовательность шагов, типовые вопросы, чек-листы и список книг. Это финальная сборка из всего, что ты прочитал.

Тайминг (45 минут)

gantt
    title System design interview
    dateFormat mm
    axisFormat %M min

    section Steps
    Уточнение требований    :0, 7
    Capacity estimation     :7, 12
    High-level дизайн       :12, 22
    Глубокое погружение     :22, 35
    Bottlenecks/wrap up     :35, 43
    Вопросы интервьюеру     :43, 45

Ключевые проверки времени.

  • 5 минут — должен быть закончен etap «requirements».
  • 12 минут — закончен capacity estimation.
  • 22 минуты — high-level схема нарисована.
  • 35–40 минут — обсуждены bottlenecks и trade-offs.
  • 45 минут — есть вопросы интервьюеру (показывает интерес к компании).

5 шагов хорошего ответа

Шаг 1. Functional + non-functional requirements (5–7 мин)

Не торопись рисовать. Задавай вопросы. Это самая ценная часть.

Functional:
- Какие действия пользователя (post / read / search / ...)?
- Какие в скоупе, какие нет (например, реклама — нет)?
- Гарантии (доставка, порядок, дубликаты)?

Non-functional:
- DAU, MAU, RPS (peak vs avg)?
- Read/write ratio?
- Latency (p99 каких операций)?
- Consistency (strong / eventual)?
- Availability (99.9 / 99.99)?
- Storage growth?
- Geography?

📌 Лайфхак. Если интервьюер не отвечает конкретно — озвучь свои предположения вслух и зафиксируй: «допустим, 100M DAU, 10:1 read/write, p99 < 200 ms — двигаемся дальше».

Шаг 2. Capacity estimation (5 мин)

Грубые оценки на коленке. Важна логика, не точность.

DAU = 100M
posts/user/day = 5
posts/sec = 100M × 5 / 86400 ≈ 5800

read/write ratio = 50:1 → reads/sec ≈ 290k

storage:
  posts × bytes = 5800 × 86400 × 500B/post ≈ 250 GB/day
  год → 90 TB
  с учётом replication ×3 → 270 TB

Рассказывай вслух. Интервьюеру важно видеть, как считаешь.

Шаг 3. API design (3–5 мин)

POST /api/v1/posts
  Body: { text, attachments? }
  Headers: Idempotency-Key
  Response: 201 { id, created_at }

GET /api/v1/feed?cursor=...&limit=20
  Response: { items: [...], next_cursor }

📌 Чек-лист. REST или gRPC + причина. Idempotency на write. Cursor pagination, не offset. Auth.

Шаг 4. High-level architecture (10 мин)

Рисуешь основные компоненты и их взаимодействия. Не вдаёшься в детали — это будет в шаге 5.

graph LR
    User --> CDN
    CDN --> LB
    LB --> API
    API --> Cache[(Redis)]
    API --> DB[(Postgres)]
    API --> MQ[Kafka]
    MQ --> Workers
    DB --> Replicas

Объясни выбор каждого: «Postgres потому что ACID + структурированные данные; Redis для hot keys feed; Kafka для async fan-out».

Шаг 5. Deep dive + bottlenecks (10–15 мин)

Здесь интервьюер «копнёт» 1–2 темы. Будь готов:

  • Sharding strategy. По какому ключу, какие сложности.
  • Cache invalidation. Как обновляешь, что с stale, thundering herd.
  • Fault tolerance. Что если упал DB master? Replica lag? Network partition?
  • Hot keys / hot users. Justin Bieber problem.
  • Race conditions. Двойное списание, concurrent updates.
  • Monitoring / SLO. Какие метрики, как алёртишь.

Шаг 6. Wrap-up

Сам перечисли, что ещё можно улучшить, что не успел затронуть. Покажет зрелость.

"Что я не успел: rate limiting, anti-fraud, GDPR delete, multi-region.
Если хотите — могу углубиться."

Что говорить, что НЕ говорить

✅ Хорошие фразы

  • «Прежде чем рисовать, уточню...»
  • «Делаю предположение: ... Поправь, если не так.»
  • «Здесь trade-off между X и Y. Я выбираю X, потому что...»
  • «На моём опыте, в [компания/проект] эта же задача решалась через...»
  • «Узкое место здесь — Y. Если упрёмся, можно...»
  • «Я не уверен на 100%, но логика подсказывает...»

❌ Плохие фразы

  • «Возьмём NoSQL, так круче.» (без обоснования)
  • «Просто шардируем». (что за ключ? какая стратегия?)
  • «Используем Kafka.» (только Kafka? зачем здесь стрим?)
  • «Я никогда не работал с этим, но думаю...» (избегай — лучше скажи: «прямого опыта нет, но из понимания CAP я бы сделал...»)
  • Молчать в течение 30 секунд. Думай вслух.

Типовые вопросы по уровням

Junior (L1)

  • Что такое REST? Чем отличается от gRPC?
  • Что такое индекс в БД?
  • Чем отличается Redis от Postgres?
  • Что такое HTTP load balancer?
  • Что такое cache hit / miss?

📌 На L1 главное — знать термины и уметь объяснить простыми словами.

Middle (L2)

  • Спроектируй URL shortener.
  • Спроектируй простой чат на 1M пользователей.
  • Чем отличаются strong и eventual consistency?
  • Как ты бы шардировал Postgres на 5 ТБ?
  • Что такое circuit breaker и зачем?
  • Что такое idempotency-key?

📌 На L2 от тебя ждут обоснованных решений и понимания trade-offs.

Senior (L3)

  • Спроектируй Twitter feed на 300M MAU. Detail fan-out.
  • Как сделать exactly-once семантику в распределённой системе?
  • Спроектируй distributed rate limiter (10k RPS на пользователя).
  • Расскажи про инцидент в проде: что упало, как фиксили, что изменили после.
  • Сравни Kafka EOS и outbox pattern. Когда что выбрать?
  • Как ты бы построил multi-region failover для критичного API?

📌 На L3 ждут production experience и навыков архитектурного думанья.

Чек-лист «не забыть»

Распечатай и держи перед глазами в первые собесы.

  • Уточнил functional requirements (что делает).
  • Уточнил non-functional: RPS, DAU, latency, consistency, geography.
  • Сделал capacity estimation (storage, RPS, bandwidth).
  • Нарисовал API: HTTP method, path, body, response.
  • Указал idempotency для write-операций.
  • Выбрал БД и обосновал.
  • Указал схему данных + индексы под query patterns.
  • Сказал про cache и стратегию инвалидации.
  • Сказал про load balancer перед API.
  • Указал, как масштабируется (sharding / replication / partition).
  • Указал очереди для async-операций (если есть).
  • Указал failure modes: что если упадёт компонент X.
  • Сказал про timeouts, retry, circuit breaker на downstream-вызовах.
  • Сказал про monitoring: RED-метрики, distributed tracing, alerting.
  • Обозначил bottlenecks и стратегии их обхода.
  • Указал trade-offs при выборе.

Reading list

Книги (по приоритету)

  • 📖 Designing Data-Intensive Applications, Martin Kleppmann. #1 must-read. Сделает из тебя нормального инженера.
  • 📖 System Design Interview vol 1+2, Alex Xu. Рабочий учебник под собес. Точные решения для типовых задач.
  • 📖 Building Microservices, Sam Newman. Если идёшь в микросервисную компанию.
  • 📖 Site Reliability Engineering, Google (бесплатно онлайн). SLO/SLA, incident management, error budget.

Papers (для senior)

  • Dynamo: Amazon's Highly Available Key-value Store (2007). Базис для Cassandra/Riak/...
  • Bigtable: A Distributed Storage System for Structured Data (2006).
  • Spanner: Google's Globally-Distributed Database (2012). TrueTime.
  • The Raft Consensus Algorithm (2014). Заметно проще Paxos.
  • Kafka: a Distributed Messaging System for Log Processing (2011).
  • MapReduce: Simplified Data Processing on Large Clusters (2004).

Online ресурсы

  • System Design Primer (donnemartin) — каталог topic'ов на GitHub.
  • microservices.io — каталог паттернов.
  • highscalability.com — реальные системы из real companies.
  • Hussein Nasser на YouTube — БД и сети без воды.
  • ByteByteGo канал — короткие видео по System Design.
  • AWS Re:Invent — talks про реальные архитектуры.

Mock interviews

📌 Reps больше всего значат. Решай задачи на доске вслух, под таймер. Записывай и пересматривай — увидишь, где замолкаешь, где хаос.

  • С другом-инженером. Бесплатно, дружелюбно.
  • interviewing.io / Pramp. Анонимные mock'и с инженерами big-tech.
  • AI-ментор BoostMentor. Прокачка терминов и обратная связь, бесплатно в Telegram.

Финальный совет

Системный дизайн — навык, не знание. Зубрёжкой 10 кейсов не сдашь — спросят 11-й. Учись думать по шагам (требования → API → данные → масштаб → failure → монитор), и любая задача складывается. Если ты до этого пункта дошёл — у тебя уже есть фундамент. Дальше — повторение и реальные проекты.

📝 Подумай

  1. Тебе сказали «спроектируй TikTok». Какие 5 первых уточняющих вопросов зададишь?
  2. Интервьюер спрашивает: «А почему не Mongo вместо Postgres?». Как правильно ответить?
  3. Ты застрял на 25-й минуте: схема нарисована, но не знаешь куда копать. Что делаешь?
Ответ
  1. (a) read- или write-heavy? (b) сколько MAU/DAU? (c) длина видео и объём storage? (d) какая latency на старт воспроизведения? (e) feed — chronological или ranked (recommendation)? + бонус: «приватные аккаунты в скоупе?», «messaging?».
  2. «У нас структурированные данные с транзакциями (заказы, платежи) — Postgres даёт ACID. Mongo — гибкая схема без транзакций между коллекциями. Здесь предсказуемая схема и нужны JOIN'ы (пользователи + заказы). Если бы данные были более дикие (event log с разной структурой) — Mongo бы рассмотрел.»
  3. Сам предложи углубление: «Хочешь углубимся в шардирование? Или failure modes? Или cache invalidation?» — пусть интервьюер выберет. Это лучше, чем молчать.

Удачи на собесе. И помни: лучшие инженеры тоже не знают всего — они просто думают вслух и не боятся trade-offs. Возвращайся к index.md или конкретным темам, когда нужно освежить.