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

82

В обстановке собеседования: Как лучше всего определить, когда кто-то является отличным программистом . Под этим я подразумеваю, что он один из тех, кто в 10-15 раз более эффективен / быстр / лучше, чем его сверстники по направлению к нижнему краю спектра.

Многие из нас слышали о проблеме FizzBuzz как о способе отсеять слабых. Конечно, 5-10 минут, чтобы решить эту проблему, являются серьезным показателем того, что кандидат является слабым кандидатом. Я полагаю, что хорошим показателем является возможность решить это так быстро, как вы можете написать. Это не кажется достаточным, хотя.

Может быть, это что-то вроде того, чтобы дать ему умеренно сложную программу с ошибками, и посмотреть, как быстро он сможет справиться с ней и выявить все проблемы с ней?

Клаудиу
источник
Вопрос предполагает, что это можно сделать надежно.
Энтони
Вы не можете: http://steve-yegge.blogspot.com/2008/06/done-and-gets-things-smart.html
Джон с вафлей
не обязательно. действительным ответом будет «вообще нет пути»
Клавдиу

Ответы:

65

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

Общий интеллект (тизеры / логические головоломки)

Знание информатики

Программирование упражнений

Знание методов объектно-ориентированного программирования и общих шаблонов проектирования

Анализ алгоритма ( сложность O (n) времени выполнения и требования к памяти)

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

Знание общих уязвимостей и атак

Базовая математика

  • Системы счисления (преобразование из одной базы в другую)
  • Теория вероятности
  • Расстояние между двумя точками на декартовой плоскости (теорема Пифагора)
  • Квадратный корень (цапля александрийская, последовательное приближение)

криптография

  • Криптография с открытым ключом
  • Криптография с симметричным ключом
  • Хэш-функции
  • Криптографические протоколы (секретный обмен, доказательства с нулевым разглашением)

Дискретная математика

  • логика
  • Теория множеств
  • Теория графов
  • Теория информации
  • Комбинаторика
  • Доказательства (например, существование иррациональных чисел, бесконечные простые числа)

Возможно, вы также захотите взглянуть на книгу « Программируемые интервью» . Это хорошая ссылка на тему.

rboyd
источник
10
Фу, это должно быть какое-то длинное интервью.
Рик Минерих
8
Сегодня я попытался решить "Пересечение мостов" с моим товарищем по команде по программированию ACM. Разница лишь в том, что мы должны решить это для любого количества людей. У нас ушло около 30 минут, чтобы решить для любого числа N человек ... но в условиях интервью я чувствую, что головоломки - плохой показатель.
52
В интервью головоломки - это отстой, потому что собеседник нервничает, не думает правильно и т. Д. Кроме того, многие головоломки - это а-ха! Напечатайте вещи, которые действительно ничего не говорят о кандидате.
11
Я считаю эти математические проблемы очень сложными. Как вы можете вспомнить, как доказывать иррациональные числа и тому подобное, после того, как вы закончили 10-летнюю степень по информатике в течение 10 лет?
14
Проблема с загадками заключается в том, что большинство людей не решили их; они только что видели ответы раньше. Таким образом, самые опытные кандидаты будут делать вид, что не видели их, и нерешительно отрабатывают ответ, который они уже знают. Если ваша цель состоит в том, чтобы нанимать умных людей, а не лживых людей, то головоломки - плохой выбор.
Kyralessa
28

Ах, вечный вопрос.

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

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

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

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

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

Я научил девушек из отдела кадров передавать мне любые резюме, как только они их получают; Я планирую собеседование лично, так быстро, как могу (в идеале послезавтра после получения резюме для хороших резюме). Затем он получает полчаса или час собеседования со мной и, по крайней мере, с одним коллегой (обычно моим начальником или членом команды), где я узнаю его и отвечу на любые вопросы. Даже если я отклоню его заявление на месте, он получает 20-30 минут экскурсии по компании, и я говорю о том, что мы делаем и как мы это делаем. Затем я отправляю его в отдел кадров для психотестирования и немного по-настоящему базового бумажного кодирования / SQL. Оба теста почти никогда не играют существенной роли в моем решении, это скорее подтверждение, которое я правильно оценил в интервью. После 15-минутной беседы я делаю ему предложение, и если мы договариваемся об условиях, которыми мы оба довольны, его нанимают.

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

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

Также один совет. Отправляйте отказные письма (или электронные письма) по каждому полученному вами заявлению. В моей нынешней компании я обычно оставляю это HR (кроме тех, о которых я рассказываю во время интервью), но в какой-то момент это было бесценно, получив восхищенный ответ от отклоненного кандидата в строках «СПАСИБО! ответил, вместо того, чтобы оставить меня интересующимся, ответят ли они однажды! "

Domchi
источник
Психологическое тестирование?
5
@ Ink-Jet: нет, психотестирование было верным - кандидата просят написать код, который будет вести неистовый человек, который также знает свой домашний адрес.
Это то, что я прочитал в первый раз, если честно.
@Grundlefleck - да, это правильно. :)
Домчи
2
Если бы я получил ваше письмо с отказом, я бы поблагодарил вас. Я был отвергнут из-за молчания после телефонного интервью, и это нервирует.
01d55
24

Этот ответ немного нестандартен, но я думаю, что это ценный момент.

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

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


источник
2
так верно ... отличный момент. :)
Арнис Лапса
5
Итак ... это "кто ты знаешь", а не "что ты делаешь"? Действительно ужасные программисты также получают работу через друзей и семью. Ой, прости "сеть единомышленников".
Филипп
17

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

Энди Лестер
источник
11

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

Interstar
источник
DOH! этот ответ, кажется, становится популярным. Так же, как я должен начать выходить и подавать заявку на работу ...
Interstar
9

Один из способов отличить увлеченных программистов от программистов «Я просто хочу работу» - спросить их, какую книгу они читают на этой неделе. Затем спросите их о книгах, которые они прочитали за последние недели.

Я обнаружил, что увлеченные программисты ВСЕГДА читают, и обычно список включает в себя несколько программ / Комп. Sci. книги в недавнем списке.

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

Если у них вообще нет недавнего списка книг, то, по моему опыту, они, вероятно, не слишком программисты.

Ура,

Huntrods
источник
8
Мой недавний список книг почти всегда выдумка. Мои последние технические чтения почти полностью онлайн, потому что это более актуально.
1
А еще лучше спросите их, какую книгу они написали в этом месяце. :)
7

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

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

Йоуни К. Сеппанен
источник
7

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

Содержание:

  • Введение
  • Глава 1: «Ударять высокие ноты»
  • Глава 2: «Поиск великих разработчиков»
  • Глава 3: «Полевое руководство для разработчиков»
  • Глава 4: «Сортировка резюме»
  • Глава 5: «Экран телефона»
  • Глава 6: «Партизанское руководство по собеседованию»
  • Глава 7: «Фиксация субоптимальных команд»
  • Приложение: «Тест Джоэл»

Статья Джоэля «Партизанский справочник по интервью» (версия 3) также может быть полезной.

И статья «Готово, и все становится умным» Стива Йегге на эту тему.

sergtk
источник
4

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

Если они не могут ответить на первый простой вопрос, такой как «написать цикл for» или что-то глупо простое, тогда вы знаете, что этот человек не может кодировать.


источник
4

Попросите их написать код на доске. Только так вы сможете сказать, знают ли они, как писать код.


источник
Не знаю, почему за это проголосовали. Если программист не может написать код на доске, что заставляет вас думать, что он сможет написать его на компьютере?
Кристофер Джонсон
3
@ Кристофер: Если программист может написать хороший код на компьютере, что заставляет вас думать, что они смогут написать его на доске? Это значительно разные среды.
Дэвид Торнли
«Тест доски» не предназначен для имитации реального кодирования. Это возможность увидеть, как думает кандидат, может ли кандидат описать, что он делает, как быстро кандидат формирует решение в своей голове и т. Д. Тот, кто просто смотрит на доску, не зная, что написать, вероятно, получит та же проблема на компьютере.
Кристофер Джонсон
3

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

Для решения задач кодирования используйте IM с чем-то вроде codepad.com, и пусть они делают это не выходя из собственного дома. Вы пишете большую часть своего кода на доске перед вашим боссом с 30-минутным сроком и вашим бонусом на линии? Я не.

Так что, интервью бессмысленно? Нет, но акцент должен быть сделан на том, чтобы они объяснили, что они сделали и что именно они внесли.

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


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

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

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

Но я признаю, что если он не может написать простой цикл со счетом от 1 до 10, у вас проблемы.

Стивен Кокс
источник
1

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

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

По сути, они имеют страсть к программированию или нет? Это настоящий вопрос.

Крис Питчманн
источник
1

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

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

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

MDM
источник
1

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

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

Я думаю, у отличного программиста должен быть трек успешных проектов, в которых они активно участвовали. Таким образом, заставлять программиста писать что-то выше базового FizzBuzz не нужно в интервью. Поговорите о своих прошлых проектах и ​​о том, что они сделали. Вы нанимаете программистов для решения кубиков Рубика и подсчета шариков или работаете над длинными и большими и утомительными программными проектами, насчитывающими более 50 строк?


источник
1

http://www.inter-sections.net/2007/11/13/how-to-recognise-a-good-programmer/

Из статьи:


Критерии в пулях

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

Положительные показатели :

  • Страстный о технологии
  • Программы как хобби
  • Буду отговаривать вас на техническую тему, если поощряется
  • Значительные (и часто многочисленные) личные сайд-проекты на протяжении многих лет
  • Изучает новые технологии самостоятельно
  • Мнение о том, какие технологии лучше для различного использования
  • Очень неудобно из-за идеи работать с технологией, которую он не считает «правильной»
  • Очевидно умный, может иметь отличные разговоры на различные темы
  • Начал программировать задолго до университета / работы
  • Имеет несколько скрытых «айсбергов», большие личные проекты под радаром CV
  • Знание большого разнообразия несвязанных технологий (не может быть в резюме)

Отрицательные показатели :

  • Программирование - это работа дня

  • На самом деле не хочу разговаривать по магазинам, даже когда

  • Изучает новые технологии на курсах, спонсируемых компанией

  • Рад работать с любой выбранной вами технологией, «все технологии хороши»

  • Не кажется слишком умным

  • Начал программировать в университете

  • Весь опыт программирования есть в резюме

  • Ориентирован в основном на один или два технологических стека (например, все, что связано с разработкой Java-приложения), без опыта работы за его пределами

Ронни Брендель
источник
Вы не могли бы объяснить больше о том, что он делает, и почему вы рекомендуете ответить на заданный вопрос? «Ответы только на ссылки» не очень приветствуются на Stack Exchange
gnat
0

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

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


источник
Я удивлен, что вы не сталкивались с оператором по модулю. Меня познакомили с ним на разных языках, которые я выучил за год.
2
Если вы специализировались в CS в колледже, оператор по модулю программирует 101
неожиданно такие вещи, как бит-смещение и по модулю пропускаются в колледже
Клавдиу
Я думаю, что это зависит от того, чему они тебя учат в колледже. Я не думаю, что когда-либо использовал модуль по реальной проблеме и не учил этому явно. Но это очень часто встречается в подобных упражнениях (и в экзаменационных вопросах).
Interstar
2
На самом деле, они оба обычно преподаются в начальной школе; на этом этапе их называют «остаток» и «умножение на 10».
интуитивно
0

Один из критериев, который я использую, - это увидеть «языки» и инструменты, над которыми он работал, в академических или профессиональных проектах, и что именно он достиг. Всегда ли он работал на уровне приложений, используя стандартные библиотеки (всегда парень на C # или VB6?) Или он делал проект с использованием C в Linux, занимаясь такими жесткими вещами, как указатели, управление памятью, рекурсия, синхронизация процессов, взаимное исключение, события и т. Д. Если он всегда использовал эти основные и фундаментальные понятия на каком-то уровне абстракции, я сомневаюсь.

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


источник
рекурсия, синхронизация процессов, взаимное исключение. Эти технологии одинаково важны, работаете ли вы с C #, VB.NET, C или ассемблером.
-1 - Это совершенно неправильно. «Вид» языков и инструментов на 100% «не имеет значения».
Морган Херлокер