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