Подготовка
На позицию инженера-разработчика в 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 года.
Команда сменилась, но дружелюбная атмосфера осталась, всем большое спасибо.
Желаю вам успеха на будущем собеседовании.
Читайте также:
- 3 ошибки на собеседованиях по программированию, из-за которых можно получить отказ
- Репозитории GitHub, которые помогут подготовиться к техническому собеседованию
- 13 чит-кодов к жизни программиста
Читайте нас в Telegram, VK и Дзен
Перевод статьи Rajat Goyal: My Interview Experience at Uber [L5A Offer — Sr. Software Engineer]