Как выйти победителем из программерского собеседования

10 декабря 2013, 09:25

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

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

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

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

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

Знать врага в лицо

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

  • рекрутер >>> Либо рекрутер обращается к вам напрямую, либо связывается с вами после изучения вашего резюме; 
  • собеседование по телефону >>> Назначается одно или несколько собеседований по телефону (в зависимости от компании);
  • собеседование в офисе >>> Длительное (иногда на протяжении целого рабочего дня) собеседование на территории работодателя;
  • предложение >>> Окончательные переговоры, обсуждение условий труда в зависимости от вашего опыта, улаживание других деталей.

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

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

  • Со стороны работодателя могут участвовать от 3 до 6 экзаменаторов. В основном это разработчики плюс HR-менеджер, иногда также присутствуют один или несколько продакт-менеджеров. Иногда вас одновременно собеседуют два человека; как правило, это делается для того, чтобы более молодой экзаменатор «дублировал» более опытного. 
  • Собеседование состоит из нескольких этапов, каждый из которых длится от 45 минут до часа, как правило, задачи решаются на маркерной доске. В некоторых случаях работа может проходить на ноутбуке, но пока такая практика не слишком распространена.

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

Перед собеседованием

Выстраивание модели успешного собеседования

Полагаю, что о качестве предложения можно судить по следующей модели:

количество предложений = (навык из области программирования) x (чистый интеллект/опыт) x (количество компаний, в которых были пройдены собеседования)
и
качество предложения (позиция и зарплата) = (количество предложений) x (опыт по резюме).

Наша цель — получить максимально качественное предложение. Больше предложений = бóльший выбор = бóльшая переговорная сила = более высокая зарплата/интересная позиция.

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

Подбор вариантов

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

  1. LinkedIn — максимально оперативно обновляйте профиль на LinkedIn, вносите в него информацию о последних выполненных проектах. Также обращайтесь ко всем друзьям и интересуйтесь, не ищет ли их компания новых сотрудников. Попросите друзей, чтобы они писали вам рекомендации; чем больше, тем лучше.
  2. Основные варианты — выберите наиболее приоритетные компании — те, в которых вам действительно хотелось бы работать. Если у вас есть какие-либо контакты с сотрудниками этих компаний, свяжитесь с ними и выразите заинтересованность. Возможно, вас начнут обсуждать в компании уже на этом этапе, а потом пригласят на собеседование. Если проверенные сотрудники компании уже имеют положительный опыт общения с вами, это может стать огромным плюсом, а в некоторых случаях даже перевесить не самое лучшее впечатление, произведенное на собеседовании. Если вы хотите обратиться в совершенно незнакомую компанию, то это всегда следует делать через страницу вакансий (она есть на сайте любой компании). 
  3. Отзывайтесь на все предложения — если вы уже получаете запросы по InMail или на LinkedIn, обязательно отвечайте на них (даже если предложение вас не заинтересует). Многие предложения поступают от хедхантеров, которые могут соединить вас с достаточно привлекательными компаниями.
  4. Запасные варианты — если вы не особенно хотите работать в какой-либо компании, которая вами заинтересовалась, но сходить туда на собеседование вас не затруднит, то записывайте их в «запасные варианты». Собеседования, пройденные в таких местах, послужат вам в качестве «тренировочных заездов». 

По идее, через пару недель вы уже должны пройти пару телефонных и даже очных собеседований из «запасного списка». Если поступят какие-либо предложения из основного списка, постарайтесь максимально их отодвинуть, чтобы выиграть время на подготовку, в частности — на вышеупомянутые тренировочные собеседования. Возможно, к тому моменту, как вы приступите к штурму основного списка, у вас уже будет пара реальных предложений о работе из «запасного». 

Прокачивайте мозг

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

1. Язык — во-первых, выберите язык программирования, в котором вы ориентируетесь лучше всего. Я видел множество соискателей, которые приходят на собеседование и вдруг решают, что выполнят эту задачу на Scala, а не на Ruby. Или на C, а не на Java. Это ошибка. Выберите один язык и работайте с ним на протяжении всей подготовки к собеседованию и на самом собеседовании. Изучите все хитросплетения и тонкости этого языка, чтобы писать на нем код совершенно спокойно. Не забывайте, время в таких условиях всегда поджимает, и вы не можете тратить его на какие-то метания. Лучше всего выбрать язык с хорошей библиотечной поддержкой. Так, использовать готовый HashMap из Java более рационально, чем писать с нуля свой собственный на C.

2. Изучайте материал — далее найдите хорошую подборку вопросов, часто задаваемых на собеседованиях, а также решения для них. Мы будем опираться на множество таких источников, но нашей настольной книгой будет «Cracking the Coding Interview» (в переводе на русский язык — «Карьера программиста. Как устроиться на работу в Google, Microsoft или другую ведущую IT-компанию», СПб.: «Питер», 2012 — прим. пер.). Ее автор очень толково разграничивает проблемы, относящиеся к разным областям. Настоятельно рекомендую приобрести бумажную книгу. В качестве резервных ресурсов обратимся к форуму загадок по информатике (Университет Беркли) и к сайту codercharts.com.

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

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

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

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

1. основные: деревья и графы, рекурсия и динамическое программирование, массивы и строки, сортировка и поиск, стеки и очереди, объектно-ориентированное проектирование, связные списки, манипуляция битами;

2. предметно-обусловленные (в зависимости от искомой позиции): математика и теория вероятности, масштабирование и память, тестирование, базы данных, потоки и блокировки.

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

  • По моему опыту, первые 4 алгоритма из этого списка встречаются на собеседованиях непропорционально часто (~1/3).

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

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

10.  Охарактеризуйте все сделанное по системе «О большое-О малое» — изучите, что такое Big-O notation, как эта система применяется к любому разрабатываемому вами алгоритму. На собеседовании по программированию вас обязательно попросят проанализировать пространственно-временную сложность предложенного алгоритма. При решении каждой поставленной перед вами задачи по программированию вы должны автоматически применять этот принцип, чтобы выбрать оптимальный вариант решения.

11. Говорите — ваше умение вербально описывать свой мыслительный процесс в ходе собеседования будет огромным козырем. Учитесь говорить сами с собой при написании кода (если слишком стесняетесь — можете говорить про себя).  

12. Прогресс — поначалу вы будете совершенствоваться очень медленно. Печально, но это факт. Вы с трудом будете припоминать простейшие алгоритмы из университетского курса информатики, а при мыслях о собеседовании будете чувствовать себя глупым и напуганным. Вы так и будете нервничать, пока не пройдете несколько собеседований в компаниях из «запасного» списка. А затем, возможно, совершенно неожиданно у вас в голове начнет складываться стройная картина, вы начнете легко улавливать закономерности. Окажется, что устрашающий на первый взгляд вопрос о графах решается путем простого поиска в ширину (а такой алгоритм вы теперь напишете даже с завязанными глазами), вопрос о связном списке окажется проще пареной репы, так как вы уже в совершенстве владеете рекурсией… и т.д.

13. Вопросы о личностных качествах — возможно, вам зададут и такие вопросы, и их тоже нужно учесть при подготовке к собеседованию. Подготовьте хорошо продуманные, убедительные, четкие ответы на вопросы примерно такого рода: [«Опишите проект, над которым вы сейчас работаете», «Вспомните какой-нибудь случай, когда у вас возникли разногласия с коллегой. Как вы смогли уладить эту ситуацию?», «Какова ваша самая серьезная слабость?», «Почему вы хотите работать в нашей компании?»]. Некоторые из этих вопросов вполне закономерны (всегда умейте объяснить, почему хотите работать в той компании, где сейчас собеседуетесь). Другие вопросы — полная чушь, и если вы не будете к ним готовы, то наверняка дадите какой-нибудь ужасный ответ и сильно ухудшите свои шансы — пусть и по оплошности.  

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

15. Изучайте межличностные отношения — нет, не всю эту психологическую дисциплину :). Но, как минимум, прочтите «Как приобретать друзей и оказывать влияние на людей» Дейла Карнеги. Многие мысли, высказанные в этой книге, исключительно пригодятся, чтобы достойно выстоять психологический раунд собеседования. Очень рекомендую эту книгу.

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

На собеседовании

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

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

2. Если застрянете — перед вами поставлена проблема, а вы не представляете, с какой стороны к ней подступиться. Вы пытаетесь ее решить, но в глубине души понимаете, что этот способ тупиковый. Через 20 минут вы продолжаете «ходить по кругу». Это очень распространенная беда, и результаты собеседования в таком случае будут неутешительными. Чтобы выйти из положения, максимально подробно озвучьте ход ваших мыслей. Проговорите предположения, имеющиеся у вас на данный момент, и попытайтесь изложить их вашим экзаменаторам в вопросительной форме. Обычно если они видят, что вы совсем плаваете, то дают вам какие-то подсказки. 

3. Добивайтесь взаимопонимания — если вы понравитесь собеседующим, то они более охотно предложат вам работу. Конечно, так происходит не всегда, и представители компании даже не всегда осознают этот механизм, но он действует. Две вещи, которые нужно попытаться сделать на любом собеседовании: 1) вызывать у экзаменатора улыбку; 2) добиться, чтобы он рассказал вам что-нибудь о себе. Эти ходы лучше делать в начале собеседования, но они срабатывают, только если выглядят абсолютно естественно.

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

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

6. Упрощайте — когда перед вами ставят проблему, вы можете задать уточняющий вопрос, после которого ее сформулируют вам в более простом виде — для этого сами выскажите упрощающие предположения. Возможность для такого маневра представляется гораздо чаще, чем может показаться, а умение ею воспользоваться приходит с опытом. Например, вместо того чтобы писать метод сортировки с нуля, предположите, что вы можете использовать встроенный метод сортировки. Раз — и 20 минут сэкономлено!

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

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

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

Заключение

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

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

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

Филип Юссеф

Источник

подписка на главные новости 
недели != спам
# ит-новости
# анонсы событий
# вакансии
Обсуждение