FizzBuzz, или почему программисты не умеют программировать


Предыдущая |

[Автор этой статьи — Джеф Этвуд (Jeff Atwood), один из основателей stackoverflow.com. Сама же статья, несмотря на довольно приличный возраст (она написана в 2007 году) до сих пор популярна, а введенный в ней термин «FizzBuzz question» стал общеупотребительным. Оригинал можно найти здесь.]

Я весьма скептически отнесся к следующему наблюдению Реджинальда Брейтвайта (Reginald Braithwaite):
 

«Меня немного удручает тот факт, что 199 из 200 соискателей программистских вакансий не умеют программировать. Повторю: они не умеют писать код. Вообще.»


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

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

Я решил разработать набор вопросов, которые позволили бы мне быстро идентифицировать таких «недопрограммистов». Вопросам такого рода я дал название «FizzBuzz questions», в честь игры, в которую играют британские школьники. Типичный FizzBuzz question выглядит следующим образом:

Напишите программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово «Fizz», а вместо чисел, кратных пяти — слово «Buzz». Если число кратно и 3, и 5, то программа должна выводить слово «FizzBuzz»

Нормальный программист должен написать такую программу на бумажке за пару минут. Но вот что интересно: многие люди с профильным образованием вообще не могут справится с этой задачей. Были даже случаи, когда кандидаты, подававшие резюме на вакансию «Senior developer» тратили на эту программу больше 15 минут.»


Дэн Кигель (Dan Kegel) рассказывает о похожих впечатлениях при приеме на работу начинающих программистов:
 

«Неожиданно много соискателей (в том числе имеющих магистерские степени и PhD по информатике!) затрудняются ответить на простейшие вопросы. Я сам видел, как люди на собеседованиях не могут написать цикл, итерирующий от 1 до 10 или не знают, какое число в шестнадцатеричной системе идет после F. Что до менее очевидных примеров, то довольно много кандидатов не знают, как применить рекурсию для решения какой-либо практической задачи. Согласитесь, всё это совершенно базовые вещи, и если человек затрудняется с ответом на подобные вопросы, значит у него попросту нет опыта программирования.

Возьму на себя смелость говорить от лица всех программистов, которым приходится проводить собеседования: мы страшно устали общаться с людьми, которые в программировании ни в зуб ногой. Поверьте, если вы можете написать цикл от 1 до 10 на всех языках, указанных в вашем резюме, если вы можете решить в уме несложный арифметический пример и если вы знаете, как применить рекурсию в несложной (но взятой из реальной жизни) задаче — то вы уже на голову выше большей части людей, вращающихся в нашей индустрии.»


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

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

Для тех из вас, кто считает задачу о FizzBuzz чересчур простой (она, впрочем, намеренно тривиальна), я приведу комментарий из поста о собеседованиях, на который мы ссылались в начале статьи:
 

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


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

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