Junior Python-разработчик: что нужно знать и что спрашивают на собеседовании
Порог входа в бэкенд на Python вырос. Пять лет назад хватало знания языка и умения собрать простой сервис, сегодня джуна спрашивают про асинхронность, транзакции и очереди. Хорошая новость: список тем конечен и вполне обозрим, если не пытаться выучить всё сразу.
Разберём, что действительно нужно к первому собеседованию, а что можно отложить.
Язык: где заканчивается «знаю Python»
Знание синтаксиса подразумевается по умолчанию. Спрашивают то, что отделяет человека, писавшего код, от человека, прошедшего курс.
Изменяемые и неизменяемые типы. Классический вопрос про изменяемый аргумент по умолчанию задают до сих пор, и половина кандидатов на нём спотыкается. Заодно спросят, что произойдёт с вложенным списком при копировании.
Структуры данных и их стоимость. Когда список, когда словарь, когда множество. Почему проверка вхождения в список медленнее, чем в множество, и на каком объёме это перестаёт быть теорией.
Генераторы и итераторы. Зачем нужен yield, чем генератор отличается от списка по памяти, что происходит при повторном проходе.
ООП. Наследование и композиция, для чего нужны магические методы, что такое дескриптор хотя бы на уровне понимания. Множественное наследование и порядок разрешения методов спрашивают реже, но на мидловых позициях всплывает.
Исключения и контекстные менеджеры. Иерархия исключений, зачем нужен finally, как написать свой менеджер контекста и почему with лучше ручного закрытия файла.
Асинхронность и GIL
Тема, без которой сегодня почти не обходятся. И тут не нужно глубокое погружение, нужно понимание модели.
Что такое GIL и что именно он запрещает. Почему потоки не ускоряют вычисления, но помогают при работе с сетью. Когда нужны процессы. Как работает event loop, чем корутина отличается от задачи, что случится, если внутри асинхронной функции вызвать блокирующий код.
Последний вопрос любят задавать в формате «покажите ошибку в этом фрагменте». Обычно там time.sleep посреди корутины или забытый await.
Веб: фреймворк плюс понимание HTTP
Достаточно уверенно знать один фреймворк и понимать, что происходит под ним.
FastAPI сейчас чаще всего у новых проектов: маршруты, валидация через Pydantic, зависимости, работа с асинхронностью. Django остаётся в компаниях с большой историей: ORM, миграции, админка, DRF для API.
Независимо от фреймворка спросят про HTTP. Методы и коды ответов, чем PUT отличается от PATCH, что вернуть при ошибке валидации, что такое идемпотентность и почему она важна для повторных запросов. Ещё спросят про WSGI и ASGI: в чём разница и что меняется, если приложение синхронное.
Базы данных: минимум, ниже которого не берут
SQL нужен даже бэкендеру, который «не занимается аналитикой». Джойны, группировки, индексы, план запроса на базовом уровне.
Дальше идёт ORM. Спрашивают про сессию и её жизненный цикл, про транзакции и уровни изоляции, про проблему N+1 и как её ловить. Про N+1 вопрос почти обязательный, потому что он сразу показывает, смотрел ли человек когда-нибудь на реальные логи запросов.
И про миграции: как накатываются, что делать с несовместимым изменением схемы на живой базе.
Тесты и инструменты
Pytest: фикстуры, параметризация, моки. Не обязательно писать сложные сценарии, но объяснить, как изолировать внешний сервис в тесте, надо уметь.
Git: ветки, слияние, разрешение конфликтов, что такое rebase и почему его не стоит делать в общей ветке. На собеседовании это редко отдельный блок, но вопрос «как вы работаете с ветками» встречается.
Docker: собрать образ, запустить контейнер, понимать, чем он отличается от виртуальной машины. Для джуна этого достаточно.
Что можно отложить
Kubernetes глубже базовых понятий. Микросервисная архитектура и распределённые транзакции. Внутренности CPython. Оптимизация под высокую нагрузку. Всё это спросят на мидла, а джуна если и спросят, то без ожидания уверенного ответа.
Гораздо хуже прийти с поверхностным знанием десяти тем, чем с уверенным знанием пяти. Собеседование устроено так, что копают вглубь по любой теме, которую вы назвали сами.
Как готовиться без коммерческого опыта
Один законченный сервис вместо пяти туториалов. Небольшое приложение с базой, миграциями, тестами и докером. Пусть это будет трекер расходов или агрегатор объявлений, тема не важна. Важно, чтобы вы прошли весь путь: спроектировали схему, написали API, покрыли тестами, упаковали в контейнер.
Читайте чужой код. Возьмите библиотеку, которой пользуетесь, и разберите один модуль. Это неожиданно много даёт: видно, как пишут люди с опытом, и появляются вопросы, которые сами по себе не возникают.
Тренируйте объяснение вслух. Половина провалов на собеседовании это не незнание, а невозможность внятно сформулировать то, что знаешь. Берёте тему, ставите таймер на две минуты и рассказываете сами себе. Первые попытки мучительны.
Прорешивайте вопросы регулярно, а не запоем. Час подготовки в день в течение месяца даёт больше, чем два выходных перед собеседованием. Память устроена так, что тема закрепляется после нескольких возвращений с интервалами.
Собеседование: чего ждать по формату
Обычно час-полтора. Начинают с рассказа о себе и проектах, потом идут вопросы по языку, потом практика: небольшая задача на код или разбор готового фрагмента с поиском ошибки. В конце вопросы к компании.
Задачи для джуна редко бывают алгоритмически сложными. Чаще проверяют аккуратность: обработали ли краевые случаи, что будет на пустом входе, не сломается ли на дубликатах.
И почти всегда спрашивают, что вы делали, когда что-то не работало. Готовый рассказ про реальный баг, который вы искали три часа, ценится выше, чем идеальные ответы на теорию.
Дальше
Список выше выглядит внушительно, но закрывается за пару месяцев спокойной работы, если заниматься по чуть-чуть каждый день и возвращаться к темам, где плывёте.
Ровно под это мы собрали Сеньорчика: банк вопросов с реальных собеседований Python-разработчиков, от асинхронности и ORM до API-дизайна и тестов. Каждый вопрос с вариантами ответов и разбором, а движок сам возвращает темы, где вы ошибались. Десять минут в день в Telegram, начать можно бесплатно.