
Почему так сложно пройти первые System Design Интервью? Какие есть подводные камни? Оказывается, что не все понимают базовый алгоритм прохождения, а также нюансы движения по основным этапам.
Меня зовут Владимир и я senior backend в геораспределенной HighLoad системе, выдерживающей пиковые нагрузки в млн RPS. Моя страсть System Design. Я успешно прохожу интервью в BigTech компании, а также готовлю учеников. Выделил ТОП-5 ошибок у новичков и готов поделиться их разбором. Подробности под катом.
Посмотрите на них и никогда не повторяйте!
🔻 Бессистемный подход вместо чёткого алгоритма
🔻 Преждевременное решение без уточнения требований
🔻 Недопустимое упование на уже оформленные требования
🔻 Неструктурированная коммуникация, которая сбивает интервьюера
🔻 Отсутствие ревью своей системы
Ниже посмотрим на причины таких ошибок, разберём каждую и сделаем вывод. Плюс, предоставлю готовые схемы для усиления ответов, что увеличит шансы на получение нужного грейда и заветного оффера. Поехали!
Почему даже подготовленные кандидаты проваливаются?
Раньше System Design спрашивали только у senior backend-разработчиков. Сегодня - у аналитиков, продакт-менеджеров и даже SRE.
Парадокс: при огромной доступности информации (Хабр, англоязычные гайды, шаблоны масштабирования) кандидаты массово наступают на одни и те же грабли.
Почему?
Информационный перегруз - книги, сотни статей с многообразным материалом и ссылками в ссылках
Отсутствие системы - без четкого фреймворка прохождения легко утонуть в деталях или сбиться с верного пути
Стресс-фактор - даже зная теорию, можно забыть основу под давлением
Хорошая новость! Я уже набил все возможные шишки и собрал повторяющиеся ошибки с первых интервью моих учеников. Подготовил и вынес вам на блюдечке. Добро пожаловать к столу!
ТОП-1 - Поговорим про жизнь, а потом само пойдёт

На самом деле есть чёткий алгоритм прохождения интервью, которому нужно следовать:
Уточнить требования
Расписать API
Нарисовать верхнеуровневую схему
Расписать модель данных
Словить deep dive в какую-то часть системы
Поговорить о масштабировании
Аргументировать технологии
Сказать о мониторинге
Подытожить
Воу! Полегче! Собеседование длится не 3 часа, а 1 или даже 45 минут!
И это правильный комментарий! Скорее-всего, вы успеете сделать 1, 2, 3. Или же 1, 2, 3, 5 . Может быть, и больше. Но такую базу вы точно должны успеть:

Фундамент готов! На интервью в любую компанию, на любую позицию вы должны осветить представленные пункты.
Далее следует понять куда идти дальше. Потому что интервьюер может хотеть освятить что-то конкретное на текущей сессии интервью. А вы, не слушая, продолжаете идти по шаблону. Как понять куда свернуть?
Об этом мы вскоре поговорим. А пока по критичности идёт ошибка №2. А точнее заблуждение:
ТОП-2 - Мне дали проектировать ленту. Я прекрасно знаю требования!

Да, вы могли изучить эту бедную ленту вдоль и поперёк. Прочитать Сью, Кабанчика, пообщаться с разработчиками твиттер, вк, изобрести собственный фасбук и совершенно спокойно пробежать эту очевидную вещь - уточнение требований 😢
Представим другую ситуацию. Началось реальное интервью. Вы прочитали эту статью и другие. У вас в голове схема прохождения. Вы понимаете, что без требований систему ну никак не построишь. И внезапно от волнения вы:
1) Либо слишком долго выясняете
2) Либо не выясняете вообще
Хочу обратить внимание, что в книгах, статьях обычно описано сухо:
"Надо уточнить. Важно. Не забудь. Без этого никак, ..."
Я с этим не спорю. Хочу передать эту важность живо, с точки зрения обычного человека. А не робота, которому дали схему, приоритет. И он блестяще исполнил алгоритм. Передать, к примеру, так:
"Мы все волнуемся. И это нормально. Отсюда следуют ошибки. Которые дорого стоят."
В нашем случае заветных баллов:
Здесь не учли требования
Там не аргументировали технологии
=> В итоге не превысили минимальный порог на прохождение.
Если бы мне эту фразу сказали раньше, то первые собеседования, думаю, были бы сильней. Поделился. Закрыл гештальт.
Что отсюда следует? Следует диалог, который не имеете права опустить. Распишу по уровням прохождения:
Basic
Интервьюер(И) - "Спроектируйте новостную ленту"
Кандидат(К) - "Честно говоря, я не представляю, что такое новостная лента. Опишите, пожалуйста, что хочется спроектировать."
И - "Лента - это совокупность постов друзей, на которых вы подписаны."
К - "Тогда я выделю основные сущности и действия - пользователь, возможность подписки на других пользователей, создание поста, составление и получение такой ленты."
Middle
Далее не забудьте спросить про способ агрегации постов в ленте, особенности отображения, накиньте CRUD на функционал постов - создание, чтение, ...
Advanced
А ещё можно упомянуть комментарии, лайки, систему аналитики. SLA на отображение ленты. Что будет плюсом.
Вы понимаете основные требования. И накидываете сверх. Больше - лучше. И далее в коммуникации с интервьюером определяете что из этого must have, а что out of scope(устоявшиеся термины в мире System Design).
Это покажет, что вы-специалист:
Которому важен бизнес
Который понимает, что в ограниченный срок можно реализовать лишь подмножество требований
Что даст вам дополнительные баллы.
Как-то ученик меня спросил: "Если знаю эту задачу, стоит ли мне специально спрашивать?"
Выше описал этот случай гипертрофировав потенциального кандидата до уровня мега эксперта. Ещё раз. Даже если вы знаете задачу, видели и прорабатывали решение, узнайте, что именно нужно проектировать в рамках этой сессии интервью.
Бежали впереди паровоза из-за волнения? Или каждый раз скрупулёзно уточняли требования?
Я думаю этот важный момент прохождения интервью мы уяснили. Двигаемся дальше.
ТОП-3 - Да тут всё расписано!

Обсудим другую ситуацию, которая произошла с учеником и в которой можете оказаться вы:
"Мне дали систему с расписанными требованиями. Нужно было спроектировать подсистему."
Это было ещё до наших основных встреч. У специалиста ещё не было понимания, что делать в этом случае. Что сделали бы вы? Что сделал он?
Правильно - потерялся. Знал ли он весь пайплайн прохождения по шагам? Да. Готов ли был его реализовывать? Да. У него это получилось? Нет.
Я снова возвращаюсь к советам из книг и идеальным алгоритмам прохождения. Это хорошо, что они есть. И плохо, что никто не разбирает человеческий фактор и нюансы прохождения. Продолжаем покрывать такие кейсы.
Итак. Перед вами расписанная система, которая умеет 1,2,3. Нужно реализовать подсистему. С чего следует начать?
Как ни странно, с шага номер 1 - уточнение требований. Даже если они расписаны в какой-то форме к вашей подсистеме. Возможно, это выглядит так:
"Есть компоненты маркетплейса. Взаимодействуют друг с другом так-то. Нужно сделать подсистему логистики, которая умеет..."
И это может быть написано под заголовком "Требования/Цель системы". Вам дали требования! Ура! Ли?
Не ведитесь, что часть работы сделана за вас! Не радуйтесь раньше времени, что можно пропустить этап уточнения требований! Вы волнуетесь. Вы что-то подразумеваете. Что-то вычленили из требований для себя.
Интервьюер в 7ой раз за день смотрит на эту задачу и подразумевает что вы поняли. А может ему всё это уже надоело! Что делать?!
Вы должны синхронизироваться! Явно!
Помните совет с ВУЗа - переписывайте лекцию своей рукой. Вам надиктовывают, вы пишите. Пока пишите, включается связь рука -> мозг. Каким-то чудесным образом в этом действие мозг обрабатывает информацию.
Я бы сказал, что это продвинутый copy-past:
Слышу -> анализирую -> пишу -> вижу результат -> анализирую -> слышу...
У вас в тетради вроде бы всё то же самое что говорит лектор. Но записанное вашей рукой вашим почерком. С вашими ромбиками, штрихами и красивостями.
Конечно, XXI век и выбивание букв с помощью клавиш привносит свою специфику. И, всё же, эта связь пока работает. Поэтому на вопрос "Как синхронизироваться?" есть ответ:
Перепишите требования в понятной для вас форме
Для меня это use cases. Свожу функциональные требования к системе, к тем действиям, которые пользователи могут над ней производить. С бедной заезженной лентой это звучит так:
Пользователь может создать пост
Подписаться
Получить ленту
К тому же это прекрасно перекладывается в API методы.
ТОП-4 - Вариантов развития сюжета много. Куда свернуть?

На первые 3 этапа у вас - новичка - ушло уже минут 30:
10 минут на уточнение требований с детализацией
10 - API
10 - схема
Конечно, это всё примерно. Таймингами стращают. Тайминги пугают. 😱
Пока разберёмся в принципиальных составляющих успешного прохождения интервью.
И между этими этапами, и для выяснения следующих существует магическая фраза. Её можете высечь в камне. Повесить над перед собой готовясь к System Design Интервью:
"Я описал базово API. Если этого достаточно, предлагаю идти дальше проектировать схему."

Это такой скелет. Забирайте. Подгоняйте под себя.
Почему фраза прекрасна и прокладывает вам дорожку к успешному прохождению? Секрет прост. Она несёт в себе 3 метасообщения:
Я понимаю что делаю
Я понимаю ограниченный тайминг интервью
Я пониманию, что можно многое обсудить. И на каждом интервью можно пойти либо широко. Либо куда-то углубиться
Мы с тобой имитируем рабочую ситуацию. Коммуницируем как колеги. Мне интересно твоё мнение. Ты же, фактически, заказчик
Я прохожу интервью инициативно
Вышло даже 5 😅 Чувствуете мощь, которая за ней скрывается? Это козырь. Который выделит вас среди кандидатов. Которые не предоставляют интервьюеру такой информации о себе.
Можете зайти с другой стороны: "Я понимаю все стадии интервью. Их много. Наверное, вы подготовили какой-то deep dive или трюк, который мне нужно раскусить. Это нормально. Мы играемся в бизнес. И вам, и мне понятно, что большую часть времени должен говорить я. Так что, как видите, я в теме прохождения SD интервью.", - такое я не советую.
Поскольку играем в бизнес, в архитектуру, давайте оставим эту интригу. Все понимают правила. И вы подчеркиваете это понимание весьма тактично.
Кстати, как считаете - сколько процентов от общего времени должен говорить кандидат? И сколько у вас получается на практике?
Магия этой фразы имеет накопительный эффект. В процессе прохождения вы её повторяете между всеми переходами. Скрепляя ваши с интервьюером зеркальные нейроны на время интервью и позволяя его проходить позитивно, в коммуникации и по этапам.
И сподвигая интервьюера делать нужные для вас шаги

ТОП-5 - Silent end

Если вы ходили на конференции, то могли заметить чем отличаются драйвовые выступления от обычных. Разбирать по косточкам все составляющие успешного успеха мы сейчас не будем.
Вспомним лишь конец. А конец должен быть таким, чтобы его вспомнили. Это визитная карточка выступающего. И что же там? Правильно:
=> Выводы <=
Вам критически важно, чтобы ваше выступление(а собеседование таковым и является) запомнили. В идеале всю встречу вы к нему и ведёте. Но это оставим для заготовленных выступлений.
На практике вы получаете знакомую или частично знакомую систему, раскручиваете её за отведенный тайминг. Но этого недостаточно. Мир ждёт вашего финального шага - ревью вашего решения! 🥳
За пару минут до момента, после которого нельзя отмотать время назад, у вас есть последний шанс для улучшения своего решения. Как его не упустить?
Просите соседа постучать в стенку или жену/мужа выпустить кота, чтобы вас переключить. Или по старинке - ставьте таймер, который прозвенит в 40ую минуту для 45 минутного интервью. Или в 55 минуту для 60 минутного интервью.
"Хорошо, я переключился. А что делать-то?"
Забирайте четкий алгоритм:

Его суть в последовательном перечисление достоинств вашей системы. Нужно заявить уверенно, что готовы выкатить её в прод эта реализация отвечает заявленным требованиям.
Проходитесь точно также поэтапно, но уже в стиле ревью - кратко описывая что сделано. Создавая тем самым happy end. Титры. Занавес. Жизнерадостная музыка. Ваше решение запомнили! 💪
Но и это ещё не всё

System Design Интервью для новичка не является лёгкой прогулкой☝️. Ревьюя свою систему вы неожиданно можете заметить, что реализовали 3/4 требований, а про последнее напрочь забыли.
Здесь именно ревью и спасет ситуацию. В горячке прохождения без итогов все бы разошлись. И интервьюер поставил бы жирный минус, что 25% функционала не реализовано. Теперь же вы воочию видите, что никак не упомянули эту часть.
И последние минуты интервью дают вам шанс это исправить! В какой-то степени. Вы словами описываете, что 4ое требование - "выдача ленты" - будет реализована с помощью сервиса, который формирует ленту. Что посты упорядочиваются в хронологическом порядке с возможным показом не совсем новых т.к. выбрали eventual consistency ради скорости отдачи. Что они возможно смешиваются с рекомендациями и выдаются пользователю порционно(спасибо пагинации). Углы сглажены. Ситуация спасена.
Ещё раз. Не нужно бить челом извиняться, что не успели всё сделать.
Даже если не хватает компонента, вы успеваете описать его словами. Этого может быть достаточно.
Интервьюер оценит защиту вашего решения. Которое приобретёт законченность.

Итого
В статье мы разобрали причины ошибок новичка, которые вызваны обилием материала по прохождению, незнанием правильного формата поэтапного движения, а также обычным человеческим волнением.
Рассмотрели ТОП-5 ошибок, которые:
Стоит знать
Нивелировать в процессе интервью
Их проработка поможет четко двигаться по структуре интервью. Явно переходить на очередной этап вовлекая интервьюера. Что сделает ваше прохождение сильнее. И увеличит шансы на получение оффера ☑️
Удачи на реальном собеседование! 🏁
Пример экспресс подготовки за 1 неделю с успешным прохождением интервью по ссылке на моём канале - System Design World с тегом #SystemDesignExpressPrep
Если хотите волшебную таблетку(💊) для прохождения интервью, вот вам совет:
Набивайте шишки на мок интервью
Чем раньше, тем лучше. Будет живое общение - то самое, что ждёт вас на реальном интервью. Найти партнера можно в нашем сообществе канала или новеньком боте.
👉 Существуют ещё несколько интересных аспектов результативного прохождения интервью. Если интересно узнать, поддержите лайками, подумаю как скоро и в какой форме опубликовать. Удачи!