Это технический этап в Okko на позицию Python Backend с заявленным доходом около 300 тысяч рублей в месяц. Компания указана в описании исходного ролика, хотя в самой открытой части встречи её не называют. После короткого разговора об опыте интервьюеры проверили базовый Python, многозадачность и SQL.
Как рассказать об опыте без лишней воды
Первый вопрос кажется простым: «Чем вы занимались на последнем месте?» На деле он задаёт уровень всего интервью. Слабый ответ перечисляет технологии. Сильный показывает ответственность: какая была задача, что сделал кандидат лично, почему выбрал решение и что изменилось после запуска.
Подойдёт короткая схема:
- Контекст: сервис, нагрузка и ограничение.
- Действие: личная зона ответственности.
- Решение: архитектура и важный компромисс.
- Результат: скорость, стабильность или эффект для бизнеса.
Например: «Я отвечал за API расчёта доставки. Мы вынесли медленные внешние вызовы в асинхронный слой, добавили таймауты и метрики. В результате время ответа основного метода перестало зависеть от партнёрского сервиса».
Коротко: рассказ об опыте должен связывать задачу, личный вклад, техническое решение и измеримый результат.
Чем отличаются list, tuple, set и dict
Вопрос: какую коллекцию выбрать?
list хранит упорядоченную изменяемую последовательность. tuple тоже сохраняет порядок, но сам кортеж неизменяем. set хранит уникальные хешируемые элементы и удобен для проверки принадлежности. dict сопоставляет уникальный ключ со значением.
На интервью важно перейти от определения к задаче. Список подойдёт для очередности действий, множество — для удаления дублей и быстрых проверок, словарь — для доступа к объекту по идентификатору.
Вопрос: как устроен dict?
Словарь реализован через хеш-таблицу. Python вычисляет хеш ключа и использует его, чтобы найти позицию. Разные ключи могут попасть в одну область — это называется коллизией; реализация должна корректно её обработать. Поэтому ключ обязан быть хешируемым, а доступ в среднем близок к постоянному времени.
Два ключа могут получить одну позицию, поэтому хеш-таблица должна обрабатывать коллизии. Источник: Amit6, Wikimedia Commons, общественное достояние.
В модели данных Python описана связь __hash__ и равенства объектов. Хороший кандидат не обещает абсолютное O(1), а говорит о среднем случае.
Коротко: коллекцию выбирают по нужным операциям: порядок, уникальность, поиск по ключу и изменяемость.
Когда использовать asyncio, потоки и процессы
Вопрос: чем отличаются три подхода?
asyncio выполняет корутины в одном цикле событий и переключается, когда текущая задача доходит до await. Это удобно для множества сетевых запросов. Потоки делят память процесса и подходят для блокирующего ввода-вывода, если библиотека не поддерживает async.
В стандартной сборке CPython GIL не позволяет нескольким потокам одновременно исполнять Python-байткод. Поэтому тяжёлые вычисления обычно выносят в процессы: у каждого своя память и свой интерпретатор. В документации Python есть отдельные рекомендации по разработке с asyncio и ограничениям потоков в CPython.
import asyncio
async def load_user(user_id: int) -> dict:
# Имитируем сетевой запрос: во время ожидания цикл событий запустит другую задачу.
await asyncio.sleep(0.1)
return {"id": user_id}
async def main() -> list[dict]:
# Запускаем независимые запросы одновременно, а не ждём каждый по очереди.
return await asyncio.gather(*(load_user(i) for i in range(3)))
print(asyncio.run(main()))Коротко: asyncio и потоки подходят для ожидания ввода-вывода, а процессы — для тяжёлых вычислений на нескольких ядрах.
Что нужно знать об индексах и JOIN
Индекс — дополнительная структура, которая ускоряет поиск строк, но занимает место и замедляет вставки и обновления. Ответ «индекс всегда ускоряет запрос» неверен: оптимизатор может выбрать полное сканирование маленькой таблицы, а составной индекс зависит от порядка столбцов. Это подробно разобрано в документации PostgreSQL.
На вопрос о JOIN сначала уточните ожидаемый результат. INNER JOIN оставит только совпавшие строки, LEFT JOIN сохранит все строки слева. Если справа несколько совпадений, одна строка слева превратится в несколько. Поэтому перед MAX, MIN или подсчётом нужно проверить гранулярность данных, иначе агрегат будет формально правильным, но бизнес-ответ — нет.
Коротко: в вопросах по SQL важно объяснить, как индекс ускоряет поиск и как JOIN влияет на число строк результата.
Получил ли кандидат оффер
Кандидат прошёл этот технический этап. Финальная встреча не состоялась: другой кандидат раньше принял предложение компании. Это не технический провал и не отказ после слабого интервью.
По ответам видно, что база у кандидата была, но некоторые формулировки можно сделать точнее. На реальном собеседовании важно не только назвать GIL или хеш-таблицу, а показать связь механизма с инженерным выбором. Именно такую подачу мы отрабатываем в тренажёре и на мок-собеседованиях ЮНИКОД.
Коротко: кандидат прошёл технический этап; финал не состоялся, потому что другой кандидат раньше принял оффер.
Чек-лист подготовки
- Объясняю каждую коллекцию через практическую задачу.
- Могу нарисовать устройство хеш-таблицы.
- Различаю задачи для asyncio, потоков и процессов.
- Знаю цену индекса при записи данных.
- Проверяю гранулярность результата после JOIN.
Источники
частые вопросы
Короткие ответы
Что повторить перед собеседованием Python Backend?
Повторите коллекции и их сложность, устройство dict, GIL, asyncio, потоки и процессы, а также индексы, JOIN и агрегатные функции SQL.
Как отвечать на вопрос о выборе структуры данных?
Назовите операции, которые важны в задаче, выберите структуру под них и объясните ограничение решения на коротком примере.
Нужно ли учить определения дословно?
Нет. Интервьюер проверяет, можете ли вы объяснить механизм, выбрать инструмент для задачи и защитить решение на уточняющих вопросах.


