Как научиться разработке на Python: новый видеокурс Яндекса

rayj7oxvffqdtqpdqw_5nnpmuto.pngОсенью прошлого года в московском офисе Яндекса прошла первая Школа бэкенд-разработки. Мы сняли занятия на видео и сегодня рады поделиться на Хабре полным видеокурсом Школы. Он позволит вам научиться промышленной разработке на Python. Авторы лекций — опытные разработчики в Яндексе. К каждому видео приложены ссылки на примеры и полезные материалы.

Для изучения курса нужно знать основы 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 позволяет сериализовать данные и как выполнять асинхронные задачи в фоне.


Презентация: yadi.sk/i/CG21xSCuMdwPkw

Ссылки


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

© Habrahabr.ru