практикум · Python

Python: продвинутая практика

Напишешь кэш, обработку повторных платежей и ограничение запросов. Отработаешь сбои и краевые случаи в отдельных задачах.

Для старта: Уверенно пишешь функции, работаешь со словарями и исключениями Python

  • Python
  • 19 модулей
  • 92 задачи
  • 4 задачи бесплатно

После регистрации откроется программа этого пути.

результаты практики

что освоишь на практике

Автор программы:
  • Проектировать идемпотентные операции списания денег и кэши с вытеснением
  • Собирать размыкатель цепи и повторы с растущей паузой для сбойных зависимостей
  • Считать перцентили и кардинальность метрик без хранения сырых измерений
подробнее о пути и навыках

что получится

69 решений на Python в 15 паках продакшен-механики: LRU-кэш с вытеснением, идемпотентное списание денег, размыкатель цепи, адаптивный предел одновременных запросов, разбор cron-выражения. Первый пак, «Основной блок» из трёх задач, бесплатный, остальные 14 премиум: биллинг, надёжность, согласованность, наблюдаемость, безопасность, справедливое распределение ресурсов, пропускная способность, потоки данных, время и расписания, графы зависимостей и границы процесса. Задачи самостоятельны, без сквозного проекта: каждую решаешь и запускаешь в браузере, а судья гоняет её на скрытых входных данных.

Для кого

Для тех, кто уже пишет на Python и хочет отработать задачи уровня продакшен-бэкенда: не синтаксис, а компромиссы систем, гонки, отказоустойчивость, деньги без потери копейки. Уровень пути hard, входной порог заметно выше базового курса. Подойдёт, если хочешь порешать то, что реально встречается в highload-сервисах, а не олимпиадные головоломки.

  • Уверенно писать функции и работать со списками, словарями и исключениями
  • Понимать изменяемость объектов и уметь читать код со стандартной библиотекой Python

что ещё отработаешь

  • Разбирать пользовательский ввод и заголовки без рассинхрона с прокси и сервером
  • Распределять ёмкость по весам и не давать шумному соседу забрать общий пул
  • Строить устойчивый порядок сборки и находить циклы в графе зависимостей
  • Разбирать CSV с кавычками, cron-выражения и слоёные конфиги с происхождением значений
программа

программа пути

Выбирай тему, которую хочешь закрепить. Задачи самостоятельны: каждую можно решить отдельно.

92 задачи · 19 модулей
1.1
Длительность для людей
Переведите число секунд в короткую запись вида 1h30m15s без нулевых сегментов
1.2
Разбор длительности
Переведите строку вида 1h30m в общее число секунд, отклоняя неверный формат
1.3
Лимитер запросов
Соберите скользящее окно из трёх функций: очистка истории, проверка лимита и запись запроса fail-closed
1.4
Версия релиза
Соберите значение-объект Version с разбором из строки, сравнением по числам и хешируемым равенством
2.1
Вычисление фич-флага
Соберите диспетчер фич-флагов: boolean, процентный раскат, allowlist и проверка атрибута, с честным отказом на неизвестном типе правила
2.2
LRU-кэш с вытеснением
Соберите LRU-кэш фиксированной ёмкости: get/put обновляют свежесть, переполнение вытесняет давно не использованную запись
2.3
Парсер поискового фильтра
Разберите строку поиска в список фильтров: пары поле:значение, фразы в кавычках с экранированием и отрицание через дефис
2.4
Стек с минимумом
Реализуйте MinStack: push/pop/top/min все за O(1), минимум не теряется при удалении текущего минимума
2.5
Слияние временных окон
Реализуйте validate_windows/merge_windows/total_coverage и оркестратор coverage_report: слияние перекрывающихся интервалов обслуживания
3.1
Пересчёт при смене тарифа
Посчитайте счёт за период, в котором тариф менялся, не потеряв ни копейки на округлении
3.2
Идемпотентное списание
Списывайте деньги ровно один раз на ключ идемпотентности, даже когда запрос приходит дважды
3.3
Списание из корзин кредитов
Соберите план списания так, чтобы сгорающие кредиты уходили первыми, и всё-или-ничего
3.4
Даты расчётного цикла
Выдавайте даты списания бесконечно, не давая дню привязки залипнуть после короткого месяца
3.5
Кампания дожима платежа
Прогоните неудавшееся списание через повторы с растущими паузами и решите, когда закрывать подписку
4.1
Размыкатель цепи
Перестаньте добивать упавшую зависимость: разомкните цепь и пустите ровно один пробник после паузы
4.2
Повторы с отступом
Соберите декоратор, который повторяет только сетевые сбои, удваивая паузу до потолка
4.3
Бюджет дедлайна
Раздайте таймауты по цепочке вызовов так, чтобы необязательный шаг не съел время обязательного
4.4
Деградация ответа
Соберите ответ из полей, часть которых не доехала, по стратегии на каждое поле и бюджету на весь ответ
4.5
Вердикт здоровья с гистерезисом
Не давайте сервису мигать: меняйте вердикт по серии проб, с разными порогами вниз и вверх и выдержкой снизу
5.1
Хранилище с версиями
Не дайте второму сохранению затереть первое: пачка записей применяется целиком или не применяется вовсе
5.2
Разгребание исходящей очереди
Держите порядок событий по каждому ключу и находите разрывы, из-за которых получатель увидел их не по порядку
5.3
Возобновляемый бэкфилл
Соберите курсор, с которым упавший бэкфилл продолжится без пропусков и повторов даже на одинаковых отметках времени
5.4
Слияние конкурирующих правок
Сливайте правки по полям так, чтобы реплики сходились к одному состоянию при любом порядке обмена
5.5
Сверка реестров
Пройдите два отсортированных реестра разом и разложите расхождения по видам, не собирая их в память
6.1
Перцентили задержек
Считайте перцентили из счётчиков корзин, не храня ни одного измерения, и не завышайте их до границ
6.2
Кардинальность меток
Удержите число временных рядов в бюджете, схлопывая лишнее в общую серию, а не выбрасывая его
6.3
Семплер трейсов
Решайте судьбу трейса по его идентификатору, а не монеткой, и подстраивайте долю под нагрузку прошлого окна
6.4
Скорость по окну
Считайте запросы в секунду по счётчику, который умеет перезапускаться, и не рисуйте отрицательную нагрузку
6.5
Правила алертов
Поджигайте алерт только после выдержки и не долбите повторами — одна машина состояний на все условия
7.1
Области путей
Проверяйте не строку пути, а место, куда он приводит, и выбирайте самое точное из выданных прав
7.2
Проверка токена
Проверьте подпись раньше всего остального и сузьте права токена до тех, что реально есть у клиента
7.3
Секреты в логах
Пишите в лог только разрешённые поля и возвращайте пути незнакомых, чтобы новое поле не утекло молча
7.4
Защита входа от перебора
Закрывайте ключ нарастающими блокировками, которые снимает тишина, а не удачный вход
7.5
Заголовок авторизации
Разберите заголовок посимвольно и отвергните всё, что прокси и сервер прочитают по-разному
8.1
Доля по весам
Разделите ёмкость по весам так, чтобы излишек скромного арендатора не пропал, а достался остальным
8.2
Карусель с накоплением
Делите очередь по весу, а не по числу заданий: недобранное переносится, а простой обнуляется
8.3
Старение приоритетов
Не дайте фоновой задаче голодать под потоком срочных: срочность растёт с ожиданием, но не выше порога
8.4
Приём по дедлайнам
Берите заказ, только если весь ранее обещанный набор всё ещё укладывается в свои сроки
8.5
Переборки в общем пуле
Резерв на клиента плюс общий остаток: шумный сосед не заберёт пул целиком, а тихий не потеряет свои слоты
9.1
Сброс нагрузки с гистерезисом
Два порога вместо одного: сброс включается на верхнем, выключается на нижнем и не дребезжит между ними
9.2
Пачки по размеру или возрасту
Пачка уходит, когда набралась или когда старшая запись заждалась — и возраст считается от той, что пачку открыла
9.3
Склейка запросов в полёте
Сорок одинаковых запросов — один поход за данными: остальные ждут ответ, а сверх группы отбиваются
9.4
Выдача устаревшего при обновлении
Два окна вместо срока годности: пока запись обновляют, её всё ещё отдают — и обновлять уходит ровно один
9.5
Адаптивный предел одновременных запросов
Предел двигается сам: вверх по единице за окно успехов, вниз вдвое сразу — подниматься осторожнее, чем падать
10.1
Слияние отсортированных источников
Слейте отсортированные порознь логи в одну ленту, держа в памяти по одной записи на источник
10.2
Отсев повторов по окну
Отсейте повторы из бесконечного потока, помня последнее окно, а не всё виденное
10.3
Витрина лучших из потока
Соберите десятку лучших из миллионов записей, держа в памяти только саму десятку
10.4
Частые ключи в ограниченной памяти
Найдите самые частые ключи потока, держа фиксированное число счётчиков и зная, насколько они врут
10.5
Резервуарная выборка
Наберите честную выборку постоянного размера из потока, длину которого узнаете только в конце
11.1
Часы SLA по рабочему календарю
Считайте срок рабочими минутами: ночи, выходные и праздники бюджет не тратят
11.2
Расписание через перевод часов
Ночная задача не должна пропасть в несуществующий час и не должна сработать дважды в удвоенный
11.3
Ежемесячное правило повторения
Разверните «31-го числа каждый месяц» в даты так, чтобы февраль не сломал ни счёт списаний, ни привычную дату
11.4
Выровненные окна отчётности
Режьте поток на периоды со сдвинутым началом так, чтобы пустой период было видно, а не потеряно
11.5
Разбор и сопоставление cron
Разберите выражение cron и не попадитесь на правиле, где два дневных поля соединяются через ИЛИ
12.1
Разбор CSV с кавычками
Разберите строку выгрузки так, чтобы адрес с запятой и цитата внутри значения не разваливали таблицу
12.2
Каноническая форма для подписи
Соберите значение в одну-единственную строку, чтобы подпись сходилась у обеих сторон
12.3
Слоёные настройки с происхождением
Слейте умолчания, файл и окружение так, чтобы флаг не сносил раздел, и покажите, откуда взялось каждое значение
12.4
Экранирование по месту вставки
Одного экранирования не бывает: текст, атрибут и адрес требуют разного, а незнакомое место не подставляется вовсе
12.5
Человеко-читаемые размеры
Читайте 1.5GiB точно, различайте 1024 и 1000 и отвергайте то, что в целых байтах не выражается
13.1
Разбор командной строки
Разберите аргументы так, чтобы файл с именем -report и число -1 не превращались в опции
13.2
Атомарная замена файла
Замените содержимое так, чтобы падение посреди записи оставило старый файл целым, а не половину нового
13.3
Владение на срок с номером
Единственный исполнитель без вечного залипания: срок забирают по истечении, а вернувшийся с того света владелец отбивается по номеру
13.4
Остановка со сливом
Остановитесь по сигналу: не берите новое, дайте доработать начатому и назовите то, что пришлось бросить
13.5
Коды возврата
Закончите работу кодом, который конвейер прочтёт верно: без потери в младшем байте и без путаницы с гибелью от сигнала
14.1
Устойчивый порядок сборки
Постройте порядок, одинаковый от прогона к прогону, и назовите цикл путём, а не фактом
14.2
Обратное влияние изменения
Посчитайте, что пересобирать после правки, идя против стрелок зависимости, и выбросьте лишние запуски
14.3
Разрешение версий
Выберите версии, подходящие под все требования, и назовите конфликт вместе с теми, кто его создал
14.4
Критический путь сборки
Найдите цепочку, задающую время сборки, и покажите, у каких шагов есть запас, а у каких нет
14.5
Клубки зависимостей
Отчитайтесь не «где-то цикл», а «вот эти четыре модуля ходят по кругу» — и стяните клубки в граф без циклов
15.1
Запрет перебивает разрешение
Решите доступ так, чтобы точечное разрешение не снимало общий запрет, и назовите правило, принявшее решение
15.2
Делегирование не расширяет доступ
Соберите цепочки передачи полномочий так, чтобы никто не отдал больше, чем имеет сам, а отзыв обрывал всё производное
15.3
Скоуп внутри скоупа, а не строка в строке
Соберите значение-скоуп, у которого покрытие сравнивает сегменты и остаётся частичным порядком: несравнимые ветки не выводятся отрицанием друг друга
15.4
Аудит, который не теряет отказы
Напишите декоратор аудита, записывающий и удавшиеся вызовы, и упавшие, с восстановлением вложенности после исключения
15.5
Условие политики читается не слева направо
Разберите условие доступа с and, or, not и скобками так, чтобы приоритет операторов соблюдался, а не подменялся порядком слов
16.1
Цепочка миграций без пропусков
Поднимите запись до текущей версии по шагам, отказавшись от работы при дырке в цепочке и при записи из будущего
16.2
Запись, которая не затирает чужое
Примените правку клиента к записи, ушедшей вперёд: применяется только изменённое, невиданное клиентом уцелевает, встречная правка того же ключа отвергается
16.3
Откат — это не тот же список задом наперёд
Соберите план перехода между версиями в обе стороны: при спуске переворачиваются и шаги, и операции внутри шага, а необратимая операция отвергается
16.4
Переименование не должно съесть соседнее поле
Ведите след каждого исходного поля через шаги миграции: переименование на занятое имя и наполовину применённый шаг отвергаются
16.5
drop и add вместо rename стирают колонку
Соберите разницу двух схем так, чтобы переехавшее поле опозналось как переименование, а не как удаление с последующим добавлением
17.1
Выход из блока не должен глотать исключение
Соберите пул слотов с менеджером контекста: слот возвращается и после падения тела, но само исключение уходит наружу, а счёт свободных не расходится
17.2
Уборка не должна прятать ошибку, из-за которой началась
Откройте ресурсы по цепочке, а при сбое разберите уже открытое в обратном порядке — так, чтобы сбой самой уборки не подменил исходную ошибку и не оборвал остальные закрытия
17.3
Внутренний откат отменяет и внешний коммит
Сделайте вложенные блоки транзакции: внутренний коммит наружу ничего не выпускает, а внутренний откат обрекает всю транзакцию, сколько бы уровней над ним ни было
17.4
Потребитель ушёл раньше — источник всё равно закрыт
Напишите ленивый поток записей, закрывающий источник ровно один раз на любом исходе: записи кончились, упёрлись в предел, генератор закрыли досрочно или в него бросили исключение
17.5
Вложенный вызов не должен угнать чужой ресурс
Напишите декоратор, берущий ресурс на время вызова: вложенные и рекурсивные вызовы получают каждый свой и возвращают их в обратном порядке
18.1
Сбой одной задачи не должен унести остальные
Выполните пачку задач с потолком на одновременность: результаты возвращаются в порядке входа, а упавшая задача не отменяет соседние
18.2
Отмена — не обычная ошибка
Оберните задачу так, чтобы ресурс освобождался на любом исходе, а отмена уходила наружу, а не превращалась в очередной результат
18.3
Победитель гонки обязан выключить остальных
Запустите задачи наперегонки: первый успех забирает результат, проигравшие отменяются и дожидаются, а упавшая задача гонку не заканчивает
18.4
Пропуск не должен побывать ничьим
Соберите пропускной шлюз, отдающий возвращённый пропуск напрямую голове очереди: свободным он не становится, а отменённый ожидающий не уносит его с собой
18.5
Слить потоки — не значит прочитать их по очереди
Соберите слияние нескольких асинхронных источников в один поток: читаются они одновременно, элементы идут по готовности, а уход потребителя закрывает все источники
19.1
Добавили узел — переехало всё
Разложите ключи по узлам через хеш-кольцо: новый узел забирает только те ключи, что попали на него, а между старыми узлами не переезжает ничего
19.2
Три реплики на одной машине — это одна реплика
Разложите копии ключа по кольцу так, чтобы все они попали на разные узлы, а нехватка узлов отвергалась, а не молча урезала запас
19.3
Владелец переполнен — ключ идёт дальше по кольцу
Разложите ключи по кольцу с потолком на узел: переполненный владелец пропускает ключ дальше, повторная раскладка того же ключа ничего не меняет, а полное кольцо отвергает запись
доступ к полной программе Платные модули этого пути входят в Premium. Условия подписки можно посмотреть на странице тарифов. от 490 ₽ / мес посмотреть тарифы первые 4 задач — бесплатно, без карты
первый шаг в этом пути

начни с задачи «Длительность для людей»

После регистрации откроется путь «Python: продвинутая практика». Выбери модуль «Основной блок»: редактор и проверка доступны на странице задачи.

4 задачи бесплатно

начать бесплатно

После регистрации откроется программа этого пути.

другие пути на этом языке