- PVSM.RU - https://www.pvsm.ru -
[1]Осенью прошлого года в московском офисе Яндекса прошла первая Школа бэкенд-разработки. Мы сняли занятия на видео и сегодня рады поделиться на Хабре полным видеокурсом Школы. Он позволит вам научиться промышленной разработке на Python. Авторы лекций — опытные разработчики в Яндексе. К каждому видео приложены ссылки на примеры и полезные материалы.
Для изучения курса нужно знать основы Python и понимать, как приложения развёртываются на серверах. Мы ждём, что вы умеете делать запросы к базам данных и знаете, как создаются веб‑приложения, — хотя бы на начальном уровне.
1. Устройство CPython [2]
2. Объектно-ориентированное программирование [3]
3. Тестирование [4]
4. Базы данных [5]
5. Базы данных: модели, миграции, тестирование [6]
6. Архитектура [7]
7. Инфраструктура [8]
8. Алгоритмы [9]
9. Дебаг, логирование, профилирование [10]
10. Асинхронное программирование. Лекция первая [11]
11. Асинхронное программирование. Лекция вторая [12]
12. Асинхронное программирование. Лекция третья [13]
Поговорим о том, почему и что мы пишем на Python. Обсудим устройство интерпретатора и словарей, менеджмент памяти и типизацию. Вы узнаете, как работают генераторы и как устроены исключения.
Презентация: yadi.sk/i/dcNx5Sgix4axOA [14]
Интепретатор в целом:
docs.python.org/3/reference/executionmodel.html [15]
github.com/python/cpython [16]
leanpub.com/insidethepythonvirtualmachine/read [17]
Управление памятью:
arctrix.com/nas/python/gc [18]
rushter.com/blog/python-memory-managment [19]
instagram-engineering.com/dismissing-python-garbage-collection-at-instagram-4dca40b29172 [20]
stackify.com/python-garbage-collection [21]
Исключения:
bugs.python.org/issue17611 [22]
Поговорим об ООП и его реализации в языке Python. Рассмотрим такие темы и понятия, как декораторы, дескрипторы и метаклассы.
Презентация: yadi.sk/i/f-UpCHCsnxqf9Q [23]
habr.com/ru/post/141411 [24]
docs.python.org/3/howto/descriptor.html [25]
habr.com/ru/post/145835 [26]
ibm.com/developerworks/ru/library/l-pymeta [27]
docs.python.org/2.5/ref/slots.html [28]
Поговорим о том, что такое тестирование ПО, какие бывают тесты и зачем их писать. Расскажем про библиотеки для тестирования Python-кода: unittest, pytest, doctest. Узнаем, чем они отличаются, и посмотрим на простые примеры тестов. Затронем тему непрерывной интеграции: что это такое, как это используется в разработке.
Презентация: yadi.sk/i/g6nd4aORJyrPMQ [29]
docs.python.org/3/library/unittest.html [30]
docs.pytest.org/en/latest [31]
docs.python.org/3/library/doctest.html [32]
Поговорим о том, что такое данные, какие базы данных бывают и чем они отличаются. Вы узнаете, какие особенности работы с БД нужно иметь в виду разработчику. Обсудим, как характеризовать, структурировать и хранить данные с расчётом на текущие особенности системы и её будущее масштабирование.
Благодаря полученным на лекции знаниям разработчик сможет понять, в какую из упомянутых тем нужно углубиться для решения конкретной задачи, а в случае возникновения багов — определить, является ли источником проблемы работа с БД. И если да, то в какую сторону копать.
Презентация: yadi.sk/i/Uf5U_xwt5qGBIQ [33]
Это лекция о практической работе с реляционными базами данных на примере PostgreSQL. Поговорим о том, как выбрать РСУБД, как выглядит инфраструктура в продакшене, сравним синхронные и асинхронные драйверы PostgreSQL. Узнаем, как устроен драйвер БД. Обсудим эффективную работу с данными, именованные и неименованные курсоры, использование транзакций, RETURNING и UPSERT.
Вы узнаете, как сделать отказоустойчивое и масштабируемое приложение, что такое Query Builder, ORM и когда их использовать (на примере SQLAlchemy), как писать миграции БД (на примере Alembic), а также зачем и как их тестировать.
Презентация: yadi.sk/i/DqYmAbrPu6en2g [34]
Примеры: github.com/alvassin/alembic-quickstart [35]
Рассмотрим три части проектирования новой функциональности системы:
— API для клиент-серверного взаимодействия;
— паттерны проектирования на уровне кода (обоснование необходимости декомпозиции со ссылкой на Мартина Фаулера);
— архитектура межсервисного взаимодействия.
Презентация: yadi.sk/d/PivB-ZJ0UJGjYQ [36]
Спецификация протокола HTTP:
tools.ietf.org/html/rfc2616 [37]
tools.ietf.org/html/rfc5789 [38]
15 тривиальных фактов о правильной работе с протоколом HTTP:
habr.com/ru/company/yandex/blog/265569 [39]
Стажер Вася и его история об идемпотентности API:
habr.com/ru/company/yandex/blog/442762 [40]
Patterns of Enterprise Application Architecture: martinfowler.com/eaaCatalog/index.html [41]
Microservices Patterns: manning.com/books/microservices-patterns [42]
Паттерны проектирования: litres.ru/elizabet-robson/head-first-patterny-proektirovaniya-39123671 [43]
Domain-Driven Design: Tackling Complexity in the Heart of Software: amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215 [44]
Optimizing the Netflix API: medium.com/netflix-techblog/optimizing-the-netflix-api-5c9ac715cf19 [45]
Обсудим инфраструктуру вокруг программы на Python: репозиторий Python Package Index (PyPI), инструмент virtualenv, процесс деплоймента, систему управления конфигурациями Ansible, виртуализацию и контейнеризацию.
Презентация: yadi.sk/i/9eOXdelTpXkoEQ [46]
Python Package: docs.python.org/3.8/distutils/setupscript.html [47]
virtualenv: docs.python.org/3.8/library/venv.html [48]
Развёртывание ПО: en.wikipedia.org/wiki/Software_deployment [49]
Ansible: docs.ansible.com/ansible/latest/user_guide/quickstart.html [50]
Виртуализация: en.wikipedia.org/wiki/Hardware_virtualization [51]
Контейнеризация: en.wikipedia.org/wiki/OS-level_virtualization [52]
Поговорим о структурах данных, вычислительной и амортизированной сложности.
На примере простого списка задач и его эволюции с постепенными улучшениями рассмотрим подходы к задачам написания серверной части веб-приложений. Сделаем обзор подходов и обычных приёмов оптимизации задач и кода. В заключительной части лекции рассмотрим процесс прохождения технических собеседований в IT-компаниях.
Презентация: yadi.sk/i/hBbOjd4SqMlw5g [53]
Реализация списков в Python: docs.python.org/3.7/faq/design.html#how-are-lists-implemented-in-cpython [54]
Разбор реализации списков в Python на Хабре: habr.com/ru/post/273045 [55]
Разбор алгоритма B-Tree на Хабре: habr.com/ru/post/114154 [56]
Разбор алгоритма LRU: habr.com/ru/post/136758 [57]
Работа LRU кэша в Redis: redis.io/topics/lru-cache [58]
Список команд Redis с вычислительными сложностями — можно поугадывать, что происходит под капотом: redis.io/commands [59]
Галактические алгоритмы: en.wikipedia.org/wiki/Galactic_algorithm [60]
Пример задачи на собеседовании из лекции: leetcode.com/problems/trapping-rain-water [61]
Введение в теорию сложности на Хабре: habr.com/ru/post/196560 [62]
Дайджест сервисов для практики программирования: tproger.ru/digest/competitive-programming-practice [63]
Пример сервиса с более-менее простым набором задач для знакомства с новыми языками: exercism.io [64]
В начале лекции вас ждёт введение в базовые знания по операционным системам (в частности, Linux). Затем рассмотрим управление памятью, процессами, многозадачность, IPC, файлы, системные вызовы. Покажем, как работать со встроенным в Python дебаггером Pdb. Поговорим про логирование в целом и про библиотеку logging в Python. Узнаем, как бороться с недостаточной производительностью программ и как найти узкое место, в котором тратится больше всего ресурсов процессора или памяти.
Презентация: yadi.sk/d/BCky8YkLcbVeUA [65]
Книга «Linux System Programming»: oreilly.com/library/view/linux-system-programming/9781449341527 [66]
Рассмотрим, в чём проблема синхронных приложений и что с этим можно сделать.
Обсудим, что происходит с точки зрения ОС при HTTP-запросе, как обрабатывать несколько запросов одновременно и какие есть преимущества и недостатки у процессов и потоков в веб-серверах. Вы узнаете об особенностях потоков в Python. Обсудим неблокирующий ввод-вывод: как обрабатывать несколько запросов в одном потоке.
Поговорим о том, что такое event-loop и зачем он нужен. Затронем тему выбора между синхронным и асинхронным решением.
Презентация: yadi.sk/i/OhqXMEOKzNlK6g [67]
A Web Crawler With asyncio Coroutines: aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html [68]
David Beazley: Generators: The Final Frontier: youtube.com/watch?v=D1twn9kLmYg [69]
Эта лекция — небольшая обзорная экскурсия по asyncio: библиотеке, интерфейсу и стандарту для асинхронного программирования в Python.
Мы рассмотрим высокоуровневый интерфейс asyncio (coroutine, task, future и методы для работы с ними), низкоуровневый интерфейс (цикл событий, политики), а также асинхронные интерфейсы Python (менеджеры контекста, итераторы, генераторы, comprehensions). Расскажем, зачем нужен aiohttp, как на нем написать веб-приложения. Вы узнаете, что такое middleware, каким образом aiohttp позволяет сериализовать данные и как выполнять асинхронные задачи в фоне.
Презентация: disk.yandex.ru/i/4gyVoP1DM9enxQ [70]
Build your own async (David Beazley): youtu.be/Y4Gt3Xjd7G8 [71]
Asyncio сегодня и завтра (Юрий Селиванов): youtu.be/3rSAtD2gKQE [72]
PEP 492: Coroutines with async and await syntax: python.org/dev/peps/pep-0492 [73]
PEP 530: Asynchronous Comprehensions: python.org/dev/peps/pep-0530 [74]
При разработке асинхронных приложений с Python и asyncio иногда возникают проблемы, связанные c управлением фоновыми задачами, блокировкой stdout, retry policy и блокирующими операциями. Вы узнаете о том, как команда сервиса Едадил решает эти проблемы при помощи aiomisc, об основных концепциях этого опенсорсного проекта, базовых классах, готовых сервисах, декораторах, работе с потоками и о многом другом.
Презентация: yadi.sk/i/SAJnWVQNfdHV0w [75]
Документация к aiomisc: pypi.org/project/aiomisc [76]
Автор: Дмитрий
Источник [77]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/352441
Ссылки в тексте:
[1] Image: https://habr.com/ru/company/yandex/blog/498856/
[2] 1. Устройство CPython: #1
[3] 2. Объектно-ориентированное программирование: #2
[4] 3. Тестирование: #3
[5] 4. Базы данных : #4
[6] 5. Базы данных: модели, миграции, тестирование : #5
[7] 6. Архитектура : #6
[8] 7. Инфраструктура: #7
[9] 8. Алгоритмы : #8
[10] 9. Дебаг, логирование, профилирование : #9
[11] 10. Асинхронное программирование. Лекция первая : #10
[12] 11. Асинхронное программирование. Лекция вторая: #11
[13] 12. Асинхронное программирование. Лекция третья: #12
[14] yadi.sk/i/dcNx5Sgix4axOA: https://yadi.sk/i/dcNx5Sgix4axOA
[15] docs.python.org/3/reference/executionmodel.html: https://docs.python.org/3/reference/executionmodel.html
[16] github.com/python/cpython: https://github.com/python/cpython
[17] leanpub.com/insidethepythonvirtualmachine/read: https://leanpub.com/insidethepythonvirtualmachine/read
[18] arctrix.com/nas/python/gc: http://arctrix.com/nas/python/gc/
[19] rushter.com/blog/python-memory-managment: https://rushter.com/blog/python-memory-managment/
[20] instagram-engineering.com/dismissing-python-garbage-collection-at-instagram-4dca40b29172: https://instagram-engineering.com/dismissing-python-garbage-collection-at-instagram-4dca40b29172
[21] stackify.com/python-garbage-collection: https://stackify.com/python-garbage-collection/
[22] bugs.python.org/issue17611: https://bugs.python.org/issue17611
[23] yadi.sk/i/f-UpCHCsnxqf9Q: https://yadi.sk/i/f-UpCHCsnxqf9Q
[24] habr.com/ru/post/141411: https://habr.com/ru/post/141411/
[25] docs.python.org/3/howto/descriptor.html: https://docs.python.org/3/howto/descriptor.html
[26] habr.com/ru/post/145835: https://habr.com/ru/post/145835/
[27] ibm.com/developerworks/ru/library/l-pymeta: https://ibm.com/developerworks/ru/library/l-pymeta/
[28] docs.python.org/2.5/ref/slots.html: https://docs.python.org/2.5/ref/slots.html
[29] yadi.sk/i/g6nd4aORJyrPMQ: https://yadi.sk/i/g6nd4aORJyrPMQ
[30] docs.python.org/3/library/unittest.html: https://docs.python.org/3/library/unittest.html
[31] docs.pytest.org/en/latest: https://docs.pytest.org/en/latest/
[32] docs.python.org/3/library/doctest.html: https://docs.python.org/3/library/doctest.html
[33] yadi.sk/i/Uf5U_xwt5qGBIQ: https://yadi.sk/i/Uf5U_xwt5qGBIQ
[34] yadi.sk/i/DqYmAbrPu6en2g: https://yadi.sk/i/DqYmAbrPu6en2g
[35] github.com/alvassin/alembic-quickstart: https://github.com/alvassin/alembic-quickstart
[36] yadi.sk/d/PivB-ZJ0UJGjYQ: https://yadi.sk/d/PivB-ZJ0UJGjYQ
[37] tools.ietf.org/html/rfc2616: https://tools.ietf.org/html/rfc2616
[38] tools.ietf.org/html/rfc5789: https://tools.ietf.org/html/rfc5789
[39] habr.com/ru/company/yandex/blog/265569: https://habr.com/ru/company/yandex/blog/265569/
[40] habr.com/ru/company/yandex/blog/442762: https://habr.com/ru/company/yandex/blog/442762/
[41] martinfowler.com/eaaCatalog/index.html: https://martinfowler.com/eaaCatalog/index.html
[42] manning.com/books/microservices-patterns: https://manning.com/books/microservices-patterns
[43] litres.ru/elizabet-robson/head-first-patterny-proektirovaniya-39123671: https://litres.ru/elizabet-robson/head-first-patterny-proektirovaniya-39123671/
[44] amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215: https://amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215
[45] medium.com/netflix-techblog/optimizing-the-netflix-api-5c9ac715cf19: https://medium.com/netflix-techblog/optimizing-the-netflix-api-5c9ac715cf19
[46] yadi.sk/i/9eOXdelTpXkoEQ: https://yadi.sk/i/9eOXdelTpXkoEQ
[47] docs.python.org/3.8/distutils/setupscript.html: https://docs.python.org/3.8/distutils/setupscript.html
[48] docs.python.org/3.8/library/venv.html: https://docs.python.org/3.8/library/venv.html
[49] en.wikipedia.org/wiki/Software_deployment: https://en.wikipedia.org/wiki/Software_deployment
[50] docs.ansible.com/ansible/latest/user_guide/quickstart.html: https://docs.ansible.com/ansible/latest/user_guide/quickstart.html
[51] en.wikipedia.org/wiki/Hardware_virtualization: https://en.wikipedia.org/wiki/Hardware_virtualization
[52] en.wikipedia.org/wiki/OS-level_virtualization: https://en.wikipedia.org/wiki/OS-level_virtualization
[53] yadi.sk/i/hBbOjd4SqMlw5g: https://yadi.sk/i/hBbOjd4SqMlw5g
[54] docs.python.org/3.7/faq/design.html#how-are-lists-implemented-in-cpython: https://docs.python.org/3.7/faq/design.html#how-are-lists-implemented-in-cpython
[55] habr.com/ru/post/273045: https://habr.com/ru/post/273045/
[56] habr.com/ru/post/114154: https://habr.com/ru/post/114154/
[57] habr.com/ru/post/136758: https://habr.com/ru/post/136758/
[58] redis.io/topics/lru-cache: https://redis.io/topics/lru-cache
[59] redis.io/commands: https://redis.io/commands
[60] en.wikipedia.org/wiki/Galactic_algorithm: https://en.wikipedia.org/wiki/Galactic_algorithm
[61] leetcode.com/problems/trapping-rain-water: https://leetcode.com/problems/trapping-rain-water/
[62] habr.com/ru/post/196560: https://habr.com/ru/post/196560/
[63] tproger.ru/digest/competitive-programming-practice: https://tproger.ru/digest/competitive-programming-practice/
[64] exercism.io: https://exercism.io
[65] yadi.sk/d/BCky8YkLcbVeUA: https://yadi.sk/d/BCky8YkLcbVeUA
[66] oreilly.com/library/view/linux-system-programming/9781449341527: https://oreilly.com/library/view/linux-system-programming/9781449341527/
[67] yadi.sk/i/OhqXMEOKzNlK6g: https://yadi.sk/i/OhqXMEOKzNlK6g
[68] aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html: https://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html
[69] youtube.com/watch?v=D1twn9kLmYg: https://youtube.com/watch?v=D1twn9kLmYg
[70] disk.yandex.ru/i/4gyVoP1DM9enxQ: https://disk.yandex.ru/i/4gyVoP1DM9enxQ
[71] youtu.be/Y4Gt3Xjd7G8: https://youtu.be/Y4Gt3Xjd7G8
[72] youtu.be/3rSAtD2gKQE: https://youtu.be/3rSAtD2gKQE
[73] python.org/dev/peps/pep-0492: https://python.org/dev/peps/pep-0492/
[74] python.org/dev/peps/pep-0530: https://python.org/dev/peps/pep-0530/
[75] yadi.sk/i/SAJnWVQNfdHV0w: https://yadi.sk/i/SAJnWVQNfdHV0w
[76] pypi.org/project/aiomisc: https://pypi.org/project/aiomisc/
[77] Источник: https://habr.com/ru/post/498856/?utm_source=habrahabr&utm_medium=rss&utm_campaign=498856
Нажмите здесь для печати.