Efectividad de FizzBuzz y más allá [cerrado]

38

Como parte del proceso de entrevista, inicialmente pedimos a los candidatos que hagan 'FizzBuzz' hoy en día, el porcentaje de candidatos que pueden responder correctamente a FizzBuzz ha aumentado dramáticamente, esto puede deberse a su popularidad en la web.

Hace aproximadamente un año, como segunda pregunta, comenzamos a hacer una pregunta muy similar al FizzBuzz original. La pregunta fue diseñada para ser tan simple como el FizzBuzz original, y también para evaluar una habilidad particular del candidato, específicamente la capacidad de ordenar y priorizar de manera significativa y lógica un conjunto de "reglas comerciales" que se han proporcionado en algunos orden arbitrario Inicialmente, la redacción de la pregunta parece un poco ambigua, lo que puede dificultar a los hablantes de inglés no nativos, pero si se puede resolver correctamente, también le da al candidato la oportunidad de hacer preguntas para aclarar, lo que siempre es algo bueno. .

Consideramos que esta es una habilidad muy importante como desarrollador, ya que el desarrollo de software generalmente se basa en requisitos funcionales que se derivan en ningún orden en particular a lo largo del tiempo, que pueden imponer restricciones y condiciones sobre otras áreas del software sin indicarlo explícitamente y es el trabajo del desarrollador astuto para al menos investigar posibles problemas y conflictos con respecto a la implementación.

Lo que encontramos fue que un poco más del 65% de los candidatos (tamaño de muestra de 38) que aprobaron FizzBuzz fallaron por completo FizzBuzz v2.0 Normalmente, estos candidatos serían detectados más adelante en el proceso, pero parece ser una buena manera de detectar ellos desde el principio.

Mi pregunta no es si FizzBuzz está desactualizado o no, sino qué factores podrían estar contribuyendo a que un número tan alto de candidatos falle la pregunta de FizzBuzz v2.

  • ¿Es la pregunta demasiado ambigua?
  • ¿El estrés del ambiente de una entrevista disminuye la capacidad de pensar críticamente hasta el punto de no poder completar una tarea tan trivial?

Pregunta:

Escriba una rutina en su lenguaje de programación favorito que tomará una lista de cadenas como entrada, y para cada cadena de la lista realizará una de las siguientes acciones:

  1. Imprima solo Fizz si la cadena contiene la letra A
  2. Imprima solo Buzz si la cadena contiene la letra B
  3. Imprima solo BuzzBuzz si la cadena contiene A y B
  4. Imprima solo FizzFizz si la cadena no contiene A y B
  5. Imprima solo FizzBuzz si la cadena contiene solo una A y solo una B

Algunas preguntas típicas formuladas por los candidatos son:

  • ¿Debería ser sensible a mayúsculas y minúsculas?
  • ¿"Contiene A y B" significa que A debe venir antes que B
  • ¿Qué se debe imprimir si no se cumple ninguno de los puntos?
  • ¿Qué debería suceder si se puede cumplir más de una condición?

Descubrimos que la abrumadora mayoría de los candidatos que completaron con éxito la pregunta, no preguntaron nada, simplemente lo hicieron como hicieron con FizzBuzz.

Gradeinar Pfeffernüsse
fuente
26
Deje la pregunta un poco ambigua. De esa manera, puede ver qué prospectos tienen suficiente sentido común para pedir una aclaración (que en sí misma es clave para el desarrollo).
Thomas Eding
17
La respuesta correcta es que el posible desarrollador le diga al BA que 'arregle estos horribles requisitos'.
Kirk Broadhurst
77
Personalizar FizzBuzz es una buena idea para filtrar a los candidatos que buscaron en Google la solución. Ni siquiera es necesario hacerlo más difícil. En realidad, dudo que se suponía que el FizzBuzz original fuera usado literalmente por todas las compañías del planeta. Es solo la pereza por parte de una empresa no personalizarlo. Ya son conscientes del problema (candidatos de programación con cero habilidades de programación) y, sin embargo, no pueden implementar una prueba que dicho candidato, con buenas habilidades de Google, no pudo pasar. WTF?
Viliam Búr
13
@ GradeinarPfeffernüsse ¿Cómo pueden los candidatos que no hicieron ninguna pregunta completar esta prueba con éxito? Es imposible porque los requisitos son contradictorios; ¡Sin aclarar este ejercicio simplemente no se puede hacer!
Andres F.
66
@MSalters No puede asumir que lex specialis es lo que quería el autor del requisito, porque no es una suposición razonable en el mundo real. Por lo tanto, este ejercicio no puede completarse sin hacer preguntas sobre las aparentes contradicciones. Alguien que completó la prueba sin hacer preguntas simplemente se equivocó.
Andres F.

Respuestas:

31

Tiene el potencial de ser una prueba mucho mejor que FIZZBUZZ, pero si tiene algún concepto de una respuesta correcta, es la peor prueba del mundo. Para empezar, estas pruebas tienen muy poco valor en las entrevistas.

Si un candidato responde "correctamente" sin hacer una pregunta, entonces tiene el problema de que la selección de candidatos seleccionará el tipo incorrecto de programador. No puede identificar requisitos ambiguos o no puede comprender que la mayoría de las personas no pueden escribir requisitos inequívocos. . No importa si el programa es técnicamente perfecto en todos los aspectos, es probable que sea el tipo de persona que entregará software con un "No me importa, no es lo que querías, eso es lo que pediste".

La parte de la prueba aquí es el orden de prioridad de las reglas. No lo especificas. La entrada "ABC" puede imprimir Fizz, Buzz, BuzzBuzz o FizzBuzz; cualquiera de estos es correcto

El candidato que tomaría es el que acertó (en su mayoría), pero hizo muchas preguntas e, idealmente, hizo muchos "cambios" en la pizarra.

Por ejemplo, exploraría mi comprensión de esos requisitos ofreciéndole una serie de textos de muestra y preguntándole qué esperaba que se imprimiera y por qué. - La discusión sobre mi entrada de ejemplo "ABC" debería conducir a algunos elementos útiles para usted.

Al igual que FIZZBUZZ, el resultado de esta prueba es tan bueno como sus observaciones sobre cómo se obtuvo el resultado; el resultado es irrelevante.

Lo modificaría un poco, solo para hacerlo más interesante, elimine el 'único'. Está cubierto en la línea de arriba ("imprima uno de los siguientes"), y vea cuántas personas preguntan al respecto. Si el candidato pierde el "único" y tiene tiempo, indíquelo y vea qué sucede. Si trata con el "único", elimínelo del requisito y pídales que cambien el código.

Mattnz
fuente
16
Me parece que el OP está tratando de hacer demasiado con esta prueba. FizzBuzz está destinado a ser una prueba rápida para mostrar que el candidato puede escribir al menos algo en el código. Esto parece estar tratando de hacer eso y también tratar de ver cómo los candidatos diseñan el proceso con requisitos ambiguos.
jk.
66
+1 para "Estas pruebas tienen muy poco valor en las entrevistas para empezar". Y si pudiera, lo haría +1 nuevamente para "No importa si el programa es técnicamente perfecto en todos los aspectos, es probable que sea el tipo de persona que entregará software con un" No me importa, no es lo que tú querido, eso es lo que pediste "."
Shivan Dragon
77
Todos ustedes, a quienes les parecen inútiles estas pruebas, están tratando de hacer demasiado con ellas ... FizzBuzz y sus contrapartes existen para un solo propósito: eliminar al 90% de los solicitantes que no saben programar .
Robert Harvey
@RobertHarvey: Excepto que hay personas que pueden programar, pero en algún momento habrían tenido dificultades con FizzBuzz por varias razones. (yo siendo uno de ellos).
James P. Wright el
3
@ JamesP.Wright los falsos negativos son un problema para el entrevistado, no para el entrevistador. Mientras el número de falsos positivos sea lo suficientemente bajo, una prueba como FizzBuzz puede ser útil para los entrevistadores.
jk.
27

La palabra "solo" en sus requisitos crea una contradicción en todas las preguntas.

Por lo tanto, su pregunta evalúa los requisitos reunidos bajo presión, ¿está seguro de que desea evaluar esa combinación de habilidades?

Si desea probar la recopilación de requisitos, le sugiero que haga UNA de las preguntas ambiguas. Si desea un reemplazo para FizzBuzz, elimine la ambigüedad.

Priorizar las reglas comerciales solo se puede hacer con conocimiento específico del dominio, a menos que incluya un contexto simple para lo que está haciendo (tal vez sean cupones para canjear por varios valores), no hay base para que el desarrollador tome su propia decisión.

Pero exigir a alguien que solicite aclaraciones cuando hacerlo tiene un riesgo significativo de resultados indeseables, tal vez no sea la mejor manera de medir su habilidad para reconocer los límites de su conocimiento. Pueden darse cuenta de que es más seguro adivinar y equivocarse, que señalar que usted es incompetente para escribir los requisitos, o si ninguno de los entrevistadores son desarrolladores, etiquetados como tener una mala actitud.

jmoreno
fuente
66
¿Realmente desea contratar a alguien que no aclare los requisitos poco claros porque tiene miedo de molestar a alguien haciendo preguntas?
Hans-Peter Störr
2
@hstoerr, tal vez no, pero una entrevista es una situación razonablemente presionada.
A. Gilfrin
3
@hstoerr: el problema es que no hay una respuesta correcta, pero definitivamente hay una respuesta incorrecta, lo que no le guste al entrevistador. Desea que el entrevistado haga preguntas, otro podría querer que juzguen, y otro podría no ver ninguna ambigüedad y considerar hacer una pregunta como incapacidad para comprender instrucciones simples. Considérelo desde el punto de vista de alguien a quien se le ha dicho que la respuesta es la dada por la "gran mayoría" que no hace preguntas pero que la responde de la misma manera. Entonces tienes personas que lo entienden, personas que lo obtienen con ayuda y personas que no.
jmoreno
16

Descubrimos que la abrumadora mayoría de los candidatos que completaron con éxito la pregunta, no preguntaron nada, simplemente lo hicieron como hicieron con FizzBuzz.

Con la ambigüedad de los requisitos, uno no puede finalizar v2.0 correctamente sin hacer preguntas.

Pieter B
fuente
2
+1 ... tal como está, los requisitos son mutuamente contradictorios, por lo que al menos se debe especificar algún tipo de desempate.
Konrad Rudolph el
44
Curiosamente, las reglas dieron un sentido de orden (desde casos genéricos a casos especiales) y casi instintivamente decidí hacerlo en orden inverso. Si estoy en una prueba así, no sentiría la ambigüedad pero seguiría mi instinto.
Codismo
44
@Codism desafortunadamente su instinto como programador podría ser exactamente lo contrario de lo que el usuario quería.
Stefan
@Stefan: hasta cierto punto, la aclaración no tiene fin. Todos dejan de razonar en algún momento en función de un conjunto de factores como la experiencia, el sentido común, etc. Incluso si puede aclarar el requisito por ahora, ¿cómo va a garantizar que no cambien mañana? Entonces, para mí sobre el requisito original, sí, es lo suficientemente sensible y lo implementaré en cinco minutos.
Codismo
1
@KonradRudolph: a menos que elija interpretar el bit sobre "uno de los siguientes" para significar que no importa cuál. Al pensar en ello, puedo ver eso como una respuesta aceptable. Ni siquiera necesita codificar a los demás, es solo una prueba para ver si puede hacer alguno de ellos. Después de todo, en realidad no hay un caso de negocios para una solución sobre otra, es una pregunta de entrevista que en última instancia es menos útil que la pregunta estándar de revertir una cadena.
jmoreno
4

Si desea eliminar cualquier ambigüedad, puede cambiar los requisitos a:

Escriba una rutina en su lenguaje de programación favorito que tome una lista de cadenas como entrada, y para cada cadena de la lista haga lo siguiente:

  1. Imprima "Fizz" si la cadena contiene el carácter '$' y no contiene '?'.
  2. Imprima "Buzz" si la cadena contiene el carácter '?' y no contiene '$'.
  3. Imprima "FizzBuzz" si la cadena contiene exactamente un '$' y exactamente uno '?'.
  4. Imprima "BuzzBuzz" si la cadena contiene exactamente un '$' y más de un '?'.
  5. Imprima "BuzzBuzz" si la cadena contiene exactamente un '?' y más de un '$'.
  6. Imprima "FizzFizz" si la cadena no contiene '$' y no contiene '?'.
Thomas Eding
fuente
3

¿Es la pregunta demasiado ambigua?

Sí, la pregunta es demasiado ambigua para ser respondida sin aclaraciones. Sin embargo, una regla adicional que dice que en los casos en que se aplican varias reglas, su programa debería elegir lo más específico, debería eliminar la ambigüedad.

¿El estrés del ambiente de una entrevista disminuye la capacidad de pensar críticamente hasta el punto de no poder completar una tarea tan trivial?

Es más probable una indicación de que el candidato "abarrota" el FizzBuzz: estrés o no, el programa es muy simple.

Creo que el FizzBuzz modificado no es comparable al original, porque su solución ideal es diferente: aunque una cadena de if-then-elserestos sigue siendo aceptable, creo que una solución basada en tablas es más apropiada para este problema:

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

El tamaño del espacio del problema 3x3no es 2x2, por lo que se asigna a una tabla mucho más fácilmente que el FizzBuzz original. De hecho, encuentro una solución basada en tablas para el problema original de FizzBuzz más difícil de entender.

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

Dos cosas aquí:

  1. Sí, creo que la mayoría de la gente simplemente buscó en Google fizz buzz y luego tropezó cuando intentaron expandirlo.
  2. Echa un vistazo a: http://dave.fayr.am/posts/2012-10-4-finding-fizzbuzz.html Explica bien cómo puedes resolver el zumbido del fizz usando las abstracciones apropiadas.
AndreasScheinert
fuente
Excepto que nunca llega al nivel correcto de abstracción. Se acerca más a las mónadas, pero creo que es un poco demasiado complicado. Una lista simple de clave / valor, con un condicional directo al final, es bastante fácil de hacer en casi cualquier idioma más complejo que BrainFuck.
jmoreno
2

Descubrimos que la abrumadora mayoría de los candidatos que completaron con éxito la pregunta, no preguntaron nada, simplemente lo hicieron como hicieron con FizzBuzz.

He visto procesos de entrevistas que alientan a los programadores a pensar en voz alta y hacer preguntas para ver su proceso de pensamiento. Me gusta más este proceso.

Leí este fizzbuzz v2.0 y pregunté sobre los requisitos n. ° 3 y n. ° 5 allí. No conozco a otras personas, pero creo que en ingeniería no quiero ninguna ambigüedad, así que hago una pregunta. Porque más adelante (codificado y todo), no quiero saber que tuve que hacer una suposición y que estaba mal.

programador mítico
fuente
Por supuesto, la técnica de "pensar en voz alta" solo es útil si está buscando programadores que prefieran "pensar en voz alta". Eso elimina a la abrumadora mayoría de los programadores, y podría decirse que solo deja principalmente a los programadores que están mejor preparados como gerentes que programadores. Después de todo, pensar a velocidades "eléctricas" en el cerebro es mucho más rápido que pensar a la velocidad "mecánica" de hablar.
Dunk
2

Quizás la forma más fácil de evitar la ambigüedad es mostrar algunos ejemplos:

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

SnoopDougieDoug
fuente
1
Un buen candidato comenzaría con algunas cadenas de prueba y resultados esperados y luego hablaría sobre las pruebas unitarias, o simplemente volvería a escribir los requisitos de manera más formal y menos ambigua. Luego hablarían sobre la importancia de requisitos claros y cómo los errores de requisitos pueden ser mucho más caros de arreglar que los errores de implementación.
John Lyon
2

En lugar de dar a un candidato requisitos contradictorios / poco claros, solo pregúnteles cómo manejan esas situaciones. De lo contrario, te verás incompetente o, peor aún, pondrás a las personas competentes en la traicionera barra de equilibrio de "¿cómo obtengo las respuestas que necesito sin implicar que esta pregunta de la entrevista o la persona que la pregunta es estúpida?"

De cualquier manera, es irritante ya que todos salen. Las entrevistas son un proceso de correspondencia y con eso quiero decir una calle de dos vías. Las preguntas directas y la claridad de intención son mucho más importantes que poner al candidato bajo una olla a presión, IMO. FizzBuzz es un buen ejemplo de una pregunta de codificación porque es breve y dulce. No lo reutilices directamente. Escribe preguntas simples como esta que sigan ese modelo.

Pero para FFS no sea inteligente al respecto y oculte la prueba real detrás de otra prueba. Pregúntele a la gente cómo manejan el maldito problema. Un desarrollador experimentado habrá tratado con requisitos ambiguos repetidamente y estará encantado de contarle sus estrategias. Incluso podrías aprender algo.

Y no asuma que todos quieren usar una pizarra blanca o se sienten cómodos durante el período de escritura a mano. Algunos de nosotros hemos estado escribiendo desde que teníamos 12 años (con muchas gracias a Space Quest). Ni siquiera puedo pensar con claridad con un bolígrafo o marcador en la mano. Es 20-freaking-13, ¿qué pasa con las pizarras blancas? Cuando la gente me da un bolígrafo y papel y me pide que haga una prueba de código, es difícil reprimir una carcajada.

Erik Reppen
fuente
1

Creo que es una buena pregunta de entrevista. Los requisitos no están claros, tal como lo son a menudo en la realidad. Usted verifica si el candidato es lo suficientemente inteligente como para darse cuenta de esto (incluso bajo estrés), que no tiene miedo de hacer las preguntas que considere necesarias y es capaz de poner los requisitos en una estructura sensible. Y dice un poco sobre sus habilidades de programación, aunque también debe plantear algunos problemas más complicados que contienen recursividad y punteros, ya que este problema es demasiado fácil.

Sin embargo, me preocupa un poco que los candidatos "exitosos" no hagan preguntas. Intentaría averiguar si se dieron cuenta de que puedes aplicar hasta 4 de las reglas en algunos casos y que no hay nada en la pregunta que resuelva esa ambigüedad, y que expliquen cómo trataron eso. Quizás su pregunta no sea lo suficientemente ambigua como para obligarlos a preguntar, o quizás debería pedirles que piensen en voz alta.

Por cierto: me parece extraño que estés hablando de una "solución correcta". Si formula la pregunta de esa manera, es legítimo imprimir cualquiera de "Fizz", "Buzz", "BuzzBuzz" o "FizzBuzz" si obtiene "AB". Entonces, en mi humilde opinión, cualquier solución sin preguntas es completamente incorrecta.

Hans-Peter Störr
fuente