Представляю вашему вниманию перевод своей статьи Amazon software engineer interview, изначально опубликованной на английском на sobit.me.


Amazon - We Pioneer


Не так давно со мной связался технический рекрутер из Amazon. Компания организовывала трехдневное онсайт собеседование по найму программистов в их берлинский офис.


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


Если я не упомянул чего-то важного в статье, спрашивайте в комментариях. Постараюсь ответить максимально подробно.


27 апреля: Вышли на контакт


Рекрутер связалась со мной через LinkedIn. Она писала, что им нужны программисты в берлинский офис, и просила отправить ей обновленное резюме, если мне это интересно. С моей привычкой постоянно держать свое резюме обновленным я отправил его уже на следующий день.


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


На задание давалось два часа, и рекрутер попросила закончить его до 5 мая. Я решил не спешить и подождать до выходных.


1 мая: Прескрининг


На Hackerrank есть платформа для проведения компаниями технических собеседований под названием Hackerrank for Work. Именно на нее я попал, пройдя по ссылке из письма. Платформа предлагает встроенный счетчик времени, веб-редактор с базовыми возможностями автодополнения для Java, непосредственно постановку задачи и возможность протестировать ее решение с различными наборами входных данных, включая собственные.


Ни рекрутер, ни платформа не сообщили мне о доступных на собеседовании языках программирования до того, как я перешел к решению задач. Все, из чего я мог выбрать, это C, C++, Java и пара других. Это пошло вразрез моим планам использовать Go или PHP, и в итоге я выбрал Java.


Собеседование состояло из трех задач. Технически их было возможно решать в любом порядке.


Задачи


Первая задача была об объектно-ориентированном программировании. Было дано несколько классов с их методами, и требовалось предоставить эффективное решение, поддерживая при этом легко читаемый и чистый код.


Второй задачей были алгоритмы. Совет, который помог лично мне: начните с решения задачи вручную и визуализируйте свое решение — это поможет взглянуть на задачу под более широким углом и понять, какие именно структуры данных и алгоритмы к ней подходят. Я решил задачу на бумаге. Р��шение оказалось достаточно простым, и я всего лишь перенес его в код.


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


В последней задаче требовалось провести анализ сложности решения предыдущей задачи, а также объяснить свой выбор. Из-за недостатка времени мне пришлось ограничиться только анализом.


4 мая: Собеседование по телефону


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


Подготовка


У меня было всего два дня на подготовку. Я пробежался по основным алгоритмам и структурам данных из следующего списка:



Помимо общих знаний, вам также надо уметь обосновывать сложность алгоритмов и стандартных операций над структурами данных. Мне в этом сильно помогла Wikipedia.


Телефонный звонок


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


Под конец она перешла на поведенческие вопросы. Я не готовился к ним заранее, и мне приходилось с ходу перебирать в голове подходящие истории к каждому вопросу.


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


2 июня: Онсайт собеседование


Через какое-то время мне пришло два письма от рекрутера: в одном мне предоставили материалы для подготовки к собеседованию, а во втором — форму с вопросами для заполнения. Вопросы были, в основном, о моем текущем положении, как Amazon может (и нужно ли) помочь мне с переездом, о моих текущих условиях работы с точки зрения заработной платы и бонусов, и какой день и время мне подходят для собеседования.


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


Подготовка


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


Интересный ресурс для практики, который я открыл для себя, — LeetCode. Так получилось, что мой друг также решил заняться этим, и мы посвятили два часа каждого четверга после работы совместному решению задач.


За две недели до собеседования я начал готовить ответы на поведенческие вопросы. Многие кандидаты недооценивают важность подобных вопросов и готовятся только к технической части. Так нельзя! Интервьюверам важно узнать вас как личность и понять, хотят ли они работать с вами в одной команде. Мне было удобно писать ответы в виде историй в стиле STAR. Я покрыл следующие ситуации: ошибки и провалы, конфликты, примеры лидерства. Как совет, постарайтесь говорить в своих историях больше о себе, а не о команде, с которой вы работали. Таким образом интервьюеру будет легче оценить ваш личный вклад.


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


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


День собеседования


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


Всего было четыре собеседования по 50 минут с 10-минутными перерывами между ними и дополнительными 15 минутами перед последним. Каждое собеседование состояло из 40 минут для решения задач и 10 минут для поведенческих вопросов.


На первом собеседовании меня попросили спроектировать объектно-ориентированную систему. Надо было построить интерфейс, который бы использовался другими разработчиками для создания библиотек на ее осн��ве. Все было просто вначале, но по ходу дела интервьер усложнял задачу новыми требованиями. Закончилось собеседование обсуждением ситуации, где я не справился с задачей в поставленный срок.


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


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


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


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


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


После собеседования присутствует неприятный осадок, будто все завалил, так как ни на одно решение к задачам не отреагировали: "Супер! Вот это идеальное решение!". Не торопитесь расстраиваться — это нормально! Никто и не ждет, что вы найдете это "идеальное решение". Задачи на собеседования готовят именно так, что нет возможности полноценно их решить за 40 минут. Все, на что интервьюеры обращают внимание, — как далеко и с каким ходом мыслей вы можете зайти.


16 июня: Оффер


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


На следующий день мы разъяснили некоторые вопросы, которые я подготовил, а также несколько дополнительных, нужных мне для увольнения из текущей компании. И в конце того же дня я отправил официальное ДА в Amazon.


Ссылки



Благодарности


Антон Попов выступал наставником в процессе найма и обсуждал черновой вариант этой статьи вместе с Шерзодом Абдуджабборовым и Умедом Худойбердиевым.