Вопросы для собеседования Data Engineer
Готовый набор для интервьюера: 36 вопросов с тезисами эталонного ответа, задача, рубрика и план встречи.
На собеседовании Data Engineer хорошо работает схема на 60 минут: 3-4 устных вопроса по стеку, одна задача на live coding, проектирование для middle и выше и вопросы кандидата. Ниже вопросы по грейдам из базы Техпрогона: у каждого тезисы, которые должен назвать сильный кандидат.
Всего в базе по этой роли 225 устных вопросов с чек-листом ответа.
Как построить техсобес на 60 минут
0-5 мин
Знакомство
Кто вы, формат встречи, кандидат коротко о себе и последнем проекте.
5-20 мин
Вопросы по стеку
3-4 устных вопроса из набора ниже. Сверяйте ответ с тезисами.
20-45 мин
Live coding
Одна задача. Смотрите на процесс по рубрике, а не только на ответ.
45-55 мин
Проектирование
Для middle и выше: система или решение целиком. Для junior: ещё вопросы.
55-60 мин
Вопросы кандидата
Что спросил кандидат, тоже сигнал: интерес к задачам и команде.
Junior: 12 вопросов
Основы: как устроено и зачем. Хватит 3-4 вопросов на встречу.
Напишите вслух декоратор, который логирует время выполнения функции, и объясните каждую строку.
Что хотим услышать
- Внешняя функция принимает
func, возвращает обёртку - Обёртка принимает
*args, **kwargsи передаёт их дальше - Возвращает результат
func functools.wrapsсохраняет имя и docstring- Время через
time.perf_counter, вывод вfinallyили после вызова - Код декоратора выполняется при определении, обёртки при каждом вызове
Если ответил, копните глубже
Чем отличается WHERE от HAVING? Приведи пример, где нужны оба.
Что хотим услышать
- WHERE фильтрует строки до группировки, HAVING фильтрует группы после
- В WHERE нельзя агрегаты, в HAVING можно
- Порядок: FROM, WHERE, GROUP BY, HAVING, SELECT
- Условия без агрегатов лучше писать в WHERE: меньше строк до группировки
- Пример: WHERE status = 'paid' и HAVING SUM(total) > 10000
Если ответил, копните глубже
Как вы решаете, делать пайплайн батчевым или потоковым?
Что хотим услышать
- Требования к свежести: как быстро падает ценность данных
- Сложность стриминга: состояние, порядок, опоздания, гарантии
- Стоимость и эксплуатация 24/7
- Промежуточный вариант: микробатчи
- Возможность пересчёта истории
- Примеры задач для каждого подхода
Если ответил, копните глубже
Объясни, что такое контейнер и чем он отличается от виртуальной машины. Какие механизмы Linux лежат в основе?
Что хотим услышать
- Контейнер это процесс (или группа) на ядре хоста, а не отдельная ОС
- Namespaces изолируют видимость: PID, сеть, ФС, hostname, пользователи
- Cgroups ограничивают ресурсы: память, CPU, число процессов
- Файловая система из слоёв образа плюс записываемый слой (overlay2, copy-on-write)
- ВМ эмулирует железо и запускает своё ядро: изоляция сильнее, старт медленнее, накладные расходы больше
- Следствия: общее ядро, быстрый старт, данные в контейнере эфемерны
Если ответил, копните глубже
ps?Объясни разницу между жёсткой и символьной ссылкой. Когда какую использовать?
Что хотим услышать
- Жёсткая ссылка: ещё одно имя того же inode, равноправное с оригиналом
- Данные живут, пока счётчик ссылок больше нуля и файл никто не держит открытым
- Жёсткую нельзя на каталог и между разными ФС
- Символьная: отдельный файл, внутри которого путь к цели
- Символьная ломается при удалении или переносе цели, зато работает с каталогами и через ФС
- Пример: symlink на текущий релиз
current -> releases/42для атомарного переключения
Если ответил, копните глубже
ls -l во второй колонке?Объясните разницу между вертикальным и горизонтальным масштабированием и когда что выбирать.
Что хотим услышать
- Вертикальное: мощнее машина, код не меняется, есть предел и единая точка отказа
- Горизонтальное: больше узлов, нужен stateless или распределённое состояние
- Stateless-сервисы приложения масштабируют горизонтально в первую очередь
- БД часто сначала масштабируют вертикально и репликами, шардирование позже
- Горизонтальное даёт отказоустойчивость, но добавляет сложность
Если ответил, копните глубже
Назовите ваши сильные стороны.
Что хотим услышать
- Две-три стороны, а не список из десяти
- Каждая подкреплена примером
- Стороны связаны с вакансией
- Нет пустых слов вроде «стрессоустойчивый, коммуникабельный» без доказательств
- Уверенно, без хвастовства
Если ответил, копните глубже
Как вы управляете зависимостями и окружениями в Python-проекте?
Что хотим услышать
- Отдельное виртуальное окружение на проект
- Зависимости в
pyproject.toml, разделение на основные и dev - Lock-файл с точными версиями для воспроизводимости
- Инструмент: uv, Poetry или pip-tools
- Обновления зависимостей контролируемо, проверка уязвимостей
- В Docker ставить по lock-файлу
Если ответил, копните глубже
requirements.txt отличается от lock-файла?Расскажи, какие бывают JOIN и как каждый влияет на число строк в результате.
Что хотим услышать
- INNER: только пары, где условие ON истинно
- LEFT/RIGHT: все строки одной стороны, у недостающей стороны NULL
- FULL: все строки обеих сторон
- CROSS: декартово произведение, N × M строк
- Связь один ко многим размножает строки «одной» стороны, два таких JOIN перемножают
- Строки с NULL в ключе не соединяются: NULL = NULL не true
Если ответил, копните глубже
Объясните, как работают группы консьюмеров в Kafka и как масштабировать обработку топика.
Что хотим услышать
- Партиции делятся между консьюмерами группы, одна партиция одному консьюмеру
- Потолок параллелизма группы равен числу партиций
- Разные группы читают топик независимо
- Оффсеты коммитятся по группе и партиции
- Ребалансировка при входе и выходе консьюмеров
- Lag как метрика: если растёт, масштабировать или оптимизировать
Если ответил, копните глубже
Какие контроллеры для запуска подов есть в Kubernetes и когда какой использовать?
Что хотим услышать
- Deployment: stateless-сервисы, rolling update и откаты
- StatefulSet: стабильные имена, порядок запуска и собственный том на реплику (базы, брокеры)
- DaemonSet: по поду на узел (агенты логов и метрик, сетевые плагины)
- Job: задача до успешного завершения с повторами
- CronJob: Job по расписанию,
concurrencyPolicy - ReplicaSet напрямую не используют, им управляет Deployment
Если ответил, копните глубже
Расскажи, как в shell перенаправить вывод и ошибки, и приведи частые ловушки.
Что хотим услышать
- Три дескриптора: 0 stdin, 1 stdout, 2 stderr
>перезаписывает,>>дописывает,2>для ошибок,<для ввода> file 2>&1объединяет потоки, порядок важен: перенаправления слева направо- Пайп передаёт только stdout, для ошибок нужен
2>&1 | sudo cmd > /etc/xне работает: файл открывает shell без прав, используют| sudo tee/dev/nullдля выбрасывания ненужного вывода
Если ответил, копните глубже
&>?Middle: 12 вопросов
Практика: почему так, какие компромиссы, что ломается.
Чем asyncio отличается от многопоточности? Когда вы выберете одно, а когда другое?
Что хотим услышать
- asyncio: один поток, кооперативная многозадачность, переключение на await
- Потоки: вытесняющая многозадачность ОС, переключение где угодно
- Корутины дешёвые, тысячи соединений; поток дороже по памяти
- asyncio требует асинхронных библиотек, блокирующий вызов стопорит всё
- Потоки для синхронных библиотек и небольшого числа задач
- Ни то, ни другое не ускоряет CPU-bound код
Если ответил, копните глубже
Спроектируй схему базы для заказов интернет-магазина: клиенты, товары, заказы, оплаты. Какие таблицы, ключи и ограничения?
Что хотим услышать
- Таблицы customers, products, orders, order_items, payments и их связи
- order_items как связь заказа и товара с qty и ценой на момент покупки
- Ограничения: FK, NOT NULL, CHECK (qty > 0), UNIQUE там, где нужно
- Типы: numeric или копейки для денег, timestamptz для времени, статус через CHECK или enum
- Индексы на FK и под частые запросы (заказы клиента по дате)
- Платежи отдельной таблицей с идемпотентным внешним id от платёжки
Если ответил, копните глубже
Сравните способы забирать изменения из базы сервиса в хранилище: полная выгрузка, инкремент по updatedat, log-based CDC.
Что хотим услышать
- Полная: просто, видит удаления, тяжело на больших объёмах
- По updated_at: дёшево, но граница, долгие транзакции, нет удалений, нужна дисциплина
- Log-based CDC: все изменения и удаления, низкая нагрузка, секунды задержки
- Цена CDC: настройка базы, слот и его мониторинг, инфраструктура Kafka Connect
- Применение изменений в хранилище: последнее состояние по позиции журнала, идемпотентность
- Периодическая сверка как страховка
Если ответил, копните глубже
Тебя просят провести ревью безопасности контейнеризованного сервиса. На что посмотришь?
Что хотим услышать
- Образ: минимальная база, multi-stage, нет лишних утилит, свежие патчи, скан на CVE в CI
- Пользователь: не root, числовой UID,
runAsNonRootв Kubernetes - Права:
cap-drop ALL, без--privileged, безdocker.sock,no-new-privileges - ФС: read-only корень, запись только в tmpfs и тома
- Секреты: не в образе и не в ENV в git, а через секреты оркестратора или хранилище
- Ресурсы и сеть: лимиты памяти, CPU, PID; не публиковать лишние порты
Если ответил, копните глубже
Мониторинг сообщает: корневой раздел заполнен на 100%, сервис падает. Что делаешь по шагам?
Что хотим услышать
- Оценить:
df -hиdf -i, место или inode - Найти крупное:
du -xh / --max-depth=1 | sort -h, затем вглубь; обычно логи, кеши, дампы, docker - Проверить удалённые, но открытые файлы:
lsof +L1 - Быстро освободить безопасно: обнулить лог через
: > fileилиtruncate, а неrmоткрытого файла;journalctl --vacuum-size,docker system pruneс пониманием - Устранить причину: logrotate, лимиты журнала, алерт на 80%
- Если нужно место надолго: расширить диск или том LVM онлайн
Если ответил, копните глубже
rm лога может не помочь?Расскажите, по какому плану вы будете вести секцию system design на 60 минут.
Что хотим услышать
- Начинаю с уточнения функциональных требований и явно фиксирую, что не делаем
- Уточняю нефункциональные требования: масштаб, задержка, доступность, консистентность
- Делаю грубую оценку RPS и объёмов и использую её в решениях
- Описываю API и модель данных, выбираю хранилище под паттерн доступа
- Рисую высокоуровневую схему и прохожу по ней путь запроса
- Оставляю время на узкие места, отказы, масштабирование и мониторинг
Если ответил, копните глубже
Почему вы ищете новую работу?
Что хотим услышать
- Причина через цель, а не через бегство
- Ни слова негатива о текущем работодателе
- Показано, что на текущем месте был рост и результаты
- Связка с этой вакансией
- Коротко: до минуты
Если ответил, копните глубже
Расскажите, как устроен dict и почему поиск в нём быстрый. Что будет при плохой хеш-функции?
Что хотим услышать
- Хеш-таблица: ключ -> hash -> слот
- Коллизии решаются открытой адресацией, ключи сравниваются через ==
- Среднее O(1), худшее O(n), расширение при заполнении
- Ключ должен быть хешируемым, хеш стабилен, равные объекты имеют равный хеш
- Порядок вставки гарантирован с 3.7, компактное хранение
- Рандомизация хеша строк защищает от атак на коллизии
Если ответил, копните глубже
Индекс есть, а в плане Seq Scan. Назови возможные причины и как каждую проверить.
Что хотим услышать
- Низкая селективность: нужна большая доля строк, seq scan дешевле
- Функция или приведение типа над колонкой: нужен индекс по выражению или переписать условие
- Условие не по ведущей колонке составного индекса
- Устаревшая статистика: оценки rows не совпадают с фактом, помогает ANALYZE
- Маленькая таблица, LIKE с % в начале, OR по разным колонкам
- Проверка: EXPLAIN (ANALYZE, BUFFERS), сравнить оценки с фактом
Если ответил, копните глубже
Вам нужно хранить в ClickHouse события продукта (300 млн в день) для дашбордов по проектам и времени. Как спроектируете таблицу и загрузку?
Что хотим услышать
- Движок MergeTree (Replicated в кластере), ORDER BY по частым фильтрам: проект, затем время
- PARTITION BY по месяцу или дню для управления данными, не мельче
- Типы: LowCardinality для строк с малым числом значений, точные типы дат и чисел
- Загрузка пачками или из Kafka через Kafka engine и MV, async_insert
- Предагрегаты в AggregatingMergeTree через материализованные представления
- TTL для старых данных, дедупликация при необходимости
Если ответил, копните глубже
После деплоя новые поды api в CrashLoopBackOff, старые ещё работают. Опиши, как будешь разбираться.
Что хотим услышать
kubectl describe pod: Last State, Reason и Exit Code, события; это сразу сужает кругkubectl logs --previous: ошибка упавшего экземпляра- Код 1 и исключение: конфиг, переменные окружения, секреты, миграции, недоступная зависимость
- Код 137: OOMKilled или убит liveness; 127/126: неверная команда; 0: процесс завершается
- Сравнить с прошлой версией: что изменилось в образе, конфиге, манифесте
- Если логов нет:
kubectl debug --copy-toсsleepили запуск команды руками; при необходимости откатrollout undo
Если ответил, копните глубже
Расскажи, что происходит с момента включения сервера до появления приглашения входа.
Что хотим услышать
- UEFI/BIOS: POST, поиск загрузчика на ESP или в MBR, Secure Boot проверяет подпись
- GRUB: меню, загрузка ядра и initramfs, передача параметров (
root=, консоль) - Ядро: инициализация CPU, памяти, драйверов, распаковка initramfs
- initramfs: модули и утилиты, чтобы найти и смонтировать корень (LVM, RAID, LUKS), переход на настоящий корень
- systemd как PID 1: юниты по зависимостям до
default.target, монтирование fstab, сеть, сервисы - getty и sshd дают логин; диагностика через
systemd-analyzeиjournalctl -b
Если ответил, копните глубже
Senior: 12 вопросов
Глубина и опыт: границы подходов, решения в продакшене.
Ваш Python-сервис стал отвечать медленно. Как вы будете искать причину и что можете сделать?
Что хотим услышать
- Метрики и трейсы: какой эндпоинт, p95/p99, где время (БД, внешние API, CPU)
- Профилирование: py-spy на живом процессе, cProfile локально
- Типичные причины: N+1 запросы, отсутствие индексов, синхронные вызовы в async, неверные структуры данных
- Исправления: батчи и prefetch, кеш, индексы, перенос тяжёлого в фон
- CPU-bound: алгоритм, встроенные функции, numpy, процессы
- Проверка результата нагрузочным тестом
Если ответил, копните глубже
Расскажите, как в PostgreSQL устроен MVCC, откуда берутся мёртвые строки и зачем нужен VACUUM.
Что хотим услышать
UPDATEсоздаёт новую версию строки, старая остаётся сxmax;DELETEтолько помечает версию- Каждая транзакция видит версии по своему снимку, поэтому чтение не блокирует запись и наоборот
- VACUUM удаляет версии, которые уже никому не видны, обновляет visibility map и замораживает старые строки
- Долгие транзакции и забытые слоты репликации мешают очистке и раздувают таблицы
- Autovacuum настраивают по таблицам:
autovacuum_vacuum_scale_factor, лимиты стоимости; мониторинг черезpg_stat_user_tables - HOT-обновления и
fillfactorуменьшают нагрузку на индексы
Если ответил, копните глубже
VACUUM FULL отличается от обычного?Как вы организуете хранение таблицы событий (1 млрд строк в день) в озере данных, чтобы запросы были быстрыми и дешёвыми?
Что хотим услышать
- Колоночный формат Parquet со сжатием Zstd или Snappy
- Партиционирование по дате события, проверка размера партиций
- Сортировка или кластеризация внутри партиции по частым фильтрам
- Размер файлов сотни мегабайт, компакция мелких
- Табличный формат для транзакций и эволюции схемы
- Запросы фильтруют по колонке партиции и выбирают только нужные колонки
Если ответил, копните глубже
Под периодически перезапускается с OOMKilled. Как найдёшь причину и что предложишь?
Что хотим услышать
- Подтвердить:
describe(Reason OOMKilled, 137), не путать с Evicted - Посмотреть график памяти контейнера до падения: резкий пик или постоянный рост (утечка)
- Сравнить лимит с реальным пиком; проверить лимит кучи рантайма (JVM, Node, Go) относительно лимита контейнера
- Учесть всю память процесса: нативные буферы, потоки, page cache в cgroup
- Утечка: профилирование кучи, heap dump, сравнение снимков
- Решение: исправить утечку или ограничить кучу, выставить лимит по данным, requests = limits для памяти
Если ответил, копните глубже
Пользователи жалуются, что https://api.example.com не открывается. Как будешь искать причину?
Что хотим услышать
- Воспроизвести и уточнить симптом: таймаут, refused, ошибка TLS, 5xx
- DNS:
dig +short, правильный ли IP, не истёк ли домен - Сеть и порт снаружи:
curl -v,nc -zv host 443; refused или timeout - На сервере: слушает ли процесс и на каком адресе (
ss -tlnp), отвечает ли локально - Фаервол на хосте и в облаке, балансировщик и его health checks
- Логи прокси и приложения, сертификат и его срок
Если ответил, копните глубже
Спроектируйте мессенджер с личными и групповыми чатами, доставкой в реальном времени и историей.
Что хотим услышать
- Требования: личные и групповые чаты до 1 000 участников, доставка онлайн и офлайн (push), история, статусы «доставлено» и «прочитано»; порядок сообщений в чате; медиа и сквозное шифрование вне рамок
- Оценка нагрузки: 50 млн DAU по 40 сообщений ≈ 2 млрд в сутки ≈ 20 000 RPS записи, в пике ~60 000; 10 млн одновременных соединений, ~100 000 на gateway → ~100 gateway; 2 млрд × 200 байт ≈ 400 ГБ в сутки, ~150 ТБ в год без реплик
- API: WebSocket: send {chat_id, client_msg_id, text}, ack {msg_id}, события new_message, read; HTTP: GET /chats/{id}/messages?before=...
- Данные: чаты и участники в PostgreSQL, сообщения в Cassandra/ScyllaDB с ключом партиции chat_id и сортировкой по msg_id, реестр user_id → gateway в Redis с TTL
- Компоненты: gateway-серверы с соединениями, сервис сообщений (сохранить, присвоить id, разослать), сервис присутствия, push-сервис для офлайн, очередь для фан-аута в группах
- Узкие места: большие группы (фан-аут через очередь), дубли при переотправке (client_msg_id для идемпотентности), переподключения и догрузка пропущенного, горячие чаты, падение gateway
Если ответил, копните глубже
Вы претендуете на senior. Расскажите о себе.
Что хотим услышать
- Назван масштаб: команда, нагрузка, пользователи или деньги
- Есть решения, которые повлияли дальше своего кода
- Есть метрики результата
- Упомянуто влияние на команду: менторинг, процессы, ревью
- Уложился в 2 минуты, не утонул в деталях
Если ответил, копните глубже
Чем typing.Protocol отличается от abc.ABC? Когда что выбрать?
Что хотим услышать
- ABC: номинальная типизация, нужно наследование или register
- ABC проверяет абстрактные методы при создании экземпляра в рантайме
- Protocol: структурная типизация, достаточно совпадения методов
- Protocol удобен для сторонних классов и фейков в тестах
@runtime_checkableдля isinstance, проверяет только наличие методов
Если ответил, копните глубже
isinstance с runtime_checkable протоколом?На проде в логах появились ошибки deadlock detected. Как вы будете разбираться и что сделаете, чтобы они ушли?
Что хотим услышать
- Deadlock это цикл ожидания: транзакции держат блокировки и ждут друг друга
- PostgreSQL проверяет цикл после
deadlock_timeout(1 с по умолчанию) и откатывает одну из транзакций с ошибкой 40P01 - В логе есть оба запроса и тип блокировок; включаю
log_lock_waitsдля долгих ожиданий - Главное лечение: единый порядок взятия блокировок, короткие транзакции, блокировка заранее через
SELECT ... FOR UPDATEв порядке ключа - Приложение должно уметь повторять транзакцию при 40P01 и 40001
Если ответил, копните глубже
FOR UPDATE отличается от FOR NO KEY UPDATE?lock_timeout?Ночная Spark-задача стала работать 4 часа вместо 1. Как будете искать причину?
Что хотим услышать
- Spark UI: какая стадия долгая, распределение времени задач, объёмы shuffle и spill
- Перекос: максимум задач против медианы, горячие ключи
- План через explain: стратегии джойнов, проталкивание фильтров, лишние shuffle
- Рост данных и число партиций, мелкие файлы на входе
- Изменения кода: UDF, collect, лишние действия без кеша
- Ресурсы: память executors, GC, spill на диск
Если ответил, копните глубже
В компании 5 команд и общий кластер. Как организуешь доступ людей и приложений?
Что хотим услышать
- Namespace на команду или сервис, права через группы из SSO (OIDC), а не через персональные сертификаты
- Стандартные роли (
view,edit) через RoleBinding в своих namespace,cluster-adminтолько у платформенной команды - Для прода разработчикам чтение и логи, изменения через CI/GitOps
- Приложениям отдельные ServiceAccount с минимальными правами, без токена, если API не нужен
- Ограничения на поды: Pod Security Admission, политики Kyverno/Gatekeeper, квоты
- Аудит: audit log API server, регулярный пересмотр прав (
kubectl auth can-i --list)
Если ответил, копните глубже
pods/exec в проде?Как правильно останавливать процесс сервиса и что должно делать приложение, чтобы остановка была корректной?
Что хотим услышать
- Сначала SIGTERM, затем ожидание (таймаут), и только потом SIGKILL
- Приложение ловит SIGTERM: перестаёт принимать новые запросы, дожидается текущих, закрывает соединения с БД
- SIGKILL нельзя перехватить, поэтому после него остаются lock-файлы и незавершённые операции
- systemd делает так же:
KillSignal,TimeoutStopSec, затем SIGKILL - В контейнере процесс должен быть PID 1 или запускаться через init (tini), иначе сигнал не дойдёт
- Код выхода 143 после SIGTERM и 137 после SIGKILL помогают понять, как завершился процесс
Если ответил, копните глубже
Задача для live coding
Сгруппировать анаграммы
Напишите group_anagrams(words): верните список групп слов-анаграмм. Слова внутри группы в порядке появления, группы в порядке первого появления. Регистр учитывается.
- Подсказка, если застрял: Что одинаково у всех анаграмм? Отсортированные буквы.
- Подсказка, если застрял: Словарь «ключ -> список слов» и
setdefault.
Эталон, тесты и таймер открываются интервьюеру в живом моке
Рубрика оценки: 1-4 балла
Те же критерии процесса, что в живом моке Техпрогона. Ставьте балл по каждому пункту, сумма показывает картину лучше, чем «понравился или нет».
Уточнил условие
Ограничения, формат входа, что вернуть при пустом вводе
Привёл примеры до кода
Обычный случай и хотя бы один краевой
Проговорил алгоритм словами
До того как писать код
Назвал сложность
По времени и по памяти
Написал рабочий код
Тесты прошли
Сам проверил краевые случаи
Прогнал в голове пустой ввод, один элемент, дубликаты
Нашёл и исправил ошибку сам
Или ошибок не было с первого раза
Мок-собес без регистрации для интервьюера
Хотите проверить кандидата на задаче с эталоном и рубрикой? Так работает живой мок в Техпрогоне.
Кандидат готовится в Техпрогоне и на задаче открывает ступень «Живой мок».
Он присылает вам ссылку. Вы открываете её без регистрации.
У вас условие, эталон, рубрика, уточняющие вопросы и таймер.
Вы ставите оценки и вердикт, кандидат сразу видит результат.
Для интервьюера бесплатно. Ссылку создаёт кандидат на тарифе Рывок
Наборы для других ролей
Готовитесь к собесу сами? Подготовка к собеседованию: Data Engineer