Собес в Яндекс · Разработчик на Python и Go в Яндекс ID
Материал Эйч · Опубликовано 27 октября 2026
Обзор
Бэкенд в команде идентификации: надёжные API, безопасность данных, Python/Go, прод и производительность
Фишка: Сильный упор на доказательность ответа: пошаговый разбор алгоритма, бенчмарки для оптимизаций, опыт с метриками и продом — типичный стиль вопросов Яндекса по Python.
| Этап | Длительность | Что проверяют |
|---|---|---|
| Скрининг / HR | 30–45 мин | Мотивация, опыт бэкенда, готовность к офису (Москва/СПб), стек Python/Go, сроки выхода |
| Техническое интервью | 1,5–2 ч | Вопросы по Python (типы, исключения, строки, pathlib), задача на код (часто merge/алгоритм), разбор асимптотики и краевых случаев |
| Углублённое тех. / продуктовое | 1–2 ч | Прод-отладка, метрики, CPU-bound оптимизация (пулы процессов), тесты и моки; возможны вопросы по БД и распределённости |
| Финал с командой | 45–60 мин | Софт-скиллы, работа в команде, ответственность за безопасность пользовательских данных |
Стек и темы
Обязательный минимум
- Python 3: типы, коллекции, исключения, строки, os/pathlib
- Асимптотика и выбор структур данных
- Многопоточность vs multiprocessing, GIL, ProcessPoolExecutor vs ThreadPoolExecutor
- Юнит-тесты, unittest.mock / patch для глобальных функций
- Реляционные БД (запросы, индексы, транзакции на уровне собеса)
- Базовый Go: синтаксис, горутины, когда уместен второй язык в сервисе
- HTTP/API, идентификация, безопасность данных на концептуальном уровне
Плюсом будет
- Профилирование CPU (cProfile, py-spy), метрики в проде
- Очереди и модуль queue
- Опыт распределённых систем и деградации под нагрузкой
- Канал Yandex for Backend — контекст культуры бэкенда в компании
Алгоритмы и O-нотация
Что ты знаешь про оптимизацию, асимптотику (O-нотацию)?
Различай верхнюю границу O, средний и худший случай; укажи память; для merge двух отсортированных массивов — O(n+m) время, O(1) доп. память при выводе в новый список.
Покажите на примере пошаговое выполнение алгоритма и докажите, что получится правильный ответ.
Возьми малый вход, веди индексы i/j, после цикла — хвост одного массива; проговори инвариант: result всегда отсортирован.
А если условие «меньше» не выполняется, то как будете действовать?
Ветки elif/else для равенства и «больше»; явные границы; недопустимый вход — исключение или контракт API.
Ловушка: При merge отсортированных списков с дубликатами нельзя делать только i+=1 при равенстве — нужно добавить оба элемента или сдвинуть оба указателя по логике задачи.
Совет: Сначала назови сложность, потом код, потом прогон примера из вакансии Яндекса.
Python: коллекции и встроенные функции
Как работает функция tuple()?
Итерируемый → кортеж; одно значение — запятая (1,); копия tuple(x); для list — tuple(lst).
Зачем нужен модуль queue?
Потокобезопасные FIFO/LIFO/PriorityQueue для producer-consumer; блокирующие get/put с таймаутами.
Фишка: В задачах на потоки queue часто предпочтительнее самописных list+lock.
Строки и pathlib
Что делает метод casefold() у строк?
Агрессивная нормализация регистра для сравнения (unicode); для поиска без учёта регистра предпочтительнее lower/casefold в зависимости от языка.
Что делает метод istitle() у строк?
True, если каждое слово в title case; цифры/символы без букв — False.
Что делает метод isspace() у строк?
True, если все символы — пробельные (включая \t, \n, неразрывный пробел и т.д.).
Что делает метод expandtabs() у строк?
Заменяет \t на пробелы до следующей позиции табуляции (по умолчанию шаг 8).
Как проверить, является ли путь директорией?
pathlib.Path(path).is_dir() или os.path.isdir(path); для symlink — is_dir(follow_symlinks=...).
Ловушка: istitle() не то же самое, что «первая буква заглавная» для всей строки.
Исключения
Что такое LookupError?
Базовый класс для KeyError, IndexError — обращение к несуществующему ключу/индексу.
Что такое IOError?
В Python 3 алиас OSError; ошибки ввода-вывода при работе с файлами и сокетами.
Что такое BufferError?
Операции с buffer/memoryview при несовместимых размерах или неготовом буфере.
Совет: Группируй исключения по иерархии: ловить LookupError шире, чем KeyError, если подходит контракт.
Параллелизм и производительность
А про многозадачность, кооперативность, параллельность что-нибудь знаешь?
Потоки — preemptive в ОС; asyncio — кооперативная многозадачность; процессы — настоящий параллелизм на CPU.
Почему для разгрузки CPU-bound задачи лучше использовать именно ProcessPoolExecutor, а не ThreadPoolExecutor?
GIL в CPython; потоки не масштабируют CPU-bound; процессы — отдельные интерпретаторы, цена — IPC и память.
Код генерации миниатюр в микросервисе (функция process) работает медленно после роста нагрузки: одно ядро на 100%, остальные простаивают. Какую метрику проанализировать и как ускорить кодом без инфраструктуры?
CPU utilization per core, latency p95/p99, queue depth; вынести process в ProcessPoolExecutor/map, размер пула ≈ число ядер, избегать лишней сериализации больших объектов.
Фишка: Типичный кейс Яндекса: доказать ускорение бенчмарком, а не «на глаз».
Ловушка: ThreadPoolExecutor для CPU-bound часто не даёт выигрыша в чистом Python.
Тестирование и прод
Как в Python можно подменить (замокать) функцию в глобальной области видимости модуля для юнит-тестов?
unittest.mock.patch('mymodule.func') или patch.object; патчить там, где имя используется (import site).
Напишите тест/бенчмарк, который доказывает, что новая реализация process с ProcessPoolExecutor работает быстрее старой.
timeit или pytest-benchmark; фиксированный workload; warm-up; несколько прогонов; изолировать от шума.
У тебя был опыт отладки приложений в проде, смотреть на метрики, профилировать?
Логи+трейсы, Grafana/Prometheus, алерты по SLO; cProfile локально; гипотеза → метрика → фикс → проверка.
Совет: Для Яндекс ID уместно упомянуть безопасность логов (не писать секреты и PII).
Go и бэкенд-контекст
Готовность программировать на Python и Go — чем дополняют друг друга в одном продукте?
Python — быстрая разработка, богатая экосистема; Go — статическая типизация, горутины, низкая латентность сервисов; часто разные микросервисы или performance-critical куски на Go.
Фишка: Вакансия явно требует оба языка — подготовь 2–3 фразы про свой опыт или план изучения Go.
Задачи
Merge двух отсортированных списков
Есть два сортированных списка целых. Написать функцию union(arr1, arr2), возвращающую новый отсортированный список из всех элементов обоих (с учётом дубликатов). Пример: [1,2,2,5,7,14] и [2,2,2,4,6,6,7,9,14,15] → [1,2,2,2,2,4,5,6,6,7,7,9,14,14,15].
def union(arr1: list[int], arr2: list[int]) -> list[int]:
result = []
i = j = 0
while i < len(arr1) and j < len(arr2):
if arr1[i] < arr2[j]:
result.append(arr1[i])
i += 1
elif arr1[i] > arr2[j]:
result.append(arr2[j])
j += 1
else:
result.append(arr1[i])
i += 1
result.append(arr2[j])
j += 1
result.extend(arr1[i:])
result.extend(arr2[j:])
return resultСложность: O(n + m) по времени, O(n + m) по памяти на результат
Ускорение CPU-bound process в микросервисе
Функция process генерирует миниатюры; после роста нагрузки одно ядро загружено на 100%, латентность выросла. Предложите изменение кода и что измерить.
Обернуть вызовы process в concurrent.futures.ProcessPoolExecutor с пулом ~cpu_count(); батчировать задачи; измерить wall time и CPU per core до/после; метрики p95 latency и throughput; при необходимости ограничить max_workers и размер очереди.
Сложность: Амортизированно ближе к O(n/p) по wall time при p воркерах для независимых задач
Бенчмарк ProcessPoolExecutor
Написать минимальный бенчмарк, доказывающий, что версия с ProcessPoolExecutor быстрее последовательной для тяжёлой CPU-функции.
import timeit
from concurrent.futures import ProcessPoolExecutor
def heavy(x):
return sum(i*i for i in range(x))
def sequential(xs):
return [heavy(x) for x in xs]
def parallel(xs):
with ProcessPoolExecutor() as ex:
return list(ex.map(heavy, xs))
if __name__ == '__main__':
data = [200_000] * 8
print(timeit.timeit(lambda: sequential(data), number=3))
print(timeit.timeit(lambda: parallel(data), number=3))Сложность: Зависит от heavy; сравнение относительное
System Design
- Спроектируйте высокодоступный сервис выдачи сессий/токенов для экосистемы (аналогично слою идентификации): rate limits, отказ одного ДЦ
- Как хранить и ротировать секреты клиентов OAuth без простоя
- Схема кэширования профиля пользователя при пиковых логинах в праздники
- Разделение ответственности между Python-сервисом оркестрации и Go-сервисом низкой латентности
Каркас ответа
- Уточни требования: RPS, latency, консистентность, регуляторика (PII)
- Нарисуй клиент → API gateway → сервисы → БД/кэш
- Проговори отказоустойчивость: реплики, health checks, деградация
- Безопасность: шифрование, audit log, минимизация данных в логах
- Метрики и алерты: SLI/SLO, нагрузочное тестирование
Поведенческое
- Расскажите о случае, когда вы оптимизировали сервис под нагрузкой — что измеряли и какой был результат
- Пример, когда ошибка в проде затрагивала пользователей: как искали причину и что изменили в процессе
- Как вы подходите к безопасности при работе с персональными данными
- Почему хотите в Яндекс ID, а не в другую команду бэкенда
- Конфликт в команде при выборе технического решения — как действовали
План подготовки
3 дня
- Повторить merge двух массивов и прогнать 3 примера вслух с доказательством
- Разобрать GIL, ProcessPoolExecutor vs ThreadPoolExecutor, написать мини-бенчмарк
- Пройтись по исключениям LookupError/IOError/BufferError и строковым методам из списка Яндекса
7 дней
- Решить 5–7 задач на LeetCode уровня Easy/Medium (arrays, two pointers, hash map)
- Практика unittest.mock.patch на глобальной функции модуля
- Читать описание Яндекс ID и вакансии: безопасность, API, распределённость
- Освежить SQL: индексы, JOIN, транзакции; набросать схему users/sessions
14 дней
- Написать маленький HTTP-сервис на Go (handlers + goroutines) и сравнить с FastAPI на Python
- Разобрать один system design кейс про auth/ID с таймером 35 мин
- Повторить модуль queue и типичные паттерны producer-consumer
- Мок-интервью: 45 мин теория Python + 45 мин задача
| Блок | Готов, если... |
|---|---|
| Алгоритмы | можешь написать merge с дубликатами и назвать O(n+m) без подсказки |
| Параллелизм | объясняешь GIL и когда ProcessPoolExecutor, плюс один способ измерить ускорение |
| Python stdlib | отличаешь casefold/istitle/isspace и знаешь Path.is_dir |
| Тесты | показываешь patch для функции в импортированном модуле |
| Продукт | в двух предложениях объясняешь роль Яндекс ID и почему надёжность критична |
В день собеседования
- Повторить шпаргалку по O-нотации и merge
- Проверить среду: IDE, Python, возможность шарить экран
- Подготовить 2 вопроса команде про нагрузку и безопасность Яндекс ID