среда, 19 августа 2009 г.

[comp.prog] Должны ли соискатели писать код на интервью?

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

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

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

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

  • для соискателя собеседование – это стресс. Написание кода в таких условиях – это олимпиадный подход. По собственному опыту могу сказать, что далеко не все люди способны делать что-нибудь разумное в таких условиях. Так что, если вам нужен экстремал, который за 5 минут в три часа ночи через dial-up способен найти и устранить баг в 24x7 системе на другом конце света, то это может быть оправдано. Но тогда есть шанс упустить менее расторопного претендента, в программах которого такие сбои не будут возникать вообще;
  • несоответствие масштабов. Вряд ли вы ищете разработчика, которому предстоит писать программки объемом 50-100 строк (и все они будут разными вариантами QuickSort). Скорее вы ищете человека которому предстоит выдавать по 50, ну максимум, по 150 отлаженных строк в день. Лично я не уверен в том, что способность быстро написать маленькую программку является доказательством способности спокойно и тщательно разрабатывать большую программу. Скорее, я уже уверен в обратном. Гораздо больше доверия у меня сейчас вызывает человек, который 20 минут будет обдумывать задачу, чем который за эти же 20 минут набросает ее решение;
  • слишком много допущений. Когда вы даете соискателю задание за 20 минут написать небольшую программку, ожидаете ли вы, что он сделает это идеально? Думаю, что вряд ли. Поэтому в оценке наспех написанного кода будет неизбежно присутствовать некая дельта качества. И я думаю, что эта дельта может привести к ошибочным выводам относительно соискателя.

Для меня вышеперечисленные причины являются достаточными для того, чтобы отказаться от программирования на интервью. Но ведь способность соискателя к написанию кода как-то проверять нужно? Обязательно нужно. Но делать это следуют по другому. Сейчас наиболее адекватным способом мне кажется выдача соискателю небольшой задачи накануне интервью (небольшая – это с решением в 200-500 строк). С тем, чтобы решение он прислал перед интервью (это нужно для того, чтобы у вас было время проверить и оценить полученное решение). Почему такой способ лучше?

  • человек решает задачу в комфортных для себя условиях. Поэтому, если он написал откровенную фигню, то оправдания “стрессовые условия”, “не было привычной мне IDE”, “не было времени подумать” и пр., идут лесом вместе с самим соискателем;
  • вы видите более-менее реальное качество кода, которое способен выдавать человек. Поэтому, если в присланном решении вы найдете корявый стиль, отсутствие комментариев или другие проблемы, можете твердо быть уверены в том, что в лучшую сторону ничего уже не изменится;
  • если человек задает вам наводящие вопросы относительно полученной задачи (а задача должна быть такой, чтобы вопросы задавались), вы получаете информацию об “адекватности” и “вменяемости” соискателя. Ведь с очень большой долей вероятности аналогичными вопросами он будет засыпать вас и после приема на работу. Поэтому, если вам встретиться человек, который будет консультироваться с вами по каждой строчке кода, то у вас будет возможность отправить его лесом еще до собеседования;
  • вместе с кодом решения человек должен прислать и наборы тестовых данных, на которых он проверял свое решение. Эти наборы очень много расскажут вам о том, насколько качество программы важно для соискателя и как много он готов платить за это качество;
  • не менее важную информацию об обязательности и ответственности соискателя вы получите от самого времени получения решения. Поскольку вы можете договориться об отсылке решения до 12:00, а соискатель пришлет вам его в 15:00, за пятнадцать минут до собеседования. И даже не объяснит, почему он не смог сделать этого до 12:00.

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

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

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

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

12 комментариев:

jazzer комментирует...

Я всегда прошу написать код, что-нть простое, например, класс строки или массива.

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

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

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

eao197 комментирует...

Класс строки -- это наверное, самый любимый пример на собеседованиях. Не страшно, если тебе попадется чел, который поднаторел в решении именно этой задачи?

И как ты прореагируешь, если человек скажет, что для обычной строки нужно взять std::string, а какую-нибудь специфическую строку (типа ROPE) за 15 минут не напишешь?

jazzer комментирует...

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

eao197 комментирует...

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

jazzer комментирует...

потому что это уже будет проверка другого скилла - умение читать и понимать чужой код.

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

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

eao197 комментирует...

А задания с предварительным написанием кода ты пробовал давать?

jazzer комментирует...

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

eao197 комментирует...

> человек в результате сидит 10 минут не шевелясь и ищет подвох.

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

jazzer комментирует...

Ясно, я отвечал на "дашь человеку распечатку с небольшим наброском класса string".

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

Так что ничего не могу сказать.

eao197 комментирует...

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

jazzer комментирует...

и как, корреляция сильная, по твоему опыту?

eao197 комментирует...

Да, на основании последних 3 или 4-х случаев, если мне понравился код человека до собеседования, то с ним меньше проблем и в дальнейшем. Поэтому-то я такой пост и написал.

Хотя выборка небольшая, да. Так что это не истина в последней инстанции.

Если интересно, я могу поискать ссылочку на тестовое задание, которое Gaperton своим соискателям давал -- оно мне понравилось.