Ефективність 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

Деякі типові запитання, які задають кандидати:

  • Чи слід це враховувати регістри?
  • Чи означає "містить A і B" означає, що A має прийти перед B
  • Що слід надрукувати, якщо жодна з пунктів не виконується?
  • Що має відбутися, якщо можна виконати більше однієї умови?

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


26
Залиште питання трохи неоднозначним. Таким чином, ви можете бачити, які перспективи мають достатньо можливостей, щоб попросити роз'яснення (що саме по собі є ключовим для розвитку).
Томас Едінг

17
Правильна відповідь - потенційний розробник повинен сказати БА «виправити ці жахливі вимоги».
Кірк Бродхерст

7
Налаштування FizzBuzz - хороша ідея для фільтрації кандидатів, які вирішили вирішити Google. Це навіть не потрібно ускладнювати. Власне, я сумніваюся, що оригінальний FizzBuzz повинен був використовуватися дослівно всіма компаніями планети. Просто лінь з боку компанії не підлаштовувати її. Вони вже знають про проблему (кандидати з програмування з нульовими навичками програмування), але все ж не змогли реалізувати тест, який такий кандидат - з хорошими навичками Google - не міг пройти? WTF?
Viliam Búr

13
@ GradeinarPfeffernüsse Як кандидати, які не задали жодного питання, успішно склали цей тест? Це неможливо, оскільки вимоги суперечливі; без уточнення цю вправу просто неможливо виконати!
Андрес Ф.

6
@MSalters Ви не можете припустити, що lex specialis - це те, чого хотів автор вимоги, оскільки це не є розумним припущенням у реальному світі. Тому цю вправу не можна виконати, не задаючи питань про очевидні протиріччя. Хтось, хто пройшов тест, не задаючи питань, просто зрозумів його неправильно.
Андрес Ф.

Відповіді:


31

Це потенціал бути набагато кращим тестом, ніж FIZZBUZZ, але якщо у вас є якась концепція правильної відповіді, це найгірший тест у світі. Ці тести мають дуже мало значення в інтерв'ю для початку.

Якщо кандидат відповідає на це «Правильно», не задаючи запитання, у вас виникає проблема, що вибір кандидата вибере неправильний тип програміста. Він не в змозі визначити неоднозначні вимоги або не в змозі зрозуміти, що більшість людей не може написати однозначні вимоги . Не має значення, чи програма в технічному відношенні досконала в кожному аспекті, швидше за все, він такий тип хлопця, який доставить програмне забезпечення з "Мені все одно, не те, що ти хотів, це те, про що ти просив".

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

Кандидат, який я б взяв, - це той, хто отримав це (в основному) правильно, але задав багато питань і, в ідеалі, зробив багато "додавання" на дошці.

Наприклад, я досліджував би своє розуміння цих вимог, надаючи вам ряд зразків текстів і запитуючи, що ви очікуєте надрукувати, і чому. - Обговорення мого прикладу "ABC" має призвести до корисних наполягань для вас.

Так само, як і FIZZBUZZ, результат цього тесту є настільки ж хорошим, як і ваші спостереження щодо того, як результат був отриманий - результат не має значення.

Я хотів би трохи підправити це - лише щоб зробити його цікавішим - вийміть «тільки». Це висвітлено у рядку вище ("надрукувати одне з наступних"), і подивіться, скільки людей запитують про це. Якщо кандидат пропускає "єдине", а у вас є час, вкажіть це і подивіться, що станеться. Якщо він має справу з "єдиним", видаліть його з вимоги і змусьте їх змінити код.


16
Мені це звучить так, ніби ОП намагається зробити занадто багато цього тесту. FizzBuzz призначений для швидкого тесту, щоб показати, що кандидат може написати хоч щось у коді. Здається, це намагається зробити, а також намагається подивитися на те, як кандидати проектують процес із неоднозначними вимогами.
jk.

6
+1 для "Ці тести мають дуже мало значення в інтерв'ю для початку". І якби я міг би поставити +1 ще раз для "Неважливо, чи програма є технічно досконалою у всіх аспектах, це, мабуть, він такий тип хлопця, який постачає програмне забезпечення із" Мені все одно, це не ти, що ти хотів, це те, про що ви просили ".
Дракон Шиван

7
Усі ви, хто вважає ці тести марними, намагаєтеся зробити з ними занадто багато ... FizzBuzz та його колеги існують лише з однією метою: відлучити 90% тих, хто взагалі не вміє програмувати .
Роберт Харві

@RobertHarvey: За винятком того, що є люди, які можуть програмувати, але в один момент вони мали б труднощі з FizzBuzz з різних причин. (я один із них).
Джеймс П. Райт

3
@ JamesP.Wright помилки є проблемою для респондента, а не інтерв'юера. Поки кількість помилкових позитивних результатів є достатньо низькою, тест на зразок FizzBuzz може бути корисним для інтерв'юерів.
jk.

27

Слово "тільки" у ваших вимогах створює протиріччя у всіх питаннях.

Таким чином, ваші запитання тестують вимоги, що збираються, перебуваючи під тиском, ви впевнені, що хочете перевірити на поєднання вмінь?

Якщо ви хочете перевірити збір вимог, я б запропонував зробити ОДНЕ з питань неоднозначним. Якщо ви хочете замінити FizzBuzz, усуньте двозначність.

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

Але вимагати від кого-небудь запитання про роз'яснення, коли це робить істотний ризик небажаного результату, можливо, не найкращий спосіб оцінити свою майстерність у визнанні меж своїх знань. Вони можуть зрозуміти, що безпечніше здогадуватися та помилятися, ніж вказувати на те, що ви некомпетентні у написанні вимог, або якщо жоден з інтерв'юерів не є розробниками, і його вважають поганим ставленням.


6
Ви дійсно хочете найняти когось, хто не уточнив незрозумілі вимоги, бо боїться дратувати когось, задаючи питання?
Ганс-Петер Стерр

2
@hstoerr, можливо, це не так, але інтерв'ю - це ситуація, в якій достатньо тиску.
А. Гільфрін

3
@hstoerr: проблема в тому, що немає правильної відповіді, але напевно є неправильна відповідь - все, що інтерв'ю не подобається. Ви хочете, щоб опитуваний ставив запитання, інший, можливо, хотів би, щоб вони судили, а ще один може не бачити двозначності і вважати, що задає питання як нездатність зрозуміти прості інструкції. Розгляньте це з POV того, кому сказали, що відповідь - це відповідь, подана "переважною більшістю", які не задають питання, але на це відповідають так само. Потім у вас є люди, які отримують це, люди, які отримують це за допомогою, і люди, які цього не роблять.
jmoreno

16

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

З неоднозначністю вимог не можна правильно закінчити v2.0, не задаючи питань.


2
+1 ... як зараз, вимоги є взаємно суперечливими, тому принаймні якийсь розрив тай-тай повинен бути вказаний.
Конрад Рудольф

4
Цікаво, що правила давали відчуття порядку (від загальних справ до особливих справ), і я майже інстинктивно вирішив це зробити у зворотному порядку. Якби я був на такому випробуванні, я не відчував би двозначності, але слідував за своїм інстинктом.
Кодизм

4
@Codism, на жаль, ваш інстинкт як програміста може бути точно протилежним тому, що хотів користувач.
Стефан

@Stefan: якщо говорити про розширення, це не має кінця. Всі перестають міркувати в якийсь момент на основі набору факторів, таких як досвід, здоровий глузд і т. Д. Навіть якщо ви можете уточнити вимогу на даний момент, як ви збираєтесь гарантувати, що вони не зміниться завтра? Тож до мене за первісною вимогою, так, це досить розумно, і я реалізую це за п’ять хвилин.
Кодизм

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);
    }
}

2

Тут дві речі:

  1. так, я думаю, що більшість людей просто гуляє фіз-гудом, а потім спотикаються, коли намагаються розширити його
  2. Перевірте: http://dave.fayr.am/posts/2012-10-4-finding-fizzbuzz.html Це добре пояснює, як можна вирішити фіз-шум, використовуючи відповідні абстракції.

За винятком того, що він ніколи не виходить на потрібний рівень абстракції. Він найближчий з монадами, але я думаю, що це занадто складно. Простий список ключів / значень, з прямим перемогою вперед в кінці, досить легко зробити майже будь-якою складнішою мовою, ніж BrainFuck.
jmoreno

2

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

Я бачив процеси інтерв'ю, які спонукають програмістів думати вголос і задавати питання, щоб побачити їх процес мислення. Мені подобається цей процес краще.

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


Звичайно, техніка "думай вголос" корисна лише в тому випадку, якщо ти шукаєш програмістів, які вважають за краще "думати вголос". Це виключає переважну більшість програмістів і, мабуть, залишає лише тих програмістів, які краще підходять як менеджери, ніж програмісти. Адже мислення з «електричними» швидкостями в мозку набагато швидше, ніж мислення з «механічною» швидкістю розмови.
Данк

2

Мабуть, найпростіший спосіб уникнути двозначності - показати кілька прикладів:

"A" повертається "Fizz" "aAbA" повертається "Fizz" "B" повертається "Buzz" "aBbB" повертається "Buzz" "AB" повертається "FizzBuzz" "ABaabb" повертається "BuzzBuzz" "" повертається "FizzFizz" "ab "повертає" FizzFizz "


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

2

Замість того, щоб давати кандидату суперечливі / незрозумілі вимоги, просто запитайте їх, як вони впораються з цими ситуаціями. Інакше ти змушуєш себе виглядати некомпетентним або ще гірше, коли компетентних людей виставляє зрадницький промінь балансу "як я можу отримати відповіді, які мені потрібні, не маючи на увазі, що це питання інтерв'ю чи людина, яка його задає, дурна?"

У будь-якому випадку це дратує, як і всі вихідці. Інтерв'ю - це процес узгодження, і я маю на увазі двосторонні вулиці. Прямі питання та ясність намірів набагато важливіші, ніж ставити кандидата під скороварку, ІМО. FizzBuzz - хороший приклад кодування питання, оскільки він короткий і солодкий. Не використовуйте його повторно. Напишіть такі прості запитання, як це, за цією моделлю.

Але FFS не розуміє цього і ховає справжній тест за іншим тестом. Просто запитайте людей, як вони справляються з проклятою проблемою. Досвідчений розробник неодноразово розбирався з неоднозначними вимогами і з радістю розповість вам про їхні стратегії. Ви навіть можете чогось навчитися.

І не припускайте, що всі хочуть використовувати дошку або це зручний час написання рукописного тексту. Деякі з нас друкують з 12 років (завдяки спасибі Space Quest). Я навіть не можу думати прямо з пером чи маркером у руці. Це 20-диво-13, що вже з дошками? Коли люди передають мені ручку та папір і просять зробити тест на код, важко придушити сміх.


1

Я думаю, це приємне питання інтерв'ю. Вимоги незрозумілі, як і часто в реальності. Ви перевіряєте, чи кандидат достатньо розумний, щоб усвідомити це (навіть в умовах стресу), що він / вона не боїться ставити питання, які вважаєте за потрібне, і чи здатний він ставити вимоги до розумної структури. І це трохи розповідає про їхні можливості програмування, хоча ви також повинні поставити деякі складніші проблеми, що містять рекурсію та покажчики, оскільки ця проблема занадто проста.

Однак я трохи хвилююся, коли "успішні" кандидати не задають питань. Я б спробував дізнатись, чи зрозуміли вони, що ви можете застосовувати до 4 правил у деяких випадках, і що в питанні немає нічого, що могло б вирішити цю неоднозначність, і дозволити їм пояснити, як вони з цим боролися. Можливо, ваше запитання недостатньо неоднозначне, щоб змусити їх запитати, або, можливо, вам слід попросити їх подумати вголос.

До речі: мені дивно, що ви говорите про "правильне рішення". Якщо ви сформулюєте таке запитання, правомірно друкувати або "Fizz", "Buzz", "BuzzBuzz" або "FizzBuzz", якщо ви отримаєте "AB". Отже, IMHO будь-яке рішення без запитань є явно неправильним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.