company_banner

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

  • Tutorial
Осенью прошлого года в московском офисе Яндекса прошла первая Школа бэкенд-разработки. Мы сняли занятия на видео и сегодня рады поделиться на Хабре полным видеокурсом Школы. Он позволит вам научиться промышленной разработке на 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 позволяет сериализовать данные и как выполнять асинхронные задачи в фоне.


Презентация: 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
Яндекс
Как мы делаем Яндекс

Comments 36

    0
    Первое видео недоступно к просмотру
      0
      Проверьте ещё раз или из другого браузера, мы ничего не трогали.
      0
      Первое видео недоступно к просмотру

      Сейчас проверим, спасибо.
        0
        Круто, спасибо за материал!
          0
          Лекция № 11. Вместо презентации видос, поправьте пожалуйста.
            0
            Сейчас исправим, спасибо.
              0
              Исправлено.
            0
            в 11м уроке в презентации должен быть видеофайл прикреплен?
              0
              Сейчас исправим, спасибо.
                0
                Исправлено.
              +1
              Не нравится мне это — слишком много последнее время Python'а. Не вышло бы так же как с С++
                0
                А как вышло на С++?
                  +2
                  Большая популярность привела к тому, что студенты выучив только его уже не к чему не стремились, что привело внедрение этого языка там где ему не место. Буквально 2 дня назад знакомый попросил подправить на сайте страницу зайдя на который я сначала подумал, что тариф на хостинге куплен самый дешёвый ибо страница с одной картинкой и одним input грузилась подозрительно долго. Хостинг оказался вполне нормальный, вот только сайт состоящий из 5 с половиной страниц был написан на Python с использованием Django. Ну куда это годится. И это тенденция только растёт. Как ниже автор написал — быстренько сваял с использованием готовых библиотек и ладненько. Ну подумаешь, что тормозит и жрёт ресурсы…
                    +2
                    Ясно, спасибо. Я подумал, что вы имели ввиду C#, в который сейчас просто ломятся все кому не лень (из-за игр?) и опускают уровень в дно. Оказалось что-то даже немного похожее на наоборот, результат только один чёрт.
                      +9
                      Если хелловорлд-сайт на Django тормозит, значит, или хостинг всё-таки хреновый, или надо искать ещё какую-то конкретную проблему, а не кивать на Django. Мне как-то хватает KVM на одно ядро и 1Гб на 5-6 не самых тяжёлых сайтов. Django, uwsgi за nginx, letsencrypt, PostgreSQL, redis, Celery, все дела.
                        –3
                        Я не киваю на Django. Мой посыл в том, что это можно уложить было всё в несколько десятков строк кода (что было реализовано за вечер под пиво на чистом Python'е и он залетал), а не пихать движок весом в 20 мб, написать как бог на душу положит и успокоится. И я думаю, что такие результаты из-за массовости «продвижения» продукта. С другой стороны вы столько всего наставили на VDS явно не просто так, а для ускорения.
                          +7
                          Мой посыл в том, что это можно уложить было всё в несколько десятков строк кода (что было реализовано за вечер под пиво на чистом Python'е и он залетал), а не пихать движок весом в 20 мб, написать как бог на душу положит и успокоится.
                          Я не думаю, что это правильный посыл сейчас. Даже самое минимальное приложение должно безопасно хранить пароли и сессии, экранировать SQL-запросы, очищать ввод от XSS-скриптов, предусматривать CSRF и много чего ещё. Реализовать всё это «за вечер под пиво»? Серьёзно?
                          С другой стороны вы столько всего наставили на VDS явно не просто так, а для ускорения.
                          Я ничего не «ускоряю», я просто стараюсь придерживаться лучших практик, насколько могу. Да, если засунуть больше сотни строк в SQLite, или использовать SQL для хранения K-V данных, сайт будет работать медленно. Значит ли это, что Postgres или Redis «ускоряют» сайт? Нет, я бы сказал, что это просто адекватные инструменты.
                            –3
                            Серьёзно?

                            Только не нужно мне сейчас перечислять все возможные варианты безопасности накопленные за 30 лет веба, что бы попробовать оправдать использование фреймворков там где они не нужны. Ну нравится вам — используйте. А по мне так такой подход и привёл к тяжелому и медленному софту везде.
                            Кстати о защите. Вот это повеселило. И такой простой косяк следствие массовости.


                            Заголовок спойлера

                            image


                            Ну там и ниже вся подноготная. А вы говорите CSRF...

                              +10
                              В только что сгенерированном проекте файл настроек выглядит так:
                              # SECURITY WARNING: don't run with debug turned on in production!
                              DEBUG = True

                              Плюс в документации чёрным по белому: “Never deploy a site into production with DEBUG turned on.

                              И да, на само́й 500 странице тоже есть пометка, инструкция практически: “You're seeing this error because you have DEBUG = True in your Django settings file.”

                              Конечно, можно сказать, что вся проблема − это низкий порог входа в Django. Но тогда представьте, чего может наворотить тот же разработчик, если начнёт писать (или тем более дописывать) веб-приложение на чистом Python. Утечкой трейсов дело явно не обойдётся.
                        0
                        5.5 страниц с одним input. По мне так django вполне подходит. Почему нет? Не из за инструмента ведь тормазило.
                          –2
                          Это скорее про JavaScript ;)
                            +2
                            Не знаю как точно называется такая метрика (масштабируемость мне кажется про другое), но если что-то нужно будет дописать или прикрутить к сайту в дальнейшем (блог, галерея, вывод данных из БД), всё равно потратите время на переход с этого же простого кода на django.
                          +3
                          Для Python есть много модулей написанных на C++ (Catboost например) или на Си (numpy например). Расширение для языка можно написать как на C/C++ или кодогенерацией из «псевдоязыка» Cython. Нет ничего удивительного что язык сейчас так популярен. Многие открытые библиотеки написаны таким образом, чтобы всю «тяжелую» работу выполнять в быстром и соптимизированном компилятором коде расширения на С++, который «дергает за ниточки» код на python. Получается, что при правильном применении этого подхода мы не много проигрываем в производительности, но при этом пользуемся всеми плюсами языка со строгой динамической типизацией.
                            –1
                            Вы не переживайте, один хрен на работу никто после таких курсов не попадает.
                            0

                            А про java будет такое?

                              0
                              Насколько мне известно таких планов сейчас нет.
                              0
                              Смотрю первую лекцию и хочу отметить, что для онлайн-слушателя сильно сбивается темп, когда люди из аудитории задают вопросы, а мы слышим только ответ, потому что люди либо не говорят в микрофон, либо сигнал с него не идет в видео. Есть предложение просить лекторов повторять заданные вопросы перед ответом, как это делают например лекторы cs231n и других курсов Стэнфорда. Вопросы зачастую бывают нетривиальные, еще они бывают глупыми, но важными, и вместо заминки слушатели получат больше деталей, и возрастёт вероятность того, что лектор правильно поймёт вопрос.
                              Яндекс уже много лет снимает лекции лучше всех в России, такое добавление в регламент повысило бы качество материала ещё сильнее.

                              upd: хех, только написал, и в видео заработал микрофон
                                +5

                                Спасибо за материал. Радует, что в отличие от большинства видео-уроков здесь больше уделяется внимание непосредственному процессу разработки, а не в очередной раз рассказывают про реализацию основных алгоритмических конструкций языка.

                                  0
                                  Добрый день, в первой лекции про асинхронное программирование упоминается «предыдущая лекция про процессы». Она будет выложена отдельно? Не нашел ее на канале
                                    +3
                                    не понравилось (посмотрел 1 целиком, 30 минут второй и 30 минут третей лекции). Сумбурно, очень поверхностно, непоследовательно, много неоднозначностей, лекторы рассказывают без интереса, не могут ответить на многие вопросы, ни разу не ораторы с поставленной речью. Непонятно в чем цель и кто целевая аудитория? спасибо, что выложили, но есть и более качественные курсы, на которые стоит потратить свое время.
                                      +1
                                      Все лекции читали и подготавливали совершенно разные люди, никто из них не является профессиональным артистом или оратором со стажем. Зато все прекрасные специалисты, и с удовольствием делятся своим опытом.
                                        0
                                        Не хотел никого обидеть — высказал личное мнение.
                                          +1
                                          Я предполагаю что все люди разные и для кого-то подача и способ рассказать свою мысль одного лектора, не вызывает желания досматривать. Не рубите весь курс из-за этого, посмотрите по 10-15 минут остальных лекций, мне лично будет приятно.
                                      +1

                                      Ясно, что это первичный курс ;-) По крайней мере для меня. Но вот вопросики для самопроверки, которые были на курсе, наверное, были бы неплохим бонусом для тех, кто решил прослушать. Если как-то возможно — то заранее спасибо !

                                        0
                                        В первом видео 50:18 показывают пример с числами. Проверил тоже самое и у меня в обоих случаях True, почему так?
                                        image
                                          +1
                                          Тут ключевое чтобы это было сделано в CLI интерпретатора, а так работает и в python2 и python3

                                          $ python2
                                          Python 2.7.16 (default, Feb 29 2020, 01:55:37)
                                          [GCC 4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.29.20) (-macos10.15-objc- on darwin
                                          Type "help", "copyright", "credits" or "license" for more information.
                                          >>> a = 42
                                          >>> b = 42
                                          >>> id(a) == id(b)
                                          True
                                          >>> a = 1234567890
                                          >>> b = 1234567890
                                          >>> id(a) == id(b)
                                          False
                                          
                                          $ python3
                                          Python 3.8.2 (v3.8.2:7b3ab5921f, Feb 24 2020, 17:52:18)
                                          [Clang 6.0 (clang-600.0.57)] on darwin
                                          Type "help", "copyright", "credits" or "license" for more information.
                                          >>> a=42
                                          >>> b=42
                                          >>> id(a) == id(b)
                                          True
                                          >>> a = 1234567890
                                          >>> b = 1234567890
                                          >>> id(a) == id(b)
                                          False
                                          >>>
                                          

                                        Only users with full accounts can post comments. Log in, please.