2013-11-11
На одном из собеседований я попросил очень опытного разработчика встроенного ПО написать простую программу, которая переворачивает строку и выводит результат на экран. И он не смог.
Он правда был крут. Ему можно было дать кучу металлолома, и он превратил бы её в робота, который смог бы передвигаться по комнате. Он работал над спутниками, которые были пущены в эксплуатацию и сейчас находятся на орбите.
Но вот так сложилось, что ему никогда в жизни не приходилось выводить результаты на экран.
У некоторых людей есть настоящий талант задавать правильные вопросы, которые помогут выявить крутых программистов на собеседованию. У других такого таланта нет: они заявляются на собеседование, задают пару вопросов, которые вычитали в Интернете, а потом принимают коллективное решение.
А ведь плохой выбор рекрутера влечёт за собой долгосрочные последствия хотя бы потому, что программист на уровне «ниже среднего» непременно снижает общий уровень команды. И наоборот, несправедливое и необдуманное отсекание великолепного кандидата тоже не принесёт ничего хорошего.
Интервью с программистом состоит как минимум из трёх частей. В первой части мы проверяем свои предположения после прочтения резюме. Во второй части мы определяем реальный опыт кандидата. В заключительной части мы проверяем этот опыт с помощью небольших задачек и вопроса по программированию.
Часть I: проверяем свои предположения
Однажды я вместе со своим коллегой собеседовал кандидата. После завершения интервью у меня осталось впечатление, что соискатель вполне неплох, хоть и неидеален. Мой коллега, напротив, был взбешен: «Он наврал насчёт знания технологии Х. Он никогда с ней не работал. Не наш кандидат». Эта технология Х даже не требовалась для данной вакансии. «Но ведь он наврал о ней. Я больше не верю ни слову из его резюме».
Конечно, в любом резюме кандидат описывает себя в наиболее положительном свете. Для того, чтобы отделить действительное от воображаемого, при просмотре резюме я пользуюсь золотым правилом:
«Всё написанное в резюме —ложь, пока не доказано обратное».
Если в резюме написано: «Эксперт в такой-то технологии», про себя я думаю, что это означает «знаю название этой технологии». Если в резюме написано «Работал над созданием многопоточной торговой площадки», про себя я замечаю, что это означает «участвовал в выборе цвета фона».
Возможно, я бы ещё верил написанному резюме, если бы как-то на собеседование ко мне не пришёл кандидат с 10 годами опыта, который не смог написать ни строчки кода.
Лучше не строить никаких ожиданий, чтобы не разочаровываться. Всё написанное нужно будет проверить.
Как? Очень просто: задать на собеседовании коварные вопросы о каждом указанном навыке или проекте.
Разрабатывал систему реального времени в качестве курсовой работы.
Коварные вопросы: Сколько человек работало с вами в группе? 15? А над чем конкретно работали вы? Над очередью сообщений? Здорово! А расскажите, что происходит, когда высокоприоритетная задача посылает сообщение низкоприоритетной задаче?
Разрабатывал с нуля протокол звуковой передачи для беспроводных систем безопасности.
Коварные вопросы: Сколько человек было в команде? Только вы? Ого! И как проходил процесс тестирования? Вы использовали RTP?
Чинил баги в XYZEngine.
Расскажите о баге, который было действительно сложно исправить, и как вы решили эту задачу.
Часть II: определяем реальный опыт кандидата
Большой опыт — хороший индикатор крутости программиста. Опытный программист уже насовершал кучу ошибок, и знает, где ещё можно ошибиться. У них уже работает нюх на то, какие требования изменятся, а какие, скорее всего, останутся неизменными. Они знают, когда можно расслабиться, а когда нужно быть педантичным. Это и есть тот настоящий опыт, который увеличивает пропасть между талантами и посредственностями.
Но не каждый опыт одинаково полезен!
Кто-то набирает огромный опыт за пару лет, работая над множеством разных проектов, занимаясь написанием и переписыванием бесчисленных строк кода, ошибаясь и исправляя ошибки. А кто-то десятилетия занимается одним проектом, внося по строчке изменений, не узнавая ничего нового.
Узнать о начале карьеры
Есть множество отличных программистов, которые начали кодить при поступлении в интститут. После выпуска у них уже есть несколько лет опыта. А вот множество превосходных разработчиков начали изучать программирование чуть ли не в детстве. У меня есть знакомые, которые начали писать свои первые программы в подростковом возрасте. Эту информацию не указывают в резюме, но её можно выяснить в ходе собеседования:
- Как вы попали в сферу разработки ПО?
- Какой был ваш первый язык программирования?
Плотность опыта
Многие превосходные программисты занимаются кодом на работе. Это замечательные зрелые специалисты, которых действительно стоит нанимать. Тем не менее, наличие личных сторонних проектов также является хорошим показателем крутости. Если у кандидата нет личных проектов, плотность опыта соискателя можно выявить по следующим показателям:
- Работа в малых командах/группах;
- Работа в большом количестве проектов;
- Подробные знания о разных уровнях проекта;
- Опыт внесения основного вклада в развитие проекта.
Часть III: подтверждаем опыт соискателя
После определения реального опыта важно подтвердить существующие навыки кандидата. Нескольких минут для тестирования всегда мало, но это всё, что мы можем себе позволить. Мы можем определить ширину и глубину знаний кандидата, задавая вопросы из разных сфер разработки ПО. Конечно, на ваше восприятие навыков соискателя будет влиять собственный опыт. Вы не можете судить о правильности ответов на темы, которые не знакомы лично вам. Поэтому так мало действительно хороших интервьюеров.
Конкретные темы зависят от требований к должности. Темами для беседы могут быть:
- структуры данных и алгоритмы;
- многопоточность;
- побитовая обработка;
- распределение памяти;
- объекты и наследование, паттерны разработки;
- рекурсия;
- компиляция и исполнение программ.
Каждая тема включает в себя некоторые базовые вопросы (например, «Что такое семафор?»). Эти вопросы должны быть настолько общими, что каждый, кто хотя бы немного работал в этой сфере, сможет ответить. Помимо общих вопросов нужно задать подробные более узкие вопросы. Что-то не так, если вы просите опытного программиста встроенных систем перевести 0х4с в двоичный код, а он пишет: 4 х 16 + 12.
Тест по программированию
Обычно после первых трёх этапов собеседования я уже понимаю, подходит кандидат или нет, но тест по программированию убирает все сомнения.
Тест необходимо тщательно продумать до собеседования. Если его неправильно задать, ответ, каким бы он ни был, будет бесполезен.
Во-первых, тест должен основываться на опыте кандидата и особенностях вакансии. Если у вас есть отличная задачка, которую можно решить с помощью конвертирования объектов в пересекающиеся 3D-плоскости, но для текущей вакансии не требуется знание 3D-графики, забудьте об этой задачке.
Во-вторых, вопрос должен быть чётко сформулирован. «Напишите функцию для перемешивания колоды карт» — это несерьёзно. Предложите хедер функции, избегайте двусмысленностей. Если вы не позаботитесь об этом, кандидат будет решать тот вопрос, который он сам себе придумал, а не тот, который задали вы. Чтобы не терять время, можно через несколько минут попросить кандидата озвучить свои мысли, чтобы понять, правильно ли он понял вопрос.
Порядок вопросов имеет значение
Порядок, в котором вы задаёте вопросы на собеседовании, оказывает влияние на мыслительный процесс соискателя. Например, я задаю вопрос о хеш-таблицах, когда полагаю, что кандидат знает о них. Затем дело доходит до теста, который не имеет ничего общего с хеш-таблицами. В большинстве случаев кандидаты начинают использовать в решении хеш-таблицы. Если я не спрашиваю о хеш-таблицах, кандидаты предлагают более оптимальные решения.
На кандидатов влияет и выбор основного ЯП. Например, вы говорите, что в текущей работе используется Java. Каждый кандидат начнёт клясться и божиться, что он настоящий эксперт в Java, и вообще это его любимый язык. Он будет использовать именно Java во всех тестах, несмотря на то, что не может вспомнить, как в его любимом языке объявляют переменную.
Не замыкайтесь на одном языке
Очень соблазнительно сделать выбор в сторону того языка, который используется в вашей компании. Ограничивая свой выбор одним языком, вы оставляете за бортом множество отличных программистов. Не старайтесь определить, насколько круто кандидат программирует на C или Java. Ваша задача: выяснить, насколько круто кандидат программирует на языке, который он знает лучше всего.
Выходим за рамки
Предложенная схема собеседования с программистом подходит не всегда и не всем. Эта схема основана на определении опыта кандидата, и может пропустить действительно крутых программистов с малым опытом, но с большим внутренним потенциалом. Для этого интервьюер может предложить выполнить задание, не требующее написания кода, но выявляющее способность решать задачи.
Данная схема предполагает построение гипотез и использование интуиции. Вам нужно определить, какими чертами должен обладать крутой разработчик. Поэтому вопрос, на который вы отвечаете сам себе, звучит так: «С какой вероятностью ответ кандидата на тот или иной вопрос подтверждает, что он на самом деле прекрасный программист?». 100%-ной вероятности вы не достигнете, но правильно подобранные вопросы помогут вам подобраться к истине немного ближе.
Перевод: Люся Ширшова. По материалам блога Steve Hanov.