Skip to content

Commit bcc68f8

Browse files
authored
Add design-interview chapter (#7)
1 parent 2ad0d53 commit bcc68f8

File tree

2 files changed

+148
-0
lines changed

2 files changed

+148
-0
lines changed

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,16 @@
322322
* [Что такое VACUUM в PostgreSQL](questions.md/#Что-такое-VACUUM-в-PostgreSQL)
323323
* [Что такое EXPLAIN. Какая разница между ним и EXPLAIN ANALYZE](questions.md/#Что-такое-EXPLAIN-Какая-разница-между-ним-и-EXPLAIN-ANALYZE)
324324
* [Какие виды Join'ов вы знаете, чем они отличаются друг от друга](questions.md/#Какие-виды-Joinов-вы-знаете-чем-они-отличаются-друг-от-друга)
325+
- [Дизайн-интервью](questions.md/#Дизайн-интервью)
326+
* [План интервью](questions.md/#План-интервью)
327+
* [1. Сбор требований](questions.md/#1-Сбор-требований)
328+
* [2. Эстимейты](questions.md/#2-Эстимейты)
329+
* [3. API](questions.md/#3-API)
330+
* [4. High-level design](questions.md/#4-High-level-design)
331+
* [5. Detailed design](questions.md/#5-Detailed-design)
332+
+ [Performance mantras](questions.md/#Performance-mantras)
333+
* [6. Масштабирование](questions.md/#6-Масштабирование)
334+
+ [Performance bottlenecks](questions.md/#Performance-bottlenecks)
325335
- [Вопросы работодателю](questions.md/#Вопросы-работодателю)
326336
* [Вопросы HR'у](questions.md/#Вопросы-HRу)
327337
* [Вопросы для технического собеседования](questions.md/#Вопросы-для-технического-собеседования)

questions.md

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5374,6 +5374,144 @@ USING — это сокращённая запись условия, полез
53745374

53755375
Еще есть cross join - декартово произведение.
53765376

5377+
# Дизайн-интервью
5378+
5379+
[Как задизайнить Facebook за пол часа или секреты System Design Interview / Алексей Петров](https://www.youtube.com/watch?v=Be7INI_U6GY)
5380+
5381+
Тема очень обширная, поэтому этот раздел следует воспринимать как чеклист для его прохождения.
5382+
5383+
## План интервью
5384+
5385+
Будем считать что тайм-слот интервью - 40 минут.
5386+
5387+
1. Уточнить требования и ограничения (4 минуты)
5388+
2. Сделать эстимейты проектируемой системы (пропускная способность, сколько нужно хранить информации, количество серверов и т.д.) (3 минуты)
5389+
3. System interface - какие сервисы предоставляет система, какие сервисы использует система (3 минуты)
5390+
4. System high-level design - какие компоненты входят в систему, как они взаимодействуют друг с другом (5 минут)
5391+
5. Component detailed design - какие компоненты входят в систему, как они взаимодействуют друг с другом. Описать возможные ботлнеки (15 минут)
5392+
6. Масштабирование - как система будет масштабироваться (5 минут)
5393+
7. Summary - общий обзор и презентация решения (5 минут)
5394+
5395+
## 1. Сбор требований
5396+
5397+
Собираем ответы на вопросы "Что система делает?" и "Какой должна быть система?"
5398+
5399+
Примеры вопросов:
5400+
5401+
- Это должна быть глобальная система или региональная?
5402+
- Как быстро система должна реагировать на внесенные изменения (latency)?
5403+
- Какая должна быть доступность системы (availability)?
5404+
- Сколько у нас пользователей активно ежедневно?
5405+
- Сколько пользователи генерируют трафика ежедневно (количество постов, публикаций и тд)?
5406+
- Какое количество информации пользователь просматривает каждый день?
5407+
5408+
Если нам предлагают спроектировать систему по примеру существующей (twitter, facebook, google docs, etc), то мы можем спросить:
5409+
- Какую часть системы мы проектируем?
5410+
- Какие именно функции должны быть реализованы?
5411+
5412+
Сразу формируем для себя чек-лист требований, чтобы не забыть что-то важное.
5413+
Например нам предложили спроектировать Facebook с такими требованиями:
5414+
5415+
- Дизайним ленту новостей (news feed) фейсбука
5416+
- Фото/видео не реализуем
5417+
- Ранжирование постов не нужно, хронологический порядок
5418+
- Встраиваем реламу в ленту (желательно)
5419+
- Глобальная система (multi-region)
5420+
- Latency (внутри региона) < 1s
5421+
- Latency (между регионами) < 60s
5422+
- Durability (постоянство данных) очень важно
5423+
- Availability (доступность) менее важно
5424+
- Миллиард пользователей
5425+
- 10 миллионов постов в день
5426+
- 500 друзей в среднем
5427+
- 5 просмотров фида на пользователя в день
5428+
5429+
## 2. Эстимейты
5430+
5431+
Чтобы посчитать эстимейты нужно примерно представить какой тип информации сколько весит.
5432+
5433+
Хранение информации:
5434+
- Символ - 1 байт
5435+
- Метаданные (строка в базе, вес поста, etc) - 5-10 килобайт
5436+
- 1080p изображение - 2 мегабайта
5437+
- 1080p видео (минута) - 30 мегабайт
5438+
5439+
Сервера:
5440+
- Дисковое пространство - 10 терабайт
5441+
- RAM - 256-512 гигабайт
5442+
5443+
Итого считаем эстимейты для примера с фейсбуком:
5444+
- Read-write ratio - 5B / 10M = 500:1
5445+
- RPS
5446+
- Read: 5B / (24 * 60 * 60) = ~58k rps
5447+
- Write: 10M / (24 * 60 * 60) = ~115 rps
5448+
- Storage:
5449+
- 10KB * 10M = 100GB ежедневно
5450+
- 30 * 100GB = 3TB ежемесячно
5451+
- Пропускная способность:
5452+
- Read: 5B * 20 постов * 10KB = 1PB ежедневно
5453+
- Write: 10M * 10KB = 100GB ежедневно
5454+
5455+
PS. RPS мы посчитали "постоянный", в пиках он может увеличиваться в 10 раз (условно)
5456+
5457+
## 3. API
5458+
5459+
Описываем максимально просто - какие методы будут доступны, какие параметры будут принимать.
5460+
5461+
## 4. High-level design
5462+
5463+
Не стоит называть какие-то конкретные технологии, а просто описывать какие компоненты будут в системе и как они будут взаимодействовать.
5464+
Ну тоесть не нужно прям называть Nginx, а просто описать что будет балансировщик нагрузки.
5465+
5466+
- Если ставим лоад-балансер, то какой? (Round-robin, sticky sessions, etc)
5467+
- Если БД, то какая? (RDBMS, NoSQL, inmemory etc)
5468+
5469+
## 5. Detailed design
5470+
5471+
- Описываем схему БД и запросы к ней (можем прям примеры запросов писать)
5472+
- Перебираем подходы по обработке данных (pros/cons)
5473+
- Выбираем решения и объясняем их tradeoffs
5474+
- Проверяем требования (список который мы составили на шаге 1)
5475+
- Определить edge cases (если они есть)
5476+
5477+
### Performance mantras
5478+
5479+
В процессе, если мы сталкиваемся с проблемой производительности, то мы можем применять следующие [мантры](https://www.brendangregg.com/methodology.html):
5480+
- Не делай этого
5481+
- Делай, но только один раз
5482+
- Делай это реже
5483+
- Сделай это позже
5484+
- Сделай пока пользователь этого не видит
5485+
- Сделай это параллельно
5486+
- Сделай это дешевле
5487+
5488+
## 6. Масштабирование
5489+
5490+
Если говорим про шардирование, то сразу оговариаем какой ключ шардирования выбираем.
5491+
5492+
### Performance bottlenecks
5493+
5494+
В зависимости от количества пользователей нам может понадобиться разные инфраструктурные решения:
5495+
5496+
- 1000 пользователей
5497+
- 1 сервер
5498+
- 1 БД
5499+
- 10 000 пользователей
5500+
- Read replicas
5501+
- Несколько серверов
5502+
- Load balancer(s)
5503+
- 100 000 пользователей
5504+
- Message queue
5505+
- Rate limits
5506+
- Cache
5507+
- CDN
5508+
- 1 000 000 пользователей
5509+
- Stateless services (если они еще не такие)
5510+
- Возможно появится noSQL (если еще не использовался)
5511+
- Database sharding
5512+
- 1 000 000 000 пользователей
5513+
- Regional DCs
5514+
53775515
# Вопросы работодателю
53785516

53795517
- [Вопросы не мальчика, а джуна. 22 вопроса работодателю на собеседовании на позицию «Middle Python-разработчик»](https://habr.com/ru/post/428283/)

0 commit comments

Comments
 (0)