раздел 45
Python backend: Тарбадель
Путь от первой строки кода до инженера, который объясняет, что происходит от нажатия Enter в браузере до строки на диске PostgreSQL. Ты курьер с Нижнего яруса Тарбадели, города-спирали вокруг горы, и твоя первая смена проходит за кредитным терминалом ларька. По городу ходит Призрак: терминалы выдают кредиты в минус, а странные промокоды проходят проверку. Каждый раздел это проект, который собирается этап за этапом: терминал ларька, свои functools и itertools, интерпретатор Lisp и подмножества Python, HTTP-сервер и фреймворк, ORM, event loop, сервисы на Django и FastAPI, очереди и микросервисы. Код проверяет песочница на Python 3.14, большие проекты гоняет CI на GitHub.
Не получилось изменить список. Попробуй ещё раз.
Без входа у каждого урока видно начало. Войди, чтобы читать целиком, отмечать пройденное и решать задачи. войти
«Python backend: Тарбадель» покупается один раз и остаётся навсегда: 500 ₽. Оплата пока не подключена, доступ открывается промокодом. ввести промокод
Мастерская: Терминал ларька
- Экран сменыэтап не сдан
- Кто на кассеэтап не сдан
- Сдачаэтап не сдан
- Копейка к копейкеэтап не сдан
- Ярлык товараэтап не сдан
- Чекэтап не сдан
- Хватит ли денегэтап не сдан
- Промокодыэтап не сдан
- Смена без перерываэтап не сдан
- Кредитэтап не сдан
- Менюэтап не сдан
- Корзинаэтап не сдан
- Что подешевлеэтап не сдан
- Разложить по функциямэтап не сдан
- Наборыэтап не сдан
- Модулиэтап не сдан
- Ошибки словамиэтап не сдан
- Прайс из файлаэтап не сдан
- Заказ: терминал ларька целикомэтап не сдан
- Смена объектомэтап не сдан
- Только для чтенияэтап не сдан
- Корзина своим классомэтап не сдан
- Товар, набор и разноеэтап не сдан
- Скидки классамиэтап не сдан
- Меню из любого файлаэтап не сдан
- Абстрактная скидкаэтап не сдан
- Одинаковые товарыэтап не сдан
- Dataclass и Enumэтап не сдан
- Типы для Лоррыэтап не сдан
- Тесты денегэтап не сдан
- Тесты промокодовэтап не сдан
- Без водопадаэтап не сдан
- Команды объектамиэтап не сдан
- Ларёк снаружиэтап не сдан
- Журнал сменыэтап не сдан
- Запуск флагамиэтап не сдан
- Заказ: терминал v2 на двенадцать ларьковэтап не сдан
Мастерская: Арсенал Подземья
- Мешок деталейэтап не сдан
- Сигнал со слабыми ссылкамиэтап не сдан
- Своя глубокая копияэтап не сдан
- compose и partialэтап не сдан
- wraps и декораторыэтап не сдан
- reduce и кэш со срокомэтап не сдан
- Свой rangeэтап не сдан
Доска заказов
Мастерская: Интерпретатор Lisp
Доска заказов
Мастерская: Оракул: свой Python
Доска заказов
Мастерская: Контракт: сверка типов
- Свой тайпчекерэтап не сдан
- Строгий журналэтап не сдан
- Кто отдаёт, кто принимаетэтап не сдан
- Протоколы уменийэтап не сдан
- Декораторы без потерьэтап не сдан
Мастерская: Вышка связи: свой веб
- Эхо по TCP и UDPэтап не сдан
- Свой резолверэтап не сдан
- Реле в обе стороныэтап не сдан
- HTTP-клиент на сокетеэтап не сдан
- Что несёт запросэтап не сдан
- Свой HTTP-серверэтап не сдан
Мастерская: Ормка: своя ORM
Мастерская: Глубина: своя СУБД с версиями
- Страницы и кортежиэтап не сдан
- Транзакции и точки сохраненияэтап не сдан
- Версии строк и VACUUMэтап не сдан
- Уровни изоляцииэтап не сдан
- Блокировки и дедлокиэтап не сдан
Мастерская: Блог Четвёртого моста на Django
- Настройки из окруженияэтап не сдан
- Адреса и представленияэтап не сдан
- Модели и миграцииэтап не сдан
- Свой QuerySetэтап не сдан
- Лента без N+1 и отчёт на SQLэтап не сдан
- Шаблоны и комментарииэтап не сдан
Мастерская: Курьер: свой event loop и async-краулер
- Обход в ширинуэтап не сдан
- Потоки и замокэтап не сдан
- Разбор в пуле процессовэтап не сдан
- Свой цикл на генераторахэтап не сдан
- async def на своём циклеэтап не сдан
Мастерская: Барахолка: сервис заказов на FastAPI
- Первые маршрутыэтап не сдан
- Схемы на Pydanticэтап не сдан
- Заказы и ошибкиэтап не сдан
- Настройки, lifespan и Dependsэтап не сдан
- Контракт, CORS и v2этап не сдан
Мастерская: Кэш-рынок: своя очередь и Celery на Redis
Мастерская: Ревизия: легаси Квота под тестами и в гексагоне
Мастерская: Красная зона: атакуем свой блог, потом закрываем дыры
Мастерская: Подъём к Шпилю: блог в проде
Мастерская: Синт-мастерская: MCP и свой агент
Мастерская: Шедевр: Барахолка на сервисах
Уроки раздела
Нижний ярус: первые программы
Изделие «Терминал ларька», крейт terminal
- Тарбадель и первая программа
- Математика инженера: системы счисления, логика, проценты, степени
- Переменные, имена и input
- Целые числа, // и %
- float и деньги в копейках
- Строки и их методы
- f-строки и форматирование
- bool, None, сравнения и типы
- Ветвления и первый отладчик
- Вложенные условия
- Списки и срезы
- Циклы, break и continue
- Вложенные циклы и сложные проценты
- Кортежи, распаковка и множества
- Словари и выбор структуры
- Генераторы списков, all и any
- Функции
- Области видимости и хорошая функция
- Изменяемость, ссылки и рекурсия
- Модули, пакеты, окружения и uv
- Ошибки, трассировки и отладка
- Исключения: try, except, свои ошибки
- Файлы, pathlib, JSON и CSV
- Имена, комментарии, PEP 8 и Ruff
- Босс: терминал ларька целиком
Мастерская Кельсы: объекты, тесты, архитектура
Изделие «Терминал ларька», крейт terminal
- Зачем ООП: всё в Python объект
- Класс, атрибуты, методы, __init__
- Инкапсуляция и property
- Наследование против композиции
- Полиморфизм и утиная типизация
- Принцип подстановки Лисков и контракты
- classmethod, staticmethod и альтернативные конструкторы
- Абстрактные классы и Protocol
- == против is, __eq__, __hash__, __repr__
- dataclasses и enum
- Подсказки типов и протоколы Лорры
- Автотесты на pytest
- Покрытие и условное покрытие
- Цикломатическая сложность и водопад сложности
- Единственная ответственность и открытость для расширения
- Разделение интерфейсов и инверсия зависимостей
- DRY, KISS, YAGNI и закон Деметры
- Уровни абстракции и user stories
- Стандартная библиотека: collections, datetime, random, math, re
- CLI: argparse, окружение, subprocess, Ctrl+C
- Босс: терминал v2
Подземье: Python изнутри
Изделие «Арсенал Подземья», крейт arsenal
- Модель данных: как операторы зовут по-настоящему
- Ссылочная модель: id, счётчик ссылок, GC, weakref
- Изменяемость глубоко: copy, deepcopy, алиасинг
- Функции первого класса, __call__ и замыкания
- Декораторы
- functools изнутри
- Итераторы и протокол итерации
- Генераторы: yield from, send, throw, close
- itertools и ленивые конвейеры
- Контекстные менеджеры и contextlib
- __getattr__, __setattr__, __getattribute__
- Дескрипторы
- Множественное наследование, MRO и super
- Метаклассы, __init_subclass__, декораторы классов
- __slots__ и память объектов
- Pattern matching, sentinel и моржовый оператор
- Числа и текст: int, IEEE 754, Decimal, Fraction, Unicode
- Как работает CPython: байткод, кадры, цикл исполнения, GIL
- Pythonic-код: сборник идиом
- Босс: арсенал Подземья
Оракул: свой интерпретатор
Изделие «Интерпретатор Lisp», крейт lisp
- Зачем писать интерпретатор: Lisp, язык древних
- Лексер s-выражений
- Парсер Lisp: списки как AST
- eval для Lisp: окружения, define, lambda, if
- Замыкания, рекурсия и трамплин
- quote, квазицитирование, макросы и REPL
- Мини-босс: стандартная библиотека Lisp
- Грамматики, BNF, конечные автоматы
- Лексер подмножества Python
- Рекурсивный спуск и парсер Пратта
- Узлы AST на dataclasses и match
- Окружения, LEGB и таблицы символов
- Tree-walk интерпретатор
- Функции, кадры и return
- Байткод и стековая машина
- Виртуальная машина: цикл и переходы
- Функции в VM: кадры и ячейки
- Трассы своего языка и скорость
- Босс: my_eval
Сверка: строгие типы
Изделие «Контракт: сверка типов», крейт kontrakt
- Теория типов для инженера
- mypy strict, Any и object
- Дженерики и вариантность
- Protocol и структурная типизация
- Callable, ParamSpec, Concatenate
- TypedDict, Literal, Final и NewType
- overload, сужение и TypeIs
- Алгебраические типы
- Ошибки как значения: Result
- Тайпклассы, функторы и монады
- Зависимости как контекст: Reader
- Тесты на типы и проверка в рантайме
- Вывод типов: алгоритм W
- Босс: сверка контрактов города
Вышка связи: сеть и веб
Изделие «Вышка связи: свой веб», крейт vyshka
- Компьютер и сеть: интерфейсы, коммутаторы, MAC, роутеры, LAN и WAN
- OSI и TCP/IP, IP, порты, NAT, DHCP, IPv6
- TCP и UDP, сокеты, эхо-сервер
- DNS: зоны, записи, свой резолвер на UDP
- Прокси, VPN, обратный прокси
- HTTP руками: методы, идемпотентность, статусы
- Заголовки, URL и данные
- HTTP-сервер на сокетах
- HTTP/1.1, HTTP/2, HTTP/3
- HTTPS и TLS, сертификаты
- WSGI и ASGI, свой фреймворк: роутинг
- Свой фреймворк: middleware, запрос и ответ, шаблоны
- HTML для бэкендера: структура, формы, кодировка
- Аутентификация и авторизация, хеши, соль, scrypt
- Cookies и сессии: подпись HMAC и флаги
- JS, fetch, SSE и WebSocket
- REST: ресурсы, ошибки по RFC 9457, версии, пагинация
- Босс: сайт Вышки
Архив: SQL и своя ORM
Изделие «Ормка: своя ORM», крейт ormka
- Зачем СУБД: кластер, база, схема
- Docker на минималках: образ, контейнер, том, порт, compose
- DDL: таблицы, ключи и ограничения
- DML: выборка, NULL, сортировка и изменение данных
- Типы PostgreSQL: деньги, строки, время с зонами, enum, массивы, JSONB
- JOIN: таблицы, которые находят друг друга
- Связи и нормализация
- Агрегаты и группировка
- Подзапросы, UNION и CTE
- Оконные функции
- Python и PostgreSQL
- Своя ORM: модели и поля
- Своя ORM: QuerySet и N+1
- Босс: ormka
Глубины Архива: PostgreSQL изнутри
Изделие «Глубина: своя СУБД с версиями», крейт glubina
- Как PostgreSQL хранит строки: страницы, кортежи, TOAST
- Транзакции: ACID, точки сохранения и now()
- MVCC и VACUUM: версии строк и горизонт
- Уровни изоляции: две сессии, два Архива
- Блокировки: FOR UPDATE, SKIP LOCKED и дедлоки
- B-дерево и EXPLAIN ANALYZE
- Виды индексов
- GIN, GiST, BRIN и полнотекстовый поиск
- Представления, PL/pgSQL и триггеры
- Первичные ключи: identity, последовательности, UUID
- Миграции без простоя
- Масштабирование PostgreSQL
- Эксплуатация PostgreSQL
- Босс: медленный Архив
Четвёртый мост: Django
Изделие «Блог Четвёртого моста на Django», крейт blog
- Django: зачем фреймворк и как устроен проект
- Адреса и представления: path, конвертеры, reverse, 404 и 405
- Модели и миграции: свой пользователь, связи, ограничения, PostgreSQL в compose
- ORM Django: QuerySet, lookups, F и Q, annotate, свой менеджер
- Какой SQL пишет ORM: N+1, select_related и голый SQL
- Шаблоны и формы: автоэкранирование, CSRF и PRG
- Админка как продукт: списки, фильтры, действия и инлайны
- Вход и права: аутентификация, группы и доступ к объекту
- Django REST framework: сериализаторы, ViewSet, права и CORS
- Тесты Django: pytest-django, фабрики и тесты миграций
- Типы в Django: django-stubs, плагин mypy и протоколы Лорры
- Async Django и фоновые задачи: async ORM, django.tasks и on_commit
- Архитектура проекта: сервисы, селекторы и тонкие представления
- logging: журнал, который можно читать
- Хорошие логи: structlog, секреты и VictoriaLogs
- Босс: Мост выходит в город
Курьерская сеть: конкурентность
Изделие «Курьер: свой event loop и async-краулер», крейт kurier
- Блокирующий ввод-вывод: курьер у двери
- Потоки, гонки и GIL: free-threaded Python 3.14
- Процессы и пулы: multiprocessing и concurrent.futures
- Свой event loop: select и генераторы
- Корутины и await
- Задачи, отмена и таймауты
- Структурная конкурентность
- Примитивы синхронизации
- Потоки внутри asyncio
- contextvars: номер на рукаве
- Async HTTP, повторы и Retry-After
- Отладка asyncio: кто держит тоннель
- Босс: курьерская сеть
Барахолка: FastAPI
Изделие «Барахолка: сервис заказов на FastAPI», крейт zakazy
- Flask, Django, FastAPI и свой фреймворк
- FastAPI изнутри: ASGI, Starlette, Pydantic
- Запросы, ответы и ошибки
- Depends, lifespan и настройки
- OpenAPI, CORS и версии API
- SQLAlchemy 2: Core и ORM, Unit of Work, identity map
- Async SQLAlchemy: сессия и транзакция на запрос
- Alembic: миграции и ловушки autogenerate
- JWT против сессий, OAuth2 и ротация refresh-токенов
- Тесты FastAPI: httpx без сети, подмена зависимостей и часы
- SSE и WebSocket: сервер сам говорит, что изменилось
- Архитектура FastAPI-проекта: сервис, хранилище и тонкие маршруты
- Босс: Барахолка открывается
Кэш-рынок: Redis и Celery
Изделие «Кэш-рынок: своя очередь и Celery на Redis», крейт ochered
- Зачем Redis: один поток, атомарные команды и память на диске
- Типы Redis: хеши, списки, множества, sorted set и срок жизни
- Кэширование: cache-aside, инвалидация и лавина промахов
- Сессии, лимиты на Lua и замки
- Pub/Sub и Streams: громкоговоритель и журнал
- Своя очередь задач на Redis Streams
- Celery: брокер, воркеры, результаты
- Celery по-взрослому: подтверждение, повторы, идемпотентность
- Canvas, beat и Flower: цепочки задач и расписание
- Задачи и транзакции: on_commit и outbox
- Босс: ночь, когда заказы не терялись
Ревизия: тесты и архитектура
Изделие «Ревизия: легаси Квота под тестами и в гексагоне», крейт reviziya
- Виды тестов и характеристические тесты
- pytest глубоко: фикстуры, conftest и маркеры
- Подделки и моки: monkeypatch, mock.patch и autospec
- Свойства и контракты: hypothesis и deal
- Интеграционные тесты и мутанты: mutmut и ложь покрытия
- Инверсия зависимостей: швы, порты и внедрение
- Гексагон: ядро, порты и адаптеры
- Точка сборки и DI-контейнеры
- DDD без фанатизма: значения, агрегат и события
- Как чинить баг: инцидент DR-500
- Босс: ночь двадцати курьеров
Красная зона: атака и защита
Изделие «Красная зона: атакуем свой блог, потом закрываем дыры», крейт krasnaya
Подъём к Шпилю: блог в проде
Изделие «Подъём к Шпилю: блог в проде», крейт shpil
- Контейнеры изнутри: namespaces, cgroups и OCI
- Dockerfile для Python: две стадии, uv и не под root
- Compose: стенд одной командой
- 12 факторов, 1-6: конфиг и службы снаружи кода
- 12 факторов, 7-12: пробы, процессы и шаг релиза
- Linux для бэкендера: сигналы, PID 1 и systemd
- CI/CD: конвейер, канарейка и blue-green
- Деплой: домен, прокси и TLS
- Облако: хранилище, CDN и подписанные ссылки
- Наблюдаемость: метрики, трейсы, SLO
- Босс: блог в верхних ярусах
Арена: алгоритмы и system design
- Сложность, O-большое и амортизация
- Сортировки и Timsort
- Массив, связный список, стопка, очередь и куча
- Хеш-таблицы: как устроены dict и set
- Поиск и деревья
- Графы
- Жадные алгоритмы и динамическое программирование
- Задачи на собеседовании
- System design: требования и оценки на салфетке
- Масштабирование, кэши, CDN и шардирование
- Очереди, консистентность и отказоустойчивость
- Разборы: сокращатель ссылок, лента, чат, rate limiter
Синт-мастерская: MCP и свой агент
Изделие «Синт-мастерская: MCP и свой агент», крейт sint
Шедевр: Барахолка на сервисах
Изделие «Шедевр: Барахолка на сервисах», крейт baraholka
- Монолит или сервисы: где резать
- REST, gRPC и события: как сервисы говорят
- RabbitMQ: обменник, очередь и подтверждение
- Kafka: журнал, партиции и группы
- Outbox и inbox: хотя бы раз и не больше раза
- Саги: транзакция из шагов и компенсаций
- Кто стучит: токены сервисов
- Устойчивость: таймауты, ретраи, предохранитель
- Распределённая трасса: один номер на весь путь
- Контрактные тесты: договор пишет потребитель
- От compose к Kubernetes: пробы, выкат и хозяин
- Босс: ночь падения Монолита
Жизнь на ярусах
Понятия курса
Понятия разобраны внутри уроков. Нажми на понятие, чтобы открыть урок, где оно объясняется.
Нижний ярус: первые программы
- Босс: терминал ларька целикомЗаказ без подсказок: итог смены, отмена чека и наборы из файла, в котором Призрак оставил ловушку. Сдашь, получишь ранг элир.урок 25 · Босс: терминал ларька целикомопираются: урок 26
- Ветвления и первый отладчикif, elif, else, булевы and, or, not, отступы как синтаксис. Первый отладчик: пошаговое выполнение и просмотр переменных. Терминал проверяет количество и оплату.урок 9 · Ветвления и первый отладчикопираются: урок 10
- Вложенные условияВложенные if и как их распрямлять. Проекты: промокоды, номера дронов, камень-ножницы-бумага. Терминал не верит промокодам.урок 10 · Вложенные условияопираются: урок 11
- Вложенные циклыЦикл в цикле, таблицы и перебор пар. Проект: сложные проценты. Терминал считает кредит.урок 13 · Вложенные циклы и сложные процентыопираются: урок 14
- Генераторы списков, all и anyСписковые, словарные и множественные включения, sum по генератору, all и any. Почему нельзя менять контейнер во время обхода.урок 16 · Генераторы списков, all и anyопираются: урок 17
- Изменяемость, ссылки и рекурсияИмя это ссылка на объект, изменяемые и неизменяемые значения, копии. Рекурсия: наборы из наборов и их цена.урок 19 · Изменяемость, ссылки и рекурсияопираются: урок 20
- Имена, комментарии, PEP 8 и RuffКак называть переменные и функции, когда комментарий нужен, PEP 8, Ruff как линтер и форматтер, Дзен Python.урок 24 · Имена, комментарии, PEP 8 и Ruffопираются: урок 25
- Исключенияtry, except, else, finally, EAFP против LBYL, свои исключения, raise from. exit против sys.exit против SystemExit.урок 22 · Исключения: try, except, свои ошибкиопираются: урок 23
- Кортежи, распаковка и множестваКортеж как неизменяемая запись, распаковка, множество и его операции. Меню ларька и промокод на одну смену.урок 14 · Кортежи, распаковка и множестваопираются: урок 15
- Математика инженераСистемы счисления (двоичная, шестнадцатеричная), степени двойки, проценты и логика «и», «или», «не»: всё, что понадобится в первых программах, на примерах из Нижнего яруса.урок 2 · Математика инженера: системы счисления, логика, проценты, степениопираются: урок 3
- Модули, пакеты, окружения и uvimport, модуль и пакет, __name__, виртуальное окружение, зависимости и uv. Терминал расходится по модулям.урок 20 · Модули, пакеты, окружения и uvопираются: урок 21
- Области видимости и хорошая функцияЛокальные и глобальные имена, LEGB, global и почему без него лучше. Чек-лист хорошей функции.урок 18 · Области видимости и хорошая функцияопираются: урок 19
- Ошибки, трассировки и отладкаКак читать traceback снизу вверх, виды ошибок, отладчик и print, как гуглить и как задавать вопрос так, чтобы на него ответили.урок 21 · Ошибки, трассировки и отладкаопираются: урок 22
- Переменные, имена и inputПеременная как имя для значения, присваивание, правила имён и input(): программа впервые спрашивает человека. Кассир называет себя терминалу.урок 3 · Переменные, имена и inputопираются: урок 4
- Словари и выбор структурыСловарь как отображение ключа в значение, get, items, удаление; когда список, кортеж, множество или словарь. Корзина терминала.урок 15 · Словари и выбор структурыопираются: урок 16
- Списки и срезыСписок как упорядоченный набор, индексы, срезы, append, insert, pop, len, in, split и join.урок 11 · Списки и срезыопираются: урок 12
- Строки и их методыСтроки, кавычки, спецпоследовательности, индексы и срезы, методы strip, lower, title, capitalize, replace. Ввод с улицы приводим в порядок.урок 6 · Строки и их методыопираются: урок 7
- Тарбадель и первая программаЧто значит «выполнить код»: интерпретатор читает строки сверху вниз и делает то, что в них написано. Первая программа в редакторе страницы, print и экран смены терминала ларька.урок 1 · Тарбадель и первая программаопираются: урок 2
- Файлы, pathlib, JSON и CSVОткрыть и закрыть файл, with, кодировки, pathlib, модули json и csv. Прайс терминала из файла и промокод, которого там быть не должно.урок 23 · Файлы, pathlib, JSON и CSVопираются: урок 24
- Функцииdef, аргументы и return, значения по умолчанию, *args и **kwargs, ловушка изменяемого значения по умолчанию. Терминал раскладывается по функциям.урок 17 · Функцииопираются: урок 18
- Целые числа, // и %Целые без границ, арифметика, целочисленное деление и остаток, приоритет операций. Первая настоящая программа: сдача купюрами и монетами.урок 4 · Целые числа, // и %опираются: урок 5
- Циклыwhile и for, range, break и continue, бесконечный цикл. Терминал становится циклом команд и работает всю смену.урок 12 · Циклы, break и continueопираются: урок 13
- bool, None, сравнения и типыИстина и ложь, сравнения и их цепочки, None как «ничего», type() и преобразования int, float, str, bool. Что считается ложным.урок 8 · bool, None, сравнения и типыопираются: урок 9
- f-строки и форматированиеf-строки, ширина, выравнивание и ведущие нули. Проект: расчёт неоновой вывески. Чек терминала ровными колонками.урок 7 · f-строки и форматированиеопираются: урок 8
- float и деньги в копейкахПочему 0.1 + 0.2 не 0.3, как float хранит дробь и почему int(4.10 * 100) теряет копейку. Деньги в целых копейках.урок 5 · float и деньги в копейкахопираются: урок 6
Мастерская Кельсы: объекты, тесты, архитектура
- == против is, __eq__, __hash__, __repr__Равенство и тождество, почему __eq__ требует __hash__, как объект становится ключом словаря и почему __repr__ пишут для отладки.урок 34 · == против is, __eq__, __hash__, __repr__опираются: урок 35
- Абстрактные классы и ProtocolABC и abstractmethod ловят забытый метод при создании объекта, а не на оплате. Protocol описывает форму без наследования: утиная типизация, которую видит тайпчекер.урок 33 · Абстрактные классы и Protocolопираются: урок 34
- Зачем ООП: всё в Python объектПочему словарь смены перестаёт хватать, когда ларьков двенадцать: опечатка в ключе, которую никто не заметил. Всё в Python объект, даже функция и число: у объекта есть тип, состояние и поведение.урок 26 · Зачем ООП: всё в Python объектопираются: урок 27
- Инкапсуляция и propertyПубличное и «приватное» по соглашению, подчёркивание и искажение имён, property вместо геттеров и сеттеров в духе Java. Закрытую смену снаружи больше не открыть.урок 28 · Инкапсуляция и propertyопираются: урок 29
- Класс, атрибуты, методы, __init__Класс как чертёж, объект как вещь по чертежу. self, __init__ и атрибуты, которые создаются в __init__, а не где попало. Смена терминала становится объектом Shift.урок 27 · Класс, атрибуты, методы, __init__опираются: урок 28
- Наследование против композицииНаследование это «является», композиция это «содержит». Корзина Квота, унаследованная от dict, и корзина Cart внутри смены.урок 29 · Наследование против композицииопираются: урок 30
- Полиморфизм и утиная типизацияОдин вопрос, разные ответы: товар, набор и «разное» отвечают на name и price, и корзине всё равно, кто перед ней.урок 30 · Полиморфизм и утиная типизацияопираются: урок 31
- Принцип подстановки Лисков и контрактыНаследник обещает не меньше родителя: скидка никогда не больше чека. Предусловия, постусловия, инварианты и сертификат ПОДАРОК.урок 31 · Принцип подстановки Лисков и контрактыопираются: урок 32
- classmethod, staticmethod и альтернативные конструкторыКак сделать меню из CSV-файла и промокоды из JSON одной строкой: Menu.from_csv и Promos.from_json. Чем classmethod отличается от staticmethod и от обычной функции модуля.урок 32 · classmethod, staticmethod и альтернативные конструкторыопираются: урок 33
- dataclasses и enumdataclass пишет __init__, __eq__ и __repr__ за тебя; frozen и slots. Enum вместо строк-констант: причины поломки набора.урок 35 · dataclasses и enumопираются: урок 36
- Автотесты на pytestСтруктура теста: подготовка, действие, проверка. assert, pytest.raises, параметризация, фикстуры. Хороший тест падает на подделке кода.урок 37 · Автотесты на pytestопираются: урок 38
- Босс: терминал v2Заказ без подсказок: возврат, слои без ввода и вывода в доменных модулях и свои тесты. Лорра сверяет контракт перед раскаткой на двенадцать ларьков.урок 46 · Босс: терминал v2опираются: урок 47
- Единственная ответственность и открытость для расширенияSRP: у модуля одна причина меняться. OCP: новая команда терминала добавляется без правки старого кода. Команды объектами и реестр команд.урок 40 · Единственная ответственность и открытость для расширенияопираются: урок 41
- Подсказки типов и протоколы ЛоррыАннотации, Optional и объединения, обобщённые коллекции, mypy --strict. Ошибки тайпчекера как протоколы Лорры: код, смысл, исправление.урок 36 · Подсказки типов и протоколы Лоррыопираются: урок 37
- Покрытие и условное покрытиеСтроки, ветви и условия: что значит «код покрыт тестами» и почему 100% строк не гарантия. Тесты промокодов, которые ловят подделку каждой ветки.урок 38 · Покрытие и условное покрытиеопираются: урок 39
- Разделение интерфейсов и инверсия зависимостейСмена получает меню и промокоды снаружи, а не читает файлы сама. Узкие интерфейсы, внедрение зависимостей и подделки в тестах.урок 41 · Разделение интерфейсов и инверсия зависимостейопираются: урок 42
- Стандартная библиотека: collections, datetime, random, math, reCounter, defaultdict и deque, время и даты, random против secrets, math и регулярные выражения. Журнал смены со временем от внедрённых часов.урок 44 · Стандартная библиотека: collections, datetime, random, math, reопираются: урок 45
- Уровни абстракции и user storiesЯзык предметной области в коде, один уровень абстракции в функции, user stories от владельцев ларьков: журнал и возврат.урок 43 · Уровни абстракции и user storiesопираются: урок 44
- Цикломатическая сложность и водопад сложностиКак измерить сложность функции, водопад сложности, wemake-python-styleguide. Водопад if в разборе команд превращается в таблицу.урок 39 · Цикломатическая сложность и водопад сложностиопираются: урок 40
- CLI: argparse, окружение, subprocess, Ctrl+CТерминал запускается флагами: argparse, переменные окружения, коды выхода, subprocess и KeyboardInterrupt.урок 45 · CLI: argparse, окружение, subprocess, Ctrl+Cопираются: урок 46
- DRY, KISS, YAGNI и закон ДеметрыСвязность и зацепление, принцип наименьшего удивления, повторение знания против повторения кода. Разбор «универсального» класса Квота.урок 42 · DRY, KISS, YAGNI и закон Деметрыопираются: урок 43
Подземье: Python изнутри
- __getattr__, __setattr__, __getattribute__Как Python ищет атрибут, когда срабатывает каждый хук, прокси-объекты и бесконечная рекурсия в __getattribute__.урок 57 · __getattr__, __setattr__, __getattribute__опираются: урок 58
- __slots__ и память объектов__dict__ против __slots__, sys.getsizeof, tracemalloc и замеры памяти.урок 61 · __slots__ и память объектовопираются: урок 62
- Босс: арсеналЗаказ без подсказок: арсенал целиком принимает Элодий. Сдашь, получишь ранг релар.урок 66 · Босс: арсенал Подземьяопираются: урок 67, урок 229
- Генераторы: yield from, send, throw, closeГенератор как приостановленный кадр, сопрограммы на send, yield from и делегирование, закрытие и очистка.урок 54 · Генераторы: yield from, send, throw, closeопираются: урок 55
- ДекораторыДекоратор как функция над функцией, functools.wraps, параметризованные декораторы, фабрики и композиция.урок 51 · Декораторыопираются: урок 52
- Дескрипторы__get__, __set__, __set_name__, дескрипторы данных и не данных; как на самом деле работают методы и property.урок 58 · Дескрипторыопираются: урок 59
- Изменяемость глубоко: copy, deepcopy, алиасингПоверхностная и глубокая копия, __copy__ и __deepcopy__, алиасинг в аргументах и значениях по умолчанию.урок 49 · Изменяемость глубоко: copy, deepcopy, алиасингопираются: урок 50
- Итераторы и протокол итерации__iter__ и __next__, StopIteration, итерируемое против итератора, как работает for.урок 53 · Итераторы и протокол итерацииопираются: урок 54
- Как работает CPythonКомпиляция в байткод, dis, кадры, цикл исполнения, первый взгляд на GIL.урок 64 · Как работает CPython: байткод, кадры, цикл исполнения, GILопираются: урок 65
- Контекстные менеджеры и contextlibwith изнутри, __enter__ и __exit__, подавление исключений, contextmanager на генераторе, ExitStack.урок 56 · Контекстные менеджеры и contextlibопираются: урок 57
- Метаклассы, __init_subclass__, декораторы классовКласс как объект, type как метакласс, регистрация подклассов и когда метакласс не нужен.урок 60 · Метаклассы, __init_subclass__, декораторы классовопираются: урок 61
- Множественное наследование, MRO и superЛинеаризация C3, порядок разрешения методов, кооперативный super и миксины.урок 59 · Множественное наследование, MRO и superопираются: урок 60
- Модель данных Python: дандер-методыПротоколы дандер-методов, __repr__ против __str__, как объект становится равным, сравнимым, итерируемым и вызываемым. Объект из 03:00, равный любой строке.урок 47 · Модель данных: как операторы зовут по-настоящемуопираются: урок 48
- Ссылочная модель: id, счётчик ссылок, GCИмена и объекты, id, подсчёт ссылок, сборщик циклов, weakref и интернирование строк и малых чисел.урок 48 · Ссылочная модель: id, счётчик ссылок, GC, weakrefопираются: урок 49
- Функции первого класса и замыканияФункция как объект, __call__, замыкания, ячейки и nonlocal, поздняя привязка в цикле.урок 50 · Функции первого класса, __call__ и замыканияопираются: урок 51
- Числа и текст: int, IEEE 754, Decimal, Fraction, Unicodeint без границ, устройство float, Decimal и Fraction для денег и дробей, кодовые точки, UTF-8, bytes и str.урок 63 · Числа и текст: int, IEEE 754, Decimal, Fraction, Unicodeопираются: урок 64
- functools изнутриpartial, lru_cache, singledispatch, reduce, map и filter: собираем свои версии в арсенале.урок 52 · functools изнутриопираются: урок 53
- itertools и ленивые конвейерыchain, islice, groupby, tee, accumulate и product: ленивые конвейеры и свой itertools.урок 55 · itertools и ленивые конвейерыопираются: урок 56
- Pattern matching, sentinel и моржовый операторmatch и case со структурными шаблонами, sentinel-значения вместо None, оператор :=.урок 62 · Pattern matching, sentinel и моржовый операторопираются: урок 63
- Pythonic-код: сборник идиомРаспаковка, enumerate и zip, срезы, ключи сортировки, слияние словарей, pathlib: как пишут на Python, а не на Java с синтаксисом Python.урок 65 · Pythonic-код: сборник идиомопираются: урок 66
Оракул: свой интерпретатор
- Байткод и стековая машинаКомпилятор из AST в байткод: LOAD_CONST, STORE_NAME, BINARY_OP, стек значений.урок 81 · Байткод и стековая машинаопираются: урок 82
- Босс: my_evalЗаказ: my_eval проходит набор Элодия: Фибоначчи, факториал, замыкания и ошибки.урок 85 · Босс: my_evalопираются: урок 86
- Виртуальная машина: цикл и переходыЦикл исполнения VM, указатель инструкции, переходы, if и while в байткоде.урок 82 · Виртуальная машина: цикл и переходыопираются: урок 83
- Грамматики, BNF, конечные автоматыКак описать язык: BNF, конечные автоматы и регулярные выражения изнутри.урок 74 · Грамматики, BNF, конечные автоматыопираются: урок 75
- Замыкания, рекурсия и трамплинЗамыкания в своём интерпретаторе, глубина рекурсии и хвостовые вызовы через трамплин.урок 71 · Замыкания, рекурсия и трамплинопираются: урок 72
- Зачем писать интерпретаторЧто делает интерпретатор, этапы от текста до действия, Lisp как язык древних и план двух изделий раздела.урок 67 · Зачем писать интерпретатор: Lisp, язык древнихопираются: урок 68
- Лексер подмножества PythonТокены Python, INDENT и DEDENT, сверка своего лексера с модулем tokenize.урок 75 · Лексер подмножества Pythonопираются: урок 76
- Лексер s-выраженийТокены, скобки, числа, символы и строки: первый шаг от текста к смыслу.урок 68 · Лексер s-выраженийопираются: урок 69
- Мини-босс: стандартная библиотека LispЗаказ: стандартная библиотека Lisp на самом Lisp поверх своего интерпретатора.урок 73 · Мини-босс: стандартная библиотека Lispопираются: урок 74
- Окружения, LEGB и таблицы символовГде живёт имя: области видимости своего языка, таблица символов и модуль symtable.урок 78 · Окружения, LEGB и таблицы символовопираются: урок 79
- Парсер Lisp: списки как ASTРекурсивный разбор s-выражений, ошибки разбора и почему у Lisp код и данные одно и то же.урок 69 · Парсер Lisp: списки как ASTопираются: урок 70
- Рекурсивный спуск и парсер ПраттаРазбор выражений с приоритетами и ассоциативностью, рекурсивный спуск для инструкций.урок 76 · Рекурсивный спуск и парсер Праттаопираются: урок 77
- Трассы своего языка и скоростьТрассировки ошибок своего языка, замер tree-walk против VM, сверка своего байткода с dis.урок 84 · Трассы своего языка и скоростьопираются: урок 85
- Узлы AST на dataclasses и matchУзлы дерева как замороженные dataclasses, обход через match, сверка с модулем ast.урок 77 · Узлы AST на dataclasses и matchопираются: урок 78
- Функции в VM: кадры и ячейкиКадры вызова в VM, возврат значений, замыкания через ячейки.урок 83 · Функции в VM: кадры и ячейкиопираются: урок 84
- Функции, кадры и returnВызов функции в своём языке: кадры, аргументы, return через исключение, рекурсия.урок 80 · Функции, кадры и returnопираются: урок 81
- eval для Lisp: окружения, define, lambda, ifОкружения как цепочки словарей, специальные формы, применение функций. Почему eval строки опасен.урок 70 · eval для Lisp: окружения, define, lambda, ifопираются: урок 71
- quote, квазицитирование, макросы и REPLКод как данные, quasiquote и unquote, простые макросы и цикл «прочитай, вычисли, напечатай».урок 72 · quote, квазицитирование, макросы и REPLопираются: урок 73
- Tree-walk интерпретаторИнтерпретатор, который обходит дерево: Visitor против match, выражения и инструкции.урок 79 · Tree-walk интерпретаторопираются: урок 80
Сверка: строгие типы
- Алгебраические типыТипы-суммы и типы-произведения: недопустимые состояния непредставимы, исчерпывающий match.урок 93 · Алгебраические типыопираются: урок 94
- Босс: kontraktЗаказ без подсказок: Лорра сверяет все контракты города инструментом, который собрал ты.урок 99 · Босс: сверка контрактов городаопираются: урок 100
- Вывод типов: алгоритм WУнификация, подстановки и let-полиморфизм: вывод типов Хиндли-Милнера для своего Lisp.урок 98 · Вывод типов: алгоритм Wопираются: урок 99
- Дженерики и вариантностьTypeVar, границы и ограничения, ковариантность и контравариантность, почему list инвариантен.урок 88 · Дженерики и вариантностьопираются: урок 89
- Ошибки как значения: ResultИсключения как скрытый контракт, Result, railway-программирование и где исключения всё-таки нужны.урок 94 · Ошибки как значения: Resultопираются: урок 95
- Тайпклассы, функторы и монадыТайпклассы в Python, эмуляция типов высшего рода, функтор и монада на пальцах.урок 95 · Тайпклассы, функторы и монадыопираются: урок 96
- Теория типов для инженераСтатика и динамика, надёжность проверки, постепенная типизация: что тип обещает и кто это проверяет.урок 86 · Теория типов для инженераопираются: урок 87
- Тесты на типы и рантайм-проверкиКак проверить, что mypy ругается там, где надо; pydantic и beartype; своя проверка по аннотациям.урок 97 · Тесты на типы и проверка в рантаймеопираются: урок 98
- Типизированный функциональный DIЗависимости как контекст: Reader, отложенное внедрение и проверка зависимостей тайпчекером.урок 96 · Зависимости как контекст: Readerопираются: урок 97
- Callable, ParamSpec, ConcatenateТипизированные декораторы, которые сохраняют сигнатуру функции и добавляют или убирают аргументы.урок 90 · Callable, ParamSpec, Concatenateопираются: урок 91
- mypy strict, Any и objectРежим strict, Any против object, cast и TYPE_CHECKING: как заглушённая проверка превращается в подделку.урок 87 · mypy strict, Any и objectопираются: урок 88
- overload, сужение и TypeIsПерегрузки, сужение типов, TypeIs против TypeGuard, assert_never и простые зависимые типы.урок 92 · overload, сужение и TypeIsопираются: урок 93
- Protocol и структурная типизацияКонтракт на умение, а не на родословную: Protocol, runtime_checkable, номинальная и структурная типизация.урок 89 · Protocol и структурная типизацияопираются: урок 90
- TypedDict, Literal, Final, NewTypeСловари с контрактом, литеральные типы, настоящие константы, NewType и Annotated.урок 91 · TypedDict, Literal, Final и NewTypeопираются: урок 92
Вышка связи: сеть и веб
- Аутентификация и паролиАутентификация против авторизации, хеш-функции, соль, scrypt и argon2.урок 113 · Аутентификация и авторизация, хеши, соль, scryptопираются: урок 114
- Босс: сайт ВышкиЗаказ без подсказок: сайт Вышки на своём фреймворке с логином. Сдашь, получишь ранг элте.урок 117 · Босс: сайт Вышкиопираются: урок 118
- Заголовки, URL и данныеЗаголовки, устройство URL, query, form, multipart и JSON; DevTools.урок 106 · Заголовки, URL и данныеопираются: урок 107
- Компьютер и сетьИнтерфейсы, концентраторы и коммутаторы, MAC-адреса, роутеры, LAN и WAN.урок 100 · Компьютер и сеть: интерфейсы, коммутаторы, MAC, роутеры, LAN и WANопираются: урок 101
- Прокси, VPN, обратный проксиКто стоит между клиентом и сервером: прямой и обратный прокси, туннели и VPN.урок 104 · Прокси, VPN, обратный проксиопираются: урок 105
- Cookies и сессииCookies, сессии, подпись HMAC, флаги HttpOnly, Secure и SameSite.урок 114 · Cookies и сессии: подпись HMAC и флагиопираются: урок 115
- DNS и свой резолверЗоны, записи, NS, dig, hosts и localhost; DNS-запрос байтами по UDP.урок 103 · DNS: зоны, записи, свой резолвер на UDPопираются: урок 104
- HTML для бэкендераСтруктура и семантика страницы, формы, кодировка и экранирование вывода.урок 112 · HTML для бэкендера: структура, формы, кодировкаопираются: урок 113
- HTTP рукамиHTTP через netcat: методы, безопасность и идемпотентность, коды ответа.урок 105 · HTTP руками: методы, идемпотентность, статусыопираются: урок 106
- HTTP-сервер на сокетахРазбор запроса из потока байтов: стартовая строка, заголовки, тело по Content-Length.урок 107 · HTTP-сервер на сокетахопираются: урок 108
- HTTP/1.1, HTTP/2, HTTP/3Keep-alive, chunked, мультиплексирование HTTP/2, QUIC и HTTP/3.урок 108 · HTTP/1.1, HTTP/2, HTTP/3опираются: урок 109
- HTTPS и TLSРукопожатие TLS, сертификаты и цепочка доверия, ssl в Python.урок 109 · HTTPS и TLS, сертификатыопираются: урок 110
- JS, fetch, SSE и WebSocketfetch, SPA против SSR, htmx, серверные события и WebSocket.урок 115 · JS, fetch, SSE и WebSocketопираются: урок 116
- Middleware, запрос, ответ, шаблоныОбъекты запроса и ответа, цепочка middleware, шаблоны с экранированием.урок 111 · Свой фреймворк: middleware, запрос и ответ, шаблоныопираются: урок 112
- OSI, TCP/IP, IP и NATМодели OSI и TCP/IP, IP-адреса и подсети, порты, NAT, DHCP и IPv6.урок 101 · OSI и TCP/IP, IP, порты, NAT, DHCP, IPv6опираются: урок 102
- RESTРесурсы, методы, ошибки по RFC 9457, версии и пагинация.урок 116 · REST: ресурсы, ошибки по RFC 9457, версии, пагинацияопираются: урок 117
- TCP, UDP и сокетыTCP против UDP, сокеты в Python, эхо-сервер и его клиент.урок 102 · TCP и UDP, сокеты, эхо-серверопираются: урок 103
- WSGI, ASGI и роутингКонтракт WSGI и ASGI, свой фреймворк: маршруты и параметры пути.урок 110 · WSGI и ASGI, свой фреймворк: роутингопираются: урок 111
Архив: SQL и своя ORM
- Агрегаты и группировкаGROUP BY, HAVING, DISTINCT, ROLLUP и CUBE, CASE.урок 125 · Агрегаты и группировкаопираются: урок 126
- Босс: ormkaЗаказ без подсказок: Лорра переводит Архив на твою ORM.урок 131 · Босс: ormkaопираются: урок 132
- Зачем СУБДЧем база лучше файла; кластер, база, схема; PostgreSQL, psql, pgcli и DBeaver.урок 118 · Зачем СУБД: кластер, база, схемаопираются: урок 119
- Оконные функцииOVER, PARTITION BY, ранги, нарастающие итоги и рамки окна.урок 127 · Оконные функцииопираются: урок 128
- Подзапросы и CTEПодзапросы, UNION, EXCEPT и INTERSECT, CTE и рекурсивные CTE.урок 126 · Подзапросы, UNION и CTEопираются: урок 127
- Своя ORM: модели и поляПоля на дескрипторах, модель на метаклассе, таблица из класса.урок 129 · Своя ORM: модели и поляопираются: урок 130
- Своя ORM: QuerySetПостроитель запросов, ленивый QuerySet, N+1 и как его не допустить.урок 130 · Своя ORM: QuerySet и N+1опираются: урок 131
- Связи и нормализацияСвязи 1-N, N-M и 1-1, нормальные формы и когда избыточность оправдана.урок 124 · Связи и нормализацияопираются: урок 125
- Типы PostgreSQLЧисла и деньги, строки, время с часовыми поясами, enum, массивы и JSONB.урок 122 · Типы PostgreSQL: деньги, строки, время с зонами, enum, массивы, JSONBопираются: урок 123
- DDL: таблицы и ограниченияCREATE TABLE, типы, первичные и внешние ключи, NOT NULL, UNIQUE и CHECK.урок 120 · DDL: таблицы, ключи и ограниченияопираются: урок 121
- DML: выборка и изменениеSELECT, WHERE, NULL и coalesce, ORDER BY, LIMIT, INSERT, UPDATE и DELETE.урок 121 · DML: выборка, NULL, сортировка и изменение данныхопираются: урок 122
- Docker на минималкахОбраз, контейнер, том и порт; compose для PostgreSQL и Redis.урок 119 · Docker на минималках: образ, контейнер, том, порт, composeопираются: урок 120
- JOINInner, outer, cross, self и lateral; полу- и антисоединения.урок 123 · JOIN: таблицы, которые находят друг другаопираются: урок 124
- Python и PostgreSQLpsycopg 3, параметры против инъекций, транзакции и пул соединений.урок 128 · Python и PostgreSQLопираются: урок 129
Глубины Архива: PostgreSQL изнутри
- Блокировки и дедлокиFOR UPDATE, SKIP LOCKED, advisory-локи, граф ожиданий и дедлоки.урок 136 · Блокировки: FOR UPDATE, SKIP LOCKED и дедлокиопираются: урок 137
- Босс: медленный АрхивЗаказ без подсказок: найди, почему Архив медленный, и почини.урок 145 · Босс: медленный Архивопираются: урок 146
- Виды индексовСоставные, уникальные, частичные, по выражению и покрывающие индексы; CONCURRENTLY; поиск лишних.урок 138 · Виды индексовопираются: урок 139
- Масштабирование PostgreSQLРепликация, партиционирование, шардирование, CAP, OLTP и OLAP.урок 143 · Масштабирование PostgreSQLопираются: урок 144
- Миграции без простояКакие изменения схемы блокируют таблицу, как их разложить и проверить тестами.урок 142 · Миграции без простояопираются: урок 143
- Первичные ключиIdentity, последовательности и их дыры, UUID v4 и v7.урок 141 · Первичные ключи: identity, последовательности, UUIDопираются: урок 142
- Представления, PL/pgSQL и триггерыПредставления и материализованные представления, функции и триггеры аудита.урок 140 · Представления, PL/pgSQL и триггерыопираются: урок 141
- Транзакции и ACIDCOMMIT, ROLLBACK, savepoint и что значит атомарность; now() как время начала транзакции.урок 133 · Транзакции: ACID, точки сохранения и now()опираются: урок 134
- Уровни изоляцииRead committed, repeatable read и serializable; аномалии, показанные в двух сессиях.урок 135 · Уровни изоляции: две сессии, два Архиваопираются: урок 136
- Устройство PostgreSQL на дискеСтраницы, кортежи, TOAST и табличные пространства: где физически лежит строка.урок 132 · Как PostgreSQL хранит строки: страницы, кортежи, TOASTопираются: урок 133
- Эксплуатация PostgreSQLБэкапы и восстановление на момент, PgBouncer, настройки, безопасность; когда хватит SQLite.урок 144 · Эксплуатация PostgreSQLопираются: урок 145
- B-tree и EXPLAIN ANALYZEКак устроен индекс B-tree, как читать план, селективность и статистика.урок 137 · B-дерево и EXPLAIN ANALYZEопираются: урок 138
- GIN, GiST, BRIN и полнотекстовый поискИнвертированные и блочные индексы, поиск по тексту и массивам.урок 139 · GIN, GiST, BRIN и полнотекстовый поископираются: урок 140
- MVCC и VACUUMВерсии строк, xmin и xmax, снимки, мёртвые версии и горизонт VACUUM.урок 134 · MVCC и VACUUM: версии строк и горизонтопираются: урок 135
Четвёртый мост: Django
- Админка как продуктСписки, фильтры, поиск, действия и инлайны в админке Django.урок 152 · Админка как продукт: списки, фильтры, действия и инлайныопираются: урок 153
- Архитектура Django-проектаПриложения, сервисный слой и селекторы, стайлгайды.урок 158 · Архитектура проекта: сервисы, селекторы и тонкие представленияопираются: урок 159
- Аутентификация и праваВход и выход, права, группы, правила доступа к объекту, вход через внешние сервисы.урок 153 · Вход и права: аутентификация, группы и доступ к объектуопираются: урок 154
- Босс: блог Четвёртого мостаЗаказ без подсказок: блог на PostgreSQL, проверка в CI своего репозитория.урок 161 · Босс: Мост выходит в городопираются: урок 162
- Какой SQL пишет ORMN+1, select_related, prefetch_related и голый SQL с параметрами.урок 150 · Какой SQL пишет ORM: N+1, select_related и голый SQLопираются: урок 151
- ЛогированиеLogger, Handler, Formatter, Filter, иерархия, dictConfig, LoggerAdapter и stacklevel.урок 159 · logging: журнал, который можно читатьопираются: урок 160
- Модели и миграцииМодели, своя модель пользователя, ограничения, миграции и PostgreSQL в compose.урок 148 · Модели и миграции: свой пользователь, связи, ограничения, PostgreSQL в composeопираются: урок 149
- Тесты Djangopytest-django, фикстуры, фабрики, тесты миграций и данные в миграциях.урок 155 · Тесты Django: pytest-django, фабрики и тесты миграцийопираются: урок 156
- Типизация Django и DRFmypy со строгим режимом и плагинами django-stubs и DRF-stubs.урок 156 · Типы в Django: django-stubs, плагин mypy и протоколы Лоррыопираются: урок 157
- Хорошие и плохие логиЧто писать в журнал и что нет, structlog, маскирование, сбор логов.урок 160 · Хорошие логи: structlog, секреты и VictoriaLogsопираются: урок 161
- Шаблоны и формыНаследование шаблонов, автоэкранирование, формы, валидация, CSRF и PRG.урок 151 · Шаблоны и формы: автоэкранирование, CSRF и PRGопираются: урок 152
- Async Django и фоновые задачиAsync-представления, async ORM, django.tasks и on_commit.урок 157 · Async Django и фоновые задачи: async ORM, django.tasks и on_commitопираются: урок 158
- Django REST frameworkСериализаторы, ViewSet, роутер, права, пагинация, OpenAPI и CORS.урок 154 · Django REST framework: сериализаторы, ViewSet, права и CORSопираются: урок 155
- Django: обзор и настройкиПлюсы и минусы Django, структура проекта, settings из окружения.урок 146 · Django: зачем фреймворк и как устроен проектопираются: урок 147
- ORM: QuerySetLookups, F и Q, annotate, свой менеджер и ленивость QuerySet.урок 149 · ORM Django: QuerySet, lookups, F и Q, annotate, свой менеджеропираются: урок 150
- URL и представленияМаршруты, конвертеры, reverse, функции и классы представлений, 404 и 405.урок 147 · Адреса и представления: path, конвертеры, reverse, 404 и 405опираются: урок 148
Курьерская сеть: конкурентность
- Блокирующий ввод-выводКак ждёт обычная программа; процессы, потоки и корутины.урок 162 · Блокирующий ввод-вывод: курьер у двериопираются: урок 163
- Босс: курьерская сетьЗаказ без подсказок: обход сети узлов с пределами, повторами и дедлайном.урок 174 · Босс: курьерская сетьопираются: урок 175
- Задачи, отмена и таймаутыcreate_task, ожидание, отмена с уборкой и таймауты.урок 167 · Задачи, отмена и таймаутыопираются: урок 168
- Корутины и awaitasync и await, и почему код от них сам не становится быстрее.урок 166 · Корутины и awaitопираются: урок 167
- Отладка asyncuvloop, режим отладки, медленные колбэки, забытые задачи и профилирование.урок 173 · Отладка asyncio: кто держит тоннельопираются: урок 174
- Потоки внутри asyncioto_thread, run_in_executor и sleep(0).урок 170 · Потоки внутри asyncioопираются: урок 171
- Потоки и GILПотоки, GIL, free-threaded Python 3.14 и гонки.урок 163 · Потоки, гонки и GIL: free-threaded Python 3.14опираются: урок 164
- Примитивы синхронизацииСемафоры, очереди, Lock, Event, throttle и debounce.урок 169 · Примитивы синхронизацииопираются: урок 170
- Процессы и пулыmultiprocessing, пулы процессов и concurrent.futures.урок 164 · Процессы и пулы: multiprocessing и concurrent.futuresопираются: урок 165
- Свой event loopКонкурентность не параллелизм; цикл событий на select и генераторах.урок 165 · Свой event loop: select и генераторыопираются: урок 166
- Структурная конкурентностьgather, TaskGroup, as_completed, wait и except*.урок 168 · Структурная конкурентностьопираются: урок 169
- Async HTTP, базы и файлыhttpx, повторы с паузой и Retry-After, async-драйверы баз и файлы.урок 172 · Async HTTP, повторы и Retry-Afterопираются: урок 173
- contextvarsКонтекст задачи: id запуска и запроса без глобальных переменных.урок 171 · contextvars: номер на рукавеопираются: урок 172
Барахолка: FastAPI
- Архитектура FastAPI-проектаСлои, репозиторий как протокол, сервис без HTTP, доменные ошибки и тонкие маршруты.урок 186 · Архитектура FastAPI-проекта: сервис, хранилище и тонкие маршрутыопираются: урок 187
- Босс: БарахолкаЗаказ без подсказок: склад без перепродажи и ключ повтора на PostgreSQL в CI.урок 187 · Босс: Барахолка открываетсяопираются: урок 188
- Запросы, ответы и ошибкиТело, путь и запрос, модели ответа, статусы и единый формат ошибок.урок 177 · Запросы, ответы и ошибкиопираются: урок 178
- Тесты FastAPI и времяhttpx без сети, lifespan в тестах, dependency_overrides, подменённые часы, PG в тестах.урок 184 · Тесты FastAPI: httpx без сети, подмена зависимостей и часыопираются: урок 185
- Alembic: миграцииAsync env.py, batch для SQLite, ловушки autogenerate и перенос данных.урок 182 · Alembic: миграции и ловушки autogenerateопираются: урок 183
- Async SQLAlchemy: сессия на запросAsync-движок и сессия, транзакция на запрос, commit до ответа.урок 181 · Async SQLAlchemy: сессия и транзакция на запросопираются: урок 182
- Depends, lifespan и настройкиГраф зависимостей, lifespan, фабрика приложения и pydantic-settings.урок 178 · Depends, lifespan и настройкиопираются: урок 179
- FastAPI изнутри: ASGI, Starlette, PydanticASGI-приложение, Starlette под FastAPI, схемы Pydantic v2 и pydantic-core.урок 176 · FastAPI изнутри: ASGI, Starlette, Pydanticопираются: урок 177
- Flask, Django, FastAPI и свой фреймворкОдна задача на четырёх фреймворках: что каждый делает за тебя и чего это стоит.урок 175 · Flask, Django, FastAPI и свой фреймворкопираются: урок 176
- JWT, OAuth2 и refresh-токеныСессии против JWT, хеши паролей, короткий access и ротация refresh с защитой от повтора.урок 183 · JWT против сессий, OAuth2 и ротация refresh-токеновопираются: урок 184
- OpenAPI, CORS и версии APIСхема как контракт, operationId, ошибки и безопасность в схеме, CORS, вторая версия.урок 179 · OpenAPI, CORS и версии APIопираются: урок 180
- SQLAlchemy 2: Core и ORMMapped-модели, Unit of Work, identity map, selectinload и запросы в стиле 2.0.урок 180 · SQLAlchemy 2: Core и ORM, Unit of Work, identity mapопираются: урок 181
- WebSocket и SSEПоток событий с сервера, рассылка после commit, keepalive и обрыв; когда что выбирать.урок 185 · SSE и WebSocket: сервер сам говорит, что изменилосьопираются: урок 186
Кэш-рынок: Redis и Celery
- Босс: Кэш-рынокЗаказ без подсказок: outbox, очередь, воркеры с inbox и гонки на PostgreSQL и Redis в CI.урок 198 · Босс: ночь, когда заказы не терялисьопираются: урок 199
- Задачи и транзакции: on_commit и outboxДвойная запись, задача после commit, outbox с ретранслятором и SKIP LOCKED.урок 197 · Задачи и транзакции: on_commit и outboxопираются: урок 198
- Зачем RedisОднопоточная модель и атомарные команды, персистентность RDB и AOF, Redis в Docker.урок 188 · Зачем Redis: один поток, атомарные команды и память на дискеопираются: урок 189
- КэшированиеCache-aside, инвалидация, лавина промахов, джиттер TTL и кэш отсутствия.урок 190 · Кэширование: cache-aside, инвалидация и лавина промаховопираются: урок 191
- Своя очередь задач на StreamsЗадачи, воркеры, ретраи, мёртвые письма и подбор записей упавшего воркера.урок 193 · Своя очередь задач на Redis Streamsопираются: урок 194
- Сессии, лимиты на Lua и замкиСессии в Redis, скользящее окно одним скриптом Lua, замок с токеном и критика Redlock.урок 191 · Сессии, лимиты на Lua и замкиопираются: урок 192
- Типы Redis и TTLСтроки, хеши, списки, множества и sorted set; сроки жизни ключей; конвейер и MULTI.урок 189 · Типы Redis: хеши, списки, множества, sorted set и срок жизниопираются: урок 190
- Canvas, beat и Flowerchain, group и chord, расписание beat, наблюдение во Flower; когда хватит taskiq или arq.урок 196 · Canvas, beat и Flower: цепочки задач и расписаниеопираются: урок 197
- Celery по-взросломуИдемпотентные задачи, acks_late, ретраи с паузой, таймауты, prefetch и маршруты по очередям.урок 195 · Celery по-взрослому: подтверждение, повторы, идемпотентностьопираются: урок 196
- Celery: брокер, воркеры, результатыПриложение Celery, задачи и их имена, брокер и хранилище результатов, eager-режим в тестах.урок 194 · Celery: брокер, воркеры, результатыопираются: урок 195
- Pub/Sub и StreamsГромкоговоритель против журнала: группы потребителей, подтверждения и зависшие записи.урок 192 · Pub/Sub и Streams: громкоговоритель и журналопираются: урок 193
Ревизия: тесты и архитектура
- Босс: РевизияЗаказ без подсказок: прокат на PostgreSQL, гонка двадцати курьеров за один дрон и резерв раньше денег в CI.урок 209 · Босс: ночь двадцати курьеровопираются: урок 210
- Виды тестов и пирамидаЮнит, интеграционные и E2E, пирамида и при чём тут архитектура; лондонская и детройтская школы; характеристические тесты легаси.урок 199 · Виды тестов и характеристические тестыопираются: урок 200
- Гексагональная архитектураСущности, сценарии и репозитории; чистая и гексагональная архитектуры; контрактные тесты адаптеров.урок 205 · Гексагон: ядро, порты и адаптерыопираются: урок 206
- Инверсия зависимостейЧто такое зависимость, швы в легаси, порты на Protocol, внедрение через аргументы, устойчивость кода.урок 204 · Инверсия зависимостей: швы, порты и внедрениеопираются: урок 205
- Интеграционные тесты и мутантыИнтеграционные и E2E тесты, база в тестах; мутационное тестирование и mutmut: кто проверяет тесты.урок 203 · Интеграционные тесты и мутанты: mutmut и ложь покрытияопираются: урок 204
- Как чинить багВоспроизвести, написать падающий тест, найти причину, починить; разбор инцидента без поиска виноватых.урок 208 · Как чинить баг: инцидент DR-500опираются: урок 209
- Мокать или нетПодделки, заглушки и моки; ловушки unittest.mock: патч не там, autospec, моки, которые проверяют сами себя.урок 201 · Подделки и моки: monkeypatch, mock.patch и autospecопираются: урок 202
- Свойства и контрактыProperty-based тесты на hypothesis, стратегии и сжатие; тесты как часть приложения: контракты и deal.урок 202 · Свойства и контракты: hypothesis и dealопираются: урок 203
- Точка сборки и DIComposition root, настройки из окружения, подмены в тестах; DI-контейнеры и dishka.урок 206 · Точка сборки и DI-контейнерыопираются: урок 207
- DDD без фанатизмаValue objects, агрегаты и их инварианты, доменные события и подписчики; где DDD лишний.урок 207 · DDD без фанатизма: значения, агрегат и событияопираются: урок 208
- pytest глубокоФикстуры и их области, фабрики, conftest, параметризация, маркеры и плагины, monkeypatch и tmp_path.урок 200 · pytest глубоко: фикстуры, conftest и маркерыопираются: урок 201
Красная зона: атака и защита
- Босс: Красная зонаCTF против своей копии блога на PostgreSQL в CI: все пробы держат, гонка за единственную награду закрыта, отчёт о найденном и закрытом.урок 217 · Босс: CTF против своего блогаопираются: урок 218
- Взлом сервераSSRF, выполнение кода через pickle, yaml.load и eval, обход пути, цепочка поставок; защита: белый список адресов, безопасная загрузка, проверка пути, пины зависимостей.урок 214 · Взлом сервера: SSRF, небезопасная загрузка, обход путиопираются: урок 215
- Инъекции, IDOR и массовое присвоениеSQL-инъекция, доступ к чужому объекту по id, массовое присвоение; защита: параметры запроса, права на объект, явные поля сериализатора.урок 213 · Инъекции, IDOR и массовое присвоениеопираются: урок 214
- Конфигурация и фишингУтечки настроек: SECRET_KEY в репозитории, ALLOWED_HOSTS, открытая админка; check --deploy; фишинг и социальная инженерия прозой.урок 215 · Конфигурация, check --deploy и фишингопираются: урок 216
- Модель угроз и OWASPКрасная зона и правило разрешения; модель угроз и STRIDE, OWASP Top 10, этика «только свой стенд»; DEBUG в проде выдаёт трассу.урок 210 · Красная зона и модель угрозопираются: урок 211
- Отказ в обслуживании и гонкиОтказ в обслуживании и лимиты, троттлинг, идемпотентность, гонки в бизнес-логике; защита по ключу.урок 216 · Отказ в обслуживании, лимиты и гонкиопираются: урок 217
- Угон аккаунтаБрутфорс, набивка чужими парами, фиксация сессии; защита: счётчик попыток, смена идентификатора сессии, общий текст ошибки.урок 211 · Угон аккаунта: перебор и фиксация сессииопираются: урок 212
- XSS, CSRF и кликджекингХранимый и отражённый XSS, CSRF, кликджекинг; защита: автоэкранирование и CSP, SameSite и Secure, X-Frame-Options, токен CSRF.урок 212 · XSS, CSRF и кликджекингопираются: урок 213
Подъём к Шпилю: блог в проде
- 12 факторов, 1-6Кодовая база, зависимости, конфиг в окружении, сторонние службы адресами, сборка-релиз-запуск, процессы без состояния.урок 221 · 12 факторов, 1-6: конфиг и службы снаружи кодаопираются: урок 222
- 12 факторов, 7-12Порт, параллелизм, утилизируемость, паритет, журналы в stdout, админ-процессы; живость против готовности, шаг релиза.урок 222 · 12 факторов, 7-12: пробы, процессы и шаг релизаопираются: урок 223
- Босс: блог в верхних ярусахCI собирает образ, поднимает его рядом с PostgreSQL и бьёт снаружи; миграция, совместимая с прошлой версией.урок 228 · Босс: блог в верхних ярусахопираются: урок 241
- Деплой: домен, прокси, TLSVPS, DNS, Caddy против nginx, ACME и Let's Encrypt, HTTPS за прокси и X-Forwarded-Proto, /version.урок 225 · Деплой: домен, прокси и TLSопираются: урок 226
- Контейнеры изнутриNamespaces и cgroups, OCI-образ как tar и JSON, слои и whiteout, digest; Docker против Podman и rootless.урок 218 · Контейнеры изнутри: namespaces, cgroups и OCIопираются: урок 219
- НаблюдаемостьМетрики RED и кардинальность, трейсы OpenTelemetry и traceparent, trace_id в журнале, SLO, бюджет ошибок и скорость сгорания.урок 227 · Наблюдаемость: метрики, трейсы, SLOопираются: урок 228
- ОблакоS3 и подписанные ссылки, CDN и неизменяемая статика, managed DB, балансеры, serverless; Terraform и Ansible обзором, привязка к поставщику.урок 226 · Облако: хранилище, CDN и подписанные ссылкиопираются: урок 227
- CI/CDGitHub Actions: линт, типы, тесты на PostgreSQL, сборка и публикация образа, права токена, пины по SHA; blue-green и канарейка.урок 224 · CI/CD: конвейер, канарейка и blue-greenопираются: урок 225
- Compose: стенд одной командойСервисы, сети и internal, тома, healthcheck и depends_on по готовности, профили, секреты файлами.урок 220 · Compose: стенд одной командойопираются: урок 221
- Dockerfile для PythonMulti-stage, uv и lock-файл, порядок слоёв и кэш, non-root, пин базы по digest, .dockerignore, сканирование образа.урок 219 · Dockerfile для Python: две стадии, uv и не под rootопираются: урок 220
- Linux для бэкендераПроцессы и сигналы, PID 1, права, systemd и journald, песочница unit, воркер с честным SIGTERM.урок 223 · Linux для бэкендера: сигналы, PID 1 и systemdопираются: урок 224
Арена: алгоритмы и system design
- ГрафыПредставления графа, BFS, DFS, Дейкстра и топологическая сортировка.урок 234 · Графыопираются: урок 235
- Задачи на собеседованииКак разбирать задачу вслух: примеры, наивное решение, оценка, улучшение, проверка.урок 236 · Задачи на собеседованииопираются: урок 237
- Массивы, списки, стек, очередь, кучаМассив против связного списка, стек, очередь, deque и двоичная куча.урок 231 · Массив, связный список, стопка, очередь и кучаопираются: урок 232
- Поиск и деревьяЛинейный и бинарный поиск, bisect, двоичные деревья поиска и trie.урок 233 · Поиск и деревьяопираются: урок 234
- Сложность и O-большоеАсимптотика, лучший и худший случай, амортизация: почему list.append дешёвый.урок 229 · Сложность, O-большое и амортизацияопираются: урок 230
- СортировкиПузырёк, быстрая, слиянием и Шелла; устойчивость; Timsort в CPython.урок 230 · Сортировки и Timsortопираются: урок 231
- Хеш-таблицыХеширование, коллизии, открытая адресация; как устроены dict и set в CPython.урок 232 · Хеш-таблицы: как устроены dict и setопираются: урок 233
- Жадные алгоритмы и ДПКогда жадность работает, динамическое программирование и NP-полные задачи на практике.урок 235 · Жадные алгоритмы и динамическое программированиеопираются: урок 236
- Масштабирование и кэшиВертикальное и горизонтальное масштабирование, кэши, CDN и шардирование.урок 238 · Масштабирование, кэши, CDN и шардированиеопираются: урок 239
- Очереди и консистентностьОчереди сообщений, модели консистентности и отказоустойчивость.урок 239 · Очереди, консистентность и отказоустойчивостьопираются: урок 240
- Разборы системСокращатель ссылок, лента, чат и rate limiter от требований до схемы.урок 240 · Разборы: сокращатель ссылок, лента, чат, rate limiter
- System design: требования и оценкиФункциональные и нефункциональные требования, оценки на салфетке.урок 237 · System design: требования и оценки на салфеткеопираются: урок 238
Синт-мастерская: MCP и свой агент
- Агенты на GitHubОркестратор, исполнители и ревьюер; агент по метке Issue, черновой PR, права токена, pull_request_target и форки.урок 246 · Синт на GitHub: метка, черновой PR и права токенаопираются: урок 247
- Босс: синт под политикойСинт чинит баг блога через настоящий MCP-сервер, отбивает инъекцию из журнала и не выключает то, у чего нет владельца.урок 248 · Босс: синт под политикойопираются: урок 249
- Декомпозиция и делегированиеПодзадачи с областью файлов, волны подагентов, агент в рефакторинге, отладке и TDD: красный тест до правки и зелёный после.урок 244 · Делегирование: подзадачи, волны и приёмка по тестуопираются: урок 245
- Как работают LLM и coding-агентыТокены и окно контекста, сообщения и блоки, tool_use и tool_result, стоимость, галлюцинации; что делает coding-агент и где его пределы.урок 241 · Как работают LLM и coding-агентыопираются: урок 242
- Контекст агента: AGENTS.md и skillsAGENTS.md по дереву каталогов, skills с описанием и телом по запросу, правила проекта, что класть в контекст и что нет.урок 242 · Контекст агента: AGENTS.md и skillsопираются: урок 243
- Ревью кода агентаЧто проверять в диффе агента, prompt injection и смертельная тройка, секреты в выводе инструментов, политика allow, ask, deny.урок 245 · Ревью синта: prompt injection, секреты и политикаопираются: урок 246
- Свой мини-агент: цикл tool useХод модели, вызовы и результаты с теми же id, ошибки инструмента, лимиты шагов, токенов и денег, петли, одобрение человека, журнал.урок 247 · Свой мини-агент: цикл tool useопираются: урок 248
- MCP: свой сервер на PythonКлиент, сервер и транспорт stdio, рукопожатие и версия протокола, инструменты, ресурсы и промпты; JSON-RPC руками, затем MCPServer из SDK.урок 243 · MCP: свой сервер на Pythonопираются: урок 244
Шедевр: Барахолка на сервисах
- Босс: ночь падения МонолитаВся Барахолка на настоящих PostgreSQL, RabbitMQ и Kafka: шторм дублей, предохранитель, мёртвые письма и разбор ночи без поиска виноватых.урок 260 · Босс: ночь падения Монолитаопираются: урок 261
- Контрактные тестыПирамида тестов сервисов, договор, управляемый потребителем, сверка по типу, проверка у поставщика, договоры сообщений, совместимость JSON Schema.урок 258 · Контрактные тесты: договор пишет потребительопираются: урок 259
- Монолит или сервисыКогда резать систему и когда нет, ограниченные контексты, закон Конвея, своя база у сервиса, копия цены в заказе, распределённый монолит.урок 249 · Монолит или сервисы: где резатьопираются: урок 250
- От compose к KubernetesЖивость и готовность, фон без проверяющего, compose по готовности, Deployment, Service, пробы, ресурсы, Secret, метка owner, разбор без поиска виноватых.урок 259 · От compose к Kubernetes: пробы, выкат и хозяинопираются: урок 260
- Распределённая трассаСпаны и trace_id, заголовок traceparent, спаны сервера, клиента, публикации и обработки, трасса через outbox, OpenTelemetry, trace_id в логах.урок 257 · Распределённая трасса: один номер на весь путьопираются: урок 258
- СагиРаспределённая транзакция без 2PC, оркестрация и хореография, компенсации в обратном порядке, журнал саги, таймаут шага.урок 254 · Саги: транзакция из шагов и компенсацийопираются: урок 255
- Токены сервисовАутентификация и авторизация, OIDC на входе, токен сервиса с aud и scope, RS256, kid и ротация ключей, путаница алгоритмов, act вместо токена покупателя.урок 255 · Кто стучит: токены сервисовопираются: урок 256
- Устойчивость вызововКаскадный отказ, таймауты и бюджет запроса, ретраи только идемпотентного, пауза с полным джиттером, предохранитель, отсеки.урок 256 · Устойчивость: таймауты, ретраи, предохранительопираются: урок 257
- Kafka: журнал событийЖурнал против очереди, топик и партиции, ключ и murmur2, группа потребителей, смещения и commit после обработки, порядок внутри партиции.урок 252 · Kafka: журнал, партиции и группыопираются: урок 253
- Outbox и inbox между сервисамиДвойная запись, outbox и ретранслятор с арендой, inbox и идемпотентный потребитель, хотя бы один раз и миф о ровно одном.урок 253 · Outbox и inbox: хотя бы раз и не больше разаопираются: урок 254
- RabbitMQ и FastStreamExchange, очередь, привязка и ключ маршрута, ack, nack и reject, prefetch, dead letter exchange; FastStream и тестовый брокер.урок 251 · RabbitMQ: обменник, очередь и подтверждениеопираются: урок 252
- REST, gRPC и событияСинхронный вызов и событие, клиент с таймаутом, gRPC и .proto, конверт события и его версия, API gateway и сборка ответа.урок 250 · REST, gRPC и события: как сервисы говорятопираются: урок 251
Жизнь на ярусах
- Жизнь на ярусахСиндром самозванца и эффект Даннинга-Крюгера, привычки и серия, сон и отдых, удалённая работа; финал курса.урок 267 · Жизнь на ярусах
- Как спрашиватьВоспроизвести, сузить, выдвинуть гипотезу; правило пятнадцати минут; вопрос в чат с шагами, ожиданием и фактом; вопросы бизнесу.урок 265 · Как спрашиватьопираются: урок 266
- Процесс, люди и честностьСпринты, стендапы и ретро как инструменты; люди вокруг разработчика; обещание и оценка; сказать «не успеваю» вовремя.урок 266 · Процесс, люди и честностьопираются: урок 267
- Ревью кода между людьмиЗачем ревью, маленькие PR, сначала замысел, потом строки, вопрос вместо приказа, метки nit и блокирующих замечаний, как принимать замечания.урок 263 · Ревью кода между людьмиопираются: урок 264
- Резюме и портфолиоРезюме на страницу, строка как результат, а не технология; портфолио из изделий курса: README, как запустить, что было трудно; GitHub как витрина.урок 261 · Резюме и портфолиоопираются: урок 262
- Собеседования целикомЭтапы найма, задача и system design вслух, поведенческие вопросы и STAR, свои вопросы компании, отказ как данные.урок 262 · Собеседования целикомопираются: урок 263
- Техдолг и оценкиТехдолг как кредит с процентами, когда его платить, рефакторинг маленькими шагами под тестами, оценка диапазоном и разбивкой, вопросы к ТЗ.урок 264 · Техдолг и оценкиопираются: урок 265