Подготовка

На позицию инженера-разработчика в Uber необходимо быть подготовленным в двух областях.

Структуры данных и алгоритмы

  • 75 «слепых» вопросов по Leetcode. Сначала разберитесь с базовыми концепциями популярных на собеседованиях структур данных, которым посвящено немало вопросов, а затем переходите к решению задач. Посмотрите, где у вас возникли затруднения и какие задачи оказалось сложно решить в заданный временной интервал.
  • Grind75 из руководства по технической части собеседования TechInterviewHandbook.

Проектирование систем и архитектура

  • Как пройти собеседование по проектированию систем. Узнайте, как проектировать системы в условиях масштабирования, изучите основные примеры вроде TinyURL, Facebook, Twitter, Uber и т. д.
  • Для подготовки на позицию старшего инженера-разработчика пригодятся YouTube-каналы codeKarle, ByteByteGo, TechDummiesNarendraL и вот это.

Собеседования

Мое собеседование на должность L5A состояло из пяти раундов, на должность L4 процесс аналогичен. Весь процесс стоит сразу уточнить у координатора по подбору персонала.

Раунд 1: написание кода бит/с (1 час)

Это был отборочный тур, где мне был задан вопрос по написанию кода Leetcode среднего уровня сложности. Акцент делается на базовых знаниях DSA и написании хороших классов, модульной структуре, хороших соглашениях по именованию переменных и классов и т. д.

Если пройдете этот раунд, будет еще четыре, независимо от результатов последующих раундов.

Раунд 2: алгоритмы и структуры данных (1 час)

Это основной раунд по программной инженерии, где акцент делается на алгоритмах и структурах данных. Первые пять минут отводятся на представление экспертов и кандидата, последние пять  —  на любые вопросы. У вас будет 50 минут на обсуждение задач, связанных с написанием кода.

Всего мне было задано три вопроса. На первый  —  по динамическому программированию Leetcode среднего уровня сложности  —  удалось найти рабочее решение в течение 15 минут, второй был решен за следующие 15 минут. К этому времени оставалось еще 15 минут, и эксперт задал третий вопрос, в котором реализовывать рабочее решение не требовалось. Поэтому я устно объяснил свой подход и перешел к разделу, где задавал вопросы о команде.

Раунд 3: вглубь специализации (1 час)

Это второй раунд, посвященный написанию кода, но основной акцент здесь делается не на алгоритмах и структурах данных, а на том, насколько хорошо вы пишете готовый к промышленной эксплуатации код.

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

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

Раунд 4: дизайн и архитектура, новая задача (1 час)

Проектирование систем  —  важный раунд для получения должности L5, где проверяются способности потенциального старшего инженера-программиста. В этот раунд обычно включается постановка задачи Greenfield, где сначала нужно уточнить требования, оценить необходимые ресурсы, разработать для системы высокоуровневый дизайн, а затем углубиться в низкоуровневый дизайн, включая проектирование API и базы данных. Когда все это готово, следует устранить узкие места и возможные точки сбоя, а также предложить решения по масштабированию системы, чтобы она справлялась с высокой нагрузкой.

Раунд 5: совместная работа и руководство, дизайн и архитектура, ранее решенная задача (1 час 15 мин)

Этот раунд  —  сочетание поведенческих вопросов и обсуждения спроектированных ранее систем, проводится менеджером.

На собеседовании первые 45 минут обсуждались мои предыдущие проекты, принятые мною решения по проектированию, полученные результаты, что можно было бы доработать и как бы я подошел к той же постановке задачи сейчас.

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

По результатам этих раундов со мной связался координатор по подбору персонала и сообщил детали предложения о приеме на работу.

Это мое возвращение в Uber, я уже работал там с июля 2021 по ноябрь 2022 года.

Команда сменилась, но дружелюбная атмосфера осталась, всем большое спасибо.

Желаю вам успеха на будущем собеседовании.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Rajat Goyal: My Interview Experience at Uber [L5A Offer — Sr. Software Engineer]

Предыдущая статьяСоздание модели Mixture of Experts (MoE) с помощью MergeKit
Следующая статьяПравила PRISM на языке Python