Загрузка…
Загрузка…
analyst / middle / tech_screening
Формат
online
Стадия
tech_screening
Когда
within_month
Длительность
60 мин
01
Поведенческий
Какие у вас зарплатные ожидания? Сколько вы хотите денег?
HR-скрининг (первый этап), общий разговор. Автор рекомендует не называть сумму, а узнавать вилку.
02
Код
Есть таблица о продажах машин за 2023 год в ClickHouse (бренд, цвет, цена, дата). Получить на выходе номер квартала, бренд и общую стоимость продаж.
Технический этап ВБ, файл 1. Решение: приведение даты к началу квартала (toStartOfQuarter), GROUP BY бренд, SUM(цена).
03
Код
Как оставить только те кварталы и бренды, где общая стоимость продаж больше 10 млн?
Follow-up к задаче про продажи машин. Ожидаемый ответ: HAVING.
04
Код
Заметки
Видео-разбор технического собеседования (2-й этап из 3) на позицию веб-аналитика в Валберис (ВБ/Wildberries): интервьюер Александр из отдела сервисной аналитики, направление e-com (конверсии, воронки, трафик). Формат: за час устно (без написания кода и шаринга экрана) разобрали два файла заданий — SQL/ClickHouse-задачи, вопросы по веб- и продуктовой аналитике; тексты заданий автор выложил в телеграме. 1-й этап — HR-скрининг (общий разговор), 3-й — общий собес с руководителем (нетехнический). Кандидата позвали на третий этап, но он вышел в другую (неназванную) компанию. Параллельно собеседовался также в Сбер (показалось, было предубеждение). По наблюдениям автора: средняя вилка опытного аналитика ~300 тыс. руб./мес; в ВБ преимущественно удалёнка, есть офисы с бесплатным питанием.
Подготовка
Готовиться к специфике ClickHouse: работа с массивами (ARRAY JOIN, has(), indexOf, arrayElement, индексация с 1), оконные функции (SUM OVER PARTITION, ROW_NUMBER), функции дат (toStartOfQuarter/toStartOfMonth), HAVING, self join для иерархий, выбор направления и типа JOIN в воронках. Думать об оптимизации запросов на больших объёмах (миллиарды событий в день; ARRAY JOIN неэффективен). Знать продуктовую аналитику (A/B-тесты, CTR/конверсии), различие фронт/бэк событий, cookies/localStorage/sessionStorage, GTM, междоменное отслеживание, структуру e-commerce событий. По словам интервьюера, редкая и ценная комбинация на рынке: веб-аналитика (Яндекс.Метрика/AppMetrica/GA) + ClickHouse + продуктовая аналитика + e-commerce.
Стиль интервьюера
Доброжелательный и знающий интервьюер: не требовал писать код — просил рассуждать вслух, наводил на мысль уточняющими вопросами, разбирал альтернативные решения и объяснял, какое оптимальнее и почему (с примерами из практики WB — нагрузка, очереди запросов, агрегаты через Airflow). Охотно отвечал на встречные вопросы кандидата. По оценке кандидата: вопросы не очень сложные, но дают возможность показать уровень знаний.
Есть таблица о покупках одежды: один заказ — одна строка, товары/бренды/цены лежат в массивах (Array). Посчитать сумму продаж товаров бренда Zara.
Два решения: 1) комбинация array-функций (поиск индекса элемента, извлечение цен по индексу) — оптимальнее; 2) развернуть массивы в плоскую таблицу через ARRAY JOIN — проще, но неэффективно на больших объёмах (миллиарды событий в день).
05
Код
Есть таблица с финансовыми данными за период (дата, метод платежа, оборот). Вычислить долю в процентах каждого платёжного метода за день.
Кандидат предложил вариант через две агрегации и склейку (CTE) — рабочий, но громоздкий. Оптимальное решение — через оконную функцию.
06
Теория
Пользовался ли ты оконными функциями? Как решить задачу про долю платёжного метода через оконную функцию?
Follow-up: добавить столбец SUM(оборот) OVER (PARTITION BY дата) и поделить.
07
Код
Есть таблица работников и их менеджеров (id, manager_id; у босса единичка / ссылка на себя). Найти всех сотрудников, которые отчитываются боссу напрямую или через других менеджеров (максимум два промежуточных менеджера).
Задачка «со звёздочкой». Решение — заджойнить таблицу саму на себя несколько раз, чтобы пройти промежуточные звенья. Интервьюер наводил на мысль вопросами («какой функцией/конструкцией это сделать?»). Оптимизацию просили не учитывать.
08
Теория
Из событий: заказ товара, добавление в отложенные, поисковый запрос с голосовым поиском, выкуп из пункта выдачи, оформление заказа «купить сейчас» — какое событие не относится к фронтовой части сайта?
Правильный ответ: выкуп товара из пункта выдачи — это изменение статуса заказа на бэкенде.
09
Теория
Чем события с фронта отличаются от событий с бэкенда?
Follow-up к вопросу про фронтовые события: фронт — взаимодействие пользователя с интерфейсом, бэк — серверные изменения (например, статус заказа).
10
Кейс
Продуктовый кейс: продакт предлагает заменить фото на видео в снипетах товаров и проводит A/B-тест (две группы по 5 млн пользователей). Есть табличка с результатами (добавления в корзину, заказы). Хватает ли этих данных для решения об успешности фичи? Какой метрики не хватает?
Ожидаемый ответ: не хватает кликабельности снипета — конверсии из просмотра снипета в открытие карточки товара. Интервьюер наводящими вопросами подводил к этой метрике.
11
Код
Есть две таблицы по баннерам на главной странице мобильного приложения: показы/клики баннеров и добавления в корзину/покупки (ID баннера в табличках отличается префиксом). Посчитать по каждому баннеру показы, клики и CR.
Файл 2. Нюанс: нужно заметить в условии, что ID отличаются префиксом, и привести их к общему ключу перед джойном.
12
Код
Какую таблицу к какой джойнить и какой JOIN при этом использовать?
Follow-up к задаче про баннеры.
13
Код
Не потеряешь ли ты данные при таком джойне? Например, если баннер запустили 5 минут назад и по нему ещё никто не добавил товары в корзину?
Follow-up: джойнить надо к таблице с верхом воронки (показы баннеров), иначе потеряются баннеры без конверсий.
14
Код
Есть таблица с количеством поисковых запросов по дням. Оставить только топ-2 поисковых запроса за каждый день.
Решение: ROW_NUMBER() OVER (PARTITION BY день ORDER BY количество) и фильтрация по 1 и 2.
15
Код
Дан SQL-запрос к таблице сырых логов (сумма добавленных в корзину товаров для бренда «Детский мир» по месяцам). Найти ошибки в запросе.
Ошибки: строковое значение события ('to_cart') без кавычек; обращение к бренду в массиве без индекса элемента; некорректный HAVING (несуществующая конструкция в таком виде / отсутствие группировки); нюанс с toMonth vs toStartOfMonth; индексация массивов в ClickHouse начинается с 1.
16
Код
Есть таблица событий с массивом кастомных параметров. Получить таблицу, где останутся только события, у которых присутствует кастомный параметр address.
Кандидат предложил indexOf != 0; оптимальное решение — функция has() в блоке WHERE: where has(custom_params, 'address') = 1.
17
Теория
Какая функция в ClickHouse возвращает 1 или 0 в зависимости от того, есть ли конкретный элемент в массиве?
Follow-up: функция has().
18
Теория
Чем отличаются cookies, локальное и сессионное хранилище в браузере? Как посмотреть/найти куки?
Кандидат рассказал про куки и просмотр через инструменты разработчика, sessionStorage не знал.
19
Теория
Работал ли ты с GTM (Google Tag Manager)? Что в нём делал?
Вопрос про опыт, перешёл в обсуждение междоменного отслеживания.
20
Теория
Настраивал ли ты когда-нибудь междоменное отслеживание в Google Analytics? Как оно работает?
Обсудили, что междоменное отслеживание работает за счёт сохранения одного и того же айдишника пользователя между доменами; сравнение GA и Яндекс.Метрики.
21
Теория
В чём принципиальное отличие e-commerce событий от обычных событий в системах аналитики?
Ожидаемый ответ: у всех e-commerce событий единая структура — одни и те же поля (ID товара, название, бренд, цена, количество и т.д.), поэтому e-commerce отчёты лежат отдельно; обычные события имеют только название и кастомные параметры.
22
Поведенческий
Ты настраивал e-commerce события в стоматологическом e-commerce? В Яндекс.Метрике или Google Analytics? Как ты участвовал в этом процессе — готовил ТЗ программистам или настраивал через GTM?
Уточняющие вопросы по опыту из резюме кандидата.
23
Теория
Какие данные передаются вместе с e-commerce событиями (просмотр снипета, просмотр карточки, добавление в корзину, покупка)?
Follow-up: ID товара, цена, количество, бренд, категория и т.д.
24
Поведенческий
Ты сейчас отрабатываешь на текущем месте? Когда сможешь выйти?
Вопрос из другого собеседования (компания, в которую кандидат в итоге вышел), упомянут в нарративе.