Собеседование Python-разработчика в 2026-м редко проваливается из-за «не назвал все магические методы». Чаще ломается другое: вакансия про Django-кабинет, а человек две недели топил LeetCode и не может объяснить транзакцию, сигнал и что будет при повторном POST. Язык здесь инструмент. Роль — backend, данные, автоматизация или «просто скрипты». Готовьте ту ветку, что в объявлении.
Ниже — блоки экрана, полные ответы про язык, данные и API, и как не утонуть в алгоритмах, если слот про продукт. Общий каркас — вопросы на собеседовании. Путь в профессию — как стать Python-разработчиком. Слоты: вакансии Python.
Коротко:
- Сначала роль из вакансии: Django/FastAPI, данные, CLI. Не «весь Python».
- Язык спрашивают через границы: GIL одной фразой, мутабельность, исключения, async если он в резюме.
- SQL и транзакции почти всегда, даже если вы «больше про вьюхи».
- Код на время — простой рабочий путь и тесты на край, не олимпиада, пока её явно нет в описании.
- Один свой сервис: инцидент, идемпотентность, что бы упростили.
Как не готовить не тот экзамен
Выпишите фреймворк, базу, очереди, домен. Если Django и админка — модели, ORM, миграции, авторизация, сигналы осторожно. Если FastAPI — схема, зависимости, тесты, фон. Если данные — pandas/SQL, не «напишу микросервис с нуля в воскресенье». Стек в CV должен совпадать с тем, что готовы защитить: см. резюме Python.
Алгоритмы готовьте, если в вакансии явный раунд или крупный процесс с отдельным кодом на время. На CIS product/outsource чаще дадут срез домена: парсер, ручка, SQL. Неделя LeetCode вместо своего сервиса — частая ошибка middle, который хочет «подстраховаться» и приходит пустым по своему коду.
Ещё одна ловушка — готовить «весь язык»: декораторы, метаклассы, GIL, слоты, AST. Спросят одно из этого, если вы сами написали «глубоко знаю Python». Напишите в CV то, чем пользовались. На экране фраза «метаклассы не писал, в проде хватало dataclass и явных фабрик» звучит взрослее пересказа статьи. Typing: если в вакансии mypy — будьте готовы к Optional и к тому, зачем Protocol. Если нет — не читайте лекцию про covariant.
Язык: граница важнее списка фич
Типовой вопрос: «чем список отличается от кортежа, и где вы стреляли себе в ногу мутабельным дефолтом?»
Список мутабельный, кортеж — нет, хешируется, если элементы хешируются. Нога: def f(items=[]): items.append(1) — один список на все вызовы. Пишу None и создаю список внутри. Для ключей словаря — неизменяемое. Для очереди задач — список или deque, не кортеж.
GIL: в одном процессе CPU-bound потоки не ускорятся. Для I/O потоки или async помогают. Если нужно считать CPU — процессы или вынести в сервис. На моём слоте API упиралось в Postgres и HTTP, не в GIL, поэтому я не продавал multiprocessing как лекарство от медленного JOIN.
Исключения: ловить широко Exception в ручке и глотать — дыра. Ловлю ожидаемое, остальное пускаю в лог и 500. В async не забываю await; «забытый await» — корутина, которая не выполнилась, баг, который я уже ловил в тестах.
Не читайте лекцию про дескрипторы, если вакансия про CRUD кабинета. Скажите границу: «глубоко не копал, в проде не нужно было».
Данные и ORM: тот же мир, что у backend
Спросят N+1, транзакцию, индекс. Даже на Django.
N+1: в цикле по заказам хожу в order.user, каждая итерация — запрос. Лечится select_related/join или явной выгрузкой. Индекс по user_id и created_at на список заказов, не «индекс на все колонки». Транзакция на списание: сначала строка платежа с уникальным ключом, потом вызов провайдера; повтор с тем же ключом не создаёт вторую проводку.
Сырой SQL пишу, когда ORM прячет план или отчёт тяжёлый. Не стыдно. Стыдно молча крутить 40 запросов в шаблоне. Миграции: вперёд с осторожностью, расширяем совместимо, не удаляем колонку в том же релизе, где код ещё пишет в неё.
Скетч, который можно набросать на доске — без «взлома», обычная выборка:
from django.db.models import Count
qs = Order.objects.filter(status='paid', created_at__gte=since).select_related('user').annotate(n_items=Count('items')).order_by('-created_at')[:50]
Эквивалент по смыслу: SELECT с JOIN на users и агрегатом по позициям, LIMIT 50. Если annotate раздует запрос — разобью на два: список шапок, позиции отдельно.
API и повторный запрос
Тот же сюжет, что на общем backend-экране, только языком Python.
POST /payments с Idempotency-Key. В таблице уникальный индекс по ключу. Первый запрос создаёт строку processing и идёт к провайдеру. Второй с тем же ключом отдаёт текущий статус, не второе списание. Celery-ретрай после таймаута — с тем же ключом. Без ключа хотя бы уникальность (user_id, order_id) на коротком окне. Поддержке три состояния: ждём, прошло, не прошло. «Неизвестно» — сверка, не новый платёж.
В FastAPI это зависимость, которая читает заголовок и ходит в репозиторий. В Django — mixin или сервисный слой, не толстый view на 200 строк. Тест: два клиента с одним ключом, assert один ряд в БД.
Код на время: не олимпиада, если её не обещали
Часто: распарсить список, сгруппировать, закрыть край пустого ввода, написать 2–3 теста. Делайте просто. Называйте сложность, если спросят, без театра.
Задача: схлопнуть события по user_id, оставить последнее по времени. Я бы собрал dict user_id → event, идя по списку; если события не гарантированно отсортированы — беру max по ts. Пустой вход — пустой выход, не падение. Дубли с одним ts — фиксирую правило: больший id. Тест на пусто, на одного пользователя, на двух, на дубль.
Не пишу универсальный фреймворк. Если успею — type hints на функцию. Если нет — скажу вслух. Генератор кода могу взять как черновик, но объясню каждую ветку, иначе на follow-up сыплюсь.
Если всё же leetcode-раунд — честно тренируйте 2–3 паттерна, не 200 задач за три дня. И всё равно оставьте вечер на свой сервис: его спросят с большей вероятностью на CIS-слоте.
Словарь и список на доске: когда dict, когда set, почему ключ должен быть неизменяемым, что будет, если мутировать объект, который уже лежит в множестве. Генератор vs список: память на большом файле, когда list() обязателен, потому что идём дважды. Это язык, который всплывает на любом слоте, даже Django. Не стыдно сказать «в этом месте сознательно список, объём маленький, читать проще».
Тесты: pytest, один файл на ручку, фикстура БД или мок провайдера. На экране могут попросить assert на дубль ключа. Не тащите иерархию на 10 классов. Назовите, что мокаете, а что идёт в настоящую базу в тесте. Если тестов в проекте нет — дыра, скажите, куда вставили бы первый. Интервьюер прощает отсутствие, не прощает «тесты не нужны, я и так аккуратный». Один зелёный тест на идемпотентность сильнее рассказа про покрытие «когда-нибудь». Два клиента, один ключ, один ряд — этого хватает как доказательства на middle-слоте.