Wirksamkeit von FizzBuzz und darüber hinaus

38

Als Teil des Interviewprozesses bitten wir die Kandidaten zunächst, 'FizzBuzz' zu machen. Heutzutage ist der Prozentsatz der Kandidaten, die FizzBuzz richtig beantworten können, dramatisch gestiegen - dies kann an seiner Popularität im Web liegen.

Vor ungefähr einem Jahr haben wir als zweite Frage begonnen, eine Frage zu stellen, die der ursprünglichen FizzBuzz sehr ähnlich ist. Die Frage sollte so einfach wie das ursprüngliche FizzBuzz sein und auch eine bestimmte Fähigkeit des Kandidaten bewerten, insbesondere die Fähigkeit, eine Reihe von "Geschäftsregeln", die in einigen bereitgestellt wurden, auf sinnvolle und logische Weise zu ordnen und zu priorisieren beliebige Reihenfolge. Der Wortlaut der Frage erscheint zunächst etwas mehrdeutig, was es für nicht englischsprachige Personen schwierig machen kann, aber wenn er durchdacht ist, kann er sie richtig lösen. Außerdem hat der Kandidat die Möglichkeit, Fragen zur Klärung zu stellen, was immer eine gute Sache ist .

Wir sind der Ansicht, dass dies eine sehr wichtige Fähigkeit für Entwickler ist, da die Softwareentwicklung in der Regel auf funktionalen Anforderungen basiert, die im Laufe der Zeit in keiner bestimmten Reihenfolge festgelegt werden und möglicherweise Einschränkungen und Bedingungen für andere Bereiche der Software mit sich bringen, ohne dies ausdrücklich anzugeben die Aufgabe des erfahrenen Entwicklers, zumindest potenzielle Probleme und Konflikte im Hinblick auf die Implementierung zu untersuchen.

Wir haben festgestellt, dass etwas mehr als 65% der Kandidaten (Stichprobengröße 38), die FizzBuzz bestanden haben, FizzBuzz v2.0 komplett nicht bestanden haben. Normalerweise werden diese Kandidaten später im Prozess erkannt, aber es scheint eine gute Möglichkeit zu sein, dies zu erkennen sie früh.

Meine Frage ist nicht, ob FizzBuzz veraltet ist oder nicht, sondern welche Faktoren dazu beitragen könnten, dass so viele Kandidaten die FizzBuzz v2-Frage nicht bestehen.

  • Ist die Frage zu vieldeutig?
  • Verringert der Stress in einer Interviewumgebung die Fähigkeit, kritisch zu denken, bis es nicht mehr möglich ist, eine so einfache Aufgabe zu erfüllen?

Frage:

Schreiben Sie eine Routine in Ihrer bevorzugten Programmiersprache, die eine Liste von Zeichenfolgen als Eingabe verwendet und für jede Zeichenfolge in der Liste eine der folgenden Aktionen ausführt:

  1. Drucken Sie nur Fizz aus, wenn die Zeichenfolge den Buchstaben A enthält
  2. Nur Buzz drucken, wenn der String den Buchstaben B enthält
  3. Gib nur BuzzBuzz aus, wenn der String sowohl A als auch B enthält
  4. Drucken Sie nur FizzFizz, wenn die Zeichenfolge nicht sowohl A als auch B enthält
  5. Drucken Sie nur FizzBuzz aus, wenn die Zeichenfolge nur ein A und nur ein B enthält

Einige typische Fragen der Kandidaten sind:

  • Sollte die Groß- und Kleinschreibung beachtet werden?
  • Bedeutet "enthält A und B", dass A vor B kommen sollte
  • Was soll gedruckt werden, wenn keiner der Punkte erfüllt ist?
  • Was soll passieren, wenn mehr als eine Bedingung erfüllt werden kann?

Wir haben festgestellt, dass die überwiegende Mehrheit der Kandidaten, die die Frage erfolgreich beantwortet haben, überhaupt nichts gefragt hat. Sie haben es einfach so gemacht, wie sie es mit FizzBuzz gemacht haben.

Gradeinar Pfeffernüsse
quelle
26
Lassen Sie die Frage etwas mehrdeutig. Auf diese Weise können Sie sehen, welche potenziellen Kunden genügend Interesse an einer Klärung haben (was für sich genommen der Schlüssel zur Entwicklung ist).
Thomas Eding
17
Die richtige Antwort ist, dass der angehende Entwickler der BA sagt, dass sie diese schrecklichen Anforderungen beheben soll.
Kirk Broadhurst
7
Das Anpassen von FizzBuzz ist eine gute Idee, um Kandidaten herauszufiltern, die die Lösung gegoogelt haben. Es ist nicht einmal notwendig, es schwieriger zu machen. Eigentlich bezweifle ich, dass der ursprüngliche FizzBuzz von allen Firmen auf dem Planeten wörtlich verwendet werden sollte. Es ist nur Faulheit eines Unternehmens, es nicht anzupassen. Sie sind sich des Problems bereits bewusst (Programmierkandidaten mit null Programmierkenntnissen) und können dennoch keinen Test durchführen, den ein solcher Kandidat - mit guten Google-Kenntnissen - nicht bestehen konnte? WTF?
Viliam Búr
13
@ GradeinarPfeffernüsse Wie können die Kandidaten, die keine Frage gestellt haben, diesen Test erfolgreich absolviert haben? Es ist unmöglich, weil die Anforderungen widersprüchlich sind; Ohne Klärung kann diese Übung einfach nicht durchgeführt werden!
Andres F.
6
@MSalters Sie können nicht davon ausgehen, dass Lex Specialis das ist, was der Autor der Anforderung wollte, da dies in der realen Welt keine vernünftige Annahme ist. Daher kann diese Übung nicht abgeschlossen werden, ohne Fragen zu den offensichtlichen Widersprüchen zu stellen. Jemand, der den Test ohne Fragen abgeschlossen hat, hat es einfach falsch verstanden.
Andres F.

Antworten:

31

Es hat das Potenzial, ein viel besserer Test zu sein als FIZZBUZZ, aber wenn Sie ein Konzept für eine korrekte Antwort haben, ist es der schlechteste Test der Welt. Diese Tests haben in Interviews zunächst nur einen sehr geringen Wert.

Wenn ein Kandidat es "richtig" beantwortet, ohne eine Frage zu stellen, haben Sie ein Problem damit, dass die Kandidatenauswahl den falschen Programmierertyp auswählt. Er kann keine mehrdeutigen Anforderungen identifizieren oder nicht nachvollziehen, dass die meisten Leute keine eindeutigen Anforderungen schreiben können . Es spielt keine Rolle, ob das Programm in jeder Hinsicht technisch perfekt ist, es ist wahrscheinlich, dass er der Typ ist, der Software mit der Aufschrift "Es ist mir egal, was Sie nicht wollten, das ist es, wonach Sie gefragt haben" liefert.

Der Teil des Tests ist hier die Prioritätsreihenfolge der Regeln. Sie geben es nicht an. Die Eingabe "ABC" kann Fizz, Buzz, BuzzBuzz oder FizzBuzz drucken - jede dieser Angaben ist korrekt

Der Kandidat, den ich nehmen würde, ist derjenige, der es (größtenteils) richtig gemacht hat, aber viele Fragen gestellt hat und im Idealfall viel auf der weißen Tafel "herumgetobt" hat.

Zum Beispiel würde ich mein Verständnis dieser Anforderungen untersuchen, indem ich Ihnen eine Reihe von Mustertexten gebe und Sie frage, was Sie erwartet haben, gedruckt zu werden, und warum. - Die Diskussion über meine "ABC" -Beispieleingabe sollte zu einigen nützlichen Insites für Sie führen.

Genau wie bei FIZZBUZZ ist das Ergebnis dieses Tests nur so gut wie Ihre Beobachtungen darüber, wie das Ergebnis erzielt wurde - das Ergebnis ist irrelevant.

Ich würde es ein wenig optimieren - nur um es interessanter zu machen - das "Einzige" herausnehmen. Es wird in der obigen Zeile behandelt ("drucken Sie eine der folgenden Angaben aus") und sehen Sie, wie viele Personen danach fragen. Wenn der Kandidat das "Einzige" verpasst und Sie Zeit haben, machen Sie ihn darauf aufmerksam und sehen Sie, was passiert. Wenn er sich mit "nur" befasst, entfernen Sie es aus der Anforderung und veranlassen Sie sie, den Code zu ändern.

mattnz
quelle
16
Es hört sich für mich so an, als würde das OP mit diesem Test zu viel anfangen. FizzBuzz soll ein schneller Test sein, um zu zeigen, dass der Kandidat zumindest etwas in Code schreiben kann. Dies scheint der Versuch zu sein, dies zu tun, und auch zu untersuchen, wie Kandidaten Prozesse mit mehrdeutigen Anforderungen entwerfen.
jk.
6
+1 für "Diese Tests haben in Interviews zunächst nur einen sehr geringen Wert." Und wenn ich es noch einmal für "Es spielt keine Rolle, ob das Programm in jeder Hinsicht technisch perfekt ist, es ist wahrscheinlich, dass er der Typ ist, der Software mit einem" liefert, ist mir egal, es ist nicht das, was Sie wollte, das ist, was Sie gefragt haben "."
Shivan Dragon
7
Alle von Ihnen, die diese Tests für nutzlos halten, versuchen zu viel mit ihnen zu tun ... FizzBuzz und seine Kollegen existieren nur zu einem Zweck: um die 90% der Bewerber auszusortieren, die überhaupt nicht programmieren können .
Robert Harvey
@RobertHarvey: Abgesehen davon, dass es Leute gibt, die programmieren können, die aber aus verschiedenen Gründen Schwierigkeiten mit FizzBuzz hatten. (Ich selbst bin einer von ihnen).
James P. Wright
3
@ JamesP. Falschnegative sind ein Problem für den Befragten, nicht für den Interviewer. Solange die Anzahl der Fehlalarme niedrig genug ist, kann ein Test wie FizzBuzz für Interviewer nützlich sein.
jk.
27

Das Wort "nur" in Ihren Anforderungen erzeugt in allen Fragen einen Widerspruch.

Wenn Ihre Frage die Anforderungen überprüft, die sich unter Druck stellen, sind Sie sicher, dass Sie diese Kombination von Fähigkeiten testen möchten?

Wenn Sie das Sammeln von Anforderungen testen möchten, würde ich vorschlagen, eine der Fragen nicht eindeutig zu formulieren. Wenn Sie einen Ersatz für FizzBuzz wünschen, beseitigen Sie die Mehrdeutigkeit.

Das Priorisieren von Geschäftsregeln ist nur mit domänenspezifischem Wissen möglich. Wenn Sie nicht einen einfachen Kontext für Ihre Aktivitäten angeben (möglicherweise handelt es sich um Gutscheine, die für verschiedene Werte eingelöst werden), kann der Entwickler keine eigene Entscheidung treffen.

Es ist jedoch möglicherweise nicht die beste Methode, jemanden um Klärung zu bitten, wenn dies ein erhebliches Risiko für unerwünschte Ergebnisse birgt, die Grenzen seines Wissens zu erkennen. Sie können sich vorstellen, dass es sicherer ist, zu raten und falsch zu verstehen, als darauf hinzuweisen, dass Sie nicht in der Lage sind, Anforderungen zu schreiben, oder wenn keiner der Interviewer Entwickler ist und als schlecht eingestuft wird.

jmoreno
quelle
6
Wollen Sie wirklich jemanden einstellen, der unklare Anforderungen nicht klärt, weil er Angst hat, jemanden mit Fragen zu ärgern?
Hans-Peter Störr
2
@hstoerr, vielleicht nicht, aber ein Interview ist eine Situation, die unter Druck steht.
A. Gilfrin
3
@hstoerr: das problem ist, es gibt keine richtige antwort, aber es gibt definitiv eine falsche antwort - was auch immer der interviewer nicht mag. Sie möchten, dass der Befragte Fragen stellt, ein anderer möchte, dass er urteilt, und ein anderer sieht möglicherweise überhaupt keine Mehrdeutigkeit und betrachtet das Stellen einer Frage als Unfähigkeit, einfache Anweisungen zu verstehen. Betrachten Sie es als die POV von jemandem, dem gesagt wurde, dass die Antwort die von der "großen Mehrheit" gegebene ist, die Fragen nicht stellt und sie dennoch auf dieselbe Weise beantwortet. Sie haben dann Leute, die es bekommen, Leute, die es mit Hilfe bekommen und Leute, die es nicht bekommen.
Jmoreno
16

Wir haben festgestellt, dass die überwiegende Mehrheit der Kandidaten, die die Frage erfolgreich beantwortet haben, überhaupt nichts gefragt hat. Sie haben es einfach so gemacht, wie sie es mit FizzBuzz gemacht haben.

Bei der Mehrdeutigkeit der Anforderungen kann man v2.0 nicht korrekt beenden, ohne Fragen zu stellen.

Pieter B
quelle
2
+1… so wie es aussieht, sind die Anforderungen gegenseitig widersprüchlich, so dass zumindest eine Art Gleichstand festgelegt werden muss.
Konrad Rudolph
4
Interessanterweise gaben die Regeln einen Sinn für die Reihenfolge (von allgemeinen Fällen bis hin zu Sonderfällen), und ich habe mich fast instinktiv dazu entschlossen, dies in umgekehrter Reihenfolge zu tun. Wenn ich mich in einer solchen Prüfung befinde, würde ich die Mehrdeutigkeit nicht spüren, sondern meinem Instinkt folgen.
Codism
4
@Codism leider könnte Ihr Instinkt als Programmierer genau das Gegenteil von dem sein, was der Benutzer wollte.
Stefan
@Stefan: Bis zu einem gewissen Grad gibt es kein Ende der Klärung. Jeder hört irgendwann mit dem Denken auf, basierend auf einer Reihe von Faktoren wie Erfahrung, gesundem Menschenverstand usw. Auch wenn Sie die Anforderungen für jetzt klären können, wie werden Sie sicherstellen, dass sie sich morgen nicht ändern? Also für mich auf die ursprüngliche Anforderung, ja, es ist vernünftig genug und ich werde es in fünf Minuten umsetzen.
Codism
1
@KonradRudolph: es sei denn, Sie interpretieren das Bit über "eine der folgenden", um zu bedeuten, dass es egal ist, welche. Wenn ich darüber nachdenke, kann ich das tatsächlich als akzeptable Antwort sehen. Sie müssen nicht einmal die anderen codieren, es ist nur ein Test, um zu sehen, ob Sie einen von ihnen ausführen können. Immerhin gibt es nicht wirklich einen Geschäftsfall, der für eine Lösung über eine andere gestellt werden kann, sondern eine Interviewfrage, die letztendlich weniger nützlich ist als die Standardumkehrung einer String-Frage.
Jmoreno
4

Wenn Sie Mehrdeutigkeiten beseitigen möchten, können Sie die Anforderungen wie folgt ändern:

Schreiben Sie eine Routine in Ihrer bevorzugten Programmiersprache, die eine Liste von Zeichenfolgen als Eingabe verwendet, und gehen Sie für jede Zeichenfolge in der Liste wie folgt vor:

  1. "Fizz" ausgeben, wenn die Zeichenfolge das Zeichen "$" enthält und kein "?"
  2. "Buzz" ausgeben, wenn der String das Zeichen "?" Enthält und enthält kein '$'.
  3. Gib "FizzBuzz" aus, wenn der String genau ein '$' und genau ein '?' Enthält.
  4. Gib "BuzzBuzz" aus, wenn der String genau ein '$' und mehr als ein '?' Enthält.
  5. Gib "BuzzBuzz" aus, wenn der String genau ein '?' und mehr als ein '$'.
  6. Gib "FizzFizz" aus, wenn der String kein '$' und kein '?' Enthält.
Thomas Eding
quelle
3

Ist die Frage zu vieldeutig?

Ja, die Frage ist zu vieldeutig, um ohne Klärung beantwortet zu werden. Eine zusätzliche Regel, die besagt, dass in Fällen, in denen mehrere Regeln gelten, Ihr Programm die spezifischste Sache auswählen und die Mehrdeutigkeit beseitigen sollte.

Verringert der Stress in einer Interviewumgebung die Fähigkeit, kritisch zu denken, bis es nicht mehr möglich ist, eine so einfache Aufgabe zu erfüllen?

Es ist wahrscheinlicher, dass der Kandidat den FizzBuzz "stopft": Stress oder nicht, das Programm ist sehr einfach.

Ich denke, dass der modifizierte FizzBuzz nicht mit dem Original vergleichbar ist, da seine ideale Lösung anders ist: Obwohl eine Kette von if-then-elseakzeptabel bleibt, denke ich, dass eine tabellenbasierte Lösung besser für dieses Problem geeignet ist:

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

Die Größe des Problembereichs ist 3x3nicht 2x2so groß , sodass die Zuordnung zu einer Tabelle wesentlich einfacher ist als beim ursprünglichen FizzBuzz. Tatsächlich finde ich eine tabellenbasierte Lösung für das ursprüngliche FizzBuzz-Problem schwieriger zu verstehen.

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
quelle
2

Zwei Dinge hier:

  1. Ja, ich denke, die meisten Leute haben nur das Rauschen gegoogelt und sind dann gestolpert, wenn sie versucht haben, es zu erweitern
  2. Check out: http://dave.fayr.am/posts/2012-10-4-finding-fizzbuzz.html Hier erfahren Sie, wie Sie Fizz Buzz mithilfe geeigneter Abstraktionen lösen können.
AndreasScheinert
quelle
Nur dass er nie die richtige Abstraktionsebene erreicht. Er kommt den Monaden am nächsten, aber ich denke, das ist ein bisschen zu kompliziert. Eine einfache Schlüssel- / Werteliste mit einer eindeutigen Bedingung am Ende ist in nahezu jeder Sprache, die komplexer ist als BrainFuck, einfach zu erstellen.
Jmoreno
2

Wir haben festgestellt, dass die überwiegende Mehrheit der Kandidaten, die die Frage erfolgreich beantwortet haben, überhaupt nichts gefragt hat. Sie haben es einfach so gemacht, wie sie es mit FizzBuzz gemacht haben.

Ich habe Interviewprozesse gesehen, die Programmierer dazu ermutigen, laut zu denken und Fragen zu stellen, um ihren Denkprozess zu sehen. Ich mag diesen Prozess besser.

Ich habe diesen Fizzbuzz v2.0 durchgelesen und dort nach den Anforderungen 3 und 5 gefragt. Ich kenne keine anderen Leute, aber ich finde, dass ich im Ingenieurwesen keine Mehrdeutigkeiten haben will, also stelle ich Fragen. Weil ich später (codiert und alles) nicht herausfinden möchte, dass ich eine Annahme machen musste und es falsch war.

mythicalprogrammer
quelle
Natürlich ist die Technik "laut denken" nur nützlich, wenn Sie Programmierer suchen, die es vorziehen, laut zu denken. Das beseitigt die überwiegende Mehrheit der Programmierer und lässt wohl nur die Programmierer übrig, die besser als Manager als Programmierer geeignet sind. Schließlich ist das Denken mit "elektrischen" Geschwindigkeiten im Gehirn weitaus schneller als das Denken mit der "mechanischen" Geschwindigkeit des Sprechens.
Dunk
2

Der einfachste Weg, um Mehrdeutigkeiten zu vermeiden, besteht darin, einige Beispiele zu zeigen:

"A" liefert "Fizz" "aAbA" liefert "Fizz" "B" liefert "Buzz" "aBbB" liefert "Buzz" "AB" liefert "FizzBuzz" "ABaabb" liefert "BuzzBuzz" "" liefert "FizzFizz" "ab "gibt" FizzFizz "zurück

SnoopDougieDoug
quelle
1
Ein guter Kandidat würde mit einigen Testzeichenfolgen und erwarteten Ergebnissen beginnen und dann über Komponententests sprechen oder einfach die Anforderungen formeller und weniger mehrdeutig umschreiben. Sie würden dann über die Bedeutung klarer Anforderungen sprechen und darüber, wie Anforderungsfehler in der Behebung um Größenordnungen teurer sein können als Implementierungsfehler.
John Lyon
2

Anstatt einem Kandidaten widersprüchliche / unklare Anforderungen zu stellen, fragen Sie ihn einfach, wie er mit diesen Situationen umgeht. Andernfalls lässt du dich inkompetent oder schlimmer aussehen, indem du kompetente Leute auf den trügerischen Balken stellst: "Wie bekomme ich die Antworten, die ich brauche, ohne zu implizieren, dass diese Interviewfrage oder die Person, die sie stellt, dumm ist?"

Wie auch immer, es ist ärgerlich, wenn man aussteigt. Interviews sind ein passender Prozess und damit meine ich eine Einbahnstraße. Direkte Fragen und klare Absichten sind viel wichtiger, als den Kandidaten unter einen Schnellkochtopf zu stellen, IMO. FizzBuzz ist ein gutes Beispiel für eine Codierungsfrage, da es kurz und bündig ist. Verwenden Sie es nicht direkt wieder. Schreiben Sie einfache Fragen wie diese, die diesem Modell folgen.

Aber für FFS werden Sie nicht schlau und verstecken Sie den eigentlichen Test hinter einem anderen Test. Fragen Sie einfach die Leute, wie sie mit dem verdammten Problem umgehen. Ein erfahrener Entwickler hat sich wiederholt mit mehrdeutigen Anforderungen befasst und teilt Ihnen gerne ihre Strategien mit. Sie könnten sogar etwas lernen.

Und nehmen Sie nicht an, dass jeder ein Whiteboard verwenden möchte oder über eine angenehme Handschrift verfügt. Einige von uns tippen seit ihrem 12. Lebensjahr (mit viel Dank an Space Quest). Ich kann nicht einmal mit einem Stift oder Stift in der Hand klar denken. Es ist 20-verdammt-13, was ist mit den Whiteboards schon? Wenn Leute mir Stift und Papier geben und mich bitten, einen Code-Test durchzuführen, ist es schwer, ein Lachen zu unterdrücken.

Erik Reppen
quelle
1

Ich finde es eine nette Interviewfrage. Die Anforderungen sind unklar, so wie sie oft in der Realität sind. Sie prüfen, ob der Kandidat intelligent genug ist, um dies zu erkennen (auch unter Stress), dass er keine Angst hat, Fragen zu stellen, die er für notwendig hält, und in der Lage ist, die Anforderungen in eine sinnvolle Struktur zu setzen. Und es sagt ein wenig über ihre Programmierfähigkeiten aus, obwohl Sie auch einige kompliziertere Probleme mit Rekursion und Zeigern aufwerfen sollten, da dieses Problem zu einfach ist.

Ich mache mir jedoch ein wenig Sorgen, dass die "erfolgreichen" Kandidaten keine Fragen stellen. Ich würde versuchen herauszufinden, ob sie realisiert haben, dass Sie in einigen Fällen bis zu 4 der Regeln anwenden können und dass es nichts in der Frage gibt, was diese Unklarheit lösen könnte, und sie erklären lassen, wie sie damit umgegangen sind. Vielleicht ist Ihre Frage nicht mehrdeutig genug, um sie zum Fragen zu zwingen, oder vielleicht sollten Sie sie zum lauten Nachdenken auffordern.

Übrigens: Ich finde es seltsam, dass Sie von einer "richtigen Lösung" sprechen. Wenn Sie die Frage so formulieren, ist es legitim, entweder "Fizz", "Buzz", "BuzzBuzz" oder "FizzBuzz" zu drucken, wenn Sie "AB" erhalten. Daher ist IMHO jede Lösung, bei der keine Fragen gestellt werden, einfach falsch.

Hans-Peter Störr
quelle