К обычному разбору
Тренировка по собеседованиюТехническое собеседованиеinDrive2025-09-29

inDrive: Техническое собеседование

Идите сверху вниз: сначала попробуйте сами, затем откройте разбор. Если шаг с кодом, пишите решение прямо здесь и запускайте проверки на странице.

Шагов
11
Вопросов
11
Задач
0
1Вопрос5 мин

Условная вероятность: кошки тяжелее 5 кг

Есть 100 собак и 100 кошек. 50 собак и 40 кошек весят больше 5 кг. Пусть B — животное является кошкой, A — животное весит больше 5 кг. Найдите P(A | B).

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

P(A | B) = 40 / 100 = 0.4. После условия B рассматриваем только 100 кошек; среди них 40 тяжелее 5 кг.

Подробный разбор

Условие B означает, что мы смотрим только на кошек. Собаки больше не входят в знаменатель.

Среди 100 кошек 40 весят больше 5 кг. Поэтому P(A | B) = 40 / 100 = 0.4. Через формулу получится то же самое: P(A и B) / P(B) = (40 / 200) / (100 / 200) = 0.4.

На собеседовании проще всего решать через подсчет: после условия остается 100 возможных кошек и 40 успешных исходов.

Типичные ошибки

  • Считать 90 / 200: это P(A), а не P(A | B).
  • Делить на всех животных после условия “животное является кошкой”.
  • Путать P(A | B) и P(B | A).

Как сказать на собеседовании

  • Сразу проговорите, каким становится знаменатель после условия.
  • Сначала решите через количества, а формулу добавьте при необходимости.
2Вопрос10 мин

Закон больших чисел, ЦПТ и распределение выборочного среднего

Объясните закон больших чисел и центральную предельную теорему. Что получится с распределением среднего, если много раз брать подвыборки по 100 наблюдений и считать среднее?

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Закон больших чисел говорит, что выборочное среднее сходится к матожиданию при росте размера выборки. ЦПТ говорит, что распределение выборочного среднего при iid-наблюдениях с конечной дисперсией становится примерно нормальным вокруг матожидания.

Подробный разбор

Закон больших чисел отвечает за сходимость: если наблюдения независимы и одинаково распределены, а матожидание конечно, то среднее по большой выборке сходится к настоящему матожиданию.

Центральная предельная теорема отвечает за форму флуктуаций вокруг этого среднего. При iid-наблюдениях с конечной дисперсией нормированное среднее стремится к N(0, 1), а само выборочное среднее приближенно имеет распределение N(mu, sigma^2 / n).

Если много раз брать подвыборки по 100 наблюдений и считать среднее, мы получим распределение выборочного среднего. Даже если исходное распределение не нормальное, это распределение часто будет около нормального, но тяжелые хвосты, зависимость и маленький размер выборки могут ломать приближение.

Типичные ошибки

  • Сказать, что сами исходные данные становятся нормально распределенными.
  • Забыть про независимость и конечную дисперсию.
  • Не упомянуть, что дисперсия среднего уменьшается как sigma^2 / n.

Как сказать на собеседовании

  • Разделите сходимость среднего и форму распределения среднего.
  • Назовите нормировку и итоговое N(0, 1).
3Вопрос12 мин

Сложности операций в односвязном списке, list, dict и строках Python

Сравните сложности добавления и доступа для односвязного списка, Python list, Python dict и конкатенации строк. Где нужен amortized O(1), а где важен worst-case?

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

В односвязном списке вставка в начало O(1), а вставка в конец O(n), если нет указателя на хвост. Python list - динамический массив: append amortized O(1), доступ по индексу O(1), вставка в начало/середину O(n). Dict обычно O(1) в среднем, строки immutable и при конкатенации копируются.

Подробный разбор

Для односвязного списка важно проговорить допущение. Если есть только указатель на голову, вставка в начало O(1), а вставка в конец требует пройти весь список и стоит O(n). Если заранее есть ссылка на нужный предыдущий узел или tail pointer, сама перестановка указателей O(1).

Python list - это динамический массив. Доступ по индексу O(1), append в конец amortized O(1), но отдельный append может стоить O(n), когда массив расширяется. Вставка в начало или середину O(n), потому что элементы нужно сдвигать.

Python dict - хэш-таблица: lookup и insert в среднем/amortized O(1), но есть caveats про коллизии, resize и hashability ключей. Строки в Python immutable, поэтому повторная конкатенация создает новые строки и копирует данные; для большого числа добавлений обычно собирают список и делают join.

Типичные ошибки

  • Говорить, что append в linked list всегда O(1), не уточнив tail pointer.
  • Забыть про resize у динамического массива.
  • Считать повторную конкатенацию строк бесплатной.

Как сказать на собеседовании

  • Сначала назовите допущение про указатели в linked list.
  • Для Python list и dict используйте слово amortized.
4Вопрос12 мин

Precision, recall и ROC-AUC при сильном дисбалансе классов

В выборке 95 единиц и 5 нулей. Модель всегда предсказывает единицу. Посчитайте precision, recall и ROC-AUC, а затем объясните, почему такая модель плохая и какие метрики смотреть дополнительно.

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Для положительного класса precision = 95 / 100 = 0.95, recall = 95 / 95 = 1.0. Если все score одинаковые, ROC-AUC = 0.5. Модель плохая, потому что она вообще не находит нулевой класс: recall по нулям равен 0.

Подробный разбор

Confusion matrix для положительного класса: TP = 95, FP = 5, FN = 0, TN = 0. Поэтому precision = 95 / 100 = 0.95, а recall = 95 / 95 = 1.0.

Эти числа выглядят хорошо только из-за дисбаланса. Модель всегда говорит "единица" и полностью игнорирует нулевой класс: для класса 0 recall будет 0, а balanced accuracy или macro recall покажут примерно 0.5.

Если модель выдает одинаковый score всем объектам, ROC-AUC равен 0.5: ранжирования между положительными и отрицательными объектами нет. Чтобы не ошибиться, нужно смотреть confusion matrix, per-class precision/recall, macro averages, balanced accuracy, PR-AUC для важного класса и выбирать threshold под бизнес-ограничение, например фиксированный FPR или минимальный precision.

Типичные ошибки

  • Назвать модель хорошей из-за precision 0.95 и recall 1.0.
  • Не посмотреть метрики по нулевому классу.
  • Выбирать threshold 0.5 без целевого operating point.

Как сказать на собеседовании

  • Начните с TP, FP, FN, TN.
  • Сразу скажите, какой класс важен для продукта и как выбирается threshold.
5Вопрос12 мин

Переобучение, регуляризация и подбор гиперпараметров

Для бинарной классификации есть очень много признаков. Какие проблемы это создает, как заметить переобучение и как подбирать гиперпараметры без утечки в тест?

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Много признаков повышает риск шума, мультиколлинеарности, утечек и переобучения. Переобучение видно по разрыву train/validation и нестабильности на holdout. Гиперпараметры подбирают на validation/CV, а test оставляют для финальной оценки.

Подробный разбор

Большое число признаков может помочь, если данных достаточно и сигнал настоящий, но оно добавляет шум, мультиколлинеарность, риск утечек, стоимость обучения и вероятность того, что модель запомнит случайные артефакты.

Переобучение обычно видно по разрыву между train и validation: train-качество улучшается, а validation стоит на месте или ухудшается. В продуктовых данных нужно следить за temporal split и leakage: случайный split может дать слишком оптимистичную оценку.

Бороться можно feature selection, L1/L2-регуляризацией, ограничением сложности модели, early stopping, dropout/weight decay для нейросетей и ограничениями деревьев вроде max_depth, min_samples_leaf, subsampling и learning rate. Гиперпараметры выбирают на validation или CV, а финальный test используют один раз как независимую проверку.

Типичные ошибки

  • Много раз подбирать параметры по test set.
  • Считать, что cross-validation сама по себе устраняет переобучение.
  • Игнорировать temporal leakage в продуктовых логах.

Как сказать на собеседовании

  • Назовите один сигнал переобучения и один способ борьбы.
  • Разделите роли train, validation и test.
6Вопрос12 мин

Bagging, boosting и регуляризация деревьев

Чем отличаются bagging и gradient boosting? Что будет, если убрать одно дерево из Random Forest и из gradient boosting, и как деревья могут переобучаться на редких категориальных признаках?

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Bagging обучает независимые деревья на bootstrap-выборках и усредняет их, поэтому удаление одного дерева обычно мало влияет. Boosting строит деревья последовательно по остаткам/градиентам, поэтому раннее дерево влияет на последующие. Редкие категории могут давать маленькие листья с экстремальными предсказаниями.

Подробный разбор

Bagging снижает variance: деревья обучаются независимо на bootstrap-выборках, а итог получается усреднением или голосованием. Random Forest дополнительно сэмплирует признаки в сплитах, чтобы деревья были менее коррелированы. Если убрать одно дерево из 100, качество обычно меняется слабо.

Gradient boosting строит аддитивную модель последовательно. Каждое следующее дерево обучается исправлять остатки или градиенты текущей модели, поэтому ранние деревья задают путь для всех последующих. Удаление первого дерева может сильно испортить качество, даже если технически inference не падает.

Деревья переобучаются на редких категориальных признаках, когда создают маленькие листья с экстремальным target. Помогают max_depth, min_samples_leaf, min_gain, subsampling, learning rate и L1/L2-регуляризация значений листьев в бустинге.

Типичные ошибки

  • Сказать, что деревья в boosting независимы.
  • Не объяснить, почему первое дерево в boosting особенно важно.
  • Забыть про min leaf size и регуляризацию leaf values.

Как сказать на собеседовании

  • Дайте по одному предложению на bagging и boosting.
  • Для редких категорий назовите depth, min leaf size и регуляризацию листьев.
7Вопрос10 мин

Data drift и мониторинг production-модели

Что такое data drift, как его выявлять в данных и какие сигналы мониторить у ML-модели в production?

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Data drift - это сдвиг распределения данных относительно обучения/валидации. Его ищут по распределениям признаков, score модели, online-метрикам, label-based качеству при задержанных таргетах и статистическим тестам вроде KS/PSI.

Подробный разбор

Data drift означает, что production-данные начинают отличаться от данных, на которых модель обучали и валидировали. Это может быть covariate drift в признаках, label drift, concept drift в связи P(y|x) или поломка feature pipeline.

Выявлять drift лучше слоями. Смотрим распределения признаков, missing values, частоты категорий, распределение model score, calibration, качество по delayed labels и продуктовые guardrails. KS-тесты, chi-square и PSI полезны как сигналы, но один статистический тест не заменяет мониторинг качества.

В production также нужны latency, error rate, freshness данных, объем предсказаний, доля пустых/аномальных ответов и триггеры переобучения. Важно помнить, что статистический drift не всегда означает продуктовый ущерб, а деградация качества может происходить без очевидного сдвига одного признака.

Типичные ошибки

  • Смотреть только online-метрики, когда ущерб уже произошел.
  • Считать, что один KS-тест по каждому признаку решает drift.
  • Забыть про поломки feature pipeline и freshness данных.

Как сказать на собеседовании

  • Разделите covariate drift, concept drift и pipeline drift.
  • Если интервьюер подсказывает скоринг, упомяните PSI.
8Вопрос18 мин

Attention, positional embeddings, BPE и LoRA

Объясните scaled dot-product attention, зачем Transformer нужны positional embeddings, как работает BPE-токенизация и в чем идея LoRA при fine-tuning.

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Scaled dot-product attention считается по формуле softmax(QK^T / sqrt(d_k))V. Positional embeddings добавляют порядок токенов. BPE итеративно объединяет частые пары символов или сабтокенов. LoRA замораживает базовые веса и обучает низкоранговые добавки к выбранным слоям.

Подробный разбор

Scaled dot-product attention проецирует состояния токенов в Q, K и V, затем считает softmax(QK^T / sqrt(d_k))V. Деление на sqrt(d_k) нужно, чтобы большие dot products не насыщали softmax.

Self-attention без positional signal не знает порядок токенов: для него последовательность похожа на множество. Поэтому к token embeddings добавляют positional embeddings/encodings или используют относительные позиции.

BPE начинает с маленьких символов и много раз объединяет самые частые соседние пары. Так получаются subword-токены: частые слова или части слов становятся короткими, а редкие слова разбиваются на несколько токенов.

LoRA - parameter-efficient fine-tuning. Базовые веса замораживаются, а для выбранных linear layers обучается низкоранговая добавка. Это уменьшает число trainable parameters и память optimizer state; адаптеры можно хранить отдельно под разные задачи или смерджить в базовые веса.

Типичные ошибки

  • Забыть sqrt(d_k) в attention.
  • Сказать, что Transformer сам знает порядок без positional signal.
  • Описать BPE как чисто word-level токенизацию.
  • Сказать, что LoRA обновляет все базовые веса.

Как сказать на собеседовании

  • Формулу attention лучше назвать точно.
  • Для LoRA используйте идею low-rank delta к frozen weights.
9Вопрос15 мин

Вопрос по метрикам

How do you design an A/B test, estimate sample size/MDE, and handle cases where treatment and control users are not independent, such as drivers and passengers in a marketplace?

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Define hypothesis, unit, metric, alpha, power and MDE. If units interfere, avoid naive user randomization and consider cluster, geo or time switchback designs.

Подробный разбор

A classical A/B test defines the hypothesis, treatment, randomization unit, primary metric, guardrails, alpha, power, MDE, duration and stopping rule. Sample size depends on baseline rate or variance, MDE, significance level, power and traffic.

In marketplaces, user-level randomization can violate independence. If one group of drivers receives a change, passengers and untreated drivers may still be affected through supply, demand, prices, waiting times or allocation.

Alternatives include cluster randomization by geography or marketplace cell, geo experiments, time-based switchback tests where the whole market alternates between variants, saturation designs and diff-in-diff/synthetic control when clean randomization is impossible. CUPED reduces variance, but does not remove interference.

Типичные ошибки

  • Use individual randomization when users compete for the same supply.
  • Claim CUPED fixes network effects.
  • Ignore guardrails like wait time and cancellations.

Как сказать на собеседовании

  • Say "interference" or "network effects" explicitly.
  • Offer switchback or geo randomization as concrete alternatives.
10Вопрос12 мин

Вопрос про production ML

A deployed ML service has 300 ms latency, but the product now needs 30 ms. What do you investigate and what optimizations can you try?

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Profile the whole request path first, then optimize the bottleneck: model format, batching, quantization, hardware, caching, feature fetching, network calls and concurrency.

Подробный разбор

Start with measurement. Break latency into feature fetching, serialization, network hops, queueing, preprocessing, model inference, postprocessing and downstream calls. Look at p50, p95, p99 and traffic bursts.

Model-level options include ONNX, TensorRT, TorchScript, quantization, FP16, pruning, distillation, smaller architecture and optimized preprocessing. Serving-level options include right-sized hardware, concurrency tuning, warm workers and efficient serialization.

System-level options can matter more than the model: cache stable predictions or features, precompute offline, move feature lookup closer to the service and remove unnecessary synchronous calls. More pods help throughput and queueing, but not single-request compute latency if the bottleneck is the model itself.

Типичные ошибки

  • Add more pods before profiling.
  • Ignore feature-store or network latency.
  • Optimize average latency while p99 still violates SLA.

Как сказать на собеседовании

  • Say "profile first" before listing optimizations.
  • Separate throughput scaling from single-request latency.
11Кейс20 мин

Рекомендации между вертикалями в супераппе

В супераппе inDrive есть несколько вертикалей: такси, доставка, междугородние поездки, грузовые перевозки и курьеры. Как рекомендовать активному пользователю одной вертикали попробовать другую? Разберите метрики, данные, модель, offline-оценку и A/B-тест.

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Это cross-sell/uplift ranking: выбираем допустимые пары пользователь-вертикаль, задаем метрики adoption/retention/GMV и guardrails, строим простые baseline, затем проверяем constrained ranking model в A/B-тесте.

Подробный разбор

Начать нужно с продуктового действия: ранжируем кнопки вертикалей, отправляем push, показываем промо или выбираем аудиторию для кампании. Цель - ожидаемая инкрементальная польза от показа другой вертикали конкретному пользователю с учетом ограничений коммуникации, а не просто похожесть пользователей.

Данные: история пользователя по вертикалям, город, паттерны pickup/dropoff, частота и давность поездок/заказов, price sensitivity, app sessions, прошлые показы, промо, доступность вертикали и supply в регионе. Baseline: случайная допустимая вертикаль, популярность по городу/сегменту, collaborative filtering вроде ALS или LightFM.

Модели: multiclass next-vertical prediction, binary user-vertical propensity, learning-to-rank, sequence models и uplift models, если есть exposure logs. Offline-метрики: AUC/PR-AUC, Recall@K/NDCG@K, calibration, coverage. Online-метрики: первый заказ в новой вертикали, повторное использование, GMV/revenue, стоимость промо, отписки/усталость от уведомлений и влияние на основную вертикаль.

Типичные ошибки

  • Оптимизировать raw adoption без учета пользователей, которые и так бы попробовали вертикаль.
  • Игнорировать доступность вертикали и supply constraints в городе.
  • Свести всю модель к среднему embedding позитивных пользователей, хотя поведение может быть мультимодальным.

Как сказать на собеседовании

  • Сначала уточни поверхность: ranking кнопок, push, promo или выбор аудитории.
  • Для top-100 пользователей ранжируй по ожидаемой инкрементальной пользе с учетом ограничений.