Настоящие программисты, проф.пригодность

fizzbuzzЭто перевод статьи из блога компании RethinkDB — калифорнийского стартапа, который занимается разработкой MySQL storage engine, оптимизированного под SSD-диски. Оригинал статьи можно прочитать здесь.

В последние месяцы RethinkDB довольно активно нанимает новых сотрудников, и за это время мы твердо убедились в том, что Джеф Этвуд (Jeff Atwood) в своей статье о FizzBuzz ни на йоту не отошел от истины.

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

Конечно, всё это гнусные инсинуации. Наше основное правило — не нанимать людей, которые не умеют программировать.

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

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

Напишите на С функцию, переставляющую в обратном порядке элементы в односвязном списке.

Всё. Точка.

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

Разумеется, это не единственный вопрос, который мы задаем. Еще нам интересно узнать, какова максимальная сложность вставки N элементов в vector (или в ArrayList, или как там в вашем любимом языке называется динамический массив). Если вы не знаете — не страшно, давайте попробуем подумать вместе! Мы с удовольствием объясним вам внутреннюю реализацию вектора. Черт возьми, мы даже зачтем O(N*logN) как правильный ответ!

Как бы вы реализовали read-write lock? Не обязательно писать код, объясните хотя бы основную идею. О, вы знакомы с понятием starvation? Это очень здорово! Нет? Да что ж такое, расскажите нам хоть что-нибудь!

Мы спрашиваем о различиях между кооперативной и вытесняющей многозадачностью. Мы спрашиваем об условных переменных (conditional variables) в межпоточном взаимодействии. В 19 случаях из 20 в телефонной трубке только тишина.

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

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

Мой коллега, впервые прочитав статью о FizzBuzz, спросил: «Если они не могут написать FizzBuzz, что они вообще могут?». Повторюсь: первоначальное отсеивание выкидывает 19 из 20 кандидатов. Каждое телефонное собеседование занимает у меня около 45 минут. Если не считать нескольких часов на предварительный просмотр резюме, то беседы по телефону с 20 кандидатами в сумме занимают около 15 часов. И всё это — только затем, чтобы найти одного(!) человека с базовыми навыками программирования, и только после этого переходить к личному собеседованию с ним.

Где же вы, настоящие программисты?

Добавить комментарий