9 Commits
1.0.0 ... 1.1.3

Author SHA1 Message Date
Daniel
a19d2ebf06 Update questions.md (#20) (#22) 2024-10-26 23:50:35 +03:00
yakimka
33d7ec3d0c Update questions.md 2024-09-15 16:09:37 +03:00
yakimka
db9d0142b8 Add more links for design patterns (#15) 2024-02-21 03:51:23 +02:00
Anton Romanov
0b40521541 Update questions.md (#13)
update Что такое async/await, для чего они нужны и как их использовать
2024-02-21 03:48:25 +02:00
Roman
345d531fde Update questions.md (#14)
* Update questions.md

added some possible slices for iterable objects

* Update questions.md

minor changes
2024-02-21 03:47:14 +02:00
yakimka
adcaa9e332 Update questions.md (#10) 2023-02-21 15:23:54 -08:00
Tony
7c45b4264c Update questions.md (#8)
лишняя "и"
2023-02-20 04:56:43 -08:00
yakimka
bcc68f8424 Add design-interview chapter (#7) 2022-12-05 15:15:28 -08:00
yakimka
2ad0d538c2 Add questions (#6)
* Update Вопросы работодателю

* Add questions
2022-02-19 01:52:52 +02:00
2 changed files with 194 additions and 27 deletions

View File

@@ -128,7 +128,7 @@
+ [В каких случаях можно обработать SyntaxError](questions.md/#В-каких-случаях-можно-обработать-SyntaxError)
+ [Можно ли создавать собственные исключения](questions.md/#Можно-ли-создавать-собственные-исключения)
+ [Для чего нужны предупреждения (warnings) и как создать собственное](questions.md/#Для-чего-нужны-предупреждения-warnings-и-как-создать-собственное)
+ [Для чего нужен модуль warning](questions.md/#Для-чего-нужен-модуль-warning)
+ [Для чего нужен модуль warnings](questions.md/#Для-чего-нужен-модуль-warnings)
* [Декораторы](questions.md/#Декораторы)
+ [Что такое декораторы. Зачем нужны](questions.md/#Что-такое-декораторы-Зачем-нужны)
+ [Что может быть декоратором. К чему может быть применен декоратор](questions.md/#Что-может-быть-декоратором-К-чему-может-быть-применен-декоратор)
@@ -322,6 +322,16 @@
* [Что такое VACUUM в PostgreSQL](questions.md/#Что-такое-VACUUM-в-PostgreSQL)
* [Что такое EXPLAIN. Какая разница между ним и EXPLAIN ANALYZE](questions.md/#Что-такое-EXPLAIN-Какая-разница-между-ним-и-EXPLAIN-ANALYZE)
* [Какие виды Join'ов вы знаете, чем они отличаются друг от друга](questions.md/#Какие-виды-Joinов-вы-знаете-чем-они-отличаются-друг-от-друга)
- [Дизайн-интервью](questions.md/#Дизайн-интервью)
* [План интервью](questions.md/#План-интервью)
* [1. Сбор требований](questions.md/#1-Сбор-требований)
* [2. Эстимейты](questions.md/#2-Эстимейты)
* [3. API](questions.md/#3-API)
* [4. High-level design](questions.md/#4-High-level-design)
* [5. Detailed design](questions.md/#5-Detailed-design)
+ [Performance mantras](questions.md/#Performance-mantras)
* [6. Масштабирование](questions.md/#6-Масштабирование)
+ [Performance bottlenecks](questions.md/#Performance-bottlenecks)
- [Вопросы работодателю](questions.md/#Вопросы-работодателю)
* [Вопросы HR'у](questions.md/#Вопросы-HRу)
* [Вопросы для технического собеседования](questions.md/#Вопросы-для-технического-собеседования)

View File

@@ -12,14 +12,18 @@
### Какие операции поддерживают большинство последовательностей
- `x in s`, `x not in s` находится ли элемент x в последовательности s (для строк и последовательностей байтов является ли x подстрокой s)
- `s + t` конкатенация последовательностей
- `s + t` конкатенация последовательностей s и t
- `s * n, n * s` конкатенация n нерекурсивных копий последовательности s
- `s[i]` i-й элемент последовательности s
- `s[i:j]` срез последовательности s от i до j
- `s[i:j:k]` срез последовательности s от i до j с шагом k
- `len(s)` длина последовательности
- `min(s)` минимальный элемент последовательности
- `max(s)` максимальный элемент последовательности
- `s[:i]` - срез всех элементов последовательности s до i (не включая i)
- `s[i:]` - срез всех элементов последовательности s от i до последнего элемента
- `s[-i:]` - срез последних i элементов последовательности s
- `s[::-1]` - перевернуть последовательность
- `s[i:j]` срез последовательности s от i до j (не включая j)
- `s[i:j:k]` срез последовательности s от i до j с шагом k (не включая j)
- `len(s)` длина последовательности s
- `min(s)` минимальный элемент последовательности s
- `max(s)` максимальный элемент последовательности s
- `s.index(x[, i[, j]])` индекс первого вхождения x (опционально начиная с позиции i и до позиции j)
- `s.count(x)` общее количество вхождений x в s
- `sum(s)` сумма элементов последовательности
@@ -380,7 +384,7 @@ foo()
Интерпретатор создаёт объект «john» и «имя» var, а затем связывает объект с данным именем.
При вызове функции, новых объектов не создаётся, вместо этого в её области видимости создаётся имя, которое связывается с существующим объектом.
Но в python есть изменяемые и неизменяемые типы. К первым, например, относятся числа: при арифметических операциях существующие объекты не меняются, а создаётся новый объект, с которым потом связывается существующее имя. Если же со старым объектом после этого не связано ни одного имени, оно будет удалено с помощью механизма подсчёта ссылок.
Но в python есть изменяемые и неизменяемые типы. Ко вторым, например, относятся числа: при арифметических операциях существующие объекты не меняются, а создаётся новый объект, с которым потом связывается существующее имя. Если же со старым объектом после этого не связано ни одного имени, оно будет удалено с помощью механизма подсчёта ссылок.
Если же имя связано с переменной изменяемого типа, то при операциях с ней изменяется память объекта, соответственно все имена, связанные с данной областью памяти «увидят» изменения.
### Что такое замыкание
@@ -925,9 +929,9 @@ except ZeroDivisionError:
Базовым классом для предупреждений является Warning, который наследуется от Exception.
Базовым классом-наследником Warning для пользовательских предупреждений является UserWarning.
### Для чего нужен модуль warning
### Для чего нужен модуль warnings
В модуле warning собраны функции для работы с предупреждениями.
В модуле warnings собраны функции для работы с предупреждениями.
Основной является функция warn, которая принимает один обязательный параметр message, который может быть либо строкой-сообщением, либо экземпляром класса или подкласса Warning (в таком случае параметр category устанавливается автоматически) и два опциональных параметра: category (по умолчанию UserWarning) класс предупреждения и stacklevel (по умолчанию 1) уровень вложенности функций, начиная с которого необходимо выводить содержимое стека вызовов (полезно, например, для функций-обёрток для вывода предупреждений, где следует задать stacklevel=2, чтобы предупреждение относилось к месту вызова данной функции, а не самой функции).
## Декораторы
@@ -1433,16 +1437,17 @@ import aiohttp
urls = ['http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org']
async def call_url(url):
print('Starting {}'.format(url))
response = await aiohttp.get(url)
data = await response.text()
print('{}: {} bytes: {}'.format(url, len(data), data))
return data
async with aiohttp.ClientSession() as session:
print('Starting {}'.format(url))
async with session.get(url) as response:
data = await response.text()
print('{}: {} bytes: {}'.format(url, len(data), data))
return data
futures = [call_url(url) for url in urls]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(futures))
loop.run_until_complete(asyncio.gather(*futures))
```
Программа состоит из метода async. Во время выполнения он возвращает сопрограмму, которая затем находится в ожидании.
@@ -1637,6 +1642,7 @@ class MyClass(BaseClass, metaclass=Singleton):
## Что такое garbage collector. В чём его плюсы и минусы
- [Всё, что нужно знать о сборщике мусора в Python](https://habr.com/ru/post/417215/)
- [CPython Garbage Collection: The Internal Mechanics and Algorithms](https://blog.codingconfessions.com/p/cpython-garbage-collection-internals)
GC (generational garbage collector) - это сборщик мусора, создавался он в первую очередь для обнаружения и удаления циклических ссылок.
`gc` является встроенным в python модулем и при необходимости его можно выключить и запускать вручную (или не запускать). Чтобы понимать для чего был создан GC нужно понимать как в Python работает менеджер памяти и как эта память высвобождается.
@@ -2194,6 +2200,8 @@ HTTPS — расширение протокола HTTP, поддерживающ
- [GitHub - pkolt/design_patterns: Паттерны проектирования](https://github.com/pkolt/design_patterns)
- [GitHub - faif/python-patterns: A collection of design patterns/idioms in Python](https://github.com/faif/python-patterns)
- [Python Design Patterns](https://python-patterns.guide/)
- [Design Patterns in Python: A Series](https://medium.com/@amirm.lavasani/design-patterns-in-python-a-series-f502b7804ae5)
- [A Catalog For Design Patterns in Python](https://towardsdev.com/a-catalog-for-design-patterns-in-python-a1b69493c677)
### Порождающие (Creational)
@@ -5288,7 +5296,7 @@ Pre-commit check можно использовать например так:
Запрос к реляционной базе данных обычно возвращает несколько рядов (записей) данных, но приложение за один раз обрабатывает лишь одну запись. Даже если оно имеет дело одновременно с несколькими рядами (например, выводит данные в форме электронных таблиц), их количество по-прежнему ограничено. Кроме того, при модификации, удалении или добавлении данных рабочей единицей является ряд. В этой ситуации на первый план выступает концепция курсора, и в таком контексте курсор указатель на ряд.
Курсор в SQL это область в памяти базы данных, которая предназначена для хранения последнего оператора SQL. Если текущий оператор запрос к базе данных, в памяти сохраняется и строка данных запроса, называемая текущим значением, или текущей строкой курсора. Указанная область в памяти поименована и доступна для прикладных программ.
Курсор в SQL это область в памяти базы данных, которая предназначена для хранения последнего оператора SQL. Если текущий оператор запрос к базе данных, в памяти сохраняется строка данных запроса, называемая текущим значением, или текущей строкой курсора. Указанная область в памяти поименована и доступна для прикладных программ.
Обычно курсоры используются для выбора из базы данных некоторого подмножества хранимой в ней информации. В каждый момент времени прикладной программой может быть проверена одна строка курсора. Курсоры часто применяются в операторах SQL, встроенных в написанные на языках процедурного типа прикладные программы. Некоторые из них неявно создаются сервером базы данных, в то время как другие определяются программистами.
@@ -5374,6 +5382,144 @@ USING — это сокращённая запись условия, полез
Еще есть cross join - декартово произведение.
# Дизайн-интервью
[Как задизайнить Facebook за пол часа или секреты System Design Interview / Алексей Петров](https://www.youtube.com/watch?v=Be7INI_U6GY)
Тема очень обширная, поэтому этот раздел следует воспринимать как чеклист для его прохождения.
## План интервью
Будем считать что тайм-слот интервью - 40 минут.
1. Уточнить требования и ограничения (4 минуты)
2. Сделать эстимейты проектируемой системы (пропускная способность, сколько нужно хранить информации, количество серверов и т.д.) (3 минуты)
3. System interface - какие сервисы предоставляет система, какие сервисы использует система (3 минуты)
4. System high-level design - какие компоненты входят в систему, как они взаимодействуют друг с другом (5 минут)
5. Component detailed design - какие компоненты входят в систему, как они взаимодействуют друг с другом. Описать возможные ботлнеки (15 минут)
6. Масштабирование - как система будет масштабироваться (5 минут)
7. Summary - общий обзор и презентация решения (5 минут)
## 1. Сбор требований
Собираем ответы на вопросы "Что система делает?" и "Какой должна быть система?"
Примеры вопросов:
- Это должна быть глобальная система или региональная?
- Как быстро система должна реагировать на внесенные изменения (latency)?
- Какая должна быть доступность системы (availability)?
- Сколько у нас пользователей активно ежедневно?
- Сколько пользователи генерируют трафика ежедневно (количество постов, публикаций и тд)?
- Какое количество информации пользователь просматривает каждый день?
Если нам предлагают спроектировать систему по примеру существующей (twitter, facebook, google docs, etc), то мы можем спросить:
- Какую часть системы мы проектируем?
- Какие именно функции должны быть реализованы?
Сразу формируем для себя чек-лист требований, чтобы не забыть что-то важное.
Например нам предложили спроектировать Facebook с такими требованиями:
- Дизайним ленту новостей (news feed) фейсбука
- Фото/видео не реализуем
- Ранжирование постов не нужно, хронологический порядок
- Встраиваем реламу в ленту (желательно)
- Глобальная система (multi-region)
- Latency (внутри региона) < 1s
- Latency (между регионами) < 60s
- Durability (постоянство данных) очень важно
- Availability (доступность) менее важно
- Миллиард пользователей
- 10 миллионов постов в день
- 500 друзей в среднем
- 5 просмотров фида на пользователя в день
## 2. Эстимейты
Чтобы посчитать эстимейты нужно примерно представить какой тип информации сколько весит.
Хранение информации:
- Символ - 1 байт
- Метаданные (строка в базе, вес поста, etc) - 5-10 килобайт
- 1080p изображение - 2 мегабайта
- 1080p видео (минута) - 30 мегабайт
Сервера:
- Дисковое пространство - 10 терабайт
- RAM - 256-512 гигабайт
Итого считаем эстимейты для примера с фейсбуком:
- Read-write ratio - 5B / 10M = 500:1
- RPS
- Read: 5B / (24 * 60 * 60) = ~58k rps
- Write: 10M / (24 * 60 * 60) = ~115 rps
- Storage:
- 10KB * 10M = 100GB ежедневно
- 30 * 100GB = 3TB ежемесячно
- Пропускная способность:
- Read: 5B * 20 постов * 10KB = 1PB ежедневно
- Write: 10M * 10KB = 100GB ежедневно
PS. RPS мы посчитали "постоянный", в пиках он может увеличиваться в 10 раз (условно)
## 3. API
Описываем максимально просто - какие методы будут доступны, какие параметры будут принимать.
## 4. High-level design
Не стоит называть какие-то конкретные технологии, а просто описывать какие компоненты будут в системе и как они будут взаимодействовать.
Ну тоесть не нужно прям называть Nginx, а просто описать что будет балансировщик нагрузки.
- Если ставим лоад-балансер, то какой? (Round-robin, sticky sessions, etc)
- Если БД, то какая? (RDBMS, NoSQL, inmemory etc)
## 5. Detailed design
- Описываем схему БД и запросы к ней (можем прям примеры запросов писать)
- Перебираем подходы по обработке данных (pros/cons)
- Выбираем решения и объясняем их tradeoffs
- Проверяем требования (список который мы составили на шаге 1)
- Определить edge cases (если они есть)
### Performance mantras
В процессе, если мы сталкиваемся с проблемой производительности, то мы можем применять следующие [мантры](https://www.brendangregg.com/methodology.html):
- Не делай этого
- Делай, но только один раз
- Делай это реже
- Сделай это позже
- Сделай пока пользователь этого не видит
- Сделай это параллельно
- Сделай это дешевле
## 6. Масштабирование
Если говорим про шардирование, то сразу оговариаем какой ключ шардирования выбираем.
### Performance bottlenecks
В зависимости от количества пользователей нам может понадобиться разные инфраструктурные решения:
- 1000 пользователей
- 1 сервер
- 1 БД
- 10 000 пользователей
- Read replicas
- Несколько серверов
- Load balancer(s)
- 100 000 пользователей
- Message queue
- Rate limits
- Cache
- CDN
- 1 000 000 пользователей
- Stateless services (если они еще не такие)
- Возможно появится noSQL (если еще не использовался)
- Database sharding
- 1 000 000 000 пользователей
- Regional DCs
# Вопросы работодателю
- [Вопросы не мальчика, а джуна. 22 вопроса работодателю на собеседовании на позицию «Middle Python-разработчик»](https://habr.com/ru/post/428283/)
@@ -5382,16 +5528,20 @@ USING — это сокращённая запись условия, полез
1. Что с отпуском и больничными?
2. Переносится ли отпуск на следующий год?
3. Есть ли мед-страховка?
4. Есть ли стажировка и как проходит?
5. Свободный график? Нужно находиться в офисе n часов?
6. Как в компании относятся к удалённой работе?
7. Существует ли в компании годовая/квартальная оценка сотрудников и как она происходит?
8. Есть ли у в компании переработки? Если есть, то компенсируются ли они и как часто они происходят?
9. Насколько в компании сильна бюрократия?
10. Является ли компания участником каких-либо IT-конференций и есть ли у компании публикации на IT-темы?
11. Есть ли митапы внутри компании?
12. Есть ли в компании стажёры и развита ли система наставничества?
3. Какое отношение к официальным государственным выходным?
4. Есть ли мед-страховка?
5. Какие ограничения есть на период испытательного срока
6. Свободный график? Нужно находиться в офисе n часов?
7. Как в компании относятся к удалённой работе?
8. Можно ли получить оборудование для удалённой работы (мониторы, etc.) или может есть компенсация на оборудование рабочего места
9. Существует ли в компании полугодовая/годовая оценка сотрудников и как она происходит?
10. Какой минимальный срок для первого пересмотра ЗП начиная с первого рабочего дня?
11. Есть ли у в компании переработки? Если есть, то компенсируются ли они и как часто они происходят?
12. Насколько в компании сильна бюрократия?
13. Является ли компания участником каких-либо IT-конференций и есть ли у компании публикации на IT-темы?
14. Есть ли митапы внутри компании?
15. Есть ли в компании стажёры и развита ли система наставничества?
16. Зарплата в какой валюте и привязана ли к курсу, если не в у.е?
## Вопросы для технического собеседования
@@ -5408,6 +5558,13 @@ USING — это сокращённая запись условия, полез
11. Используется ли технология контейнеризации в проектах?
12. Немного поспрашивать собеседующего о том, чем он занимался до этого проекта и давно ли он в проекте.
13. Есть ли синьеры в команде или просто очень опытные разрабы?
14. Оцениваниются ли задачи по времени или стори-поинтам?
15. Как легко втащить в проект новую технологию? Как выбирается стек для нового проекта?
16. Как в команде принимаются решения? Есть ли человек за которым последнее слово?
17. Попросить описать несколько типичных задач или несколько последних
18. Какие версии Python и фреймворков используются?
19. Насколько часто приходится работать с legacy?
20. Если приходится работать с legacy то какой подход: вносим минимальные правки или пытаемся привести legacy в нормальный вид?
# Интересные ссылки