System Design Interview. Шаблон прохождения собеседования этого этапа

Недавно я собеседовался в Амазон и Майкрософт в офисы в Испании (так как я тут живу). Пока готовился много что понял, сейчас поделюсь.

Собеседование на проектирование систем.

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


Каждый этап, чтобы все успеть, желательно ограничить временем


Структура и тайминг предлагаемого шаблона такой: 

0. Формальное представление друг другу ~5 min

1. Сбор требований (Requirements) ~5 min

2. Ключевые сущности (Core entities) ~2 min

3. Методы / контракт (API or Interface) ~5 min

4. Как передаются данные (Data flow) ~5 min

5. Само проектирование, рисование (High Level Design) ~10-15 min

6. Углубление в проблему (Deep Dives) ~10 min

Итого: ~40-45 мин


0. Формальное представление друг другу 

На этом этапе вам скажут что-то типа: 

Привет, Я Джон, работаю в Имя_Компании столько-то лет, моя роль такая то, сегодня будем с тобой делать примерно вот такое, расскажешь о себе?

Ответ должен быть емкий типа:

Привет, Я Андрей, engineering manager, у меня 10 лет+ опыта в разработке ПО, сейчас работаю такой_то компании, делаем вот такое, до этого был вот там менеджером, делали вот это. Мой бекграунд фуллстек фронтенд, бекенд, мобайл с такими то технологиями. Приятно познакомиться


1. Сбор требований (Requirements) ~5 min

Цель этапа собрать требования чтобы иметь четкое понимание что сейчас надо будет проектировать. Можно сравнить это с фрилансом/клиентом когда вы узнаете что надо конкретно сделать. 

Например: Твиттер

Делиться этап на 2 под этапа:

1.1 Функциональные требования (Users/Clients should be able…)

— Постить твиты

— Подписаться на других

— Видеть твиты тех на кого подписан

1.2 Не-функциональные требования (The system should be able to…)

— 100M пользователей в день (DAU)

— Быстро отображать ленту (до 200ms)

— Высокая доступность (99.9%)

Если вас попросили спроектировать Твиттер, или другой «большой» проект, не надо расписывать все функции, иначе их и будут ожидать от вас, ваша задача выбирать стратегически фичи, например 3 основные, и сфокусироваться на них, а остальное упомянуть только как out of scope (вне проекта).


2. Ключевые сущности (Core entities) ~2 min

На этом этапе просто определите, и напишите, сущности без детальной модели/таблицы, она может измениться после дизайна, главное выделить основное

User

Tweet

Follow


3. Методы / контракт (API or Interface) ~5 min

Не нужно мудрить, постарайтесь выделить основное

POST /v1/tweet

body: {

  "text": string

}

GET /v1/tweet/:tweetId -> Tweet

POST /v1/follow/:userId

GET /v1/feed -> Tweet[]

Вы можете заметить тут не передается пользователь, нужно упомянуть что обычно он берется из auth token заголовка, sensitive информация типа userid, не должна быть в body и get запросах.


4. Как передаются данные (Data flow) ~5 min

Рассказать как примерно будут течь данные по системе, типа:

Когда публикуем твит, это передается по апи в сервис, сервис отправляет в базу, при запросе ленты, они собираются из базы (или из кеша) и передаются как массив


5. Само проектирование, рисование (High Level Design) ~10-15 min

На этом этапе надо нарисовать что-то простое, типа вот client обращение на backend/сервис, через api gateway, вот база куда записываются данные/читаются. На этом этапе уже можно расписаться какие поля в сущности User, Tweet, Follow. И объясняя параллельно как данные будут течь по системе.

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

Здесь надо чтобы система соответствовала Функциональным требованиям.


6. Углубление в проблему (Deep Dives) ~10 min

Тут чтобы система соответствовала Не-Функциональным требованиям. 

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


Во время всего собеседования надо держать связь с интервьюверов, и периодически уточнять: 

Все норм? Продолжаю? Куда углубиться? 

И не переборщить с вопросами, нужно одновременно показать что вы понимаете что делаете и “вести”.


На данный момент я работаю в международной компании из «travel» индустрии в роли Engineering Manager, но очень хочу работать в айти гиганте типа Амазон/Майкрософт, поэтому много изучаю и стремлюсь туда.

Если вы уже проходили туда и можете поделиться советами — буду рад

Недавно проходил interview loop (это когда 4-5 собесов в один день) в Амазон, жду пока результат, обязательно расскажу здесь и у себя в тг канале. А в прошлом году я проходил в Майкрасофт, но был плохо подготовлен и не прошел.

Автор: aposnov

Источник

Оставить комментарий