Thursday, November 1, 2007

De como encontré programadores que no podían programar la serie de Fibonacci

Es difícil encontrar buenos programadores y es mucho mas difícil decidir en unos cuantos minutos cual es la capacidad de cada candidato para resolver problemas de un nivel de dificultad no trivial. No quiero equivocarme, es muy costoso para la empresa contratar un candidato que no pueda ajustarse a las exigencias del puesto, es frustrante para dicha persona y negativo para el equipo en general. Lamentablemente ya me ha pasado. Asi que en la duda prefiero rechazar que aceptar.

Ahora bien si nosotros estuviéramos mas enfocados en búsquedas en tablas y presentación de resultados (y no hay nada de malo en ello) obviamente me centraría mas en saber cual es la experiencia con SQL, herramientas de reportes, creación de interfaces, etc. del candidato. Lamentablemente lo que yo busco es un candidato con la capacidad de resolver problemas que probablemente ni el ni yo hemos visto, además de poder hacer todas esas cosas mundanas que la gente de TI hacemos.

Encontrar este tipo de programadores es bastante difícil, encontrar buenos programadores en general es difícil. Por ello el proceso completo de selección de un programador con experiencia (no junior) envuelve: revisión de su CV, un examen online y finalmente un examen escrito con entrevista personal.

El CV básicamente solo descarta aquellas personas que mencionan su experiencia con lenguajes de programación como Word, PowerPoint o Internet Explorer (y no es haciendo macros o JavaScript). Es decir: tienes que tener un CV tan pero tan malo para que sea rechazado en esta fase.

El examen online me ayuda a separar a los que dicen tener años de experiencia en C/C++, de los que realmente tienen algo de experiencia. Las preguntas no son triviales, aunque ciertas pistas y respuestas se pueden encontrar buscando en la web. Casi todas las preguntas se pueden responder con menos de 100 lineas. Y debido a que se pueden elegir las preguntas a resolver casi siempre se eligen las preguntas mas simples. El candidato tiene un tiempo máximo de una semana para entregarlo después de contactar con el. Esto debido a que puede estar trabajando y solo podría resolver el examen en su tiempo libre. Que lo entregue lo mas pronto posible es por cierto considerado como un punto a favor. Solo un 5% pasa esta etapa, quizás menos. Lo que es bueno porque me evita el trabajo de descartar a los que solo han hecho cosas triviales en C/C++, (como copiar de la pizarra en su clase de Lenguajes de Programación I, hace varios años dicho sea de paso, eso señores no cuenta como años de experiencia en ningún lenguaje de programación excepto quizás VisualBasic), asi como a los que realmente no están muy interesados en el puesto y piensan que es un fastidio continuar con tan horrendo examen.

Ahora viene la parte difícil, decidir de entre los que enviaron el examen a los que realmente me gustaría contratar de los que no. Una primer vistazo al código es suficiente para descartar muchos, solo un 20% logra aprobar el examen, y no hablo de formato de código, o eficiencia de la implementación, hablo que muchos programas se cuelgan o dan soluciones equivocadas.

Entonces me queda un 1% del total por evaluar. Para comenzar debo aclarar que cualquiera que haya resuelto y aprobado ese examen por su cuenta es capaz de realizar cualquier trabajo medianamente complejo en C/C++. Y de tener recursos ilimitados por gastar contrataría directamente a dicha persona. Pero no los tengo, asi que mi inquietud es medir con cuanta ayuda resolvió el candidato ese examen online y cuanto tiempo real le tomaría hacerlo todo de nuevo bajo mi supervisión. Ahora que lo pienso esa seria una buena solución. Esto de escribir blogs es bueno. De hecho bastaría sentarme con el media hora para darme cuenta de que se encontró la solución por algún lado y la copio o que realmente se tomo un mes para resolver el examen antes de enviar su CV. Ahora, el hecho que lo haya podido hacer tiene su lado bueno, el restante 95% de candidatos no pudo hacerlo. Por otro lado no quiero contratar una persona deshonesta.

La solución actual implica pedirle al candidato venir para una entrevista personal y un examen psicológico y de programación. El examen psicológico es un test de IQ estándar, no hemos tenido sorpresas aqui, casi todos hacen entre 8 y 10 de 13 (lo que esta dentro del rango normal), donde si he tenido sorpresas es en el examen de programación. Este examen es bastante simple, o me parecía bastante simple, al principio pensé que seria ridículamente simple y esperaba ver cierta cara de mofa en los candidatos ante tales preguntas, todo sea por verificar la capacidad de cada candidato me decía. Si tu dices saber teoría de números y yo te pongo una pregunta donde debes multiplicar 13x14, lo que se espera es que puedas resolver eso sin ninguna dificultad. Casi como respirar.

Dicho examen puede ser resuelto en C/C++ o pseudocódigo, importa poco si te equivocas por allí en cerrar una llave o un paréntesis si la idea se entiende. Vamos yo me equivoco varias veces en ese tipo de cosas todos los dias, seria tonto decirte que no sabes programar porque no pusiste un punto y coma al final de una sentencia, ese tipo de cosas suelen pasar y mas si estas bajo presión y escribiendo en papel. Además, y aqui voy a dejar tema para otro post: yo creo que un lenguaje que te obliga a poner un punto y coma al final de cada sentencia es un fastidio, por decir lo menos. Y ya esta, que empiecen a llover los vilipendios. Pero desde que mi lenguaje favorito dejo de ser C/C++ y ahora es Ruby no voy a cambiar de opinión (si ya se que que Ruby es lento, por eso aun uso C/C++), pero bueno, a lo que iba.

Espero que un candidato con experiencia resuelva ese examen sin mucho problema: OK lo ideal seria darle un compilador por media hora pero el examen también tiene preguntas de concepto y diseño, no creo que una PC le ayude mucho en ello, además estamos partiendo del precepto de que el candidato sabe programar y bastante bien. Entonces llegamos a la pregunta maldita:

Implementar una función que devuelva el termino n-esimo de la serie de Fibonacci: 1,1,2,3,5,8,... ¿En cuanto tiempo calculará su función el valor de fibonacci(75)?

Tan simple como eso, la segunda parte es un hint para que el candidato implemente una solución iterativa, pues la solución recursiva demora demasiado y me sirve perfectamente para verificar si el candidato ha implementado alguna vez en su vida este ejercicio básico.

Y aqui viene la parte desagradable y el motivo de este post, pues he tenido que rechazar candidatos que en el papel tenían amplios conocimientos y certificados, cuyo examen online estaba dentro del promedio de calidad que acepto (sin llegar a ser brillante) pero cuya respuesta a esta pregunta hizo que sonaran muchas campanas de alerta en mi interior.

Hubo un candidato que tenia en su CV una maestría en una universidad del extranjero en ciencias de la computación, había implementado como tesis de bachiller un complejo algoritmo de optimización y que sin embargo falló en todas las preguntas simples que le hice. Siendo esta la de Fibonnacci la que ya no pude soportar. Cuando le pregunte el porqué me respondió: "Que era algo que había visto en la universidad hace mucho tiempo y no se recordaba bien pero tenia que hacerse con recursión."

El que no se recordara de Fibonacci no importaba, de hecho que nunca haya visto el problema seria lo ideal pues el candidato trataría de resolverlo solo con su ingenio, la serie esta ahí, ¿Quizás no pudo recordar como se formaba la serie? Difícilmente pues el mismo está admitiendo haberla visto algún tiempo y no es una serie como esta: 1, 11, 21, 1211, 111221, 312211,... Esa si es una serie que te hará doler la cabeza. El hecho es que para mi el candidato solo conocía la programación desde un punto de vista teórico, y eso hasta puede estar bien, Dijkstra mismo pensaba que había algo mas abstracto en las ciencias de la computación que mera programación. Algo en lo cual yo creo totalmente. "Las computadoras no son mas, a las ciencias de la computación, de lo que los telescopios son a la astronomía". Absolutamente cierto, pero yo estoy buscando un programador practico, y todos los programadores buenos y prácticos que conozco, aquellos que logran hacer cosas, pueden resolver este problema sin pensarlo mucho, quizás sin usar un tipo de dato que te permita calcular fibonacci(75), quizás sin emplear solo dos variables, quizás sin usar la formula cerrada o usando matrices, quizás sin emplear librerías especiales de números para calcular valores grandes, etc. Solo pon algunas variables y un contador dentro de un sucio for o while y punto. Siguiente problema.

Por eso escribo este post, quizás haya algún buen programador ahí afuera, realmente bueno, que lo lea y que tampoco sepa como programar la serie de fibonacci y que me convenza que alguien que no puede hacerlo en 10 minutos puede aún resolver problemas mas complejos pero practicos(?).

6 comments:

  1. Pues de hecho que debe ser dificil
    por ejemplo yo estoy a cargo
    de un grupo de soporte
    y es dificil encontrar gente buena
    y con criterio (que en mi opinion
    es lo mas importante)

    Lo que hago es explicarles
    algo muy dificil
    durante 15 minutos
    conceptos tecnicas
    y cosas nuevas
    y luego lo que hagoe s inmediatamente
    preguntarles acerca de lo
    que les acabode explicar
    y les hago preguntas relacionadas a eso
    te sorprenderias! muchas personas
    mueren en el intento!

    ReplyDelete
  2. Si estaba pensando en emplear esa tecnica tambien, lo que pensaba hacer era poner problemas algo mas dificiles que solo creo resolverian uno entre varios miles y luego si alguien lo resuelve contratarlo y al resto explicarles las solucion y que me la codifiquen luego pero hasta ahora no lo he hecho.

    ReplyDelete
  3. Me he encontrado con esta blog y pese a que hace tiempo de la entrada me gustaría aportar mi opinion.

    Solo puedo opinar desde el otro lado, ya que no he contratado a nadie. Por un lado entiendo los recelos a la hora de contratar a una persona nueva, nunca sabes con seguridad lo que vas a encontrarte, y entiendo las preguntas y posibles examenes. Pero por otra parte, me parece absurdo preguntar cosas especificas fueras del contexto del trabajo que los candidatos estan desarrollando.

    Para mi la entrevista ideal seria plantear un problema real y darle al candidato de unos minutos(15, 30, 60, dependiendo de la complejidad) para que planteara una serie de pasos para llegar hasta la solucion. Si el razonamiento que describe se ajusta a la realidad, es razonable, bien planificado(diagramas de clases, diagramas de estados) y la persona se expresa de manera correcta, tiene todas las posibilidades para ser un buen candidato. Para mi, aquellas personas que no fueran buenos candidatos serian las que empezaría a escribir directamente el codigo, ya que esta manera de trabajo solo funciona a pequeña escala cuando los proyectos y tareas son muy pequeñitos. En cuanto la tarea supusieran varios meses estos programadores resultarían tremendamente improductivos ya que sin una planificación previa acabarian genereando código sphagetti.
    Ademas esta manera de plantear la entrevista supone un reto interesante para el candidato ya que le estas poniendo que proponga (no que implemente) una solucion para un caso real. Pero bueno, esto es una posibilidad para encontrar a una persona flexible y dinamica capaz de adaptarse al equipo y aprender, si lo que se pretende buscar es un tio que pique codigo sin pensar, entonces los test de codigo tienen sentido.


    Se que estamos en tiempos dificiles y mas dificiles se van a poner para todo el mundo. Pero hemos de tratarnos con respeto y con sentido comun. Hemos de ser conscientes que cada persona tiene distintas habilidades. Hemos de comprender que NUNCA encontraremos un clon de nuestras habilidades, pero si que podremos encontrar gente entusiasta con buenas ideas, organizada, capaz de trabajar en equipo y evolucionar a nuevas soluciones.

    ReplyDelete
  4. Hola urkel, gracias por comentar, hace tiempo que modifique mi política de contratación, ahora es mucho mas estricta!! :)
    como vez yo tambien estoy aprendiendo pero sigo 110% de acuerdo con este viejo post mio:

    "me parece absurdo preguntar cosas especificas fueras del contexto del trabajo que los candidatos estan desarrollando."

    a mi no, somos una empresa de programacion y preguntarle a alguien si sabe como usar loops y variables no me parece fuera de contexto, si les preguntara de politica o humanismo quizas estaria de acuerdo.


    "Para mi la entrevista ideal seria plantear un problema real y darle al candidato de unos minutos(15, 30, 60, dependiendo de la complejidad)"

    eso hacemos pero lamentablemente ningun problema *real* del que nos interesa es posible de solucionar en ese tiempo. Pero tenemos un examen online, osea con libros, google etc en la cual el candidato puede mostrar su conocimiento.

    Como dije otro seria mi politica si lo que hicieramos estuviera mas por el lado de SQL o sistemas de informacion tradicional.

    Hasta ahora mi experiencia ha sido que todos los que puede resolver este problema pueden resolver problemas mas grandes que requieren arquitectura y diseño mas sofisticado, pero los que no pueden resolver problemas simples como este definitivamente solo diseñan desastres (que son mas dificiles de descubrir y mas costosos). Por eso mi post, quiero encontrar un programador realmente bueno, que no pueda resolver fibonacci en 10 minutos.

    ReplyDelete
  5. If you pay peanuts you get monkeys!

    Te falta un hervor de perspicacia.

    El problema muchas veces es que queremos que nos aparezca un buen programador pagándole 1000 eurillos al mes. Y esto no hay Dijkstra ni Algoritmia que lo resuelva. Los que tienen talento simplemente se van del país, mientras se quedan los que no saben ni codificar una serie de Fibonacci. En fin, tenemos lo que la consultoría cárnica merece.

    ReplyDelete
  6. Y ahora en 2012, habrá algún buen programador que se haya quedado en Espana?

    ReplyDelete