Тренажёр

Livecoding

Не алгоритмическая секция: здесь не просят развернуть красно-чёрное дерево. Просят написать прикладной код, какой пишут каждый день, — и смотрят, как вы думаете вслух, какие вопросы задаёте и что делаете с краевыми случаями.

30 задачи в трёх темах. У каждой: условие, что уточнить у интервьюера до начала, решение и разбор — почему именно так и что спросят следом.

Python

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

01 Сгруппировать записи по полю Начальный 10 минут Разминочная задача, с которой начинают почти всегда: список словарей — в словарь списков. словариdefaultdictкраевые случаи 02 Топ-N самых частых слов Начальный 10–15 минут Проверяют знание Counter и умение аккуратно обойтись с одинаковыми частотами. Counterheapqнормализация текста 03 Разложить вложенный словарь в плоский Средний 15 минут Живая задача из интеграций: конфиг или JSON от чужого API нужно превратить в плоские ключи. рекурсиягенераторыкраевые случаи 04 Дубликаты и нарезка на пачки Начальный 10–15 минут Две микрозадачи, которые почти всегда идут вместе: убрать дубли с сохранением порядка и отдать данные батчами. множествагенераторыitertools 05 Слить пересекающиеся интервалы Средний 15–20 минут Задача про бронирования и расписания: единственный алгоритмический сюжет, который правда встречается в бэкенде. сортировкаинвариантыкраевые случаи 06 Декоратор retry с экспоненциальной паузой Средний 20 минут Самая частая задача на декораторы: проверяют и синтаксис, и понимание, что повторять можно не всё. декораторыfunctools.wrapsобработка ошибок 07 Контекстный менеджер для замера времени Средний 15 минут Проверяют протокол with, поведение при исключении и знание contextlib. контекстные менеджерыcontextlibисключения 08 LRU-кэш своими руками Продвинутый 20–25 минут Проверяют структуры данных и понимание, почему обычный словарь тут не спасает. OrderedDictсложность операцийвытеснение 09 Разобрать лог и собрать статистику Средний 20 минут Задача про файлы: проверяют потоковую обработку и то, не прочитаете ли вы гигабайт целиком. генераторыпотоковая обработкаагрегация 10 Ограничитель частоты вызовов Продвинутый 25 минут Rate limiter руками: проверяют алгоритм, работу со временем и понимание гонок. token bucketвремямногопоточность

Async Python

Секция для тех, у кого в резюме asyncio, FastAPI или aiohttp. Проверяют не знание синтаксиса, а понимание: что выполняется параллельно, а что нет, что происходит при таймауте и отмене, как не положить чужой сервис сотней одновременных запросов.

01 Забрать сто URL параллельно Начальный 15 минут Первая задача любой асинхронной секции. Главное — не написать цикл с await внутри. gatherконкурентностьклиентская сессия 02 Ограничить число одновременных запросов Средний 15 минут Продолжение предыдущей задачи: как сделать параллельно, но не сто сразу. Semaphoreобратное давлениеограничения чужого API 03 Таймаут и отмена Средний 15–20 минут Проверяют понимание отмены: что происходит с корутиной, которую прервали на середине. wait_forCancelledErrorочистка ресурсов 04 Частичный успех: что делать с ошибками в gather Средний 15 минут Нужно вернуть удачные результаты и внятно отчитаться по неудачным, а не упасть целиком. return_exceptionsTaskGroupобработка ошибок 05 Очередь: производитель и потребители Продвинутый 25 минут Классическая схема обработки потока: проверяют обратное давление и корректное завершение. asyncio.Queueворкерыgraceful shutdown 06 Повторы для асинхронного вызова Средний 15 минут Тот же retry, но в асинхронном мире — и с вопросом, что будет с отменой во время паузы. декораторыasyncio.sleepотмена 07 Блокирующий код внутри асинхронного Средний 15 минут Любимый вопрос: в асинхронный обработчик попал синхронный вызов — что произошло и как чинить. to_threadexecutorGIL 08 Фоновая задача по расписанию Средний 15–20 минут Периодическое обновление кэша: важно, чтобы одна ошибка не убила задачу навсегда. create_taskжизненный циклустойчивость 09 Асинхронный итератор по страницам API Средний 15–20 минут Обёртка над постраничным API так, чтобы снаружи это был обычный async for. __aiter__генераторыленивость 10 Кэш и одновременные промахи Продвинутый 20–25 минут Сто запросов одновременно не нашли значение в кэше — в базу должен уйти один. Lockкэшгонки

SQL

Пишется в блокноте или в общем редакторе, без подсказок IDE. Почти всегда это агрегация с группировкой, оконная функция или поиск того, чего нет — и следом вопрос про индексы и план запроса.

01 Вторая по величине зарплата Начальный 10 минут Разминка, в которой проваливаются на краевом случае: что вернуть, если второй нет. DISTINCTLIMIT/OFFSETNULL 02 Топ-3 товара в каждой категории Средний 15 минут Самая частая задача на оконные функции: «лучшие внутри группы». оконные функцииPARTITION BYROW_NUMBER 03 Найти и удалить дубликаты Средний 15 минут Данные приехали дважды: нужно найти повторы и удалить лишние, оставив по одной записи. GROUP BY / HAVINGctidудаление 04 Клиенты без заказов Начальный 10–15 минут Поиск того, чего нет: три способа написать и вопрос, чем они отличаются. LEFT JOINNOT EXISTSNULL 05 Накопительный итог по дням Средний 15 минут Выручка по дням и нарастающий итог — то, что просят для любого дашборда. SUM OVERрамки окнагруппировка по дате 06 Дни без продаж Средний 15 минут Найти то, чего нет в таблице: строки нужно сначала откуда-то взять. generate_seriesLEFT JOINCOALESCE 07 Вернувшиеся пользователи Продвинутый 20 минут Простая продуктовая метрика, на которой проверяют самоджойн и аккуратность с датами. self joinкогортыDISTINCT 08 Почему запрос медленный Продвинутый 20 минут Вместо написания запроса — разбор чужого: что не так и как чинить. индексыEXPLAINsargable-условия 09 Вставить или обновить без гонок Продвинутый 20 минут Счётчик, который увеличивают два процесса одновременно: классическая потерянная запись. INSERT ON CONFLICTблокировкиатомарность 10 N+1 и как её увидеть в SQL Средний 15 минут Задача на стыке ORM и SQL: почему страница делает 201 запрос и что показать в ответ. JOINORMагрегация

Как пользоваться

Откройте задачу, закройте решение и напишите код сами — в редакторе или на бумаге, вслух проговаривая, что делаете. Только потом смотрите разбор: на собеседовании ценится не столько ответ, сколько то, как вы к нему шли.