[Перевод] Взламываем собеседования: по алгоритмам, по архитектуре, поведенческие и прочее

image

Я только что закончил семь собеседований в компаниях Кремниевой долины. В конечном итоге я принял предложение разработки программного обеспечения в Facebook.

Вот как я готовился к этим собеседованию и чему я научился на этом пути.

Мой многолетний путь в Кремниевую долину


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

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

Я оставил свое место в качестве ведущего инженера iOS в чудесной компании в Мельбурне и я вернулся обратно в мой родной город Перт, чтобы учиться. Тут я буду готовиться к переговорному процессу которое ждет меня в Кремниевой долине. Я знал, что это будет невероятно сложно и тяжело.

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

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


Перевод выполнен при поддержке компании EDISON Software, которая профессионально занимается разработкой софта для крупных заказчиков (например, система управления городским освещением или электронная система медицинского осмотра).

Собеседование — это навык


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

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

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

Как и во многих других ситуациях в жизни, практика повысит вашу уверенность.

Различные виды собеседований, с которыми я столкнулся


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

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

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

Я кратко рассмотрю каждую из тем, с которыми я столкнулся.

Собеседование по алгоритмам


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

Это был хлеб и масло моей подготовки, каждый день в течение шести недель, я решал алгоритмы на дешевой подвесной доске, оценивал их сложность (time/space complexity), а также действительно пытался понять, что происходит в каждой строке кода.

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

Собеседование по проектированию архитектуры


Это интересное интервью, которое я очень недооценил. Интервьюер попросит вас разработать систему (на доске, конечно), такую ​​как система билетов на автостоянку, чат-мессенджер, твиттер-канал, или что-то из числа других похожих систем.

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

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

Поведенческие интервью


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

Вопросы, как правило, следующие:

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


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

  • «Моя слабость в том, что я слишком сфокусирован»
  • «Это был все вина Джерри, он был ответственен за большую часть проекта»


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

Соответствие корпоративной культуре


Обычно это входит в поведенческое собеседование и сосредоточено на определение, соответствуете ли вы критериям компании.

Например, Facebook следует hacker-like культуре, приветствуют смелые и новые идеи, и судя по всему, не боятся что-то испортить. А Airbnb хочет создать мир где люди чувствуют себя как дома, где бы они не были, и поэтому они ищут людей с навыками гостеприимства.

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

Парное программирование


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

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

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

Поиск и исправление ошибок


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

Я видел только один случай такого типа собеседования, и я чувствую, что для кого-то будет действительно трудно подготовиться, особенно если он джуниор. У каждой среды программирования есть свои небольшие причуды и нюансы, многие из которых выявились благодаря моему предыдущему опыту работы с интегрированной средой разработки (IDE) и похожими фреймворками, которые я использовал за эти годы.

Тестирование знаний в вашей сфере


Программирование принципиально одинаково на большинстве языков, которые мы видим сегодня. Скорее всего, если вы знаете объектно-ориентированное программирование на одном языке, эти навыки подойдут и для другого.

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

Понимание операционных систем


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

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

Как вы должны готовится


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

Минимальные знания


Если бы кто-нибудь спросил меня на каких областях нужно сосредоточиться, я бы предложил следующее:

  • Учитесь писать код от руки на листике и доске сначала, а затем переносите его в IDE для подсветки синтаксиса, это должно стать для вас привычным делом
  • Развивайте глубокие познания структур данных, их преимущества и недостатки в сравнении друг с другом. Я обнаружил, что реализация структур данных с нуля и их поведение научили меня гораздо большему, по сравнению с тем, что я знал из их абстрактных концепций.
  • Полностью поймите концепцию Big O для понимания сложности алгоритмов (временной/емкостной). Это отлично подойдет когда вы столкнетесь с вопросами про алгоритмы и сортировки.
  • Освойте все алгоритмы сортировок, потому что велик шанс, что разница в сложности алгоритмов (временной/емкостной), может провалить ваше оптимальное решение для алгоритма который вы пытаетесь решить.


Когда начать


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

Не переживайте


У вас получится.

Источники


Пробные интервью

  • interviewing.io (бета-версия), бесплатно
  • Pramp, бесплатно
  • CareerCup, платно


Алгоритмы

  • Cracking the Code Interview, книга
  • byte by byte, Сайт и YouTube
  • CS50, YouTube
  • Interview Cake, сайт
  • HackerRank, сайт
  • LeetCode, сайт


Операционные системы

Основные понятия операционных систем, книга

Архитектурное проектирование

  • Введение в архитектуру и системы, YouTube


Касательно поведения

  • Введение в поведенческие интервью, YouTube

© Habrahabr.ru