Собеседование 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-слоте.
Свой проект за две минуты
Связка с рассказом о проекте: задача, ваша роль, ограничение, результат, что не сделали.
Год закрывал API статусов заказов на FastAPI и Postgres: кабинет и поддержка, очередь писем. Чтение больше записи. Узкое место — список с join на историю; историю вынесли на отдельный экран. Инцидент: провайдер 500, ретраи писем раздули очередь; остановили консьюмер этого типа, статус в API «задержка», разбор без дублей по event_id. Моя роль: сервис и ключ идемпотентности, не вся платформа. Не делал: шарды и «микросервисы ради слайдов». Трафик скромный, зато инцидент настоящий.
Django и FastAPI: что копают сверх языка
Django: толстые модели vs сервисный слой — не религия, а «где у вас лежала идемпотентность». Сигналы: чем опасны скрытые побочки на save. middleware, авторизация, «почему N+1 в шаблоне». Миграции без простоя: добавить колонку nullable, начать писать, потом читать, удалять старое в следующем релизе. Не обещайте zero-downtime, если не делали.
FastAPI: схема ответа, валидация 422, зависимость с сессией БД, как не держать коннект на весь фон. Тесты через TestClient на критичную ручку. Если в резюме Celery — карта: очередь, ретрай, идемпотентность задачи, что делаете с poison message. Если Celery нет — не учите ночь ради страха.
В Django view не кладу платёж и письмо вместе без транзакции на запись платежа. Письмо — после коммита, иначе письмо ушло, ряд откатился. В FastAPI то же: сначала репозиторий с ключом, потом брокер. Тест: два параллельных клиента, один ряд. Если интервьюер спросит про select_for_update — скажу, где блокировка строки, и что уникальный индекс всё равно нужен, потому что два воркера на разных инстансах.
Десять дней, если слот Django/FastAPI
- Дни 1–3: язык — дефолты, исключения, генераторы vs списки, async если в CV.
- Дни 4–6: SQL + ORM, один N+1 на своём коде, транзакция на бумаге.
- Дни 7–8: идемпотентный POST вслух и тестом.
- Дни 9–10: mock-интервью, вилка, проект. Подготовка к интервью.
Частые вопросы
Обязателен ли async?
Если его нет в вакансии и в коде — не учите неделю asyncio ради страха. Если есть в резюме — будьте готовы к «что будет, если забыть await» и к блокирующему вызову внутри корутины.
Pandas на backend-слоте?
Только если роль смешанная. Иначе достаточно SQL. Не тащите датафрейм в запрос на каждый HTTP.
Что со старым Python 3.8 в проде?
Скажите факт и ограничение. Не спорьте с интервьюером про «надо срочно 3.12», если не знаете их политику. Можете назвать, что вам дал бы новый синтаксис — без нравоучения.
Тестовое «напишите маркетплейс за выходные»?
Отказ или урезание: как отказаться от тестового.
Нужно ли сопроводительное?
Короткое, с одним сервисом и ссылкой. Генератор, шаблоны — короткое письмо.
Спросят ли про GIL на junior?
Иногда одной фразой. Достаточно: CPU vs I/O, не диссертация. Если не знаете — «не копал, в задачах упирались в БД», это честнее выдумки.
Что сделать сейчас
Откройте одну вакансию. Вычеркните LeetCode, если его нет в тексте. Напишите ответ про повторный POST и разбор своего сервиса на 90 секунд. Добавьте два теста на край. Затем идите в каталог Python-ролей с этим каркасом, не с «всем языком сразу».
Если экран завтра: не открывайте метаклассы. Откройте свой view или ручку, найдите транзакцию и место, где можно задвоить запись. Проговорите это. Второй прогон — мутабельный дефолт и «забытый await», если async в CV. Этого набора хватает, чтобы не начать с пустого «ну я пишу на Python». Остальное интервьюер доберёт follow-up по их домену. После слота запишите один вопрос, на котором поплыли, и закройте его примером из своего кода — так готовитесь быстрее, чем по чужому списку из двухсот пунктов.