К обычному разбору
Тренировка по собеседованиюТехническое собеседованиеFlameTree2026-04-14

FlameTree Technical: Agents, NLP, LLM и Python backend

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

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

Как LLM работает на инференсе

Интервьюер просит объяснить базовый inference loop LLM: что подается на вход, что модель возвращает и как получается следующий токен.

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

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

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

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

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

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

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

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

На вход подаются token ids, модель строит контекстные представления и возвращает logits по словарю для следующего токена. Decoding превращает logits в выбранный token id, он добавляется к контексту, и цикл повторяется.

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

На inference текст сначала токенизируется в token ids. Модель получает последовательность токенов, прогоняет ее через transformer blocks и на последней позиции выдает logits по словарю: для каждого возможного токена есть score следующего шага.

Дальше logits превращаются в вероятности или ранжирование: temperature, top-k/top-p, greedy decoding или beam search выбирают следующий токен. Выбранный token id добавляется к уже сгенерированной последовательности, после чего модель снова предсказывает следующий токен. Цикл заканчивается по special token, лимиту длины или stop condition.

Важно не говорить, что модель "сразу пишет весь ответ". Даже если API возвращает текст потоком, под капотом autoregressive LLM генерирует его пошагово.

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

  • Говорить, что модель возвращает готовый текст целиком за один шаг.
  • Не отличать logits от уже выбранного токена.
  • Не упомянуть decoding parameters и stop conditions.

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

  • Объясняй через один шаг: tokens in, logits out, decode next token.
  • После базового loop добавь KV cache и latency как production детали.
2Вопрос8 мин

Как устроена autoregressive generation и зачем KV cache

Как LLM генерирует ответ токен за токеном и какую роль в этом играет KV cache?

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

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

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

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

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

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

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

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

Autoregressive модель предсказывает следующий токен по всем предыдущим. KV cache хранит key/value tensors прошлых токенов, чтобы на каждом новом шаге не пересчитывать attention для всего префикса заново.

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

В autoregressive generation вероятность ответа раскладывается как произведение вероятностей следующего токена при уже известном префиксе. На шаге t модель видит prompt и ранее сгенерированные токены, строит распределение следующего токена, выбирает его и переходит к шагу t+1.

Без кеша каждый новый шаг заново прогонял бы весь префикс через attention. KV cache сохраняет key/value представления прошлых токенов в каждом attention layer. Для нового токена достаточно посчитать query/key/value для него и attention к уже сохраненным key/value.

Trade-off: KV cache сильно ускоряет decoding, но занимает память пропорционально длине контекста, batch size, числу слоев и hidden size. Поэтому длинные контексты и много параллельных запросов быстро упираются в GPU memory.

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

  • Думать, что KV cache хранит сами текстовые токены, а не tensors attention state.
  • Не замечать memory trade-off при длинном контексте.
  • Смешивать prefill prompt и decode phase.

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

  • Раздели prefill и decoding: prompt считается пачкой, дальше идут токены по одному.
  • Сразу назови главный trade-off: faster decoding vs GPU memory.
3Вопрос10 мин

Как работает токенизатор и зачем его обучать

Интервьюер просит рассказать про токенизатор: какие бывают алгоритмы, как он работает и нужно ли его обучать под домен или язык?

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

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

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

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

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

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

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

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

Токенизатор переводит текст в последовательность token ids. Частые алгоритмы: BPE, WordPiece, Unigram/SentencePiece. Его обучают, когда нужен лучший coverage и меньше токенов на конкретном языке или домене.

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

Токенизатор разбивает текст на единицы, с которыми работает модель. Символьная токенизация слишком длинная, словарная плохо работает с редкими словами, поэтому современные LLM обычно используют subword tokenization.

BPE начинает с маленьких единиц и итеративно объединяет частые пары. WordPiece похож по идее, но выбирает merges через likelihood. Unigram/SentencePiece строит вероятностный словарь subword units и умеет работать без предварительного разделения на слова.

Обучать свой токенизатор имеет смысл, если готовый плохо покрывает язык, домен или формат данных. Например, для русского текста или специфических документов плохой токенизатор может давать слишком много токенов, повышать стоимость и ухудшать context efficiency. Но новый токенизатор усложняет совместимость с pretrained моделью.

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

  • Сказать только "токенизатор делит на слова".
  • Не объяснить subword идею.
  • Забыть про trade-off собственного токенизатора и pretrained модели.

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

  • Назови 2-3 алгоритма: BPE, WordPiece, SentencePiece/Unigram.
  • Свяжи обучение токенизатора с языком, доменом и количеством токенов.
4Вопрос10 мин

Как проверить, стоит ли менять LLM на новую open-source модель

Вышла новая open-source LLM. Как проверить, станет ли она лучше текущей модели в продукте и стоит ли ее внедрять?

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

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

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

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

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

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

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

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

Нужен fixed eval set под продукт, сравнение качества/latency/cost, проверка совместимости tokenizer/prompt/fine-tuning, затем canary или A/B с guardrails.

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

Сначала нужно понять, что значит "лучше": качество ответов, меньше hallucination, лучше retrieval usage, ниже latency, дешевле serving, больше throughput или проще self-hosting. После этого собирается fixed eval set из реальных запросов и edge cases.

Сравнение должно быть воспроизводимым: одинаковые prompts, одинаковый retrieval context, одинаковые параметры генерации, human/LLM-as-judge с калибровкой, regression tests на критичных сценариях. Отдельно проверяются latency, memory, GPU utilization, quantization compatibility, tokenizer и возможность дообучения.

Если offline результат хороший, модель выкатывают через canary или A/B с guardrails: ошибки, жалобы, fallback rate, latency p95/p99, стоимость, product metrics. Не стоит менять модель только потому, что она сильнее в публичном leaderboard.

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

  • Опираться только на общий benchmark.
  • Не проверить latency/cost и tokenizer compatibility.
  • Сразу заменить модель без canary и rollback plan.

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

  • Начни с определения "лучше" через продуктовые и технические метрики.
  • Раздели offline eval, load/perf eval и online rollout.
5Вопрос12 мин

Что такое LLM agent и из каких компонентов он состоит

Интервьюер спрашивает, как устроен LLM agent: какие компоненты нужны и чем agent отличается от обычного вызова модели.

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

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

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

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

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

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

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

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

Agent — это не только LLM, а цикл: цель/инструкция, состояние, планирование, tool calling, observation, память, guardrails и остановка. Модель выбирает действия, система выполняет их и возвращает наблюдения.

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

Обычный вызов LLM получает prompt и возвращает текст. Agent добавляет цикл принятия решений: есть задача, состояние, набор доступных инструментов, политика выбора следующего действия, выполнение tool call, observation и решение продолжать или остановиться.

Минимальные компоненты: LLM, prompt/system policy, tool registry с описанием интерфейсов, executor, память или state, механизм проверки результата, лимиты итераций и guardrails. В production также нужны логирование, retries, idempotency для действий, sandboxing инструментов и мониторинг стоимости/latency.

Хороший ответ обязательно говорит про ограничения: agents нестабильны на длинных горизонтах, могут зациклиться, вызвать неправильный инструмент, сделать небезопасное действие или потратить слишком много токенов. Поэтому их нужно ограничивать, тестировать на сценариях и иметь fallback.

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

  • Называть agent любой prompt с LLM.
  • Не упомянуть tool interface и observation loop.
  • Не обсудить guardrails, cost limits и stop conditions.

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

  • Рисуй мысленно loop: decide -> act -> observe -> update state.
  • После архитектуры обязательно назови риски и способы ограничить поведение.
6Вопрос8 мин

Какие техники prompt engineering использовать в production

Какие практические техники prompt engineering помогают получать стабильный и проверяемый ответ от LLM?

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

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

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

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

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

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

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

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

Нужны четкая роль и задача, входные данные отдельно от инструкции, формат вывода, few-shot примеры, decomposition, запрет на догадки, schema validation и regression set для промптов.

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

Сильный ответ начинается не с "напишу красивый prompt", а с контракта: какие входы, какой формат выхода, что считается ошибкой и как это проверяется. Инструкции должны отделяться от пользовательских данных, особенно если есть риск prompt injection.

Практичные техники: system instruction с ролью и границами, явная структура ответа, JSON/schema output, few-shot примеры на типичных и edge cases, decomposition сложной задачи на шаги, request for citations/grounding при RAG, запрет на выдумывание и fallback "не знаю".

В production prompt engineering нельзя считать разовым ручным тюнингом. Нужен фиксированный eval set, версия prompt, сравнение метрик качества/latency/cost и мониторинг регрессий после изменения модели или retrieval pipeline.

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

  • Полагаться только на chain-of-thought wording без проверки результата.
  • Не отделять инструкции от пользовательского текста.
  • Не иметь regression set для изменений prompt или модели.

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

  • Говори про output schema и validation.
  • Покажи, что prompt — часть production artifact: версионируется и тестируется.
7Вопрос10 мин

Когда нужен fine-tuning, а когда хватает prompt engineering

Как решить, дообучать LLM или ограничиться prompt engineering/RAG, и что меняется при LoRA adapters?

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

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

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

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

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

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

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

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

Prompt/RAG выбирают для знаний, формата и быстрых итераций. Fine-tuning нужен, когда нужно устойчиво изменить стиль, доменную процедуру или поведение на большом наборе примеров, и это подтверждено eval set.

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

Сначала нужно проверить более дешевые варианты: prompt, few-shot, RAG, reranking, structured output и post-processing. Они проще откатываются, не требуют обучающего пайплайна и часто решают проблему, если модель уже умеет делать нужную операцию.

Fine-tuning имеет смысл, когда нужен устойчивый доменный стиль, формат, классификация, tool-use pattern или специфическая процедура, которую сложно удерживать prompt-ом. Нужны качественные пары input-output, train/validation split, метрики и проверка, что модель не деградировала на общих сценариях.

LoRA/PEFT снижает стоимость адаптации: базовые веса заморожены, обучаются небольшие adapter matrices. Это удобно для нескольких доменов и ограниченного железа, но все равно требует контроля данных, eval и serving compatibility.

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

  • Дообучать модель из-за нехватки внешних знаний вместо RAG.
  • Не иметь validation set и regression checks.
  • Забыть про стоимость serving и совместимость adapters.

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

  • Начни с decision tree: prompt/RAG first, fine-tune only with evidence.
  • Обязательно скажи, как измеришь улучшение и регрессии.
8Вопрос8 мин

Как работает LoRA и зачем нужны low-rank adapters

Объясни технически, что делает LoRA при дообучении большой модели и почему это экономит память.

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

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

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

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

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

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

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

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

LoRA замораживает исходные веса и добавляет к выбранным матрицам обучаемое low-rank обновление. Вместо полной матрицы обучаются две маленькие матрицы, поэтому параметров и optimizer state сильно меньше.

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

В обычном fine-tuning обновляются большие weight matrices модели. LoRA предполагает, что нужное изменение весов можно приблизить матрицей низкого ранга: вместо обучения полного delta W обучаются две меньшие матрицы A и B, произведение которых добавляется к исходной проекции.

Базовые веса остаются замороженными, поэтому меньше обучаемых параметров, меньше gradient/optimizer memory и проще хранить несколько доменных адаптеров. На inference adapter можно подключать отдельно или иногда слить с базовыми весами.

Ограничение: LoRA не магия. Качество зависит от данных, выбранных слоев/проекций, ранга, регуляризации и eval. Низкий ранг может не хватить для сложной адаптации, а плохие данные ухудшат модель так же, как при обычном fine-tuning.

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

  • Говорить, что LoRA обучает всю модель быстрее.
  • Не объяснить low-rank decomposition.
  • Забыть, что базовые веса обычно заморожены.

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

  • Объясни через delta W = B A или две маленькие матрицы вместо одной большой.
  • Назови практические плюсы: меньше память, дешевле training, несколько adapters.
9Вопрос10 мин

Что такое quantization LLM и какие trade-off она дает

Интервьюер спрашивает про quantization: зачем она нужна, какие бывают варианты и чем можно заплатить за ускорение.

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

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

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

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

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

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

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

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

Quantization хранит веса или активации в меньшей точности, например int8/int4 вместо fp16/bf16. Это уменьшает память и может ускорить inference, но дает риск деградации качества и требует eval.

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

Цель quantization — уменьшить memory footprint и bandwidth. Если веса хранятся в int8 или int4, модель занимает меньше GPU/CPU memory, можно поднять больший batch или модель на более дешевом железе. Иногда ускоряется и сам compute, если runtime хорошо поддерживает нужный формат.

Бывают post-training quantization и quantization-aware training. Можно квантизовать только weights или также activations/KV cache. Практические схемы отличаются granularities: per-tensor, per-channel, group-wise; часто используют calibration data, чтобы подобрать scales и снизить ошибку.

Главный trade-off — качество и стабильность на edge cases. Поэтому после quantization нужно прогонять доменный eval set, latency/memory benchmarks и проверять, не появились ли регрессии на длинных контекстах, редких языках или чувствительных задачах.

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

  • Считать, что int4 всегда быстрее fp16.
  • Не отличать weight-only quantization от activation/KV quantization.
  • Не проверять качество на доменном eval set.

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

  • Назови цель: memory, throughput, cost.
  • После методов сразу скажи про обязательный eval качества и latency.
10Вопрос8 мин

Как объяснить SOLID на backend-собеседовании

Интервьюер просит рассказать SOLID: какие есть принципы и зачем они нужны в поддерживаемом коде.

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

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

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

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

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

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

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

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

SOLID — это набор эвристик для кода, который легче менять: одна ответственность, расширение без правки старого кода, корректная подстановка наследников, маленькие интерфейсы и зависимость от абстракций.

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

Single Responsibility: у класса или модуля должна быть одна причина для изменения. Open/Closed: поведение лучше расширять через новые реализации, а не постоянно править старую. Liskov Substitution: наследник должен быть заменяем базовым типом без сюрпризов для клиента.

Interface Segregation: лучше несколько маленьких интерфейсов, чем один большой, который заставляет реализовывать лишнее. Dependency Inversion: высокоуровневый код зависит от абстракций, а не от конкретных реализаций, чтобы можно было заменить БД, API-клиент или модель.

Важно подать SOLID как практические правила, а не религию. В Python это может быть выражено через модули, протоколы, композицию, dependency injection и тестируемые boundaries, а не обязательно через тяжелую OOP-иерархию.

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

  • Перечислить буквы без смысла.
  • Сделать вывод, что SOLID требует много наследования.
  • Не привести пример зависимости от абстракции.

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

  • Дай короткое расшифрование каждой буквы и один backend пример.
  • Подчеркни pragmatic use: меньше связности, проще тесты и замены.
11Вопрос6 мин

В каком порядке применяются и вызываются Python decorators

Если у функции несколько decorators, в каком порядке они применяются при объявлении и в каком порядке выполняются при вызове?

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

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

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

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

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

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

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

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

Decorators применяются снизу вверх при создании функции: ближайший к def оборачивает первым. При вызове выполняется внешняя обертка, то есть верхний decorator получает управление первым.

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

Код с двумя декораторами:

@a
@b
def f():
    ...

эквивалентен f = a(b(f)). Значит, при объявлении сначала применяется b, потом a. Итоговая переменная f указывает на результат a(...), то есть на внешнюю обертку.

При вызове порядок выглядит наоборот с точки зрения входа в wrappers: сначала вызывается wrapper от a, внутри него может вызываться wrapper от b, и только потом исходная функция. Если wrappers делают код до и после вызова, важно отдельно проговорить enter/exit порядок.

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

  • Смешать порядок применения decorators и порядок входа в wrappers.
  • Забыть, что decorator выполняется при определении функции.
  • Не объяснить эквивалент через f = a(b(f)).

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

  • Всегда рисуй эквивалент присваивания: f = a(b(f)).
  • Если спрашивают execution order, уточни: application time или call time.
12Вопрос8 мин

Зачем нужен asyncio event loop в Python

Как работает async/await в Python и чем concurrency через event loop отличается от parallel execution?

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

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

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

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

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

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

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

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

asyncio дает cooperative concurrency для IO-bound задач. Корутина сама отдает управление на await, event loop переключает готовые задачи, но CPU-bound код без await будет блокировать loop.

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

async/await в Python нужен, когда много ожидания внешних операций: сеть, БД, файловые операции, timers. Корутина выполняется до await, затем отдает управление event loop. Loop может запустить другую готовую корутину, пока первая ждет IO.

Это concurrency, а не автоматический parallel CPU execution. В одном event loop код обычно выполняется в одном потоке, поэтому тяжелый CPU-bound цикл заблокирует все остальные корутины. Для CPU-bound нужны multiprocessing, native extensions, worker pool или вынос работы в отдельный сервис.

Плюс asyncio — высокий throughput для большого числа одновременных IO-запросов без большого числа потоков. Цена — нужно не блокировать loop, правильно обрабатывать cancellations/timeouts и использовать async-compatible клиенты.

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

  • Сказать, что async автоматически ускоряет CPU-bound код.
  • Вызывать blocking requests/DB client внутри async handler.
  • Не упомянуть cancellation и timeout.

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

  • Сразу разделяй IO-bound concurrency и CPU-bound parallelism.
  • Назови опасность: blocking call внутри event loop.
13Вопрос8 мин

Для чего нужны asyncio Lock, Event и Semaphore

Объясни разницу между async Lock, Event и Semaphore и где они нужны в backend-коде.

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

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

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

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

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

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

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

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

Lock защищает критическую секцию для одной корутины, Event будит ожидающие корутины по сигналу, Semaphore ограничивает число одновременных операций, например запросов к API или соединений.

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

asyncio.Lock нужен, когда несколько корутин могут одновременно менять shared state или выполнять операцию, которую нужно сериализовать. В отличие от thread lock, он не блокирует поток ОС, а при ожидании отдает управление event loop. asyncio.Event — это флаг/сигнал. Одни корутины ждут event.wait(), другая вызывает event.set(), и ожидающие продолжают работу. Это удобно для readiness signals, shutdown signals или ожидания инициализации ресурса. asyncio.Semaphore ограничивает concurrency: например, не больше 10 одновременных запросов к внешнему API, не больше N задач обработки или не больше размера пула. Он полезен для backpressure и защиты внешних систем.

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

  • Думать, что async Lock защищает от всех race conditions между процессами.
  • Использовать Lock там, где нужен Semaphore для лимита concurrency.
  • Не освобождать lock/semaphore через async context manager.

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

  • Дай по одному примеру на Lock, Event и Semaphore.
  • Подчеркни, что ожидание async primitive не блокирует event loop.
14Вопрос10 мин

Чем отличаются threading и multiprocessing в Python

Когда выбирать потоки, когда процессы, и как GIL влияет на CPU-bound и IO-bound задачи?

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

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

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

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

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

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

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

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

Threads делят память процесса и удобны для IO-bound задач, но GIL мешает параллельно исполнять Python bytecode на CPU. Processes имеют отдельную память и обходят GIL, но дороже по запуску и обмену данными.

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

Потоки внутри одного процесса разделяют память, поэтому между ними проще передавать объекты, но нужен контроль race conditions. В CPython GIL разрешает исполнять Python bytecode только одному потоку за раз, поэтому CPU-bound Python-код обычно не масштабируется на несколько ядер через threading.

Для IO-bound задач threads могут быть полезны: пока один поток ждет сеть или диск, другой может работать. Многие native операции освобождают GIL, поэтому детали зависят от библиотек.

Multiprocessing запускает отдельные процессы с отдельной памятью и своим GIL. Это подходит для CPU-bound Python work, но у процессов выше overhead, сложнее shared state, нужна сериализация данных, IPC/queues/pipes/shared memory и аккуратное управление worker lifecycle.

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

  • Сказать, что threads всегда бесполезны из-за GIL.
  • Игнорировать стоимость передачи больших объектов между процессами.
  • Смешивать concurrency и parallelism.

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

  • Сначала спроси: IO-bound или CPU-bound.
  • Назови GIL, но добавь нюанс про IO и native extensions.
15Вопрос6 мин

Для чего нужны pytest fixtures и какие бывают scopes

Интервьюер спрашивает про pytest fixtures: зачем они нужны и какие scopes у них бывают?

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

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

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

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

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

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

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

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

Fixture переиспользует setup/teardown логику в тестах: подготовить данные, клиент, БД, mock или конфиг. Scopes: function, class, module, package, session.

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

Fixture в pytest — это способ вынести повторяемую подготовку теста в отдельную функцию. Например, создать тестового пользователя, поднять соединение с БД, подготовить client, замокать внешний сервис или очистить состояние после теста.

Scope определяет, как часто fixture создается. function — на каждый тест, class — на класс, module — на файл, package — на пакет, session — один раз на весь запуск. Чем шире scope, тем быстрее может быть тестовый прогон, но тем выше риск shared state и зависимостей между тестами.

Хороший ответ: fixtures улучшают читаемость тестов, убирают duplication, позволяют управлять teardown через yield, а scope нужно выбирать по стоимости setup и риску загрязнения состояния.

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

  • Сказать только "это мок".
  • Не назвать scopes.
  • Выбирать session scope для mutable state без изоляции.

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

  • Приведи пример: db_client или prepared_dataframe.
  • Отдельно скажи про trade-off speed vs isolation.
16Вопрос6 мин

Чем отличается git merge от rebase

Интервьюер спрашивает про командную работу с Git: что делает merge, что делает rebase и когда какой подход выбирать?

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

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

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

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

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

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

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

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

Merge сохраняет историю ветвления и создает merge commit, если нужно. Rebase переносит commits ветки на новую базу и переписывает их, делая историю линейнее.

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

git merge объединяет две ветки, сохраняя факт, что разработка шла параллельно. Если fast-forward невозможен, появляется merge commit с двумя parents. Это хорошо сохраняет контекст интеграции, но история может быть более ветвистой. git rebase берет commits текущей ветки и применяет их поверх нового base. Получаются новые commit hashes, потому что история переписывается. Плюс — линейная история и проще читать последовательность изменений. Минус — нельзя бездумно rebase-ить общую ветку, от которой уже работают другие люди.

Практичное правило: локальную feature branch можно rebase-ить перед PR, чтобы убрать лишние merge commits. Общие опубликованные ветки лучше не переписывать без договоренности команды.

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

  • Говорить, что rebase просто "сливает ветки".
  • Rebase-ить shared master/main.
  • Не понимать, почему меняются commit hashes.

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

  • Скажи коротко: merge preserves history, rebase rewrites branch commits.
  • Обязательно упомяни правило безопасности для опубликованных веток.
17Вопрос6 мин

Для чего нужен Docker multistage build

Интервьюер спрашивает: зачем в Dockerfile нужен multistage build и что он дает в production?

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

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

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

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

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

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

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

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

Multistage build разделяет этап сборки и финальный runtime image: в финальный образ попадает только нужный артефакт, без build tools, кешей и лишних зависимостей.

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

В первом stage обычно ставятся build dependencies, компилируется приложение, собирается frontend или wheel. Во втором stage берется чистый runtime image, куда копируются только готовые артефакты и минимальные runtime dependencies.

Плюсы: меньше размер образа, меньше attack surface, быстрее pull/deploy, меньше случайных зависимостей в production. Для ML/DS это полезно, когда нужно не тащить компиляторы, dev headers, notebooks и временные файлы в serving image.

Важно понимать, что multistage build не заменяет нормальный dependency management, но помогает сделать production image компактнее и безопаснее.

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

  • Не отличать build image от runtime image.
  • Думать, что multistage нужен только для frontend.
  • Оставлять секреты или build cache в финальном образе.

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

  • Отвечай через два этапа: build stage и runtime stage.
  • Назови benefits: image size, security, deploy speed.
18Вопрос8 мин

Какие Linux-команды нужны для диагностики сервера

Интервьюер спрашивает, какими Linux-командами пользоваться на сервере для навигации, поиска файлов, логов и диагностики процессов.

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

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

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

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

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

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

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

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

Нужен базовый набор: cd/ls/pwd, find/rg/grep, cat/less/tail, ps/top/htop, df/du/free, systemctl/journalctl, ss/lsof, env и chmod/chown. Важно объяснять, что именно диагностируешь.

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

Для навигации и файлов: pwd, ls -la, cd, find, rg или grep, cat, less, head, tail -f. Для места и ресурсов: df -h, du -sh, free -h, top или htop.

Для процессов и сервисов: ps aux, pgrep, kill, systemctl status/restart, journalctl -u service -f. Для сетевой диагностики: ss -tulpn, lsof -i, curl -i, иногда nc. Для окружения и прав: env, printenv, chmod, chown.

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

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

  • Перечислить команды без сценариев применения.
  • Забыть journalctl/systemctl для systemd-сервисов.
  • Не проверить диск, порт и переменные окружения при production incident.

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

  • Отвечай через диагностические сценарии, а не просто список команд.
  • Для systemd-сервисов сразу называй systemctl и journalctl.