«Возьмите инициативу на себя»: готовимся к System Design Interview

Привет! Меня зовут Артём Ермилов. Я фронтенд-инженер в компании Авито. Сегодня я расскажу, как и для чего мы проводим интервью по System Design, а также про то, что ожидаем на этой секции от соискателей. Дополнительно перечислю полезные материалы для подготовки.

b412e5771265bae0eb68e15461453f23.jpg

Зачем мы проводим интервью по System Design

Одним из этапов собеседований в Авито является секция «Проектирование» a.k.a. System Design. Её мы проводим для технических менеджеров и большинства направлений разработчиков с определенного грейда, включая бэкенд, мобильную разработку, фронтенд. 

На секции мы можем дать как общую задачу вида «давай спроектируем Авито», так и задачу с условиями, специфичными для команды, в которую происходит найм. Примеры: «давай спроектируем конструктор виджетов, используя JS-фреймворк», «давай спроектируем бэкенд для сервиса нотификаций».

Вопросы на интервью по System Design могут быть открытыми, не иметь единственного правильного ответа, а процесс самого интервью может строиться по-разному: в зависимости от кандидата, задачи и интервьюера.

Может возникнуть вопрос: зачем мы проводим такую секцию? Ведь в реальной работе инженерам не нужно будет проектировать Авито заново, да и вообще редко когда придётся строить новые сложные архитектуры. Причины две.

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

Вторая: в Авито практикуется подход, когда одна команда может сама сформировать архитектуру проекта, реализовать её и запустить на пользователей без привлечения дополнительных разработчиков. Поэтому большинство наших команд кросс-функциональные и включают в себя бэкенд- и фронтенд-инженеров, iOS- и Android-разработчиков, QA. Они регулярно встречаются и вместе продумывают, как будут выполнять поставленные цели, обсуждают подходы к проектированию, разработке и тестированию фич. Поэтому команда должна быть вовлечена в процесс проектирования. Секция по System Design как раз позволяет проверить уровень экспертности кандидатов в этом вопросе.

На интервью мы сталкиваемся с ситуациями, когда кандидат получает задание и не знает, с чего начать проектирование, какие знания нужно продемонстрировать. Мои рекомендации дадут ответы на эти вопросы.

Этапы интервью

Я расскажу о каждом из них на примере нашей секции «Проектирование для фронтенд-инженеров». Но эти рекомендации подойдут и на другие позиции: бэкенд-инженера, тимлида, мобильного разработчика.

Интервью проходит в три этапа:

  1. Понимание поставленной задачи, определение границ проектируемой системы.

  2. Построение высокоуровневого дизайна системы.

  3. Погружение в детали.

Понимание поставленной задачи

На секции мы дадим вам задачу без чётких требований. Условие — спроектировать приложение. Это нужно, чтобы вы сами задали вопросы на понимание границ проектируемой системы, сценариев использования продукта, собрали функциональные и нефункциональные требования. Мы ожидаем, что вы учтёте собранную информацию при решении задачи. 

Обсуждайте на этом этапе:

  • конкретную функциональность, которой должно обладать приложение;

  • аудиторию приложения;

  • сроки разработки;

  • границы проектируемой системы, интеграция с партнерами.

Примерное время на этап: 5–10 минут.

Высокоуровневый дизайн

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

Для наглядности нарисуйте схему компонентов, которые входят в состав проектируемого приложения. Обозначьте связи между ними. Примеры таких компонентов: клиенты, балансеры, Backend-For-Frontend, сервера приложений, кеши, очереди, хранилища данных.

Если хватит времени, рассчитайте целевую нагрузку на бэкенд. Так вы поймёте, удовлетворяет ли спроектированный дизайн собранным требованиям.

Если в ходе собеседования появляются вопросы: «нужно ли спроектировать стор клиентского приложения?», «нужно ли спроектировать схему БД?», «нужно ли продумать контракты API эндпоинтов?», — обязательно задайте их интервьюеру. 

Примерное время на этап: 20 минут.

Погружение

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

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

Примеры вопросов для обсуждения:

  1. Технологический стек на фронтенде:

  • какие технологии и почему подходят для решения задачи?  

  • какие минусы у выбранных технологий?  

  • какие есть долгосрочные риски и как их решить?

  1. Клиент-серверное взаимодействие:

  1. Оптимизации и масштабирование (конкретные вопросы зависят от архитектуры, спроектированной на предыдущем этапе) 

  • нужен ли Backend-For-Frontend для данного приложения?  

  • как ускорить ответы от бэкенда?  

  • как защититься от пиковой нагрузки?  

  • как ускорить загрузку статики?  

  • стоит ли использовать микрофронтенды в данном приложении?  

  1. Тестирование

  • как покрывать приложение тестами с учётом пирамиды тестирования?

  • как организовать процесс контроля качества приложения?

  1. Метрики 

  • какие метрики помогут определить и локализовать проблемы в приложении?  

  • как организовать процесс сбора метрик?  

Примерное время на этап: 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 → 

Что ещё добавит вам плюсов

  1. Возьмите на себя инициативу по ведению интервью и рассуждайте вслух. Тогда интервьюер будет выступать в роли заказчика или бизнеса, отвечать на уточняющие вопросы.

  2. Продумывайте корнер-кейсы сценариев использования приложения и учитывайте их при проектировании.

  3. Когда принимаете решения в ходе собеседования — рассматривайте разные альтернативы, конкретизируйте и обосновывайте выбор, взвешивайте долгосрочные риски от его последствий.

Надеюсь, эта статья поможет вам успешно проходить собеседования по System Design. Успехов!

Предыдущая статья: Feature-Sliced Design — альтернативный подход к организации кода приложений

© Habrahabr.ru