«Возьмите инициативу на себя»: готовимся к System Design Interview
Привет! Меня зовут Артём Ермилов. Я фронтенд-инженер в компании Авито. Сегодня я расскажу, как и для чего мы проводим интервью по System Design, а также про то, что ожидаем на этой секции от соискателей. Дополнительно перечислю полезные материалы для подготовки.
Зачем мы проводим интервью по System Design
Одним из этапов собеседований в Авито является секция «Проектирование» a.k.a. System Design. Её мы проводим для технических менеджеров и большинства направлений разработчиков с определенного грейда, включая бэкенд, мобильную разработку, фронтенд.
На секции мы можем дать как общую задачу вида «давай спроектируем Авито», так и задачу с условиями, специфичными для команды, в которую происходит найм. Примеры: «давай спроектируем конструктор виджетов, используя JS-фреймворк», «давай спроектируем бэкенд для сервиса нотификаций».
Вопросы на интервью по System Design могут быть открытыми, не иметь единственного правильного ответа, а процесс самого интервью может строиться по-разному: в зависимости от кандидата, задачи и интервьюера.
Может возникнуть вопрос: зачем мы проводим такую секцию? Ведь в реальной работе инженерам не нужно будет проектировать Авито заново, да и вообще редко когда придётся строить новые сложные архитектуры. Причины две.
Первая: в ходе секции проектирования мы проверяем навыки кандидата — может ли он построить работоспособную архитектуру приложения на основании собранных требований. Также мы проверяем умение взвешивать плюсы и минусы выбранных решений, способность выявлять и нивелировать долгосрочные риски.
Вторая: в Авито практикуется подход, когда одна команда может сама сформировать архитектуру проекта, реализовать её и запустить на пользователей без привлечения дополнительных разработчиков. Поэтому большинство наших команд кросс-функциональные и включают в себя бэкенд- и фронтенд-инженеров, iOS- и Android-разработчиков, QA. Они регулярно встречаются и вместе продумывают, как будут выполнять поставленные цели, обсуждают подходы к проектированию, разработке и тестированию фич. Поэтому команда должна быть вовлечена в процесс проектирования. Секция по System Design как раз позволяет проверить уровень экспертности кандидатов в этом вопросе.
На интервью мы сталкиваемся с ситуациями, когда кандидат получает задание и не знает, с чего начать проектирование, какие знания нужно продемонстрировать. Мои рекомендации дадут ответы на эти вопросы.
Этапы интервью
Я расскажу о каждом из них на примере нашей секции «Проектирование для фронтенд-инженеров». Но эти рекомендации подойдут и на другие позиции: бэкенд-инженера, тимлида, мобильного разработчика.
Интервью проходит в три этапа:
Понимание поставленной задачи, определение границ проектируемой системы.
Построение высокоуровневого дизайна системы.
Погружение в детали.
Понимание поставленной задачи
На секции мы дадим вам задачу без чётких требований. Условие — спроектировать приложение. Это нужно, чтобы вы сами задали вопросы на понимание границ проектируемой системы, сценариев использования продукта, собрали функциональные и нефункциональные требования. Мы ожидаем, что вы учтёте собранную информацию при решении задачи.
Обсуждайте на этом этапе:
конкретную функциональность, которой должно обладать приложение;
аудиторию приложения;
сроки разработки;
границы проектируемой системы, интеграция с партнерами.
Примерное время на этап: 5–10 минут.
Высокоуровневый дизайн
После того, как вы собрали требования и уточнили границы системы, наступает этап дизайна архитектуры. Несмотря на то, что секция называется «Frontend-проектирование», полезно обсудить функционирование системы целиком — и клиент, и серверную часть. Это даст нам понять, можете ли вы заглянуть дальше клиентской разработки. Особенно это важно для Senior-инженеров и тимлидов.
Для наглядности нарисуйте схему компонентов, которые входят в состав проектируемого приложения. Обозначьте связи между ними. Примеры таких компонентов: клиенты, балансеры, Backend-For-Frontend, сервера приложений, кеши, очереди, хранилища данных.
Если хватит времени, рассчитайте целевую нагрузку на бэкенд. Так вы поймёте, удовлетворяет ли спроектированный дизайн собранным требованиям.
Если в ходе собеседования появляются вопросы: «нужно ли спроектировать стор клиентского приложения?», «нужно ли спроектировать схему БД?», «нужно ли продумать контракты API эндпоинтов?», — обязательно задайте их интервьюеру.
Примерное время на этап: 20 минут.
Погружение
Секция интервью ограничена по времени, поэтому на ней не получится детально обсудить все аспекты проектируемой системы. Согласуйте с интервьюером список вопросов для подробного обсуждения. Будет плюсом, если вы сами сделаете предположения о том, в какие аспекты нужно погрузиться глубже.
Также обсудите пограничные ситуации, которые могут возникнуть при использовании приложения, и способы защиты от них.
Примеры вопросов для обсуждения:
Технологический стек на фронтенде:
какие технологии и почему подходят для решения задачи?
какие минусы у выбранных технологий?
какие есть долгосрочные риски и как их решить?
Клиент-серверное взаимодействие:
Оптимизации и масштабирование (конкретные вопросы зависят от архитектуры, спроектированной на предыдущем этапе)
нужен ли Backend-For-Frontend для данного приложения?
как ускорить ответы от бэкенда?
как защититься от пиковой нагрузки?
как ускорить загрузку статики?
стоит ли использовать микрофронтенды в данном приложении?
Тестирование
как покрывать приложение тестами с учётом пирамиды тестирования?
как организовать процесс контроля качества приложения?
Метрики
какие метрики помогут определить и локализовать проблемы в приложении?
как организовать процесс сбора метрик?
Примерное время на этап: 30 минут
Полезные ресурсы
В интернете есть множество полезных источников для подготовки к System Design, в том числе и по направлению Frontend. Я отмечу эти:
Книги:
Alex Xu. System Design Interview — An insider«s guide
Купить на Amazon →
Alex Xu, Sahn Lam. System Design Interview — An insider«s guide, Volume: 2
Купить на Amazon →
Martin Kleppmann. Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems
Купить на Amazon →
Курсы educative Learn to Code with Educative Interactive Courses Online →
Визуализация архитектуры системы — может помочь C4 Model →
Ютуб-каналы:
Front-End Engineer →
ByteByteGo →
Что ещё добавит вам плюсов
Возьмите на себя инициативу по ведению интервью и рассуждайте вслух. Тогда интервьюер будет выступать в роли заказчика или бизнеса, отвечать на уточняющие вопросы.
Продумывайте корнер-кейсы сценариев использования приложения и учитывайте их при проектировании.
Когда принимаете решения в ходе собеседования — рассматривайте разные альтернативы, конкретизируйте и обосновывайте выбор, взвешивайте долгосрочные риски от его последствий.
Надеюсь, эта статья поможет вам успешно проходить собеседования по System Design. Успехов!
Предыдущая статья: Feature-Sliced Design — альтернативный подход к организации кода приложений