Структура собеседования Junior DE
Типичное собеседование Junior DE — это 3-5 этапов, общим объёмом 4-8 часов:
- Скрининг рекрутера (30 мин) — общие вопросы, мотивация, английский.
- Технический скрининг (1 час) — SQL + Python live coding, могут быть basic concepts.
- Глубокое техническое (1-2 часа) — SQL deep, Python deep, иногда system design easy.
- System design (1 час) — если задано — спроектировать pipeline для X.
- Hiring manager (30-60 мин) — мотивация, культурное соответствие, вопросы про проекты.
- Иногда behavioral / values (30-60 мин) — про прошлый опыт, конфликты, обучение.
Не все компании имеют все этапы. В стартапах могут быть 2 этапа, в Big Tech — 5+.
Блок 1: SQL
Самый важный блок. Если завалишь SQL — оффер не получишь, даже с идеальным остальным.
Что спрашивают:
Базовое — обязательно
- JOIN типы (INNER/LEFT/RIGHT/FULL OUTER/CROSS), когда какой.
- GROUP BY + aggregation.
- WHERE vs HAVING.
- Subqueries: scalar, correlated, EXISTS.
Middle — почти всегда
- Window functions: ROW_NUMBER, RANK, DENSE_RANK, LAG, LEAD, SUM/AVG OVER.
- CTE (Common Table Expressions) — single и multi-level.
- Self-join.
- Set operations: UNION ALL vs UNION, INTERSECT, EXCEPT.
Advanced — встречаются
- Recursive CTE.
- Pivot / unpivot.
- DATE arithmetic, intervals.
- NULL handling (IS NULL, COALESCE, NULLIF).
- Performance: EXPLAIN, индексы, partition pruning.
Типичные задачи
Задача 1: Топ-N по группе.
Найди top-3 заказа по сумме для каждого customer.
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY amount DESC) AS rn
FROM orders
)
SELECT * FROM ranked WHERE rn <= 3;
Задача 2: Подсчёт сессий.
Группируй log-события в сессии: новая сессия, если разрыв более 30 минут.
WITH gaps AS (
SELECT user_id, event_time,
CASE WHEN event_time - LAG(event_time) OVER (PARTITION BY user_id ORDER BY event_time)
> INTERVAL '30 minutes' THEN 1 ELSE 0 END AS new_session
FROM events
),
sessions AS (
SELECT user_id, event_time,
SUM(new_session) OVER (PARTITION BY user_id ORDER BY event_time) AS session_id
FROM gaps
)
SELECT user_id, session_id, MIN(event_time) AS start, MAX(event_time) AS end
FROM sessions GROUP BY user_id, session_id;
Задача 3: Retention / cohort.
Сколько % пользователей зарегистрировавшихся в неделе X вернулись в неделе X+N.
Это сложнее — обычно на финальном раунде.
SQL window functions: задачи TOP-N, running totals, сессии — практика для интервью DEГде практиковаться
- StrataScratch — лучшая SQL-практика, реальные company-questions (Netflix, Airbnb).
- DataLemur — фокус на DE/DA вопросах.
- LeetCode SQL — базовая практика, free.
- HackerRank SQL — короткие задачки, хорошо для разминки.
Стратегия: 30 задач разной сложности (10 easy, 15 medium, 5 hard) за месяц. Каждый раз пиши без подсказок сначала.
Главное в SQL-интервью — думать вслух. Не пиши молча, объясняй каждый шаг: “сначала JOIN такой-то таблицы, потом фильтр, потом aggregation”. Это даёт собеседующему понять твою логику и помочь, если зашёл в тупик.
Блок 2: Python
Python live coding для DE-джуна — обычно средняя сложность. Не Leet-Code Hard.
Что спрашивают:
Базовое
- Списки, словари, sets — операции, временные сложности.
- List comprehension.
- Iterators, generators.
- File I/O — читать CSV/JSON.
- Exception handling — try/except.
DE-specific
- pandas: DataFrame operations, merge, groupby, фильтрация.
- API call: написать requests.get с retry и error handling.
- SQL via sqlalchemy или native connector — execute, fetch, transaction.
Типичные задачи
Задача 1: Парсинг JSON.
Дан список dict с записями о заказах. Посчитай total revenue по category.
from collections import defaultdict
orders = [
{"order_id": 1, "category": "books", "amount": 50},
{"order_id": 2, "category": "books", "amount": 30},
{"order_id": 3, "category": "tech", "amount": 200},
]
revenue = defaultdict(float)
for order in orders:
revenue[order["category"]] += order["amount"]
print(dict(revenue)) # {"books": 80, "tech": 200}
Задача 2: Дедупликация.
Из списка записей оставь только уникальные по
event_id, оставляя последнюю поtimestamp.
def dedup_keep_latest(records):
seen = {}
for r in records:
eid = r["event_id"]
if eid not in seen or r["timestamp"] > seen[eid]["timestamp"]:
seen[eid] = r
return list(seen.values())
Задача 3: API client с retry.
Напиши функцию
fetch_with_retry(url, max_attempts=3), которая retry-ит на 5xx ошибках с exponential backoff.
import time, requests
def fetch_with_retry(url, max_attempts=3):
for attempt in range(max_attempts):
try:
r = requests.get(url, timeout=10)
if r.status_code >= 500:
raise requests.HTTPError(f"5xx: {r.status_code}")
r.raise_for_status()
return r.json()
except (requests.ConnectionError, requests.Timeout, requests.HTTPError) as e:
if attempt == max_attempts - 1:
raise
time.sleep(2 ** attempt)
Anti-задачи
Если на джуниора кидают LeetCode Hard про segment trees / dynamic programming — это не junior DE, это, видимо, перепутали с algorithmic интервью. Уточни scope с рекрутером, переноси на нормальный DE-собес.
Блок 3: System Design Easy
Junior level system design в DE — это спроектировать простой pipeline для конкретной задачи.
Типичный вопрос:
Спроектируй pipeline для ежедневной загрузки данных о заказах из REST API партнёра в наш DWH. Что выберешь, как пойдёшь.
Что собеседующий хочет услышать
- Уточняющие вопросы. “Какой объём? Сколько заказов в день? Какой SLA? Есть ли late-arriving data? Какой DWH?” Без этого решение неполное.
- High-level дизайн. API -> ingester -> staging -> DWH -> transformations -> BI. Нарисовать на доске.
- Конкретные tools. “Airflow для оркестрации, Python для extraction, Snowflake для DWH, dbt для transformations.”
- Идемпотентность, retry. “Detereministic path по date, MERGE INTO, retry с exponential backoff.”
- Observability. “Метрики: freshness, volume, error rate. Алерты в Slack.”
- Backfill story. “Можно ли перезалить за прошлую дату? Через Airflow catchup.”
Чего НЕ делать
- Закидывать buzzwords (Kafka, Spark, Iceberg, Flink) без надобности. Если задача — “1M заказов в день, batch-load”, Kafka — over-engineering.
- Молчать. Думай вслух.
- Игнорировать requirements. Спрашивай.
Стратегия подготовки
Возьми 5 типичных задач:
- Pipeline ингестии REST API в DWH (daily batch).
- Streaming pipeline для clicks-events (real-time).
- CDC pipeline из OLTP в OLAP (Debezium / WAL).
- Web-analytics aggregation (page views, sessions).
- ML feature pipeline (features -> feature store).
Распиши на бумаге архитектуру каждой. Это и есть подготовка к system design.
System design — это диалог, не монолог. Собеседующий хочет видеть, как ты думаешь и принимаешь решения. Если просто выдашь “Airflow + Snowflake + dbt” без обоснования — это слабо. Объясняй trade-offs: почему Airflow, а не Dagster; почему Snowflake, а не BigQuery; почему dbt, а не SQL руками.
Блок 4: Behavioral / soft skills
Часто игнорируется, но может завалить даже сильного технически кандидата.
Типичные вопросы:
- “Расскажи о проекте, которым гордишься.” — Готовь STAR-ответ (Situation, Task, Action, Result).
- “Расскажи о ситуации, когда ты ошибся / что-то сломал.” — Покажи self-awareness, не сваливай вину.
- “Как разрешаешь конфликты в команде?” — Готовь реальный пример.
- “Почему DE? Почему наша компания?” — Не “потому что хорошие зарплаты”.
- “Какие у тебя слабости?” — Не “я перфекционист”. Реальная слабость + что делаешь, чтобы улучшить.
STAR-метод
Когда отвечаешь на “Расскажи о ситуации”:
- S — Situation: контекст.
- T — Task: что нужно было сделать.
- A — Action: что сделал ты конкретно.
- R — Result: что получилось, какие выводы.
Не “мы вместе решили проблему”, а “я сделал X, Y, Z” — собеседующий хочет видеть твою роль.
Чего НЕ делать
Антипаттерны на собеседовании:
- Зубрить Spark internals или RDD/DataFrame deep — это middle-уровень. Junior такое не спрашивают.
- Учить distributed systems глубоко — паксос, consensus, CAP — не junior DE.
- Игнорировать SQL в пользу “модных” тем. SQL — 50% собеса.
- Перегружать pet-project технологиями — Kafka + Spark + Iceberg в pet-проекте без надобности — фейк, сразу видно.
- Не готовить вопросы собеседующему — это сигнал слабого интереса.
- Опаздывать или забывать про время-зону для remote interview.
Полезные ресурсы
SQL
- StrataScratch, DataLemur — практика.
- “SQL Antipatterns” (Bill Karwin) — короткая книга.
- “SQL Performance Explained” (Markus Winand) — оптимизация.
Python
- “Fluent Python” (Luciano Ramalho) — основа.
- pandas documentation + 10-min tutorial.
System Design
- “Designing Data-Intensive Applications” (Martin Kleppmann) — bible (читать по главам, не от корки до корки для junior).
- “Fundamentals of Data Engineering” (Joe Reis & Matt Housley) — современный гайд по DE.
Online
- Этот курс + deep-dive courses на платформе.
- DataExpert.io (Zach Wilson) — DE focused tutorials.
- Seattle Data Guy — YouTube.
Чек-лист за неделю до собеса
- Pet-project работает локально, README актуален, последние коммиты — недавние.
- LinkedIn / резюме обновлены.
- STAR-истории для 3-5 behavioral вопросов написаны.
- 10 SQL-задач разной сложности решены без подсказок за час.
- 3-5 system design сценариев распланированы на бумаге.
- Список технологий компании прочитан — сама компания изучена.
- 3-5 вопросов к компании / команде подготовлены.
В день собеседования — не учи нового. Перечитай заметки, сделай 2-3 разминочных SQL-задачи, сделай зарядку. Свежая голова важнее ещё одной выученной темы.
Попробуй сам
- На StrataScratch (или DataLemur) сделай 10 задач уровня “easy” и 5 уровня “medium”. Записывай время на каждую. Цель — не идеально, а понять свой baseline.
- Возьми задачу из system design (например, “pipeline для tweets analytics”). Распиши архитектуру на бумаге, без кода. 30 минут.
- Напиши 3 STAR-истории: про успех, про ошибку, про конфликт. Каждая — на 1-2 минуты разговора.