Skuteczność FizzBuzz i Beyond [zamknięte]

38

W ramach rozmowy kwalifikacyjnej początkowo prosimy kandydatów o zrobienie „FizzBuzz”, a obecnie odsetek kandydatów, którzy potrafią poprawnie odpowiedzieć na FizzBuzz, gwałtownie wzrósł - może to być spowodowane jego popularnością w Internecie.

Około rok temu jako drugie pytanie zaczęliśmy zadawać pytanie bardzo podobne do oryginalnego FizzBuzz. Pytanie zostało zaprojektowane tak, aby było tak proste jak oryginalny FizzBuzz, a także aby ocenić konkretną zdolność kandydata, w szczególności zdolność do porządkowania i ustalania priorytetów w sensowny i logiczny sposób zestaw „reguł biznesowych”, które zostały określone w niektórych arbitralne zamówienie. Sformułowanie pytania na początku wydaje się nieco niejednoznaczne, co może utrudnić obcokrajowcom mówiącym po angielsku, ale jeśli przemyślenie można rozwiązać poprawnie - Daje to również kandydatowi możliwość zadawania pytań w celu wyjaśnienia, co zawsze jest dobrą rzeczą .

Uważamy, że jest to bardzo ważna umiejętność jako programista, ponieważ tworzenie oprogramowania zwykle opiera się na wymaganiach funkcjonalnych, które nie są ustalane w określonej kolejności w czasie, które mogą nakładać ograniczenia i warunki na inne obszary oprogramowania bez wyraźnego wskazania i jest to zadaniem bystrego programisty jest przynajmniej zbadanie potencjalnych problemów i konfliktów związanych z wdrażaniem.

Odkryliśmy, że nieco ponad 65% kandydatów (wielkość próby 38), którzy pozytywnie przeszli FizzBuzz, całkowicie zawiodło. FizzBuzz v2.0 Normalnie ci kandydaci zostaną wykryci później, ale wydaje się, że to dobry sposób na wykrycie je wcześnie.

Moje pytanie nie dotyczy tego, czy FizzBuzz jest przestarzały, ale raczej, jakie czynniki mogą przyczynić się do tak dużej liczby kandydatów, którzy nie zdadzą pytania FizzBuzz v2.

  • Czy pytanie jest zbyt dwuznaczne?
  • Czy stres środowiska wywiadu zmniejsza zdolność krytycznego myślenia do tego stopnia, że ​​nie jest w stanie wykonać tak banalnego zadania?

Pytanie:

Napisz procedurę w swoim ulubionym języku programowania, która weźmie listę ciągów jako dane wejściowe, a dla każdego ciągu na liście wykona jedną z następujących czynności:

  1. Drukuj tylko Fizz, jeśli ciąg zawiera literę A.
  2. Drukuj tylko Buzz, jeśli ciąg zawiera literę B.
  3. Drukuj tylko BuzzBuzz, jeśli ciąg zawiera zarówno A, jak i B
  4. Drukuj tylko FizzFizz, jeśli ciąg nie zawiera zarówno A, jak i B
  5. Drukuj tylko FizzBuzz, jeśli ciąg zawiera tylko jeden A i tylko jeden B

Niektóre typowe pytania zadawane przez kandydatów to:

  • Czy wielkość liter ma być rozróżniana?
  • Czy „zawiera A i B” oznacza, że ​​A powinien pojawić się przed B.
  • Co należy wydrukować, jeśli żaden z punktów nie zostanie spełniony?
  • Co powinno się stać, jeśli można spełnić więcej niż jeden warunek?

Okazało się, że przeważająca większość kandydatów, którzy pomyślnie ukończyli pytanie, w ogóle nie zadawała pytań, po prostu zrobili to tak, jak FizzBuzz.

Gradeinar Pfeffernüsse
źródło
26
Pozostaw pytanie trochę niejednoznaczne. W ten sposób możesz zobaczyć, którzy potencjalni klienci mają wystarczająco dużo żucia, by prosić o wyjaśnienia (co samo w sobie jest kluczem do rozwoju).
Thomas Eding,
17
Prawidłowa odpowiedź jest dla przyszłego programisty, aby powiedział BA „naprawić te okropne wymagania”.
Kirk Broadhurst,
7
Dostosowywanie FizzBuzz to dobry pomysł, aby odfiltrować kandydatów, którzy wyszukali rozwiązanie. Nie jest nawet konieczne utrudnianie. W rzeczywistości wątpię, aby oryginalny FizzBuzz miał być używany dosłownie przez wszystkie firmy na tej planecie. To jest po prostu lenistwo ze strony firmy, aby nie dostosować go. Są już świadomi problemu (programowanie kandydatów z zerowymi umiejętnościami programistycznymi), a jednak nie wdrażają testu, którego taki kandydat - z dobrymi umiejętnościami Google - nie mógł przejść? WTF?
Viliam Búr
13
@ GradeinarPfeffernüsse W jaki sposób kandydaci, którzy nie zadali żadnych pytań, pomyślnie ukończyli ten test? Jest to niemożliwe, ponieważ wymagania są sprzeczne; bez wyjaśnienia tego ćwiczenia po prostu nie można wykonać!
Andres F.,
6
@MSalters Nie można zakładać, że lex specialis jest tym, czego chciał autor wymagania, ponieważ nie jest to rozsądne założenie w świecie rzeczywistym. Dlatego tego ćwiczenia nie można ukończyć bez zadawania pytań na temat pozornych sprzeczności. Ktoś kończący test bez zadawania pytań po prostu źle go zrozumiał.
Andres F.,

Odpowiedzi:

31

Może to być znacznie lepszy test niż FIZZBUZZ, ale jeśli masz jakieś pojęcie poprawnej odpowiedzi, jest to najgorszy test na świecie. Testy te mają bardzo małą wartość w wywiadach na początek.

Jeśli kandydat odpowie „Prawidłowo” bez zadawania pytania, to masz problem, że wybór kandydata wybierze niewłaściwy rodzaj programisty - Nie jest on w stanie zidentyfikować niejednoznacznych wymagań lub nie jest w stanie zrozumieć, że większość ludzi nie może napisać jednoznacznych wymagań . Nie ma znaczenia, czy program jest perfekcyjny technicznie pod każdym względem, prawdopodobnie jest typem faceta, który dostarczy oprogramowanie z „Nie obchodzi mnie, że nie to, czego chciałeś, to o co prosiłeś”.

Część testu tutaj jest priorytetem reguł. Nie określasz tego. Wpisz „ABC”, aby wydrukować Fizz, Buzz, BuzzBuzz lub FizzBuzz - każdy z nich jest poprawny

Kandydat, którego bym wziął, to ten, który miał (w większości) rację, ale zadał wiele pytań i, najlepiej, zrobił wiele „uników” na białej tablicy.

Na przykład chciałbym zbadać moje rozumienie tych wymagań, podając serię przykładowych tekstów i pytając, czego się spodziewasz i dlaczego. - Dyskusja na temat mojego przykładu „ABC” powinna prowadzić do użytecznych wskazówek dla ciebie.

Podobnie jak FIZZBUZZ, wynik tego testu jest tak dobry, jak twoje obserwacje poczynione na temat tego, jak uzyskano wynik - wynik jest nieistotny.

Ulepszę to trochę - aby uczynić to bardziej interesującym - wyjmij „jedyne”. Jest to opisane w powyższej linii („wydrukuj jedną z poniższych”) i zobacz, ile osób o to pyta. Jeśli kandydatowi brakuje „jedynego” i masz czas, wskaż go i zobacz, co się stanie. Jeśli zajmuje się „tylko”, usuń go z wymogu i poproś o zmianę kodu.

mattnz
źródło
16
Wydaje mi się, że OP próbuje z tym testem zrobić zbyt wiele. FizzBuzz ma być szybkim testem pokazującym, że kandydat może napisać przynajmniej coś w kodzie. Wydaje się, że próbuje to zrobić, a także stara się spojrzeć na to, jak kandydaci projektują proces z niejednoznacznymi wymaganiami.
jk.
6
+1 za „Te testy mają na początku bardzo małą wartość w wywiadach”. I gdybym mógł, dałbym to +1 jeszcze raz za: „Nie ma znaczenia, czy program jest technicznie doskonały pod każdym względem, to prawdopodobnie jest typem faceta, który dostarczy oprogramowanie z„ Nie obchodzi mnie to, co nie chciałem, właśnie o to prosiłeś "."
Shivan Dragon,
7
Wszyscy z was, którzy uważają te testy za bezużyteczne, starają się z nimi zrobić zbyt wiele ... FizzBuzz i jego odpowiedniki istnieją tylko w jednym celu: wyeliminować 90% kandydatów, którzy w ogóle nie wiedzą, jak programować .
Robert Harvey
@RobertHarvey: Tyle, że są ludzie, którzy mogą programować, ale w pewnym momencie miałby trudności z FizzBuzz z różnych powodów. (ja jestem jednym z nich).
James P. Wright
3
@ JamesP.Wright fałszywe negatywy są problemem dla rozmówcy, a nie dla ankietera. Dopóki liczba wyników fałszywie dodatnich jest wystarczająco niska, test taki jak FizzBuzz może być przydatny dla ankieterów.
jk.
27

Słowo „tylko” w twoich wymaganiach stwarza sprzeczność we wszystkich pytaniach.

W związku z tym twoje pytania testowe zbierają się pod presją, czy na pewno chcesz przetestować tę kombinację umiejętności?

Jeśli chcesz przetestować zbieranie wymagań, sugeruję, aby JEDEN z pytań był niejednoznaczny. Jeśli chcesz zastąpić FizzBuzz, usuń niejednoznaczność.

Priorytetowe reguły biznesowe można wykonać tylko przy wiedzy specyficznej dla domeny - chyba że podasz jakiś prosty kontekst tego, co robisz (być może są to kupony, które można wykorzystać na różne wartości), nie ma podstaw do podjęcia przez programistę własnej decyzji.

Jednak wymaganie od kogoś, aby poprosił o wyjaśnienie, w przypadku gdy wiąże się to ze znacznym ryzykiem niepożądanego wyniku, może nie jest najlepszym sposobem oceny ich umiejętności w rozpoznawaniu granic ich wiedzy. Mogą dojść do wniosku, że bezpieczniej jest zgadywać i nie rozumieć źle, niż wskazać, że jesteś niekompetentny w pisaniu wymagań, lub jeśli żaden z ankieterów nie jest programistą, ponieważ jest źle oceniany.

jmoreno
źródło
6
Czy naprawdę chcesz zatrudnić kogoś, kto nie wyjaśnia niejasnych wymagań, ponieważ boi się kogoś drażnić, zadając pytania?
Hans-Peter Störr
2
@hstoerr, może nie, ale wywiad jest sytuacją, w której panuje uzasadniona presja.
A. Gilfrin
3
@ hstoerr: problem polega na tym, że nie ma właściwej odpowiedzi, ale zdecydowanie jest zła odpowiedź - cokolwiek ankieterowi się nie podoba. Chcesz, aby rozmówca zadawał pytania, inny może chcieć, aby osądził, a jeszcze inny może nie widzieć żadnych dwuznaczności i postrzegać zadawanie pytań jako niemożność zrozumienia prostych instrukcji. Rozważ to z POV osoby, której powiedziano, że odpowiedź jest udzielona przez „ogromną większość”, która nie zadaje pytania, ale odpowiedz na to w ten sam sposób. Potem masz ludzi, którzy to dostają, ludzi, którzy dostają to z pomocą i ludzi, którzy nie.
jmoreno
16

Okazało się, że przeważająca większość kandydatów, którzy pomyślnie ukończyli pytanie, w ogóle nie zadawała pytań, po prostu zrobili to tak, jak FizzBuzz.

Przy dwuznaczności wymagań nie można poprawnie zakończyć wersji 2.0 bez zadawania pytań.

Pieter B.
źródło
2
+1… w obecnej postaci wymagania są ze sobą sprzeczne, więc przynajmniej należy określić pewien rodzaj rozstrzygnięcia.
Konrad Rudolph
4
Co ciekawe, reguły dawały poczucie porządku (od przypadków ogólnych do przypadków specjalnych) i prawie instynktownie postanowiłem to zrobić w odwrotnej kolejności. Gdybym był w takiej próbie, nie czułbym dwuznaczności, ale podążałbym za swoim instynktem.
Codism
4
@Codism niestety twój instynkt programisty może być dokładnym przeciwieństwem tego, czego chciał użytkownik.
Stefan
@Stefan: do pewnego stopnia wyjaśnienia nie mają końca. Każdy w pewnym momencie przestaje rozumować w oparciu o zestaw czynników, takich jak doświadczenie, zdrowy rozsądek itp. Nawet jeśli możesz wyjaśnić na razie wymóg, jak zamierzasz zagwarantować, że nie zmieni się jutro? Jeśli chodzi o pierwotne wymaganie, tak, jest to wystarczająco rozsądne i zaimplementuję je za pięć minut.
Codism
1
@KonradRudolph: chyba że zdecydujesz się zinterpretować bit o „jednym z poniższych”, co oznacza, że ​​nie ma znaczenia, który. Zastanawiając się nad tym, widzę to jako akceptowalną odpowiedź. Nie musisz nawet kodować pozostałych, to tylko test, aby sprawdzić, czy możesz wykonać którekolwiek z nich. W końcu tak naprawdę nie ma uzasadnienia biznesowego dla jednego rozwiązania nad drugim, jest to pytanie do wywiadu, które jest ostatecznie mniej przydatne niż standardowe odwrócenie ciągu znaków.
jmoreno
4

Jeśli chcesz usunąć niejednoznaczność, możesz zmienić wymagania na:

Napisz procedurę w swoim ulubionym języku programowania, która weźmie listę ciągów jako dane wejściowe, a dla każdego ciągu na liście wykonaj następujące czynności:

  1. Wydrukuj „Fizz”, jeśli ciąg zawiera znak „$” i nie zawiera „?”.
  2. Wyświetl „Buzz”, jeśli ciąg znaków zawiera znak „?” i nie zawiera „$”.
  3. Wydrukuj „FizzBuzz”, jeśli ciąg zawiera dokładnie jeden „$” i dokładnie jeden „?”.
  4. Wydrukuj „BuzzBuzz”, jeśli ciąg zawiera dokładnie jeden „$” i więcej niż jeden „?”.
  5. Wydrukuj „BuzzBuzz”, jeśli ciąg zawiera dokładnie jedno „?” i więcej niż jeden „$”.
  6. Wydrukuj „FizzFizz”, jeśli ciąg nie zawiera „$” i nie zawiera „?”.
Thomas Eding
źródło
3

Czy pytanie jest zbyt dwuznaczne?

Tak, pytanie jest zbyt dwuznaczne, aby na nie odpowiedzieć bez wyjaśnień. Jednak dodatkowa reguła mówiąca, że ​​w przypadkach, gdy stosuje się wiele reguł, twój program powinien wybrać najbardziej konkretną rzecz, powinien usunąć niejasności.

Czy stres środowiska wywiadu zmniejsza zdolność krytycznego myślenia do tego stopnia, że ​​nie jest w stanie wykonać tak banalnego zadania?

Bardziej prawdopodobne jest, że kandydat „wcisnął” FizzBuzz: stres czy nie, program jest bardzo prosty.

Myślę, że zmodyfikowany FizzBuzz nie jest porównywalny z oryginalnym, ponieważ jego idealne rozwiązanie jest inne: chociaż łańcuch zachowań jest if-then-elseakceptowalny, myślę, że rozwiązanie oparte na tabeli jest bardziej odpowiednie dla tego problemu:

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

Rozmiar obszaru problemowego 3x3nie jest 2x2, więc mapuje się go na stole znacznie łatwiej niż oryginalny FizzBuzz. W rzeczywistości trudniej jest mi zrozumieć oparte na tabelach rozwiązanie pierwotnego problemu 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
źródło
2

Dwie rzeczy tutaj:

  1. tak, myślę, że większość ludzi po prostu brzęczy w gazecie, a potem się potyka, gdy próbują ją rozwinąć
  2. Sprawdź: http://dave.fayr.am/posts/2012-10-4-finding-fizzbuzz.html Miło wyjaśnia, w jaki sposób można rozwiązać szum fizyczny za pomocą odpowiednich abstrakcji.
AndreasScheinert
źródło
Tyle że nigdy nie osiąga odpowiedniego poziomu abstrakcji. Zbliża się do monad, ale myślę, że to trochę zbyt skomplikowane. Prosta lista kluczy / wartości z prostymi warunkami na końcu jest łatwa do zrobienia w każdym języku bardziej złożonym niż BrainFuck.
jmoreno
2

Okazało się, że przeważająca większość kandydatów, którzy pomyślnie ukończyli pytanie, w ogóle nie zadawała pytań, po prostu zrobili to tak, jak FizzBuzz.

Widziałem procesy wywiadu, które zachęcają programistów do głośnego myślenia i zadawania pytań, aby zobaczyć ich proces myślenia. Ten proces bardziej mi się podoba.

Przeczytałem ten fizzbuzz v2.0 i zapytałem o wymagania # 3 i # 5. Nie znam innych ludzi, ale uważam, że w inżynierii nie chcę żadnych dwuznaczności, więc zadaję pytanie. Ponieważ później (zakodowane i wszystko), nie chcę się dowiedzieć, że musiałem założyć i to było złe.

mityczny programista
źródło
Oczywiście technika „myśl na głos” jest przydatna tylko wtedy, gdy szukasz programistów, którzy wolą „myśleć na głos”. To eliminuje przytłaczającą większość programistów i prawdopodobnie pozostawia głównie programistów, którzy lepiej nadają się jako menedżerowie niż programiści. W końcu myślenie z prędkością „elektryczną” w mózgu jest znacznie szybsze niż myślenie z „mechaniczną” prędkością mówienia.
Dunk
2

Być może najłatwiejszym sposobem uniknięcia dwuznaczności jest pokazanie kilku przykładów:

„A” zwraca „Fizz” „aAbA” zwraca „Fizz” „B” zwraca „Buzz” „aBbB” zwraca „Buzz” „AB” zwraca „FizzBuzz” „ABaabb” zwraca „BuzzBuzz” „” zwraca „FizzFizz” „ab „zwraca” FizzFizz ”

SnoopDougieDoug
źródło
1
Dobry kandydat zaczynałby od niektórych ciągów testowych i oczekiwanych wyników, a następnie mówił o testach jednostkowych lub po prostu przepisywał wymagania bardziej formalnie i mniej niejednoznacznie. Następnie rozmawiali o znaczeniu jasnych wymagań oraz o tym, jak błędy wymagań mogą być o rząd wielkości droższe do naprawienia niż błędy implementacyjne.
John Lyon
2

Zamiast dawać kandydatowi sprzeczne / niejasne wymagania, po prostu zapytaj go, jak sobie radzą w takich sytuacjach. W przeciwnym razie wyglądasz na niekompetentnego lub gorzej, stawiając kompetentnych ludzi na zdradzieckim balansie równowagi: „jak uzyskać odpowiedzi, których potrzebuję, nie sugerując, że to pytanie lub osoba zadająca to pytanie jest głupie?”

Tak czy inaczej, to irytujące, jak wszyscy uciekają. Wywiady są dopasowanym procesem i mam na myśli dwukierunkową ulicę. Bezpośrednie pytania i jasność intencji są o wiele ważniejsze niż poddanie kandydata szybkowarowi, IMO. FizzBuzz jest dobrym przykładem pytania o kodowanie, ponieważ jest krótkie i słodkie. Nie używaj go ponownie bezpośrednio. Napisz proste pytania podobne do tego modelu.

Ale w przypadku FFS nie bądź mądry i nie kryj prawdziwego testu za kolejnym testem. Zapytaj ludzi, jak sobie radzą z tym cholernym problemem. Doświadczony programista będzie wielokrotnie stawiał czoła dwuznacznym wymaganiom i chętnie opowie o swoich strategiach. Możesz się nawet czegoś nauczyć.

I nie zakładaj, że wszyscy chcą korzystać z tablicy lub są wygodnym okresem pisma ręcznego. Niektórzy z nas piszą na maszynie odkąd skończyliśmy 12 lat (wielkie dzięki Space Quest). Nie mogę nawet myśleć prosto z długopisem lub markerem w dłoni. Jest 20-cholernie-13, co już jest z tablicami? Kiedy ludzie wręczają mi długopis i kartkę i proszą o wykonanie testu kodu, trudno jest powstrzymać śmiech.

Erik Reppen
źródło
1

Myślę, że to miłe pytanie podczas rozmowy kwalifikacyjnej. Wymagania są niejasne, tak jak często są w rzeczywistości. Sprawdzasz, czy kandydat jest wystarczająco inteligentny, aby zdać sobie z tego sprawę (nawet pod wpływem stresu), czy nie boi się zadawać pytań, które uznają za konieczne, i jest w stanie wprowadzić wymagania w rozsądną strukturę. I to trochę mówi o ich umiejętnościach programistycznych, chociaż powinieneś również stwarzać bardziej skomplikowane problemy zawierające rekurencję i wskaźniki, ponieważ ten problem jest zbyt łatwy.

Martwię się jednak trochę o to, że „odnoszący sukcesy” kandydaci nie zadają pytań. Spróbuję dowiedzieć się, czy zdali sobie sprawę, że w niektórych przypadkach można zastosować do 4 zasad i czy w pytaniu nie ma nic, co rozwiązałoby tę dwuznaczność, i poprosili, by wyjaśnili, jak sobie z tym poradzili. Być może twoje pytanie nie jest na tyle dwuznaczne, aby zmusić ich do zadawania pytań, a może powinieneś poprosić ich, aby zastanowili się na głos.

BTW: Wydaje mi się dziwne, że mówisz o „poprawnym rozwiązaniu”. Jeśli sformułujesz takie pytanie, uzasadnione jest wydrukowanie „Fizz”, „Buzz”, „BuzzBuzz” lub „FizzBuzz”, jeśli pojawi się „AB”. Zatem IMHO każde rozwiązanie bez zadawania pytań jest po prostu błędne.

Hans-Peter Störr
źródło