Привет, Хабр!

Хочу поделиться своим опытом прохождения Системного Дизайна (aka System Design) в Бигтех. От первых шагов и провалов до успешно пройденной секции. Лично мне изначально эта секция показалась попроще чем алгоритмы. В целом я до сих пор так думаю, но проще — это не значит просто. Что же кроется в мелочах? Давайте разберемся.

База

Для того, чтобы совсем уж не потеряться, нужно не так уж и много — Load Balancer, Sharding (Шардирование), можно еще Partitioning (Партиционирование), Replication (Репликация), Message Queue (Очереди сообщений), и немного про базы данных. Чтобы все совсем в голове не перемешалось — можно каждую из тем читать в разные дни. За пару недель регулярных заходов можно покрыть достаточно хорошо, чтобы сильно не теряться. Имея этот базовый набор можно уже пробовать собеседоваться, и для менее крупных компаний этого вполне может хватить.

Спроектируй мне …

Классический сценарий собеседования развивается так — вам говорят, что планируют запустить некий сервис, который должен что‑то там делать. И ваша задача — спроектировать этот сервис согласно выставленным требованиям. Если конкретнее, то примеры: 

  1. Спроектируй соцсеть с новостной лентой

  2. Спроектируй видеохостинг

  3. Спроектируй карты

В большинстве своем, спрашивают именно бэкенд, но мне доводилось участвовать и на фронтенд System Design. Причем самое интересное — фронтенд спрашивают дополнительно, если собеседуетесь на фронтенд вакансию, а бэкенд спрашивают всегда.

Нужно делать так, как нужно. А как не нужно, делать не нужно! .

Казалось бы :-) И тем не менее. Правило номер 1: нужно много спрашивать! К примеру, собеседование начинается вот так: «Мы поняли, что можем делать более точные карты (чтобы открыв карту можно было найти кафе неподалеку, например). Мы открыли инновационный способ получения данных, поэтому верим в успех. Давайте попробуем их спроектировать.»

Самое простое (и неправильное) здесь — сразу приступать к реализации. Я завалил несколько собеседований, потому‑что мало спрашивал. Например, вы можете сразу взахлеб рассказывать, как бы вы делали построение маршрута, потому‑что как раз про это недавно читали, и вот она! Возможность блеснуть знаниями! Но эта функциональность была не нужна. В итоге интервьюеру придется постоянно вас перебивать, вы будете теряться, и не понимать, что нужно.

Первые минут 5 нужно посвятить вопросам. А что хотим? Что наши карты будут уметь? Нужно ли нам считать, сколько ресурсов потратим, и какое железо нам нужно (обычно не спрашивают, но иногда хотят)? Словом, собираем функциональные («фичи») и нефункциональные (безопасность, надежность, …) требования. Только после того, как наша фантазия на вопросы закончилась — можем приступать к реализации.

Дьявол кроется в деталях. A vs B

Базовые концепты покрываются достаточно быстро. На самом деле их не так много. Есть несколько типов СУБД, есть возможность «размазать» нагрузку при помощи очередей (Message brokers) либо периодически запускаемых процессов (Batch jobs). Для того, чтобы 2 штуки чего‑то общались между собой есть Push модель (А говорит В: «я сделал») и Pull модель (В спрашивает А: «ты сделал?»).

Для того, чтобы проходить собеседования (и еще в бóльшей степени, чтобы применять на практике) нужно четко разделять, почему вы делаете этот выбор в конкретной ситуации.

Поделюсь личными историями неуспеха во время собеседований:

  1. Я выбрал очереди (Message brokers) для распределения нагрузки вместо "джоб". Сказал что очереди хорошо размазывают нагрузку, а "джобы" с периодическим запуском усложняют архитектуру, и вносят больше задержки в обработке. Меня спросили "А в каком случае вы бы выбрали batch jobs?". И я понял, что ни в каком (кстати, хороший маркер того, что я не понимаю технологию). Я как раз работал на проекте где "пострадал" от этой архитектуры, у нас были неприятные дежурства, мы перешли на очереди и было все хорошо. В общем, ответ был в том, что "джобы" можно назначить на запуск в конкретное время, что часто нужно бизнесу. Сейчас пишу и думаю, как же это очевидно, но на собеседовании я не смог вообще осознать, зачем они нужны в 2020+ году

  2. Pull vs Push. Штука А делает работу, штуке В надо это узнать. Пусть когда А доделает тогда и скажет об этом. В чем проблема? Не буду расписывать, но я регулярно терял внятные инструменты и не мог понять, как же лучше, и почему. Кстати, даже отправка метрик по разному делается в разных инструментах(Prometheus - pull, InfluxDB - push). Я несколько раз выходил после собеседований с фразой "Опять Push/Pull не вспомнил"

Я настолько устал ошибаться на Push/Pull, что нарисовал себе схемку и распечатал:

Компромиссы (tradeoff)

Серебряной пули не существует. Это вроде все знают, а вроде и забывают:) Особенно на собеседованиях от кандидатов мне часто приходилось слышать «штука А это круто, а штука Б это плохо». Обычно это некоторый ПТСР, идущий из проекта, где кандидат от этого пострадал. Всплывают фразы вида: «Строгая типизация это плюс, динамическая это минус», «Монолит это плохо, микросервисы это хорошо», «Ой нет, был у меня опыт с Cassandra, ужасно работало, PostgreSQL — венец эволюции. Надо всегда выбирать его». 

Senior/Principal инженер подразумевает более глубокое понимание. Это всегда компромиссы. Выбирая определенный путь мы всегда чем‑то жертвуем. Если мы берем монолит — мы жертвуем масштабируемостью, если мы берем микросервисы — мы жертвуем скоростью (разработки, а часто и ответа). 

Чем выше уровень инженера — тем более глубоко он понимает, чем NoSQL выиграет у SQL и наоборот. Это и структуры данных для хранения (LSM / B‑Tree), и обязательства наличия схемы данных, и наличие/отсутствие связей между сущностями, и т д.

В идеале для любого выбора вы должны понимать Tradeoff (я вольно трактую это слово как «Компромисс», но в разговоре использую все‑таки «трейдоф»). Что вы теряете (вы всегда теряете что‑то) от этого решения, и насколько это критично.

Материалы для подготовки

Я готовился так — покупал бумажные книги и карандашом делал на них заметки. Там где отметил — загибал листочек в углу. Так выглядят мои книги сейчас:

Итак, что же это за книги, и в каком порядке лично я рекомендую их читать:

Alex Xu - System Design Interview Volume 1

Честно говоря, я считаю, что после этой книги можно пробоваться. Из 6 собеседований в Бигтех 3 задания были взяты отсюда. Это хороший фундамент для ознакомления не только с базой и основными подходами, но еще и с самыми популярными заданиями. На мой взгляд это «must have».

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

System Design Interview volume 2

Продолжение первой книги. Тоже содержит много примеров, менее популярных. Больше глубины, больше разъяснений касательно Tradeoff, более детальное погружение в тему «почему так».

Designing Data-Intensive Applications

Легендарная книга с максимальным погружением в вопросы «почему». Как устроены структуры данных в одном или другом типе СУБД, какие есть проблемы при масштабировании, какие есть проблемы распределенных систем и какие есть подходы к их решению.

Мое мнение — не стоит начинать читать эту книгу первой. Я рад, что я начал ее решать спустя 2 другие книги, и решение алгоритмов.

На мой взгляд эта книга — путь в «больше чем Senior». Она дает ту «дополнительную» глубину, которой обладают хорошие технические лидеры, Principal/Staff инженеры, и т д.

P. S. Эта книга про рост и глубину. К моменту прохождения собеседования в Бигтех я дочитал ее где‑то наполовину.

Финальные мысли

System Design это очень интересная секция, которая может развенчать много «магии» вокруг инструментов. Как делают игры, карты, платежные системы, видеохостинги, S3, прочие сервисы.

Эту секцию можно быстро нахватать по верхам, и уже как‑то отбиваться на собеседованиях.

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

Комментарии (15)


  1. Sitro23
    06.04.2026 17:25

    Тема слабовато раскрыта


    1. Roman2dot0
      06.04.2026 17:25

      Зато какая памятка про push/pull!)


    1. eugene_october Автор
      06.04.2026 17:25

      Было бы здорово расширить мысль, чего конкретно не хватает. Я старался подсветить общий подход, и немножко углубился в конкретный пример.

      Больше примеров наподобие Push/Pull вроде и не добавит ценности (нуок, понятно, что нужно уметь сравнивать). Сухой список тем – тоже вроде не здорово, такого, полагаю, и так навалом.

      В общем, обратная связь приветствуется, может, чего-нибудь допишу еще в другой заход


      1. Sitro23
        06.04.2026 17:25

        Выбор СУБД, outbox/inbox, event sourcing и т.п.


        1. eugene_october Автор
          06.04.2026 17:25

          Ну, то есть больше по конкретным сценариям? Про выбор СУБД не всегда есть даже. Пару примеров:

          .1 Web Crawler – вообще про СУБД особо не обсуждалось в нем на практике. Там больше про то, как нагрузку размазать аккуратно
          .2 Саджест (подсказки поисковая строка) - там Trie, и тоже СУБД не обсуждается.

          В общем, делаю пока вывод, что Push/Pull получилось хорошо, но этого мало, и есть запрос больше по кейсам пройтись.


  1. jujalica-zibizi13
    06.04.2026 17:25

    Я не адепт system design, но разве job-ы и брокеры решают одну и ту же проблему? Это же разные вещи, которые могут быть вместе в одной системе, как их можно сравнивать?


    1. eugene_october Автор
      06.04.2026 17:25

      Могут быть сценарии, когда можно сделать через одно либо через другое. Аналитика / постпроцессинг каких-нибудь заявок в E-commerce.

      Да вообще на самом деле много сценариев, когда мы можем данные сразу передать в очередь, либо складывать куда-то в хранилище, и раз в какое-то время придет джоба, чтобы обработать накопившееся (раз в час/раз в день).

      Во всяком случае, у меня точно были ситуации, когда я между ними выбирал, и ошибался


  1. ordinaryman
    06.04.2026 17:25

    Я в жёлтый банк собес по System design не прошел с одним из комментариев от их архитектора, что неверно разбил по микросервисам, так как правильно - это разбивать по методологии Domain Driven Design. Видимо без DDD не пройти собес ни в одну компанию.


    1. dmitriinikolaev
      06.04.2026 17:25

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


  1. noldo32
    06.04.2026 17:25

    Ну хорошо, книга. А в резюме тоже книгу указывать? Всем же опыт подавай - тем же системным архитектором, которого еще нет.


    1. Tikani
      06.04.2026 17:25

      А перед тем, как позвать на алгоритмическую секцию, сначала проверят, есть опыт работы алгоримистом? Компании вкрутили секцию system design как дополнительный фильтр в воронку найма, так как людей с опытом в 5-7 лет на рынке труда прилично, все хотят много денег. Компании отдают себе отчёт, что те, у кого спрашивают system design на позицию синьора, чаще всего будет иметь свободу воли на уровне "могу выбирать, какие таблички в БД будут по описанию из ТЗ и как будет выглядеть SQL запрос". А будет ли у команды новый микросервис для фичи, нужна ли ему БД или redis решит уже прикрепленный к команде архитектор.


      1. Stan91
        06.04.2026 17:25

        прикрепленный к команде архитектор

        В обоих последних банках такого не встречал


  1. ivvi
    06.04.2026 17:25

    Автор, подскажите, пожалуйста.

    В вашей памятке на последнем рисунке что означает фраза "no metrics seen"? (Остальное понятно). Заранее спасибо.


    1. eugene_october Автор
      06.04.2026 17:25

      Я там постарался себе стрелочками разного цвета время отобразить.

      Идея такая: Есть крон-джоба, запускающаяся раз в час в 00 минут, 00 секунд. Она обычно отрабатывает 2 секунды (из головы пример. "Некое незначительное время"), либо мало данных (ночью пришло 1к вместо 100к днем, и быстрее завершаем работу). Сценарий:

      .1 Зарезервировали инстанс (например, spot в AWS)
      .2 Сделали работу
      .3 Вернули инстанс (освободили ресурсы, не платим за него деньги)
      .4 Пришел запрос за метриками, инстанса нет (уже)

      В случае с Pull если между 1 и 3 происходит мало времени - это проблема. В случае с Push - нет


  1. fenom82
    06.04.2026 17:25

    Куда прошли, на какой грейд, сколько заняло времени со старта подготовки до оффера? Собесились именно в фаанг? Ну и ссылочку как к алгосам готовились если есть. Спасибо