Представляю вашему вниманию перевод своей статьи Amazon software engineer interview, изначально опубликованной на английском на sobit.me.
Не так давно со мной связался технический рекрутер из Amazon. Компания организовывала трехдневное онсайт собеседование по найму программистов в их берлинский офис.
Весь процесс, начиная с того, как со мной связались, и заканчивая подписью контракта, занял около двух месяцев. Я хотел бы поделиться опытом, как все прошло, и что, на мой взгляд, помогло мне получить работу.
Если я не упомянул чего-то важного в статье, спрашивайте в комментариях. Постараюсь ответить максимально подробно.
27 апреля: Вышли на контакт
Рекрутер связалась со мной через LinkedIn. Она писала, что им нужны программисты в берлинский офис, и просила отправить ей обновленное резюме, если мне это интересно. С моей привычкой постоянно держать свое резюме обновленным я отправил его уже на следующий день.
В ответ я получил немного информации про саму должность и про то, как будет проходить собеседование. В тот же день я получил ссылку на техническое задание на Hackerrank. Первый шаг заключался в его решении.
На задание давалось два часа, и рекрутер попросила закончить его до 5 мая. Я решил не спешить и подождать до выходных.
1 мая: Прескрининг
На Hackerrank есть платформа для проведения компаниями технических собеседований под названием Hackerrank for Work. Именно на нее я попал, пройдя по ссылке из письма. Платформа предлагает встроенный счетчик времени, веб-редактор с базовыми возможностями автодополнения для Java, непосредственно постановку задачи и возможность протестировать ее решение с различными наборами входных данных, включая собственные.
Ни рекрутер, ни платформа не сообщили мне о доступных на собеседовании языках программирования до того, как я перешел к решению задач. Все, из чего я мог выбрать, это C, C++, Java и пара других. Это пошло вразрез моим планам использовать Go или PHP, и в итоге я выбрал Java.
Собеседование состояло из трех задач. Технически их было возможно решать в любом порядке.
Задачи
Первая задача была об объектно-ориентированном программировании. Было дано несколько классов с их методами, и требовалось предоставить эффективное решение, поддерживая при этом легко читаемый и чистый код.
Второй задачей были алгоритмы. Совет, который помог лично мне: начните с решения задачи вручную и визуализируйте свое решение — это поможет взглянуть на задачу под более широким углом и понять, какие именно структуры данных и алгоритмы к ней подходят. Я решил задачу на бумаге. Решение оказалось достаточно простым, и я всего лишь перенес его в код.
Не обошлось и без ошибок: вместо того, чтобы сконцентрироваться на последней задаче, я продолжал оптимизировать и без того рабочее решение и рефакторить код, чтобы выглядел красивее. Неправильно расставленные приоритеты. Урок усвоен.
В последней задаче требовалось провести анализ сложности решения предыдущей задачи, а также объяснить свой выбор. Из-за недостатка времени мне пришлось ограничиться только анализом.
4 мая: Собеседование по телефону
На следующий день рекрутер поздравляла меня в письме по электронной почте о прохождении первого этапа. Перед тем, как пригласить меня на онсайт собеседование в берлинский офис, она хотела созвониться и поговорить о моих технических навыках. Мы договорились на 4 мая.
Подготовка
У меня было всего два дня на подготовку. Я пробежался по основным алгоритмам и структурам данных из следующего списка:
- Сортировка: bubble sort, quicksort, merge sort
- Поиск: linear search, binary search
- Структуры данных: linked list, hash table, array, tree, binary search tree, stack, queue
Помимо общих знаний, вам также надо уметь обосновывать сложность алгоритмов и стандартных операций над структурами данных. Мне в этом сильно помогла Wikipedia.
Телефонный звонок
Девушка на другом конце провода оказалось очень дружелюбной: мы начали разговор с отвлеченных тем, типа погоды и жизни в наших городах. После этого мы перешли непосредственно к обсуждению моих технических навыков. Она затронула почти все из списка выше, а также задала несколько вопросов про динамическое программирование и рекурсию. Пару раз я споткнулся на точных определениях некоторых терминов, так как привык называть их по-своему. Обычно рекрутеры не могут сильно углубляться в технические темы, но ей было интересно, как именно я их называл и почему.
Под конец она перешла на поведенческие вопросы. Я не готовился к ним заранее, и мне приходилось с ходу перебирать в голове подходящие истории к каждому вопросу.
Закончили разговор ее позитивностью о моей кандидатуре и уверенностью, что я проведу такое же хорошее впечатление на онсайт собеседовании ее коллегам. Сразу после этого я заказал книгу для подготовки к техническому собеседованию (указана в разделе Ссылки). И заказал ее, кстати, через Amazon.
2 июня: Онсайт собеседование
Через какое-то время мне пришло два письма от рекрутера: в одном мне предоставили материалы для подготовки к собеседованию, а во втором — форму с вопросами для заполнения. Вопросы были, в основном, о моем текущем положении, как Amazon может (и нужно ли) помочь мне с переездом, о моих текущих условиях работы с точки зрения заработной платы и бонусов, и какой день и время мне подходят для собеседования.
После отправки заполненной формы на четвертый день я получил подтверждение о собеседовании от нового рекрутеры из офиса в Берлине. Еще через неделю она отправила мне подробное расписание с именами и должностями тех, с кем мне предстояло говорить. Было полезно найти их профили на LinkedIn, чтобы заочно познакомиться по-ближе.
Подготовка
У меня было немногим меньше месяца для подготовки. Я понимал, что не смогу освоить купленную книгу полностью, поэтому решил уделить время трем задачам из каждой главы. Весь ход мыслей и итерации решения я описывал на бумаге и сравнивал их с решениями в конце книги. Черной ручкой я решал задачи, а красной — исправлял ошибки. Целью было видеть меньше красного с каждой последующей задачей.
Интересный ресурс для практики, который я открыл для себя, — LeetCode. Так получилось, что мой друг также решил заняться этим, и мы посвятили два часа каждого четверга после работы совместному решению задач.
За две недели до собеседования я начал готовить ответы на поведенческие вопросы. Многие кандидаты недооценивают важность подобных вопросов и готовятся только к технической части. Так нельзя! Интервьюверам важно узнать вас как личность и понять, хотят ли они работать с вами в одной команде. Мне было удобно писать ответы в виде историй в стиле STAR. Я покрыл следующие ситуации: ошибки и провалы, конфликты, примеры лидерства. Как совет, постарайтесь говорить в своих историях больше о себе, а не о команде, с которой вы работали. Таким образом интервьюеру будет легче оценить ваш личный вклад.
Вам нужно четко знать, почему вы хотите работать в Amazon. Если вы не можете честно ответить на этот вопрос, то подумайте, подходит ли вам это место. Обмануть интервьюеров не удастся, и это будет потерей времени для всех. В конце концов, зачем пытаться тратить драгоценные годы своей жизни на что-то, что вас не интересует?
Вы должны уметь говорить о себе. В идеале вы должны быть готовы рассказать о своем образовании, стремлениях, ключевых моментах в вашей карьере, а также о сильных и слабых сторонах характера. Не менее полезным было бы подготовить список вопросов о компании и о команде, с которой предстоит работать.
День собеседования
Кандидатов попросили взять с собой паспорта и подойти на 10 минут раньше назначенного времени, чтобы зарегистрироваться и подписать соглашение о неразглашении. Затем один из работников проводил меня в комнату, где и должны были проходить мои собеседования.
Всего было четыре собеседования по 50 минут с 10-минутными перерывами между ними и дополнительными 15 минутами перед последним. Каждое собеседование состояло из 40 минут для решения задач и 10 минут для поведенческих вопросов.
На первом собеседовании меня попросили спроектировать объектно-ориентированную систему. Надо было построить интерфейс, который бы использовался другими разработчиками для создания библиотек на ее основе. Все было просто вначале, но по ходу дела интервьер усложнял задачу новыми требованиями. Закончилось собеседование обсуждением ситуации, где я не справился с задачей в поставленный срок.
Самое важное на данном этапе: не приступайте к решению задач до тех пор, пока не будет полного понимания, что от вас ожидается. Ведите себя на этих собеседованиях как на мозговых штурмах: общайтесь с интервьюером, задавайте вопросы, обсуждайте решения, и когда всем будет ясно, что надо делать, берите в руки маркер и делайте.
Не менее важный совет: если вы где-то застряли, не стесняйтесь и просите о помощи. Самое худшее, что может кандидат сделать в такой ситуации, — это молча смотреть на доску без понятия, что делать дальше.
На втором собеседовании была техническая задача в рамках продукта. Надо было найти правильный подход к решению, определить подходящие структуры данных и алгоритмы и расписать решение на доске. В последние 10 минут мы говорили о том, как я повел себя в конфликтной ситуации с коллегой.
На третьем собеседовании я проектировал системы для различных пользовательских сценариев. Рисовал компоненты на доске, объясняя при этом, какой из них за что отвечает, и как происходит общение между ними. В конце меня попросили рассказать о ситуации, где я решил работать над чем-то без согласия своего руководителя.
Последняя задача была целиком об алгоритмах. Простейшее решение было очевидным, так что я начал с вопроса, стоит ли мне тратить время на него или сфокусироваться на более оптимальном. Он попросил все же начать с простейшего, после которого, конечно же, последовал ряд итераций по оптимизации до тех пор, пока у нас не закончилось время. После он спросил меня, принимал ли я решение, о котором жалел позже. И если да, как бы я поступил в подобной ситуации сегодня.
После собеседования присутствует неприятный осадок, будто все завалил, так как ни на одно решение к задачам не отреагировали: "Супер! Вот это идеальное решение!". Не торопитесь расстраиваться — это нормально! Никто и не ждет, что вы найдете это "идеальное решение". Задачи на собеседования готовят именно так, что нет возможности полноценно их решить за 40 минут. Все, на что интервьюеры обращают внимание, — как далеко и с каким ходом мыслей вы можете зайти.
16 июня: Оффер
Amazon понадобилось восемь дней, чтобы принять решение. В пятницу рекрутер из берлинского офиса написал, что они выбрали меня на должность. Мы обсудили подробности по телефону в понедельник, и через три дня, 16 июня, я получил оффер со всеми цифрами.
На следующий день мы разъяснили некоторые вопросы, которые я подготовил, а также несколько дополнительных, нужных мне для увольнения из текущей компании. И в конце того же дня я отправил официальное ДА в Amazon.
Ссылки
- Which algorithms/data structures should I “recognize” and know by name?
- Big-O Cheat Sheet
- Cracking the Coding Interview, 6th Edition
- Problems | LeetCode OJ
Благодарности
Антон Попов выступал наставником в процессе найма и обсуждал черновой вариант этой статьи вместе с Шерзодом Абдуджабборовым и Умедом Худойбердыевым.
Автор: Sobit