Перейти к содержимому
Alexander

System design собеседование: структура ответа на 45 минут

План ответа на систем-дизайн по минутам: требования, оценка нагрузки, API, данные, схема, узкие места и компромиссы. С разбором на примере сокращателя ссылок.

System design собеседование: структура ответа на 45 минут

Вам говорят: «Спроектируйте сервис сокращения ссылок», и дают пустую доску. Задача звучит просто, поэтому рука сама тянется рисовать квадратик «база данных». Через двадцать минут на доске шесть квадратиков, интервьюер спрашивает, сколько запросов в секунду выдержит эта схема, а вы этого ни разу не считали.

По AI-разборам собеседований пользователей Sobes систем-дизайн выходит самым трудным этапом: средняя успешность 52% против 61% у технических интервью. Задачи при этом бывают далеко не только про ленты и чаты. В банке есть, например, «Спроектируйте систему семантического поиска по корпоративной документации на 1М документов» и «Спроектируйте систему персонализированных рекомендаций товаров для маркетплейса». Выучить ответы на все варианты нельзя, зато можно выучить порядок, в котором строится любой ответ.

План на 45 минут

Из часа на саму задачу обычно остаётся минут сорок пять: остальное уходит на знакомство и ваши вопросы.

Минуты Что делаете Что остаётся на доске
0–5 Требования и уточнения Список функций и ограничений
5–10 Оценка нагрузки RPS, объём данных, соотношение чтения и записи
10–15 API 3–5 методов с параметрами
15–20 Модель данных Таблицы или коллекции, ключи, выбор хранилища
20–30 Высокоуровневая схема Клиент, балансировщик, сервисы, хранилища, кэш, очереди
30–40 Узкие места и масштабирование Что сломается первым и что с этим делать
40–45 Компромиссы и итог Что упростили, что сделали бы дальше

Границы условные. Если интервьюер на двадцатой минуте уводит вас в детали шардирования, идите за ним: он показывает, что хочет оценить.

Требования и нагрузка: первые десять минут

Начинайте с вопросов. Функциональные: что именно умеет система, а что в задачу не входит. Нефункциональные: сколько пользователей, что важнее при сбое, доступность или согласованность, какая задержка допустима.

Давайте я сначала зафиксирую рамки. Нужны создание короткой ссылки и редирект. Свои алиасы, срок жизни и статистику переходов делаем? Если времени мало, я бы оставил первые два и срок жизни, а статистику обсудил в конце.

Вы сами предлагаете, что отрезать. Интервьюер видит, что вы умеете ограничивать задачу, а не пытаетесь спроектировать всё сразу.

Дальше цифры. Точность не нужна, нужен порядок величин, и считать его надо вслух:

Пусть создаётся 100 миллионов ссылок в месяц. В месяце примерно 2,6 миллиона секунд, получается около 40 записей в секунду. Читают ссылки гораздо чаще, чем создают. Возьму сто к одному: это 4 000 редиректов в секунду, в пике закладываю вдвое больше. За пять лет наберётся 6 миллиардов записей. Если на запись уходит полкилобайта, это около 3 терабайт.

Из этих трёх чисел следует половина решений. Запись мелкая, чтение доминирует, значит, нужен кэш перед хранилищем. 3 терабайта на один сервер ставить неудобно, значит, придётся говорить о шардировании.

API и данные

API пишите как сигнатуры, без лишних деталей:

POST /links        { url, ttl? }  ->  { code }
GET  /{code}       ->  302 Location: url

Модель данных здесь из одной таблицы: code, url, created_at, expires_at. Поиск всегда идёт по ключу, связей нет, поэтому подойдёт key-value хранилище или обычная реляционная база с шардированием по code. Назовите выбор и причину одной фразой, технологию без причины интервьюер не засчитает.

Отдельно скажите, откуда берётся code. Семь символов base62 дают около 3,5 триллиона комбинаций, для 6 миллиардов записей запас большой. Варианта генерации два: счётчик с кодированием в base62 или случайная строка с проверкой на коллизию. У счётчика нет коллизий, но коды предсказуемы и нужен общий источник номеров. Выберите один и объясните почему.

Схема

Теперь можно рисовать. Клиент, балансировщик, несколько экземпляров сервиса без состояния, кэш, хранилище. Проведите по схеме оба сценария вслух: что происходит при создании ссылки и что при переходе по ней.

Редирект: запрос приходит на любой экземпляр, он смотрит в кэш. Если код там есть, сразу отдаём 302. Если нет, идём в базу, кладём результат в кэш и отвечаем. Популярные ссылки почти всегда будут в кэше, до базы дойдёт малая часть чтений.

Проговорённый путь запроса полезнее лишних квадратиков: по нему видно, что схема работает, а вы понимаете, зачем в ней каждый элемент.

Узкие места и компромиссы

На тридцатой минуте задайте себе вопрос интервьюера раньше, чем он: что сломается первым при росте нагрузки в десять раз.

  • Хранилище: шардирование по коду, реплики для чтения.
  • Кэш: что будет, если он упадёт и весь поток пойдёт в базу.
  • Генератор кодов: один счётчик на всех или диапазоны номеров, выданные каждому экземпляру.
  • Одна «горячая» ссылка, по которой идёт половина трафика.

Компромиссы называйте прямо, с ценой:

Я отдаю 302, а не 301. Браузер не закэширует редирект, поэтому каждый переход придёт к нам. Нагрузка выше, зато можно считать статистику и отключить ссылку. Если статистика не нужна, 301 дешевле.

В последние минуты подведите итог: что есть на доске, что вы упростили и что добавили бы при наличии времени (удаление просроченных ссылок, защита от злоупотреблений, мониторинг).

Типичные ошибки

  • Рисовать с первой минуты. Без требований и цифр схему нечем обосновать, и её приходится перерисовывать.
  • Молчать. Интервьюер оценивает рассуждение, а на доске его не видно. Тот же навык нужен на лайвкодинге, о нём есть статья «Лайвкодинг на собеседовании: что говорить вслух».
  • Не считать нагрузку. Тогда кэш, шарды и очереди появляются «потому что так принято».
  • Называть технологии без причины: Kafka, Redis, Cassandra в одном предложении и ни одного «потому что».
  • Проектировать идеальную систему на миллиард пользователей, когда в требованиях десять тысяч.
  • Защищать первое решение до конца. Если интервьюер нашёл дыру, согласитесь и перестройте схему.

Если спрашивают про технологию, с которой вы не работали, не изображайте опыт. Как рассуждать в такой ситуации, показано в статье «Не знаю ответ на собеседовании». О месте систем-дизайна среди остальных этапов коротко рассказано в статье про техническое собеседование.

Как тренироваться

Поставьте таймер на 45 минут и решите одну задачу целиком по таблице выше, проговаривая всё вслух. На первых попытках почти у всех одно и то же: к тридцатой минуте готовы только требования и половина схемы. Это лечится двумя-тремя повторами с таймером.

В тренажёре систем-дизайна схема рисуется на канвасе, а интервьюер задаёт по ней вопросы и в конце даёт разбор. Решите там две разные задачи и сравните, какие блоки плана у вас проседают в обоих случаях. Обычно это оценка нагрузки и узкие места: именно их и стоит отработать отдельно.