El Fizz Buzz est谩 muerto, larga vida al Fizz Buzz

22 de abril del 2019 鈥 2458 palabras 鈥 13 min

Ya hace un par de a帽os que me involucro y lidero procesos para la contrataci贸n de talentos. Al ser programador, tambi茅n me he visto involucrado en procesos ajenos que me han ayudado a encontrar maneras 贸ptimas de crear procesos de selecci贸n para cualquier 谩rea.

Hace tiempo que he estado colaborando con una agencia de reclutamiento llamada Multiplica Talent. En comparaci贸n con otras agencias de reclutamiento, su diferencial est谩 en probar de manera t茅cnica a los candidatos antes de presentarlos a los clientes. Mi rol en esta empresa est谩 enfocado en tener un proceso de selecci贸n moderno y efectivo para los talentos que buscamos.

Dado que el proceso de selecci贸n para posiciones de programaci贸n era relativamente nuevo, me encontr茅 con uno no muy 贸ptimo: consist铆a en enviar una prueba regular al candidato en donde se med铆an conocimientos de ciertos lenguajes. El tiempo que el candidato ten铆a que invertir era de alrededor de 5 horas. Muchos de estos candidatos no enviaban su prueba a tiempo o simplemente no respond铆an.

Lo primero que identifiqu茅 fue que el tipo de prueba no era para nada atractiva. Las pruebas de programaci贸n pueden ser tan aburridas, que al final del d铆a, tambi茅n son un reflejo de la cultura que tiene la empresa. Si una prueba es tediosa, no requiere creatividad y tiene una dificultad sospechosa, la motivaci贸n e inter茅s del candidato quedar谩n por los suelos.

Tambi茅n hablemos del tiempo; a menos de que un candidato est茅 en b煤squeda activa, es decir, que pueda invertir mucho tiempo en todos los procesos de diferentes empresas a las que se est谩 postulando, le ser谩 dif铆cil encontrar 5 horas (libres) entre semana e inclusive fines de semana.

Con esta informaci贸n comenc茅 a dise帽ar un proceso de selecci贸n para candidatos de programaci贸n. Este consta de 3 filtros que aseguran que podamos conocer y evaluar al candidato de manera 贸ptima, pero manteniendo un equilibrio con el tiempo que se invierte. El nuevo proceso tiene una duraci贸n total de 2 horas: 15 minutos para una prueba de filtrado r谩pido, 1 hora para la prueba de programaci贸n especializada y 45 minutos de entrevistas.

En este art铆culo hablar茅 acerca del primer filtro, el de filtrado r谩pido que dura 15 minutos. Este consiste en una prueba que nos ayuda a filtrar candidatos que est茅n interesados en la posici贸n que ofrecemos, pero que tambi茅n tengan habilidades de programaci贸n y resoluci贸n de problemas.

El Fizz Buzz

Muchos programadores, si no es que la mayor铆a, saben que existe una prueba de filtrado llamada Fizz Buzz. Esta prueba consiste en escribir un peque帽o programa que imprima los n煤meros del 1 al 100, pero que cuando el n煤mero sea m煤ltiplo de 3, imprima la palabra 鈥淔izz鈥; para m煤ltiplos de 5 deber谩 imprimir 鈥淏uzz鈥, finalmente cuando el n煤mero sea m煤ltiplo de 3 y de 5, deber谩 imprimir 鈥淔izzBuzz鈥.

Esta prueba se ha aplicado en muchas empresas como una puerta para poder comenzar el proceso de selecci贸n, porque pone a prueba las habilidades de escritura de c贸digo y resoluci贸n de problemas. Tambi茅n muestra que se sabe programar porque, incre铆blemente, muchos de los candidatos que comienzan un proceso de selecci贸n, no lo saben hacer. Finalmente, da cabida a mostrar otras habilidades del candidato referentes a estructuras de c贸digo, buenas pr谩cticas, entre otras cosas.

Este ejercicio de programaci贸n se ha vuelto muy famoso, y en mi opini贸n, ya ha sido utilizado demasiadas veces; incluso ya es ense帽ado durante la escuela. Personalmente, me resulta anticuado aplicar esta prueba en estos tiempos modernos.

驴Algoritmos? Solo si se requiere

Muchas empresas aplican ejercicios en herramientas de automatizaci贸n y aplicaci贸n de pruebas de c贸digo; sin embargo, he visto que colocan problemas altamente complejos, no relacionados al tipo de tareas que tendr铆a un candidato en el trabajo, y que tambi茅n lo llegan a utilizar como 煤nica prueba para 鈥渕edir鈥 las habilidades del candidato.

Soy creyente de que los procesos de selecci贸n de en una empresa deben ser humanos, considerando al candidato como tal. Que el postulante no es un code monkey, y que tampoco una prueba de algoritmos validar谩 sus habilidades de producci贸n de c贸digo. Si el trabajo requiere creaci贸n de algoritmos, entonces que se ponga a prueba; de lo contrario, se est谩 perdiendo tiempo.

Pens茅 que el ejercicio no necesariamente tendr铆a que estar alineado al tipo de trabajo 鈥攎e refiero al lenguaje o tipo de aplicaci贸n鈥 y que tampoco tuviera la innecesaria complejidad de demostrar capacidad para escribir algoritmos complicados que rara vez son utilizados.

La alternativa

Decid铆 implementar un primer ejercicio de filtrado al estilo Fizz Buzz; pero sin el Fizz, ni el Buzz. Un primer paso en el proceso de selecci贸n que permitiera al candidato demostrar sus habilidades de programaci贸n de una manera natural, sin ponerlos contra la pared, y que a su vez fuera divertido.

Pens茅 que el ejercicio no necesariamente tuviera que estar alineado al tipo de trabajo - me refiero al lenguaje o tipo de aplicaci贸n, y que tampoco tuviera la innecesaria complejidad de demostrar capacidad para escribir algoritmos complicados que rara vez son utilizados.

Para la creaci贸n de este primer filtro, establec铆 las siguientes reglas para la elaboraci贸n de los ejercicios.

  1. Deb铆an tener la simpleza y peculiaridad del Fizz Buzz, pero a su vez, una marca innovadora y divertida.
  2. Ten铆an que ser cortos y sencillos. Ejercicios que pudieran ser resueltos en un lapso no mayor a 15 minutos.
  3. Ten铆an que contar una historia que los envolviera, para darle ese toque peculiar, como de resolver un misterio para obtener una respuesta a trav茅s de c贸digo. Muy a la CSI.
  4. Ten铆an que permitir escribir el c贸digo que fuera necesario. Que fueran flexibles a la hora de resolverlos.
  5. Los ejercicios deb铆an de tener una respuesta final para automatizar la verificaci贸n de la respuesta. Si el talento hab铆a podido entender y escribir el c贸digo necesario, iba a ser capaz de llegar a la respuesta final y por lo tanto era un talento que sab铆a programar y que estaba interesado.

Con base en las reglas anteriores pude crear dos ejercicios; son dos para poder asignarlos aleatoriamente y a su vez poder medir el 茅xito de cada uno, por si era necesario modificarlo.

  1. Ejercicio 1: Ganando la loter铆a Existe una leyenda urbana acerca de una frecuencia especial, que al sintonizarse, uno puede escuchar los n煤meros de la loter铆a del mes. Tu curiosidad y habilidades para hallar secretos te llevan a encontrar una lista en internet con ajustes de frecuencia (incrementando o decrementando), que probablemente, te har谩n llegar a la frecuencia secreta.
  2. Ejercicio 2: La caja fuerte El antiguo due帽o de la casa que acabas de adquirir, dej贸 su caja fuerte cerrada. Te coment贸 que hay un jugoso premio dentro de ella para la persona que logre adivinar la contrase帽a. Sin embargo, solo te di贸 una pista para poder adivinar la contrase帽a: 鈥淭oma este documento y suma el n煤mero total de repeticiones de letras鈥, despu茅s te entreg贸 un documento lleno de letras y n煤meros por los dos lados.

Cada ejercicio viene acompa帽ado de un input, que son los datos del ejercicio. Estos datos deben de ser utilizados para poder procesarlos seg煤n el problema y obtener una respuesta final. La respuesta final es un n煤mero, as铆 que no importa si el c贸digo creado para llegar a la respuesta es 鈥渂onito鈥 o 鈥渇eo鈥, lo importante es que se llegue a esta respuesta final.

Cabe se帽alar que estos dos ejercicios ya fueron aplicados a m谩s de 100 candidatos alrededor del mundo.

Datos y respuestas din谩micas

El input del ejercicio puede ser generado de manera din谩mica, es decir, cada vez que se crea un ejercicio, este tiene una respuesta correcta 煤nica.

El siguiente bloque de c贸digo es el generador de los datos que necesita el primer ejercicio 鈥淕anando la loter铆a鈥.

input = (0..1000).map do |i|
  "#{["+", "-"].sample}#{rand(1...100)}"
end.join("\n")

Y el c贸digo para obtener la respuesta podr铆a ser escrito de la siguiente manera.

input.split("\n").map(&:to_i).sum

Para el segundo ejercicio 鈥淟a caja fuerte鈥, el generador luce as铆.

input = (0..10000).map do |i|
  [*('a'..'z'), *(1..100)].sample
end.join

Y el c贸digo para obtener la respuesta, puede ser as铆 de simple.

input.delete("^a-zA-Z").size

El c贸digo para generar la respuesta luce bastante simple, pues es parte de la flexibilidad y la simpleza que tienen estos dos ejercicios. Para los programadores, esto puede ser contra-intuitivo. Estamos acostumbrados a realizar ejercicios m谩s complicados o que representan un reto a煤n m谩s grande.

Esto es totalmente intencional, la idea es que exista espacio para la creatividad en forma de c贸digo.

驴C贸mo respondieron?

Los candidatos han respondido de muchas formas. Me he encontrado con respuestas completas y 贸ptimas, otras muy complejas, y otras innecesariamente complejas. Cualquier desarrollador que haya podido enviar su ejercicio es porque encontr贸 la respuesta correcta.

Los siguientes scripts son una muestra de lo que los candidatos nos contestaron.

鈥淟a caja fuerte鈥 en Javascript:

var totalLetters = 0
inputArr.forEach(function(element) {
  var letters = /^[a-zA-Z]+$/
  if (letters.test(element)) {
    totalLetters++
  }
})
console.log(totalLetters)

En PHP:

$input = str_replace('1', '', $input);
$input = str_replace('2', '', $input);
$input = str_replace('3', '', $input);
$input = str_replace('4', '', $input);
$input = str_replace('5', '', $input);
$input = str_replace('6', '', $input);
$input = str_replace('7', '', $input);
$input = str_replace('8', '', $input);
$input = str_replace('9', '', $input);
$total = 0;
foreach (count_chars($input, 1) as $i => $val) {
  echo "<p>hubo $val instancias(s) de \"" , chr($i) , "\" en la palabra.</p>";
  $total+=$val;
}
echo "<p>valor final = $total</p>";

Y finalmente en Python:

clave = 0
for caracter in mensaje:
    if caracter.isalpha():
        clave=clave+1
print("La suma total de los caracteres es: ", clave)

Despu茅s, 鈥淕anando la loter铆a鈥 en Javascript:

AdjustFrequency (array) {
  let lotteryNumber = 0;

  array.forEach( (element) => {
    lotteryNumber += element;
  });

  return lotteryNumber;
}

En PHP:

foreach($lista as $string){
  if($string[0]=='+'){
    $frecuencia=$frecuencia+(int)(str_replace(['+','-'],'',$string));
  } else {
    $frecuencia=$frecuencia-(int)(str_replace(['+','-'],'',$string));
  }
}
echo $frecuencia;

Y finalmente en Python:

def frecuencia(input):
    resultado = 0
    with open(input) as frec:
        for linea in frec:
            if linea[:1] == '+':
                resultado += int(linea[1:])
            elif linea[:1] == '-':
                resultado -= int(linea[1:])
    return resultado

print(frecuencia('input.txt'))

Cada uno de estos scripts tiene su lado curioso, algo que revela qui茅n es el talento, de qu茅 manera ley贸 el ejercicio y c贸mo lo resolvi贸 a trav茅s de c贸digo. Tambi茅n revela qu茅 es lo que quiso demostrar; si quiso demostrar la simpleza de su soluci贸n o las habilidades que tiene para resolverlo de una forma m谩s elegante. En algunos casos nos revela qu茅 sabe el talento acerca del lenguaje que eligi贸 para resolverlo.

Al fin y al cabo, lo que queremos es conocer al candidato: c贸mo se mueve, c贸mo piensa, sus intenciones y sus ambiciones. Esta prueba de 15 minutos permiti贸 a los programadores demostrar sus habilidades a su manera y al ser la puerta de entrada al resto de proceso, pudimos demostrar iba a ser divertido, diferente y moderno.

Conclusi贸n

Esto sin duda ayud贸 mucho a identificar talentos con enfoque m谩s completo que el Fizz Buzz. Nos dio una herramienta para filtrar a candidatos con habilidades para poder resolver problemas y para demostrar el inter茅s en el resto del proceso de selecci贸n, pero lo m谩s importante, nos mostr贸 una parte de la personalidad y quiz谩s el nivel de los talentos.

La conclusi贸n de esta historia que les quise contar, es que, a pesar de que el Fizz Buzz ya haya sido utilizado demasiadas veces y que los talentos lo aprendan en sus pasos b谩sicos, este tipo de ejercicios son herramientas que ayudan a identificar talentos en procesos de selecci贸n y contrataci贸n. Que no es necesario que sean aburridos o complejos para poder darle la oportunidad al programador de expresar sus ideas, permitiendo comprensi贸n y creatividad a la hora de desarrollar soluciones.

Y es que este 煤ltimo punto para m铆 es el m谩s importante. 驴Por qu茅 la programaci贸n tiene que dejar de ser divertida y creativa? Al final del d铆a, la mayor铆a de los programadores programan con pasi贸n y coraz贸n. Pero tambi茅n, 驴ser谩 que se puede tener una prueba similar para otras disciplinas profesionales?