¿Por qué tantos programadores tienen dificultades con la pregunta de la entrevista del código FizzBuzz?

El primer instinto que cualquier programador medio decente tiene cuando se enfrenta a algo como FizzBuzz es encontrar una solución en su idioma favorito, ¡solo para demostrar que pueden y para divertirse! No agregaré a la pila ya en los comentarios aquí, pero dirigiré a las partes interesadas al depósito gigante de soluciones en todos los idiomas imaginables (incluido Brainfuck). Este es el punto que más bien le falta: por supuesto que puede resolverlo, está diseñado para ser una pregunta simple de nivel básico que le permite programar todo. Lo inquietante es cuando encuentras personas que no pueden .

Este es un problema real en el reclutamiento de software, y se han propuesto una variedad de respuestas. Aparte de la idea trivialmente tonta de que no es realmente un problema (fácilmente refutado si alguna vez has tenido que entrevistar a candidatos), y la sugerencia francamente perturbadora de que FizzBuzz es de alguna manera demasiado difícil (!) Aquí hay algunas que he encontrado.

¿Por qué estos programadores no saben lo malos que son? Sugeriría el efecto Dunning-Kruger (son demasiado incompetentes para saber cuán incompetentes son). Pero, ¿por qué son tan malos en primer lugar? Algunas personas dirían que es porque carecen de la parte del cerebro necesaria para la abstracción. Un artículo bastante grandioso (que desde entonces ha sido retirado por su autor) afirmó que esta es la razón por la cual algunas personas encuentran que aprender a programar es muy fácil, y otras no pueden dominarlo en absoluto.

Joel on Software señala (aunque su ensayo trata más sobre distinguir a los desarrolladores promedio de los realmente excelentes) que aquí hay un problema de frecuencia: los grandes desarrolladores rara vez están en el mercado laboral. Mientras que los tipos terribles están enviando sus CV por todas partes, siempre esperando ganar la lotería y obtener otra entrevista. El misterio de cómo superan su proceso de evaluación de CV (¿cómo obtuvieron ese grado si no pueden programar? ¿Plagio?) Es mayor que dejaré para las personas más sabias que yo.

Debido a que la mayoría de los programadores ya no escriben código trivial, Programación 101.

Esto es algo que esperarías que te enseñen / mencionen un par de semanas en una clase introductoria (cuando tocas bucles, condicionales y matemáticas).

La mayoría de los programadores han estado haciendo un trabajo interesante durante un tiempo, y las pruebas estúpidas como esta los arrojan porque es “demasiado fácil”, por lo que se congelarán, lo ingeniarán demasiado o arrojarán algo en el tablero que podría ser correcto, pero Como no hay resaltado de sintaxis, compilador, etc., no saben si realmente es correcto.

Wikipedia enumera la edición más simple en su página al respecto:

// javascript
var o = ”;
para (var i = 1; i <= 100; i ++) {
i% 3 || (o + = ‘Fizz’);
i% 5 || (o + = ‘Zumbido’);
! (i% 3 && i% 5) || (o + = (i + ”));
}
console.log (o);

Cuando haya visto “desarrolladores”, pregunte “¿qué es un bucle?”, No es sorprendente encontrar un “programador” que no piense en “aritmética de módulo” al ver FizzBuzz. Como dijo Matt Maufe, cualquier programador debería poder escribirlo en un minuto (ni siquiera conozco Python, pero podría seguir su programa como si fuera simple inglés: FizzBuzz es tan trivial), pero muchos “programadores “No tengo idea de qué módulo aritmético es, o de que puede obtener ese resultado al realizar una operación matemática en un número.

No estoy seguro de que muchos programadores tengan dificultades con este problema. Si una persona es capaz de escribir un ciclo for, declaraciones if / then, hacer aritmética simple y finalmente comparar la igualdad, entonces este problema es fácilmente solucionable. El problema te pide que resuelvas todos los enteros del 1 al 100, pero en aras de guardar las pulsaciones de teclado, resolveré todos los enteros del 1 al 15.

R: esta es la forma más básica de resolver el problema.

para (sea i = 1; i <16; i ++) {
if (i == 3 || i == 6 || i == 9 || i == 12) {
console.log (‘Fizz’);
} else if (i == 5 || i == 10) {
console.log (‘Buzz’);
} más si (i == 15) {
console.log (‘FizzBuzz’);
} más {
console.log (i);
}
}

B: de esta forma se demuestra una forma dinámica de resolver el problema: no utiliza el operador de módulo y no está optimizado

para (sea i = 1; i <16; i ++) {
dejar valor1 = i / 3;
dejar valor2 = i / 5;
if (Math.floor (value1) == value1 && Math.floor (value2) == value2) {
console.log (‘FizzBuzz’);
} else if (Math.floor (value1) == value1) {
console.log (‘Fizz’);
} else if (Math.floor (value2) == value2) {
console.log (‘Buzz’);
} más {
console.log (i);
}
}

Finalmente, podríamos usar el operador de módulo para resolver esto. Así es como se podría escribir en TypeScript en una sola línea:

for (let i = 1; i <16; i ++) {(i% 15 == 0)? console.log (‘FizzBuzz’): (i% 3 == 0)? console.log (‘Fizz’): (i% 5 == 0)? console.log (‘Buzz’): console.log (i)}

Si está interesado en probar este código, aquí hay un enlace: Playground · TypeScript. Con la verdadera prueba Fizz Buzz, querrás reemplazar 16 con 101 … pero esto es solo un POC 🙂

Por lo que entiendo, la prueba Fizz Buzz no le pide que optimice el programa. Por lo tanto, ninguno de los algoritmos que proporcioné fallaría la prueba 😀 (suponiendo que los algoritmos hagan lo que pide la prueba de Fizz Buzz). Ahora, la pregunta más apremiante es ¿qué dicen estos algoritmos sobre la persona que los escribió? Probablemente, alguien que haya sido completamente nuevo en programación y no haya tenido mucho tiempo para aprender los matices del oficio lo escribiría. ¿Estás buscando un ingeniero de software senior? No contrates a la persona que escribió A : son demasiado nuevos. Sin embargo, tal vez podrían ser una buena opción para una pasantía o un puesto de primaria. La persona que escribe B debe saber sobre el operador de módulo (incluso si no sabe que se llama operador de módulo), especialmente teniendo en cuenta que sabe sobre Math.floor (). Dicho esto, preguntándoles algo como, ‘oye, ¿por qué usaste Math.floor () en lugar de verificar si existía un resto?’, Podría revelar alguna idea de su proceso de pensamiento, tal vez también sean nuevos, tal vez solo estaban nerviosos 🙂

Sin contexto, la prueba Fizz Buzz no es increíblemente útil.

Es un ejercicio de pensamiento lógico para resolver problemas, algo que la mayoría de las personas (incluso la mayoría de las personas que se hacen llamar programadores) tienen dificultades para hacer.

O es una prueba para ver si conoce los bucles básicos y el operador del módulo.

O es una prueba de qué tan bien investigas preguntas comunes de entrevistas y memorizas las respuestas simples a ellas.

O…

No lo hacen, de verdad.

Cualquiera que considere un programador podrá, y dada la definición del problema, una computadora bien equipada con acceso a Internet y media hora, probablemente podría enseñarle a un principiante completo a hacerlo.

Las personas que no pueden no programar, o solo pueden programar cosas que fueron parte de su escuela secundaria / universidad / cualquier curso. Sin embargo, he oído que muchos solicitantes para programar trabajos caen en esta categoría.

Por diversión, FizzBuzz en Python:

para i en rango (100):
si i% 15 == 0:
print (“FizzBuzz!”)
elif i% 3 == 0:
imprimir (“Fizz”)
elif i% 5 == 0:
imprimir (“Zumbido”)
más:
imprimir (i)

Me imagino que hay una manera más eficiente de hacerlo, pero Python no es mi fuerte.

Tuve que buscarlo.

Todo lo que parece probar es si has oído hablar del operador de módulo.

No tengo idea de por qué se supone que eso es difícil.

Después de hacer varias entrevistas, estoy convencido de que muchos programadores simplemente no pueden programar. Quizás esta sea la razón.