Efficacité de FizzBuzz et au-delà [fermé]

38

Dans le cadre du processus d’entretien, nous avons d’abord demandé aux candidats de faire «FizzBuzz». De nos jours, le pourcentage de candidats pouvant répondre correctement à FizzBuzz a considérablement augmenté - cela est peut-être dû à sa popularité sur le Web.

Il y a environ un an, nous avons commencé par poser une question très similaire à celle de FizzBuzz originale. La question a été conçue pour être aussi simple que le FizzBuzz original et pour évaluer également une capacité particulière du candidat, en particulier la capacité de commander et de hiérarchiser de manière logique et significative un ensemble de "règles de gestion" fournies dans certains ordre arbitraire. Le libellé de la question semble au départ légèrement ambigu, ce qui peut compliquer les choses pour les non-anglophones, mais s’il est réfléchi correctement, cela donne également la possibilité au candidat de poser des questions de clarification, ce qui est toujours une bonne chose. .

Nous estimons qu’il est très important d’avoir cette compétence en tant que développeur, car le développement logiciel est généralement basé sur des exigences fonctionnelles qui ne sont dérivées d’aucun ordre particulier dans le temps et qui peuvent imposer des contraintes et des conditions à d’autres domaines du logiciel sans indiquer explicitement et ce, de la même manière. Il incombe au développeur astucieux d’enquêter au moins sur les problèmes et les conflits potentiels liés à la mise en œuvre.

Ce que nous avons constaté, c’est qu’un peu plus de 65% des candidats (taille de l’échantillon de 38) ayant réussi FizzBuzz ont complètement échoué. FizzBuzz v2.0 Normalement, ces candidats seraient détectés plus tard dans le processus, mais cela semble être un bon moyen de détecter les tôt.

Ma question ne porte pas sur le fait que FizzBuzz soit obsolète ou non, mais plutôt sur les facteurs qui pourraient contribuer à un nombre aussi élevé de candidats ne répondant pas à la question FizzBuzz v2.

  • La question est-elle trop ambiguë?
  • Est-ce que le stress d'un environnement d'interview diminue la capacité de penser de manière critique au point de ne pas pouvoir mener à bien une tâche aussi triviale?

Question:

Écrivez une routine dans votre langage de programmation préféré qui prendra une liste de chaînes en tant qu'entrée et effectuera l'une des opérations suivantes pour chaque chaîne de la liste:

  1. N'imprimez que Fizz si la chaîne contient la lettre A
  2. Imprimer uniquement Buzz si la chaîne contient la lettre B
  3. N'imprimez que BuzzBuzz si la chaîne contient A et B
  4. N'imprimez que FizzFizz si la chaîne ne contient pas A et B
  5. N'imprimez que FizzBuzz si la chaîne ne contient qu'un seul A et un seul B.

Voici quelques questions typiques posées par les candidats:

  • Devrait-il être sensible à la casse?
  • Est-ce que "contient A et B" signifie que A devrait venir avant B
  • Que faut-il imprimer si aucun des points n’est atteint?
  • Que devrait-il se passer si plusieurs conditions peuvent être remplies?

Nous avons constaté que la très grande majorité des candidats qui ont répondu à la question sans rien demander du tout l’ont fait comme ils l’ont fait avec FizzBuzz.

Gradeinar Pfeffernüsse
la source
26
Laissez la question un peu ambiguë. De cette façon, vous pouvez voir quelles perspectives ont assez de potentiel pour demander des éclaircissements (ce qui en soi est la clé du développement).
Thomas Eding
17
La réponse correcte est que le développeur potentiel dise à la BA de "résoudre ces terribles exigences".
Kirk Broadhurst
7
Personnaliser FizzBuzz est une bonne idée pour filtrer les candidats qui ont recherché la solution sur Google. Il n'est même pas nécessaire de rendre les choses plus difficiles. En fait, je doute que le FizzBuzz original ait été supposé être utilisé textuellement par toutes les entreprises de la planète. C'est juste la paresse d'une entreprise pour ne pas la personnaliser. Ils sont déjà conscients du problème (programmer des candidats n'ayant aucune compétence en programmation), sans toutefois réussir à mettre en œuvre un test qu'un tel candidat - avec de bonnes compétences de Google - ne pourrait pas réussir? WTF?
Viliam Búr
13
@ GradeinarPfeffernüsse Comment les candidats qui n'ont posé aucune question ont-ils réussi ce test? C'est impossible parce que les exigences sont contradictoires. sans clarification, cet exercice est tout simplement impossible!
Andres F.
6
@MSalters Vous ne pouvez pas supposer que lex specialis est ce que l'auteur de l'exigence souhaitait, car ce n'est pas une hypothèse raisonnable dans le monde réel. Par conséquent, cet exercice ne peut être complété sans poser de questions sur les contradictions apparentes. Quelqu'un qui termine le test sans poser de questions se trompe tout simplement.
Andres F.

Réponses:

31

Il a le potentiel d'être un test bien meilleur que celui de FIZZBUZZ, mais si vous avez le moindre concept de réponse correcte, c'est le pire test au monde. Ces tests ont très peu d’importance dans les entretiens.

Si un candidat répond "correctement" sans poser de question, vous avez alors un problème: le candidat sélectionné sélectionne le mauvais type de programmeur. Il est incapable d'identifier les exigences ambiguës, ou est incapable de comprendre que la plupart des gens ne peuvent pas rédiger d'exigences non ambiguës. . Peu importe que le programme soit techniquement parfait à tous points de vue, il est probablement le genre de type qui fournira des logiciels avec un message "Je m'en moque, ce n'est pas ce que vous voulez, c'est ce que vous avez demandé".

La partie du test ici est l'ordre de priorité des règles. Vous ne le spécifiez pas. L'entrée "ABC" peut imprimer Fizz, Buzz, BuzzBuzz ou FizzBuzz - l'un de ces éléments est correct

Le candidat que je prendrais est celui qui l’a bien (la plupart du temps) bien, mais il a posé beaucoup de questions et, idéalement, a fait beaucoup de "doddling" au tableau blanc.

Par exemple, j'exploiterais ma compréhension de ces exigences en vous donnant une série de textes exemples et en vous demandant ce que vous espériez imprimer et pourquoi. - La discussion sur mon exemple "ABC" devrait déboucher sur des pistes utiles.

Tout comme FIZZBUZZ, le résultat de ce test est aussi bon que vos observations sur la manière dont le résultat a été obtenu - le résultat n'est pas pertinent.

Je voudrais le peaufiner un peu - juste pour le rendre plus intéressant - enlever le "seul". Il est couvert dans la ligne ci-dessus ("imprimez l’un des suivants") et voyez combien de personnes le demandent. Si le candidat manque le "seul" et que vous avez le temps, faites-le remarquer et voyez ce qui se passe. S'il traite du "seul", supprimez-le de l'exigence et demandez-leur de changer le code.

Mattnz
la source
16
Il me semble que le PO essaie de faire trop avec ce test. FizzBuzz se veut un test rapide montrant que le candidat peut écrire au moins quelque chose dans le code. Cela semble tenter de le faire, mais aussi d’examiner la manière dont les candidats conçoivent le processus avec des exigences ambiguës.
jk.
6
+1 pour "Ces tests ont très peu de valeur dans les entretiens." Et si je pouvais le redonner à +1, "peu importe si le programme est techniquement parfait dans tous ses aspects, il est probablement le genre de gars qui fournira un logiciel avec un" voulu, c'est ce que vous avez demandé "."
Shivan Dragon
7
Tous ceux qui trouvent ces tests inutiles essaient de faire trop avec eux ... FizzBuzz et ses homologues n'existent que dans un seul but: éliminer les 90% de candidats qui ne savent pas du tout programmer .
Robert Harvey
@RobertHarvey: Sauf qu'il y a des gens qui peuvent programmer, mais à un moment donné, FizzBuzz aurait eu des difficultés pour diverses raisons. (moi-même étant l'un d'entre eux).
James P. Wright
3
@ JamesP.Wright Les faux négatifs sont un problème pour l'interviewé et non pour l'interviewer. Tant que le nombre de faux positifs est suffisamment faible, un test comme FizzBuzz peut être utile pour les enquêteurs.
jk.
27

Le mot "seulement" dans vos exigences crée une contradiction dans toutes les questions.

Par conséquent, votre question vérifie la collecte des exigences lorsque vous êtes sous pression. Voulez-vous vraiment tester cette combinaison de compétences?

Si vous souhaitez tester la collecte des exigences, je vous suggère de rendre l'une des questions ambiguës. Si vous voulez remplacer FizzBuzz, supprimez l'ambiguïté.

La hiérarchisation des règles métier ne peut être effectuée qu'avec des connaissances spécifiques à un domaine - à moins que vous n'incluiez un contexte simple pour ce que vous faites (il s'agit peut-être de coupons à échanger contre différentes valeurs), le développeur n'a aucune base pour prendre sa propre décision.

Mais demander à une personne de demander une clarification lorsque cela comporte un risque important de résultats indésirables, n’est peut-être pas la meilleure façon de mesurer son habileté à reconnaître les limites de ses connaissances. Ils peuvent penser qu'il est plus prudent de deviner et de se tromper que de faire remarquer que vous êtes incompétent pour rédiger les exigences ou que, si aucun des interviewers n'est un développeur, il est étiqueté comme ayant une mauvaise attitude.

Jmoreno
la source
6
Voulez-vous vraiment embaucher quelqu'un qui ne clarifie pas les exigences peu claires parce qu'il / elle a peur d'ennuyer quelqu'un en posant des questions?
Hans-Peter Störr
2
@hstoerr, peut-être pas, mais une interview est une situation raisonnablement sous pression.
A. Gilfrin
3
@hstoerr: le problème est qu'il n'y a pas de bonne réponse, mais il y a certainement une mauvaise réponse - tout ce que l'intervieweur n'aime pas. Vous voulez que la personne interrogée pose des questions, une autre peut vouloir exercer son jugement, et une autre encore peut ne pas voir l'ambiguïté du tout et considérer la question comme une incapacité à comprendre des instructions simples. Considérez cela du point de vue de quelqu'un à qui on a dit que la réponse est celle donnée par la "grande majorité" qui ne pose pas de question mais répondez de la même manière. Vous avez ensuite des personnes qui l'obtiennent, des personnes qui l'obtiennent avec de l'aide et d'autres qui ne l'obtiennent pas.
Jmoreno
16

Nous avons constaté que la très grande majorité des candidats qui ont répondu à la question sans rien demander du tout l’ont fait comme ils l’ont fait avec FizzBuzz.

Avec l'ambiguïté des exigences, on ne peut pas terminer correctement la version 2.0 sans se poser de questions.

Pieter B
la source
2
+1… dans sa forme actuelle, les exigences sont contradictoires, il faut donc au moins spécifier une sorte de point d'ancrage.
Konrad Rudolph
4
Fait intéressant, les règles donnaient un sens de l'ordre (des cas génériques aux cas particuliers) et j'ai presque instinctivement décidé de le faire dans l'ordre inverse. Si je suis dans un tel test, je ne sentirais pas l'ambiguïté mais suivrais mon instinct.
Codisme
4
@ Codisme, malheureusement, votre instinct de programmeur pourrait être exactement l'inverse de ce que l'utilisateur souhaitait.
Stefan
@ Stefan: dans une certaine mesure, il n'y a pas de fin à la clarification. Tout le monde arrête de raisonner à un moment donné en fonction d'un ensemble de facteurs tels que l'expérience, le bon sens, etc. Même si vous pouvez clarifier les exigences pour le moment, comment allez-vous garantir qu'elles ne changeront pas demain? Donc pour moi sur l'exigence initiale, oui, c'est assez raisonnable et je vais le mettre en œuvre dans cinq minutes.
Codisme
1
@ KonradRudolph: à moins que vous choisissiez d'interpréter le mot "l'un des éléments suivants" comme signifiant, peu importe lequel. En y réfléchissant, je peux réellement voir cela comme une réponse acceptable. Vous n'avez même pas besoin de coder les autres, c'est juste un test pour voir si vous pouvez en faire. Après tout, il n’ya pas vraiment d’argent commercial à faire pour une solution sur une autre, c’est une question d’entrevue qui est finalement moins utile que la question standard inversée.
Jmoreno
4

Si vous souhaitez supprimer toute ambiguïté, vous pouvez modifier les exigences pour:

Ecrivez une routine dans votre langage de programmation préféré qui prendra une liste de chaînes en tant qu'entrée. Pour chaque chaîne de la liste, procédez comme suit:

  1. Imprimez "Fizz" si la chaîne contient le caractère '$' et ne contient pas '?'.
  2. Imprimez "Buzz" si la chaîne contient le caractère "?" et ne contient pas '$'.
  3. Imprimez "FizzBuzz" si la chaîne contient exactement un '$' et exactement un '?'.
  4. Imprimez "BuzzBuzz" si la chaîne contient exactement un '$' et plus d'un '?'.
  5. Imprimez "BuzzBuzz" si la chaîne contient exactement un "?" et plus d'un '$'.
  6. Imprimez "FizzFizz" si la chaîne ne contient pas '$' et ne contient pas '?'.
Thomas Eding
la source
3

La question est-elle trop ambiguë?

Oui, la question est trop ambiguë pour qu'on y réponde sans éclaircissements. Cependant, une règle supplémentaire indiquant que dans les cas où plusieurs règles s'appliquent, votre programme doit sélectionner l'élément le plus spécifique et supprimer l'ambiguïté.

Est-ce que le stress d'un environnement d'interview diminue la capacité de penser de manière critique au point de ne pas pouvoir mener à bien une tâche aussi triviale?

C'est plus probablement une indication du candidat "entassant" le FizzBuzz: stress ou pas, le programme est très simple.

Je pense que le FizzBuzz modifié n'est pas comparable à celui d'origine, car sa solution idéale est différente: bien qu'une chaîne de valeurs if-then-elsereste acceptable, je pense qu'une solution basée sur des tables est plus appropriée pour ce problème:

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

La taille de l’espace à problèmes n’est 3x3pas 2x2, donc, mappée sur une table beaucoup plus facilement que le FizzBuzz original. En fait, je trouve plus difficile de comprendre une solution sous forme de tableau au problème original de 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
la source
2

Deux choses ici:

  1. oui je pense que la plupart des gens ont juste googlé fizz buzz puis trébucher quand ils essaient de l'élargir
  2. Découvrez: http://dave.fayr.am/posts/2012-10-4-finding-fizzbuzz.html Cela explique bien comment vous pouvez résoudre le fizz buzz en utilisant les abstractions appropriées.
AndreasScheinert
la source
Sauf qu'il n'atteint jamais le bon niveau d'abstraction. Il se rapproche le plus des monades, mais je pense que c'est un peu trop compliqué. Une simple liste clé / valeur, avec un conditionnel simple à la fin, est assez facile à faire dans à peu près n'importe quel langage plus complexe que BrainFuck.
Jmoreno
2

Nous avons constaté que la très grande majorité des candidats qui ont répondu à la question sans rien demander du tout l’ont fait comme ils l’ont fait avec FizzBuzz.

J'ai vu des processus d'entrevue qui encouragent les programmeurs à penser à voix haute et à poser des questions pour voir leur processus de réflexion. J'aime mieux ce processus.

J'ai lu ce fizzbuzz v2.0 et je lui avais posé des questions sur les exigences n ° 3 et n ° 5. Je ne sais pas à propos d'autres personnes mais je trouve qu'en ingénierie je ne veux pas d'ambiguïté alors je pose la question. Parce que plus tard sur la ligne (codée et toutes), je ne veux pas savoir que je devais faire une supposition et que c'était faux.

programmeur mythique
la source
Bien entendu, la technique "Penser à voix haute" n’est utile que si vous recherchez des programmeurs qui préfèrent "penser à voix haute". Cela élimine la très grande majorité des programmeurs et ne laisse sans doute que la plupart des programmeurs qui conviennent mieux en tant que gestionnaires que les programmeurs. Après tout, penser à des vitesses "électriques" dans le cerveau est beaucoup plus rapide que de penser à une vitesse "mécanique" de la parole.
Dunk
2

Le moyen le plus simple d’éviter toute ambiguïté consiste peut-être à donner quelques exemples:

"A" renvoie "Fizz" "aAbA" renvoie "Fizz" "B" renvoie "Buzz" "aBbB" renvoie "Buzz" "AB" renvoie "FizzBuzz" "ABaabb" renvoie "BuzzBuzz" "" renvoie "FizzFizz" "ab "retourne" FizzFizz "

SnoopDougieDoug
la source
1
Un bon candidat commencerait par quelques chaînes de test et les résultats attendus, puis parlerait de tests unitaires, ou réécrirait simplement les exigences de manière plus formelle et moins ambiguë. Ils discuteraient ensuite de l'importance de la clarté des exigences et de la façon dont les erreurs de exigences peuvent être des ordres de grandeur plus coûteux à réparer que les erreurs d'implémentation.
John Lyon
2

Au lieu de donner à un candidat des exigences contradictoires / peu claires, demandez-lui simplement comment il gère ces situations. Sinon, vous vous sentez incompétent ou pire encore, vous mettez des personnes compétentes sur le rayon de la perfide: "Comment puis-je obtenir les réponses dont j'ai besoin sans impliquer que cette question d'entrevue ou la personne qui la demande est stupide?"

De toute façon, c'est irritant comme tout. Les entretiens sont un processus d’appariement et j’entends par là une rue à double sens. Les questions directes et la clarté de l’intention sont beaucoup plus importantes que de placer le candidat sous pression, IMO. FizzBuzz est un bon exemple de question de codage car elle est courte et agréable. Ne le réutilisez pas directement. Écrivez des questions simples comme celle-ci qui suivent ce modèle.

Mais pour FFS, ne soyez pas malin et cachez le vrai test derrière un autre test. Demandez simplement aux gens comment ils gèrent ce foutu problème. Un dev expérimenté aura à maintes reprises fait face à des exigences ambiguës et sera ravi de vous expliquer ses stratégies. Vous pourriez même apprendre quelque chose.

Et ne présumez pas que tout le monde veut utiliser un tableau blanc ou que la période d’écriture est confortable. Certains d’entre nous dactylographient depuis l’âge de 12 ans (merci beaucoup à Space Quest). Je ne peux même pas penser droit avec un stylo ou un marqueur dans la main. C'est 20-freaking-13, c'est quoi déjà avec les tableaux blancs? Quand les gens me donnent un stylo et du papier et me demandent de faire un test de code, il est difficile d'empêcher un rire.

Erik Reppen
la source
1

Je pense que c'est une bonne question d'entrevue. Les exigences ne sont pas claires, tout comme elles le sont souvent dans la réalité. Vous vérifiez si le candidat est suffisamment intelligent pour s'en rendre compte (même sous stress), qu'il / elle n'a pas peur de poser les questions qu'il juge nécessaires et qu'il est capable de placer les exigences dans une structure logique. Et cela en dit un peu sur leurs capacités de programmation, bien que vous devriez également poser des problèmes plus complexes contenant de la récursion et des pointeurs, car ce problème est trop facile.

Cependant, je m'inquiète un peu que les candidats "retenus" ne posent pas de questions. J'essaierais de savoir s'ils ont compris que vous pouvez appliquer jusqu'à 4 règles dans certains cas et que rien dans la question ne résoudrait cette ambiguïté, et de leur demander d'expliquer comment ils ont traité cette question. Peut-être que votre question n’est pas suffisamment ambiguë pour les obliger à demander, ou peut-être devriez-vous leur demander de réfléchir à voix haute.

BTW: Je trouve étrange que vous parlez d'une "solution correcte". Si vous formulez la question de cette manière, il est légitime d’imprimer «Fizz», «Buzz», «BuzzBuzz» ou «FizzBuzz» si vous obtenez «AB». Donc, à mon humble avis, toute solution sans questions posées est tout simplement fausse.

Hans-Peter Störr
la source