VK — крупнейшая соцсеть РФ (60M+ MAU) и собес туда фокусируется на engagement metrics (DAU/MAU sticky, session length, feed CTR) и ML feed-ranking. Это самый «алгоритмический» собес среди РФ-компаний для аналитика. В этом гайде разберу 25+ реальных вопросов с 5 раундов собеса аналитика VK (Соцсеть / Музыка / Mail / Облако / Mini Apps) — с разбором сильного и слабого ответа.
Грейды аналитика в VK (2026)
| Грейд | Compensation/мес РФ | Опыт | Что спрашивают |
|---|---|---|---|
| Junior | 140-210K ₽ | 0-1 год | SQL базовый, pandas, базовые engagement-метрики |
| Middle | 210-330K ₽ | 1-3 года | ClickHouse advanced, A/B, feed-ranking basics |
| Senior | 330-500K ₽ | 3-6 лет | ML/RecSys, deep ranking, multi-product analytics |
| Lead | 500-680K+ ₽ | 6+ лет | Multi-team projects, ML strategy, system design |
5 раундов собеса VK
| Раунд | Что | Длительность |
|---|---|---|
| 1. HR-скрининг | Мотивация, social/ML опыт | 30 мин |
| 2. SQL live (ClickHouse) | 2-3 задачи + engagement metrics | 60 мин |
| 3. Python + ML | pandas + ranking + A/B | 60 мин |
| 4. Продуктовый кейс | Engagement / feed ranking / recommendations | 60 мин |
| 5. Финал с лидом | Behavioral + system thinking | 45 мин |
8 SQL-вопросов с собеса VK
DAU/MAU stickiness — query за 30 дней.
✅ Сильный ответ:
\\\sql
WITH daily_users AS (
SELECT toDate(event_ts) AS d, uniq(user_id) AS dau
FROM events
WHERE event_ts >= today() - 30
GROUP BY d
),
monthly_users AS (
SELECT toDate(event_ts) AS d, uniq(user_id) AS mau
FROM events
WHERE event_ts >= today() - 60
GROUP BY d
)
SELECT d.d, d.dau, m.mau, 100.0 * d.dau / m.mau AS stickiness_pct
FROM daily_users d
JOIN monthly_users m ON d.d = m.d
ORDER BY d.d;
\\\
Senior follow-up: «Stickiness > 50% = «утилитарная» соцсеть (юзер заходит каждый день — как WhatsApp). VK обычно 30-40% — entertainment + comm пополам.»
Session length percentiles.
✅ Сильный ответ:
\\\sql
WITH sessions AS (
SELECT user_id, session_id,
dateDiff('second', min(event_ts), max(event_ts)) AS session_sec
FROM events
WHERE event_ts >= today() - 7
GROUP BY user_id, session_id
)
SELECT
quantile(0.50)(session_sec) AS p50_sec,
quantile(0.75)(session_sec) AS p75_sec,
quantile(0.95)(session_sec) AS p95_sec,
count() AS total_sessions
FROM sessions
WHERE session_sec > 0;
\\\
Feed CTR by position.
✅ Сильный ответ:
\\\sql
SELECT
position,
countIf(event_type = 'click') * 1.0 / countIf(event_type = 'impression') AS ctr,
countIf(event_type = 'impression') AS impressions
FROM feed_events
WHERE event_date >= today() - 7
GROUP BY position
ORDER BY position
LIMIT 50;
\\\
Senior: «Position bias видна — top-position CTR ~15%, position-10 ~3%. Cliked != relevant — для proper ranking eval нужен IPS (Inverse Propensity Scoring).»
Engagement по типам контента.
✅ Сильный ответ:
\\\sql
SELECT
content_type,
uniq(user_id) AS unique_users,
countIf(event_type = 'view') AS views,
countIf(event_type = 'like') AS likes,
countIf(event_type = 'comment') AS comments,
countIf(event_type = 'share') AS shares,
countIf(event_type = 'like') * 1.0 / countIf(event_type = 'view') AS like_rate
FROM content_events
WHERE event_date >= today() - 30
GROUP BY content_type
ORDER BY views DESC;
\\\
Funnel: открытие → лайк → комментарий.
✅ Сильный ответ:
\\\sql
WITH user_actions AS (
SELECT user_id,
countIf(event_type = 'session_start') AS sessions,
countIf(event_type = 'view') AS views,
countIf(event_type = 'like') AS likes,
countIf(event_type = 'comment') AS comments
FROM events
WHERE event_date >= today() - 7
GROUP BY user_id
)
SELECT
countIf(sessions > 0) AS opened,
countIf(views > 0) AS viewed,
countIf(likes > 0) AS liked,
countIf(comments > 0) AS commented
FROM user_actions;
\\\
Viral coefficient (K-factor) calculation.
✅ Сильный ответ:
«K-factor = invites per user × conversion rate of invites
\\\sql
WITH user_invites AS (
SELECT
inviter_user_id AS user_id,
countIf(invite_status = 'sent') AS invites_sent,
countIf(invite_status = 'accepted') AS invites_accepted
FROM invites
WHERE invite_date >= today() - 30
GROUP BY inviter_user_id
)
SELECT
avg(invites_sent) AS avg_invites_per_user,
sum(invites_accepted) * 1.0 / sum(invites_sent) AS conversion_rate,
avg(invites_sent) * (sum(invites_accepted) * 1.0 / sum(invites_sent)) AS k_factor
FROM user_invites;
\\\
K > 1 = viral growth. K < 1 = need paid acquisition.»
Top-3 friend overlap (mutual friends).
✅ Сильный ответ:
\\\sql
SELECT
u1.user_id AS user_id,
u2.user_id AS friend_id,
count() AS mutual_friends
FROM friendships u1
JOIN friendships u2 ON u1.friend_id = u2.friend_id
WHERE u1.user_id != u2.user_id
GROUP BY u1.user_id, u2.user_id
HAVING mutual_friends >= 3
ORDER BY mutual_friends DESC
LIMIT 100;
\\\
Senior: «На VK scale 60M users × avg 200 friends = 12B friendship edges. Self-join не scale'ится. Production: distributed graph DB или MapReduce.»
Cohort analysis: registration month → MAU retention.
✅ Сильный ответ:
\\\sql
WITH cohorts AS (
SELECT user_id, toStartOfMonth(min(event_date)) AS cohort
FROM events
GROUP BY user_id
),
monthly_active AS (
SELECT user_id, toStartOfMonth(event_date) AS active_month
FROM events
GROUP BY user_id, active_month
)
SELECT
c.cohort,
ma.active_month,
dateDiff('month', c.cohort, ma.active_month) AS month_offset,
uniq(c.user_id) AS users
FROM cohorts c
JOIN monthly_active ma ON c.user_id = ma.user_id
GROUP BY c.cohort, ma.active_month
ORDER BY c.cohort, month_offset;
\\\
→ Когортный анализ retention в SQL
5 Python/ML-вопросов
Feed-ranking ML: основные подходы.
✅ Сильный ответ:
«Подходы к ranking в feed:
- Pointwise: score каждого item independently (logistic regression / GBDT). Простой но не учитывает relative ordering.
- Pairwise (LambdaRank, RankNet): optimizes loss на pairs (item A vs B). Учитывает relative ordering.
- Listwise (ListNet, LambdaMART): optimize full list metrics (NDCG@K).
- Deep ranking (DLRM, transformer-based): учитывает все user/item/context features end-to-end.
В VK обычно: GBDT (LightGBM) для quick iteration + deep model (PyTorch) для production. Cascade ranker — fast first stage (LightGBM) → slow re-ranker (deep) для top-100.»
Cold-start problem: new user, no history. Как ранжируешь feed?
✅ Сильный ответ:
«Multi-level cold-start strategy:
Level 1: Demographic priors
- Age, gender, region → typical content preferences
- Average новых юзеров same demographic
Level 2: Content-based
- Trending content (popular в последние 24h)
- Editorially curated (admin-promoted)
Level 3: Friend-based
- Если есть друзья → friends' liked content
Level 4: Exploration boost
- Random sample of diverse content для signal collection
- Active learning: maximize information gain
После 5-10 interactions ML model становится feasible. До этого — heuristic-based ranking.»
Reaction-based features в feed-ranking.
✅ Сильный ответ:
«Reaction features в VK feed-ranking:
- Direct: likes, comments, shares (positive signal)
- Negative: hide, report, mute author (negative signal)
- Temporal: time-decayed engagement (recent activity > old)
- Sequence: sequence of actions in session (like 3 in a row of same content type → boost type)
- Cross-modal: like on video → boost video weight
- Social: friend reactions (если друзья лайкают → boost)
Practice в VK: weighted sum of reactions через learned weights (через A/B-testing).»
Pandas: groupby с rolling window engagement.
✅ Сильный ответ:
\\\python
import pandas as pd
df = df.sort_values(['user_id', 'date'])
df['rolling_engagement_7d'] = (
df.groupby('user_id', group_keys=False)
.apply(lambda g: g['engagement_score'].rolling(7, min_periods=1).mean())
)
\\\
Senior follow-up: «На больших данных используй \.rolling()\ напрямую с groupby — chains лучше apply.»
Sequence modeling: predict next user action.
✅ Сильный ответ:
«Approaches:
- N-gram models — count P(action_t | action_{t-1, t-2, ...}). Простой, не scale на large vocab.
- RNN / LSTM — sequence input, predict next action distribution.
- Transformer-based (BERT4Rec, SASRec) — masked language model на user action sequence. State-of-art.
- Practical в VK: hybrid — short-term sequence (last 100 actions) через Transformer + long-term user embedding через collaborative filtering.
Use cases: predict next click in session, predict abandonment, recommend related content.»
5 продуктовых вопросов
Engagement metric выбираем для feed-ranking.
✅ Сильный ответ:
«Hierarchy:
Primary: weighted engagement score = a × likes + b × comments + c × shares + d × time_spent. Веса learned через A/B.
Secondary:
- Session duration
- Return visits next day (delayed engagement)
- Negative signals (mute / hide / report)
Guardrails:
- Diversity (не один content type доминирует)
- Friendship strengthening (друзья видят друг друга)
- Content creator NPS (creators продолжают postить)
WB-specific: \Total Watch Time\ для video, \Comments per like\ для discussion quality. Также — \Cross-product engagement\ (юзер использует Music + Feed + Mail).»
Cold-start problem с новым типом контента.
✅ Сильный ответ:
«Steps:
- Bootstrap dataset — synthetic users с known preferences для семинации
- Editorial seeding — экспертно подобранный контент в первые недели
- Boost in feed — гарантированный показ X% времени каждому юзеру
- Collect signals — explicit (likes) + implicit (dwell time)
- Train initial model — после 100K+ interactions
- Iterate — пересматривать каждые 2 недели
Risk: новый тип отжирает позиции у established types → trade-off с overall engagement. A/B обязательно.»
DAU upal на 8% за неделю. Что делаешь?
✅ Сильный ответ:
«Декомпозиция DAU:
DAU = MAU × stickiness = (returning users + new users) × (sessions / user)
1. Сегментация:
- New vs returning users
- Platform (iOS / Android / Web)
- Region (Москва / регионы)
- Demographic
2. Гипотезы:
- App update broke something (crashes / new bug)
- External event (competitor launch, big news)
- Seasonality (school break / holidays)
- Feed quality (algorithm change reduced engagement)
- Marketing (paid spend reduced)
3. Action:
- App crash rate?
- Push notification delivery rate?
- Feed CTR trends по дням?
- A/B-test analytics — какой experiment активен?»
NSM для VK — что предложишь?
✅ Сильный ответ:
«NSM для VK должна reflect:
- Engagement (юзер вовлечён)
- Connection (юзер взаимодействует с другими, не пассивный)
- Long-term value (retention)
Кандидаты:
- Active Sessions per User per Week — combines engagement + frequency
- Meaningful Interactions per Session (likes + comments + shares + DMs)
- Cross-product Engagement (юзер использует 2+ VK products)
❌ DAU — может надуваться bots, push notifications
❌ Revenue — secondary в social
Реальный NSM возможно «Meaningful Daily Interactions per User» — поведенческий health metric.»
Music Recommendations: что отличается от feed?
✅ Сильный ответ:
«Feed: heterogeneous content (text/video/photo), short consumption, broadcast mode (similar для всех).
Music: homogeneous (только audio), longer consumption (3-5 мин/track), personal mode (каждый юзер — личный playlist).
Differences in ML:
- Music: collaborative filtering doминирует (users with similar history)
- Feed: content-based + social signals доминируют
- Music: sequence matters (playlist flow)
- Feed: independence (каждый item evaluated separately)
VK Music специально:
- «Микс» для discovery
- Daily playlist (personalized)
- Friend's listening — social signal»
2 behavioral вопроса (раунд 5)
Конфликт с ML engineer о метрике успеха.
✅ Сильный ответ (STAR):
«Ситуация: ML engineer считал что NDCG@10 правильная метрика для feed-ranking. Я считал что primary должна быть session-level engagement.
Задача: найти common ground без эскалации к VP.
Действие:
- Listen first — спросил почему NDCG. Ответ: «academic standard, optimization есть».
- Show data — провёл A/B где NDCG +5% но session engagement -2%. Online != offline.
- Propose hybrid — primary = engagement, secondary = NDCG. Ranker train'ится на engagement, NDCG как guardrail.
- Compromise — он согласился с hybrid, я с использованием NDCG для offline validation.
Результат: Hybrid approach стал нашим standard. Через 6 месяцев — paper в KDD по этой методологии.»
Когда твой A/B провалился — что вынес.
✅ Сильный ответ:
«Кейс: новый ranker увеличивал CTR +8% (offline), но online A/B показал -3% session duration.
Learning:
- CTR != engagement. Click может быть на bait content который потом hidden.
- Long-term effects: session duration падает потому что users find content faster → меньше времени в фиде.
- Не оптимизируй на proxy metric — direct optimization на business outcome.
Action: разработал new offline metric — \Session Engagement Score\ = correlation с known good production rankers. Это стало standard в VK для feed-ranking offline eval.»
Red flags (не делай)
- Не упомянуть position bias / IPS на ranking вопросах
- Игнорировать negative signals (mute / hide / report)
- Описывать ML без production constraints (latency, memory)
- Не знать ClickHouse — для middle+ обязательно
- Слишком академический ML без VK-specific examples
Как готовиться к VK
Месяц 1: engagement metrics + ClickHouse
- DAU/MAU/sticky/session metrics
- 50+ SQL задач — SQL-тренажёр
Месяц 2: ML basics + ranking
- LightGBM, NDCG, position bias
- Прочитать «Learning to Rank» (Liu)
Месяц 3: кейсы + behavioral
- 30+ кейсов из /cases social fokus
- AI мок-собес
FAQ
VK vs Yandex — кто сложнее?
Технически Yandex сложнее (search relevance, deeper ML). VK больше про продукт (engagement metrics, social dynamics).
Можно ли пройти junior без ML опыта?
Да. Middle+ требует ML basics.
Какие команды самые конкурентные?
Feed-ranking, Music ML, VK ads targeting. Менее — VK Pay, VK Mini Apps.
Стек технологий?
ClickHouse + Spark + Airflow + Python + PyTorch.
Что дальше
- 521 SQL-задача
- 532 Python-задачи
- AI мок-собес
- 150+ вопросов общего собеса
- Вопросы Yandex аналитика
- Вопросы Wildberries аналитика
- Behavioral interview
Сравнить Free и Pro → (1999 ₽/мес)
Источники
- Levels.fyi РФ 2026 (VK grades, salary bands)
- Habr / vk.com/tech — engineering articles
- KDD / RecSys papers — feed-ranking research