Это большое собеседование Python Backend-разработчика. Код кандидат пишет в среде Yandex Code, поэтому компания подтверждена как Яндекс. Точный грейд не назван; по глубине вопросов секция рассчитана примерно на Middle или Middle+.
Каким может быть ключ словаря
Короткий ответ: ключ должен быть хешируемым, а его хеш и результат сравнения не должны меняться во время хранения.
Строки, числа и кортежи из хешируемых элементов подходят. Список — нет, потому что его содержимое меняется. Словарь сначала использует __hash__, затем __eq__ для проверки совпадения. Поэтому равные объекты должны иметь одинаковый хеш.
Доступ по ключу в среднем занимает O(1), но это не абсолютная гарантия. Коллизии и изменение размера таблицы добавляют работу.
Чем полезны генераторы, контекстные менеджеры и MRO
Короткий ответ: генератор лениво выдаёт данные, контекстный менеджер надёжно завершает работу с ресурсом, MRO определяет порядок поиска методов.
Генератор подходит для больших потоков и одноразового прохода. Контекстный менеджер реализует __enter__ и __exit__; его асинхронный вариант — __aenter__ и __aexit__.
При множественном наследовании Python строит порядок разрешения методов C3. Вызов super() идёт по этому порядку, а не обязательно обращается к «прямому родителю». __slots__ может уменьшить память объектов и ограничить набор атрибутов, но у него есть особенности при наследовании.
Когда нужны asyncio, потоки и процессы
Короткий ответ: asyncio и потоки полезны при ожидании ввода-вывода, процессы — для параллельной CPU-нагрузки.
Event loop переключается между корутинами, когда они явно отдают управление через await. Блокирующий вызов внутри корутины остановит весь цикл, поэтому его выносят в подходящий исполнитель или заменяют асинхронной библиотекой.
GIL в обычном CPython не позволяет нескольким потокам одновременно исполнять Python-байткод, но потоки всё ещё полезны во время сетевого ожидания. Процессы имеют отдельную память и требуют передачи данных между ними.
Чем WSGI отличается от ASGI
Короткий ответ: WSGI рассчитан на классический синхронный запрос-ответ, ASGI поддерживает асинхронные приложения и долгие соединения.
ASGI нужен для WebSocket, конкурентных соединений и асинхронных обработчиков. Но один только интерфейс не делает код быстрым: база, клиент HTTP и остальной путь тоже должны не блокировать цикл.
WSGI и ASGI работают на стороне приложения, но запрос до него может пройти через прокси, балансировщик и веб-сервер. Источник: MDN Web Docs.
В Django select_related обычно делает JOIN для одиночных связей, а prefetch_related выполняет отдельный запрос и объединяет результаты в Python. Выбор нужен, чтобы избежать N+1 запросов и не загружать лишние данные.
Что нужно знать о PostgreSQL
Короткий ответ: транзакции защищают согласованность, WAL обеспечивает журналирование, уровни изоляции определяют видимость изменений, а план показывает реальную стоимость запроса.
ACID расшифровывается как атомарность, согласованность, изоляция и долговечность. MVCC позволяет читателям и писателям меньше блокировать друг друга, сохраняя версии строк.
EXPLAIN показывает оценку планировщика, EXPLAIN ANALYZE — фактическое выполнение. Поле cost выражено не в миллисекундах, а в условных единицах планировщика. Именно на этой детали часто ошибаются.
Составной B-tree индекс эффективен с учётом порядка столбцов. Индекс ускоряет чтение, но занимает место и удорожает вставку и обновление.
Чем Protocol отличается от абстрактного класса
Короткий ответ: абстрактный класс задаёт явное наследование и может содержать реализацию, Protocol описывает структурный контракт.
Если объект имеет нужные методы и типы, статический анализатор может считать его совместимым с Protocol без наследования. Это удобно для слабой связанности.
В DDD агрегат задаёт границу согласованности. Все изменения внутри неё проходят через корень агрегата, который защищает правила. Не нужно превращать DDD в набор модных названий: на интервью ценится конкретный инвариант предметной области.
Типичная ошибка. Перечислять архитектурные термины без задачи, которую они решают. Интервьюер слышит знакомые слова, но не понимает, умеет ли кандидат выбирать границы и отвечать за последствия решения.
Как лучше. Назовите конкретный инвариант, покажите место его проверки и объясните компромисс. Например: агрегат не позволяет подтвердить заказ без позиций, но слишком крупная граница усложнит параллельные изменения.
Как определить число переговорных
Короткий ответ: отсортировать встречи и отслеживать ближайшее время освобождения комнаты.
import heapq
def min_meeting_rooms(intervals):
# Встречи рассматриваем по времени начала.
intervals.sort(key=lambda interval: interval[0])
end_times = []
for start, end in intervals:
# Освободившуюся комнату можно использовать повторно.
if end_times and end_times[0] <= start:
heapq.heapreplace(end_times, end)
else:
# Иначе требуется ещё одна комната.
heapq.heappush(end_times, end)
# В куче остаётся максимальное число одновременно занятых комнат.
return len(end_times)Сортировка занимает O(n log n), каждая операция с кучей — O(log n). Нужно заранее договориться, можно ли начать встречу ровно в момент окончания другой.
Получил бы кандидат оффер
Короткий ответ: скорее да.
Кандидат уверенно прошёл широкий круг вопросов от модели объектов до архитектуры и решил задачу. Неточности были точечными: условные единицы cost и детали потоков. Общая глубина соответствует сильному Middle или Middle+.
Системно проверить такую карту тем можно в тренажёре собеседований ЮНИКОД.
Источники
частые вопросы
Короткие ответы
Сколько тем нужно знать перед Python Backend-собеседованием?
Не нужно одинаково глубоко знать всё. Сверьте вакансию со своим уровнем, закройте базу Python, HTTP и SQL, а затем углубляйтесь в фреймворк, PostgreSQL и архитектуру, которые указаны в требованиях.
Чем ASGI отличается от WSGI?
WSGI описывает синхронное взаимодействие Python-приложения и веб-сервера. ASGI поддерживает асинхронные приложения и соединения с несколькими событиями, например WebSocket.
Что важнее: знать определения или иметь опыт?
Опыт помогает приводить примеры, но его нужно уметь объяснить. На интервью ценится связка: понятная модель, рабочий пример, ограничение и решение, которое вы приняли.


