Эффективность FizzBuzz и за ее пределами [закрыто]

38

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

Около года назад, как второй вопрос, мы начали задавать вопрос, очень похожий на оригинальный FizzBuzz. Этот вопрос был разработан так, чтобы быть простым, как первоначальный FizzBuzz, а также для оценки конкретной способности кандидата, в частности способности упорядоченно и логически расставлять приоритеты и наборы «бизнес-правил», которые были предоставлены в некоторых произвольный порядок. Формулировка вопроса поначалу кажется немного двусмысленной, что может затруднить работу носителей английского языка, но если продуманное решение может быть правильно решено - это также дает кандидату возможность задать вопросы для уточнения, что всегда хорошо ,

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

Мы обнаружили, что немногим более 65% кандидатов (размер выборки 38), прошедших FizzBuzz, полностью провалили FizzBuzz v2.0. Обычно эти кандидаты обнаруживаются позже в процессе, но, похоже, это хороший способ обнаружить их рано.

Мой вопрос не в том, является ли FizzBuzz устаревшим, а в том, какие факторы могут способствовать столь большому количеству кандидатов, которые не смогли ответить на вопрос FizzBuzz v2.

  • Вопрос слишком двусмысленный?
  • Снижает ли стресс среда собеседования способность критически мыслить до такой степени, что не может выполнить такую ​​тривиальную задачу?

Вопрос:

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

  1. Печатайте только Fizz, если строка содержит букву A
  2. Печатать только Buzz, если строка содержит букву B
  3. Печатать только BuzzBuzz, если строка содержит как A, так и B
  4. Печатайте только FizzFizz, если строка не содержит ни A, ни B
  5. Печатать только FizzBuzz, если строка содержит только один A и только один B

Некоторые типичные вопросы, задаваемые кандидатами:

  • Должно ли оно быть чувствительным к регистру?
  • Означает ли «содержит А и В», А должен предшествовать B
  • Что должно быть напечатано, если ни один из пунктов не достигнут?
  • Что должно произойти, если может быть выполнено более одного условия?

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

Gradeinar Pfeffernüsse
источник
26
Оставьте вопрос немного двусмысленным. Таким образом, вы можете увидеть, у каких потенциальных клиентов достаточно сомнений, чтобы попросить разъяснений (что само по себе является ключом к развитию).
Томас Эдинг
17
Правильный ответ заключается в том, что потенциальный разработчик должен сказать БА «исправить эти ужасные требования».
Кирк Бродхерст
7
Настройка FizzBuzz - это хорошая идея, чтобы отфильтровать кандидатов, которые погуглили решение. Нет необходимости даже усложнять. На самом деле, я сомневаюсь, что оригинальный FizzBuzz должен был дословно использоваться всеми компаниями на планете. Это просто лень со стороны компании, чтобы не настроить его. Они уже знают о проблеме (программисты-кандидаты с нулевыми навыками программирования), и все же не могут выполнить тест, который такой кандидат - с хорошими навыками Google - не мог пройти? WTF?
Вильям Бур
13
@ GradeinarPfeffernüsse Как кандидаты, которые не задавали никаких вопросов, успешно прошли этот тест? Это невозможно, потому что требования противоречивы; без разъяснений это упражнение просто невозможно!
Андрес Ф.
6
@MSalters Вы не можете предполагать, что lex specialis - это то, чего хотел автор требования, потому что это не является разумным предположением в реальном мире. Поэтому это упражнение нельзя выполнить, не задавая вопросов о явных противоречиях. Кто-то, кто прошел тест, не задавая вопросов, просто ошибся.
Андрес Ф.

Ответы:

31

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

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

Часть теста здесь является приоритетным порядком правил. Вы не указываете это. Ввод "ABC" может печатать Fizz, Buzz, BuzzBuzz или FizzBuzz - любой из них является правильным

Кандидат, которого я выберу, - это тот, кто понял (в основном) правильно, но задал много вопросов и, в идеале, сделал много «пустяков» на белой доске.

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

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

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

mattnz
источник
16
Мне кажется, что ОП пытается сделать слишком много с этим тестом. FizzBuzz предназначен для быстрого тестирования, чтобы показать, что кандидат может написать хоть что-то в коде. Кажется, это пытается сделать это, а также пытается посмотреть, как кандидаты проектируют с неоднозначными требованиями.
JK.
6
+1 за «Эти тесты имеют очень небольшое значение в интервью для начала». И если бы я мог добавить +1 еще раз за «Не имеет значения, если программа технически совершенна во всех аспектах, скорее всего, он из тех парней, которые будут поставлять программное обеспечение с« Мне все равно, не то, что вы хотел, это то, что вы просили "."
Шиван Дракон
7
Все вы, ребята, которые считают эти тесты бесполезными, пытаются сделать с ними слишком много ... FizzBuzz и его коллеги существуют только для одной цели: отсеять 90% кандидатов, которые вообще не знают, как программировать .
Роберт Харви
@RobertHarvey: За исключением того, что есть люди, которые умеют программировать, но в какой-то момент у FizzBuzz возникли бы трудности по разным причинам. (я являюсь одним из них).
Джеймс П. Райт
3
@ JamesP. Правильные ложные негативы являются проблемой для интервьюируемого, а не интервьюера. Пока количество ложных срабатываний достаточно мало, такой тест, как FizzBuzz, может быть полезен для интервьюеров.
JK.
27

Слово «только» в ваших требованиях создает противоречие во всех вопросах.

Таким образом, ваш вопрос проверяет требования, собранные в условиях стресса, вы уверены, что хотите проверить эту комбинацию навыков?

Если вы хотите проверить сбор требований, я бы предложил сделать ОДИН из вопросов двусмысленным. Если вы хотите заменить FizzBuzz, уберите двусмысленность.

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

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

jmoreno
источник
6
Вы действительно хотите нанять кого-то, кто не проясняет неясных требований, потому что он / она боится раздражать кого-то, задавая вопросы?
Ганс-Петер Стёрр
2
@hstoerr, может быть, и нет, но интервью - это ситуация с достаточно большим давлением.
А. Гилфрин
3
@hstoerr: проблема в том, что нет правильного ответа, но определенно есть неправильный ответ - что бы не понравилось интервьюеру. Вы хотите, чтобы собеседник задавал вопросы, другой мог бы пожелать, чтобы он высказал свое мнение, а третий, возможно, вообще не видит двусмысленности и рассматривает вопрос как неспособность понять простые инструкции. Рассмотрите это от POV кого-то, кому сказали, что ответ - тот, который дан "подавляющим большинством", которые не задают вопрос, все же отвечают на него так же. Тогда у вас есть люди, которые получают это, люди, которые получают это с помощью, и люди, которые этого не делают.
Jmoreno
16

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

С неоднозначностью требований нельзя правильно завершить v2.0, не задавая вопросов.

Питер Б
источник
2
+1… в нынешнем виде требования взаимно противоречивы, так что, по крайней мере, должен быть указан какой-то тип тай-брейка.
Конрад Рудольф
4
Интересно, что правила давали ощущение порядка (от общих случаев до особых случаев), и я почти инстинктивно решил сделать это в обратном порядке. Если я нахожусь в таком тесте, я не чувствую двусмысленности, но следую своему инстинкту.
Кодизм
4
@Codism, к сожалению, ваш инстинкт программиста может быть полной противоположностью желанию пользователя.
Стефан
@ Стефан: до конца, нет никаких разъяснений. Каждый в какой-то момент перестает рассуждать, основываясь на ряде факторов, таких как опыт, здравый смысл и т. Д. Даже если вы можете уточнить требования на данный момент, как вы собираетесь гарантировать, что они не изменятся завтра? Так что для меня на исходное требование, да, это достаточно разумно, и я буду выполнять его через пять минут.
Кодизм
1
@KonradRudolph: если только вы не решите немного интерпретировать слово «один из следующих», это означает, что не имеет значения, какой именно. Размышляя об этом, я могу видеть это как приемлемый ответ. Вам даже не нужно кодировать другие, это всего лишь тест, чтобы увидеть, можете ли вы сделать любой из них. В конце концов, на самом деле не существует бизнес-обоснования для решения одного решения над другим, это вопрос интервью, который в конечном итоге менее полезен, чем стандартный вопрос с обратной строкой.
Jmoreno
4

Если вы хотите устранить двусмысленность, вы можете изменить требования на:

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

  1. Выведите «Fizz», если строка содержит символ «$» и не содержит «?».
  2. Выведите «Buzz», если строка содержит символ «?» и не содержит '$'.
  3. Выведите «FizzBuzz», если строка содержит ровно один «$» и ровно один «?».
  4. Выведите «BuzzBuzz», если строка содержит ровно один «$» и более одного «?».
  5. Выведите «BuzzBuzz», если строка содержит ровно один символ «?» и более одного «$».
  6. Выведите «FizzFizz», если строка не содержит «$» и не содержит «?».
Томас Эдинг
источник
3

Вопрос слишком двусмысленный?

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

Снижает ли стресс среда собеседования способность критически мыслить до такой степени, что не может выполнить такую ​​тривиальную задачу?

Скорее всего, это признак того, что кандидат «забивает» FizzBuzz: стресс или нет, программа очень проста.

Я думаю, что модифицированный FizzBuzz не сравним с оригинальным, потому что его идеальное решение отличается: хотя цепочка if-then-elseостается приемлемой, я думаю, что решение на основе таблиц больше подходит для этой проблемы:

static string[,] FB = new string[3,3] {
    {"FizzFizz", "Buzz", "Buzz"}
,   {"Fizz", "FizzBuzz", "BuzzBuzz"}
,   {"Fizz", "BuzzBuzz", "BuzzBuzz"}
};
static string FizzBuzz(string str) {
    return FB[
        Math.Min(str.Count(c => c == 'a'), 2)
    ,   Math.Min(str.Count(c => c == 'b'), 2)
    ];
}

Размер проблемного пространства - 3x3нет 2x2, поэтому он сопоставляется с таблицей гораздо легче, чем исходный FizzBuzz. На самом деле, я считаю, что решение исходной проблемы FizzBuzz на основе таблиц труднее для понимания.

private static string[] FB = new[] {"{0}", "Fizz", "Buzz", "BizzBuzz"};
public static void Main() {
    for (var i = 1 ; i <= 100 ; i++) {
        Console.WriteLine(FB[(i%5==0?2:0)+(i%3==0?1:0)], i);
    }
}
dasblinkenlight
источник
2

Две вещи здесь:

  1. да, я думаю, что большинство людей просто гуглило шипение, а потом спотыкается, пытаясь расширить его
  2. Проверьте: http://dave.fayr.am/posts/2012-10-4-finding-fizzbuzz.html Это хорошо объясняет, как вы можете решить fizz buzz, используя соответствующие абстракции.
AndreasScheinert
источник
За исключением того, что он никогда не достигает нужного уровня абстракции. Он ближе всего подходит к монадам, но я думаю, что это слишком сложно. Простой список ключ / значение с прямым условным обозначением в конце достаточно прост для создания практически любого языка, более сложного, чем BrainFuck.
Jmoreno
2

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

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

Я прочитал этот fizzbuzz v2.0, и я бы спросил там о требованиях № 3 и № 5. Я не знаю о других людях, но нахожусь в инженерном деле, я не хочу никакой двусмысленности, поэтому я задаю вопрос. Потому что позже по линии (закодировано и все) я не хочу выяснять, что я должен был сделать предположение, и это было неправильно.

mythicalprogrammer
источник
Конечно, техника «мысли вслух» полезна, только если вы ищете программистов, которые предпочитают «мысли вслух». Это устраняет подавляющее большинство программистов и, возможно, оставляет в основном только программистов, которые лучше подходят для менеджеров, чем для программистов. В конце концов, мышление на «электрических» скоростях в мозге гораздо быстрее, чем на «механической» скорости разговора.
Данк
2

Возможно, самый простой способ избежать двусмысленности - показать несколько примеров:

"A" возвращает "Fizz" "aAbA" возвращает "Fizz" "B" возвращает "Buzz" "aBbB" возвращает "Buzz" "AB" возвращает "FizzBuzz" "ABaabb" возвращает "BuzzBuzz" "" возвращает "FizzFizz" "ab "возвращает" FizzFizz "

SnoopDougieDoug
источник
1
Хороший кандидат должен начать с нескольких тестовых строк и ожидаемых результатов, а затем поговорить о модульных тестах или просто переписать требования более формально и менее двусмысленно. Затем они расскажут о важности четких требований и о том, как ошибки требований могут быть на порядок дороже исправить, чем ошибки реализации.
Джон Лион,
2

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

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

Но для FFS не надо придумывать и скрывать настоящий тест за другим тестом. Просто спросите людей, как они справляются с этой чертовой проблемой. Опытный разработчик неоднократно сталкивался с неоднозначными требованиями и с удовольствием расскажет вам свои стратегии. Вы могли бы даже чему-то научиться.

И не думайте, что все хотят использовать доску или это удобный период рукописного ввода. Некоторые из нас печатали с 12 лет (большое спасибо Space Quest). Я даже не могу думать прямо с ручкой или маркером в руке. Это 20-freaking-13, что с досками уже? Когда люди протягивают мне ручку и бумагу и просят пройти кодовый тест, трудно сдержать смех.

Эрик Реппен
источник
1

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

Однако я немного беспокоюсь о том, что «успешные» кандидаты не задают вопросов. Я постараюсь выяснить, поняли ли они, что в некоторых случаях вы можете применить до 4 правил, и что в этом вопросе нет ничего, что могло бы разрешить эту двусмысленность, и попросили их объяснить, как они с этим справились. Возможно, ваш вопрос не настолько двусмысленный, чтобы заставить их задавать вопросы, или, возможно, вам следует попросить их мыслить вслух.

Кстати: мне странно, что вы говорите о «правильном решении». Если вы зададите такой вопрос, то вы можете напечатать «Fizz», «Buzz», «BuzzBuzz» или «FizzBuzz», если вы получили «AB». Так что ИМХО любое решение без вопросов просто неправильно.

Ханс-Петер Стёрр
источник