Как программисту успешно пройти собеседование

0
1088
views

Перевод статьи «How to pass a programming interview».

Как разработчику успешно пройти собеседование

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

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

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

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

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

1. Проявляйте энтузиазм

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

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

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

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

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

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

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

2. Изучите распространенные темы для собеседований

Алгоритмы это частая тема для собеседований

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

  • Хэш-таблицы
  • Связанные списки
  • Поиск в ширину и в глубину
  • Быстрая сортировка, сортировка слиянием
  • Бинарный поиск
  • 2D-массивы
  • Динамические массивы
  • Двоичные деревья поиска
  • Динамическое программирование
  • Big-O анализ

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

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

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

В качестве источника я рекомендую книгу «Алгоритмы. Руководство по разработке» Стивена Скиены. Главы с 3 по 5 отлично раскрывают этот материал. Там используется язык С и некоторый математический синтаксис, но объясняется все хорошо. Также хорошие курсы по алгоритмам можно найти на Coursera. Вот в этом, например, сделан фокус на темы, важные для собеседований.

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

3. Получайте помощь от интервьюера

Помощь интервьюера

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

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

  1. Задавайте вопросы.
  2. Проговорите вслух брут-форс решение.
  3. Озвучьте оптимизированное решение.
  4. Напишите код.

После того как вам дадут задачу, начните уточнять, что именно спрашивается. Здесь нужно проявить педантичность. Проясняйте каждое возникающее у вас сомнение. Спрашивайте об edge cases. Приведите примеры отдельных случаев input-а и убедитесь, что вы правы насчет ожидаемого output-а.

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

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

Брут-форс решение

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

Кандидаты часто пропускают шаг с брут-форс решением, считая, что оно слишком очевидное или неправильное. Это ошибка. Обязательно выдвигайте свое решение для предложенной вам проблемы (даже если оно потребует огромное количество времени или супер-компьютер АНБ). Озвучивая свое брутфорс-решение, спросите интервьюера, реализовывать ли вам его или предложить более эффективный вариант. Обычно интервьюеры предпочитают второе.

Лучшее решение

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

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

4. Обсуждайте компромиссы

Нужно уметь обсуждать позитивные и негативные стороны своих решений

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

В таких случаях спрашивается, как бы он или она спроектировал(а) реальную сложную систему. Примеры могут включать проектирование Google Maps, социальной сети или API для банка.

На первый взгляд кажется, что для ответов на подобные вопросы нужны какие-то специфические познания. Конечно, никто не ждет от вас, что вы на самом деле спроектируете Google Maps, ведь для этого требуется много людей и времени. Но у вас должно быть понимание того, как это делается.

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

  • HTTP (на уровне протокола)
  • Базы данных (индексы, планирование запросов)
  • Сеть доставки (и дистрибуции) содержимого (CDN)
  • Кэширование
  • Балансировщики нагрузки.

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

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

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

5. Подчеркивайте результаты

Рассказывайте о достигнутых результатах

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

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

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

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

6. Используйте динамический язык, но упоминайте С

Используйте динамический язык программирования

Я советую в ходе собеседований использовать динамический язык, например Python, Ruby или JavaScript. Конечно, вообще надо пользоваться тем языком, который вы знаете лучше всего. Но мы обнаружили, что многие люди пытаются на собеседовании писать на C , C++ или Java, потому что считают их «настоящими» языками программирования.

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

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

Если вы знаете только один язык, вам остается только полагаться на силу своих познаний в этом языке. А если у вас все же есть сторонние проекты на других языках, обязательно скажите об этом на собеседовании. В частности, вам может помочь упоминание о работе с низкоуровневыми языками, такими как C, C++, Go или Rust.

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

7. Практика, практика, практика

Тренируйтесь проходить собеседования

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

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

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

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

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

8. Упомяните о рекомендациях

Используйте предубеждения интервьюеров

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

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

9. Собирайте офферы

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

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

Заключение

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

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

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here