Руководство от Pinterest Engineering по проведению технических собеседований

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

Подготовка к собеседованию 

Тренируйтесь: Вы не должны слышать вопросы к интервью во время самого собеседования и впервые задумываться о них. Отрабатывайте все — от потенциальных вопросов до концепций — еще до начала реального собеседования. Освежите основные знания по компьютерной науке, общие навыки разработки программного обеспечения и проектирования крупномасштабных систем. Компании постоянно обновляют свои банки вопросов для собеседований, но можно использовать такие сайты, как Leetcode и Interviewing.io, чтобы найти отличные вопросы для тренировки. Не стоит забывать и о таких ресурсах, как проекты с открытым исходным кодом Pinterest на GitHub и opensource.pinterest.com.

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

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

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

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

Разбираясь в проблеме

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

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

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

Существует несколько способов определить виды оптимизации:

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

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

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

Качество кода: Написание хорошего, чистого кода всегда вызовет одобрение интервьюера, независимо от того, пишете ли вы его на компьютере или на доске. Хорошая практика кодирования включает в себя: 

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

  • Написание осмысленных имен переменных и функций
  • Добавление проверок на ввод и на null

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

Предположения: Вполне допустимо делать предположения, когда вы их обосновываете! Было бы неразумно ожидать, что вы запомните все детали языка или реализуете все обычные структуры данных или алгоритмы за ограниченное время. Если реализация компонента не является жизненно важной для решения проблемы, интервьюер часто разрешает или даже ожидает, чтобы вы абстрагировались от некоторых деталей. Однако важно четко сформулировать и объяснить свои предположения. Например, вместо того чтобы реализовывать вспомогательную функцию (helper function), можно просто разработать сигнатуру метода, объяснить, как и зачем она будет использоваться, и продолжать дальше.

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

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

Наконец, выступите в роли «адвоката дьявола», пытаясь сломать свое решение, и обратите внимание на: 

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

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

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

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

Задаем правильные вопросы 

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

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

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

Вот некоторые примеры: 

  • Каким бывает ваш обычный день? 
  • Что вам больше и меньше всего нравится в вашей работе? 
  • По какой причине вы решили присоединиться к компании и почему остались?

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

Например,

Вместо этого..Попробуйте так..
Какие еще есть вакансии? Инженер, вероятно, не знает обо всех открытых должностях, поэтому лучше всего спросить об этом рекрутера. Какие качества требуются от кандидата на эту должность? Интервьюер принимает решение, поэтому вы можете получить от него информацию о том, как подготовиться к следующему раунду.
Где находится офис? Информацию такого рода легко найти в Интернете. Каким образом вы добираетесь до места работы? Интервьюер может передать вам свой субъективный опыт с помощью таких фактов, как местоположение офиса. 
Как работают Связанные пины? Старайтесь, чтобы технические вопросы не выходили за рамки компетенции интервьюера. Если интервьюер работает в сфере рекламной инфраструктуры, то, скорее всего, не будет знать ответа!Как работают Связанные пины? Если интервьюер работает в системе Related Pins, он, вероятно, будет очень рад ответить на этот вопрос. 
Планируете ли вы завести детей? Устраивают ли вас родительские льготы? Вопросы личного характера могут поставить в неловкое положение и вас, и интервьюера.
Известны ли вам люди, которые уходили в отпуск по уходу за ребенком? Как в целом компания реагирует на это? Общие вопросы о культуре, не переходящие на личности, можно задавать вполне спокойно.

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

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

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

Руководство от Pinterest Engineering по проведению технических собеседований