Собеседование на позицию Data Engineer в Х5: чего ждать и как лучше подготовиться

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

О направлении Data Engineering в X5

В X5 Group активно развивают цифровые продукты, построенные на основе больших данных, использующие сложную аналитику и машинное обучение, такие как прогнозирование спроса, управление ассортиментной матрицей магазинов, предсказание отсутствия товаров на полках, динамическое ценообразования и т.п.

Для разработки продуктов формируются автономные, кросс-функциональные команды, которые имеют минимум внешних зависимостей и могут двигаться вперед с максимальной скоростью. Одной из ключевых ролей в таких командах является роль Data Engineer, который помогает решать следующие задачи:

  • Разрабатывать быстрые и отказоустойчивые пайплайны обработки данных, выдерживающие жесткий SLA

  • Определять оптимальный способ хранения и обновления данных для конкретной задачи, начиная с выбора СУБД и заканчивая разработкой схемы данных, удовлетворяющей модели запросов конкретного приложения.

  • Разрабатывать интеграции с различными приложениями и сервисами через очереди сообщений и API

  • Подготавливать и развертывать необходимую инфраструктуру, системы мониторинга и логирования для задач по обработке данных

Используем мы следующий технологический стек:

  • DataLake на основе кластера Hadoop с 300+ нодами и 9Pb данных

  • EDW на GreenPlum с 20+ нодами и 180Tb данных

  • Кластер K8S для деплоя приложений и сервисов

  • Apache Spark для большинства расчетов и Apache Airflow для запуска пайплайнов по расписанию

  • PostgreSQL для типовых задач, Clickhouse - когда нужна аналитика на кончиках пальцев и Hive для различных ad-hoc запросов

  • Python, как основной рабочий язык программирования

Структура собеседования

Обычно собеседование состоит из двух этапов. На первом этапе оценивается технический уровень кандидата, обсуждаются его пожелания и устремления в части проектов, задач и т.п. По результатам первой встречи для кандидата определяется один или несколько проектов, которые лучше всего подходят к его техническому уровню и пожеланиям. После чего организуются встречи уже непосредственно с командами соответствующих проектов. Если на первом этапе основной акцент делается не техническое интервью, то на втором этапе чаще смотрим на софт-скилы и совместимость конкретной команды и кандидата, подробно обсуждаем задачи и планы конкретного проекта. В некоторых случаях на втором этапе также обсуждаются технические вопросы, если у проекта есть важная специфика или если результаты первого этапа были не очень убедительны.

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

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

В ходе интервью мы стараемся оценить кандидата по следующим направлениям:

  • Программирование на Python

  • Распределенные системы и вычисления на Hadoop / Spark

  • SQL и реляционные базы данных

  • Прочее интересное: Docker, K8S, Airflow, NoSQL, Kafka, e.t.c.

Далее подробно остановимся на первом пункте этого списка, и поговорим про программирование на Python, а остальные пункты будут раскрыты в последующих статьях.

Программирование на Python

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

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

Для проверки этого навыка мы обычно просим кандидата решить простую, на наш взгляд задачу, где требуется написания лишь нескольких строк код. В качестве примера можно привести задачу реализации класса для эффективного вычисления скалярного произведения разреженных векторов

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

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

Для проверки этого навыка мы обычно просим кандидата решить простую, на наш взгляд задачу, где требуется написания лишь нескольких строк код. В качестве примера можно привести задачу реализации класса для эффективного вычисления скалярного произведения разреженных векторов

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

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

Для проверки этого навыка мы обычно просим кандидата решить простую, на наш взгляд задачу, где требуется написания лишь нескольких строк код. В качестве примера можно привести задачу реализации класса для эффективного вычисления скалярного произведения разреженных векторов.

class SparseVector:
    def __init__(self, nums: List[int]):
        self.nums = nums

    def dotProduct(self, vec: 'SparseVector') -> int:
        return sum([x*y for x, y in zip(self.nums, vec.nums)])

При этом кандидат также способен, предложить и реализовать более эффективное решение, учитывающее особенности обращения с разреженными векторами, например с использование словаря для хранения ненулевых элементов и их индексов

class SparseVector:
    def __init__(self, nums: List[int]):
        self.nums = {i: n for i, n in enumerate(nums) if n != 0}

    def dotProduct(self, vec: 'SparseVector') -> int:
        result = 0
        for i, n in self.nums.items():
            result += n * vec.nums.get(i, 0)
        return result

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

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

  • поговорить про стандартные типы данных в Python и как они реализованы

  • обсудить ваш опыт асинхронного программирования и провести ревью небольшого фрагмента кода

  • решить чуть более сложную задачу, например сделать собственную реализацию функции zip

  • и т.п.

Здесь уже речь идет не о том, что необходимо глубоко разбираться во всех этих темах, а том, чтобы заработать дополнительные очки в ходе интервью, если ваш опыт программирования на Python распространяется дальше владения базовыми возможностями языка.

Совет: если у вас есть опыт backend-разработки на Python (асинхронное программирование, микросервисы, работа с высоконагруженными приложениями и т.п.) то обязательно расскажите про это. Мы считаем подобный опыт весьма ценным.

Продолжение следует.

Источник: https://habr.com/ru/company/X5RetailGroup/blog/572596/


Интересные статьи

Интересные статьи

Часто при разговорах с клиентами мы спрашиваем, как они ведут учет различных данных и используют ли они CRM-систему? Популярный ответ — мы работаем с Excel-файлами, а пот...
Ошибки наблюдения и различия в подгруппах могут легко привести к статистическим парадоксам в любом прикладном решении data science. Игнорирование этих элементов может полностью дискредити...
На волне последних обсуждений темы собеседований, хочу задать аудитории Хабра вопрос: вы помните, как писали в резюме: "коммуникабельный, инициативный, быстро обучаюсь"?&...
Все «за» и «против» 1С-Битрикс, какие есть альтернативы и что выгоднее знать разработчику? Читать далее
Хочу рассказать об одной утилите для поиска, которая очень сильно упрощает жизнь. Когда я попадаю на сервер и мне надо что-то поискать я первым делом проверяю установлен ли ack. Эта у...