Sunday, November 4, 2007

Perl

Recuerdo el día que se rompió la burbuja C/C++ que aprisionaba mi cabeza. Fue por la noche, estaba molesto, pues tenía que aceptar, nuevamente, que aquel simple programita que me había querido hacer seguiría demorándose n-dias mas porque ya estaba cansado de escribir tanto código aburrido, para hacer hacer algo que no era ni tan interesante, ni tan urgente como para seguir frente a una computadora, después de haber estado todo el día frente a otra en mi trabajo, tal ves podría dormir temprano por alguna vez, y tratar de llegar temprano mañana, para variar.



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(?).