Antes de que llegara la pandemia de COVID, vivía y trabajaba en una pequeña ciudad del noroeste de Alemania. Trabajaba en una pequeña empresa emergente. Era uno de los siete ingenieros de la empresa. A pesar de que éramos un equipo muy pequeño, mis compañeros de trabajo eran algunas de las personas más inteligentes con las que he trabajado. Desarrollamos una aplicación de escritorio nativa que utilizaban los ingenieros mecánicos para diseñar piezas. Estas piezas eran del tipo que se utilizaba en los coches, los aviones y demás. Era un programa de modelado 3D (CAD), así que, naturalmente, siempre que contratábamos a un nuevo ingeniero o teníamos un pasante, preferíamos a personas que fueran buenas en matemáticas, geometría, escribiendo código de alto rendimiento de bajo nivel, etc. Cuando entrevistamos a los candidatos, me dieron la responsabilidad de hacer la entrevista técnica. Había preparado algunas tareas de programación que reflejaban las habilidades que queríamos en un candidato. Le pedía al candidato que resolviera el problema y hablara sobre su proceso de pensamiento. Incluso si no terminaban la solución en 45 minutos, era una forma útil de aprender lo que sabían y cómo pensaban. Otros miembros de mi equipo entrevistaron a los candidatos en función de otros criterios, como la personalidad, etc. Esto había funcionado muy bien y habíamos contratado a ingenieros muy talentosos y motivados. Todos éramos bastante buenos en lo que hacíamos y nos respetábamos mutuamente.
A principios de 2020, un estudiante de último año de la universidad local se puso en contacto con nosotros para solicitarnos una pasantía. Me tomé unas vacaciones muy necesarias y me fui a Berlín durante un par de semanas. Así que no estuve presente para hacer la entrevista técnica. Mi gerente y el resto del equipo quedaron muy impresionados con el estudiante durante la entrevista, y su currículum era excepcional. Nunca habíamos tenido un pasante antes. Mi gerente pensó que una entrevista técnica podría ser innecesaria para un pasante. Entonces decidió que comenzara a trabajar con nosotros sin una entrevista técnica. Regresé de mis vacaciones y me dijeron sobre el nuevo pasante que comenzaría la semana siguiente. Tuve que supervisar el trabajo de este pasante. Básicamente, asegurarme de que entendiera lo que había que hacer, responder cualquier pregunta, desbloquearlo de cualquier manera posible. Ya habíamos establecido el conjunto de problemas en los que queríamos que trabajara el pasante. A partir de ahora, me referiré al pasante como Stefan. En esta época, se hablaba mucho de la propagación del virus Corona en Alemania. Estaba en todas partes en las noticias. Éramos un equipo pequeño y estábamos acostumbrados a trabajar en espacios reducidos, a hacernos preguntas, a intercambiar ideas en pizarrones, etc. Pero, por desgracia, exactamente un día antes de que Stefan se uniera a nosotros, Alemania entró en cuarentena total. Todos comenzamos a trabajar de forma remota desde casa. Tuvimos dificultades con el trabajo remoto durante las primeras semanas. Como yo era el supervisor del proyecto de Stefan, le dije que podía comunicarse conmigo para cualquier cosa que necesitara para comenzar. En caso de que yo estuviera fuera o ocupado, otros miembros del equipo estaban felices de intervenir y ayudar a Stefan.
Nuestra base de código era una mezcla de C# y C++. Todos nuestros usuarios usaban Windows, así que escribíamos el front-end y todo lo que no fuera crítico para el rendimiento en C#. Todos nuestros algoritmos numéricos, renderizado 3D y todo lo que fuera crítico para el rendimiento se escribían en C++. La mayoría de los miembros de nuestro equipo dominaban ambos lenguajes, algunos se especializaban en uno u otro. Stefan afirmaba ser muy competente tanto en C# como en C++. En su primer día, estuve de guardia con Stefan durante varias horas explicándole nuestra base de código y configurando todo en su máquina local para que pudiera empezar. Stefan estaba un poco nervioso y dijo que había pasado un tiempo desde que escribía en C++ o usaba Windows. Stefan manejaba diariamente una máquina Linux. Parecía tener dificultades para escribir en C++. Me imaginé que estaba un poco desconcertado por tener que trabajar en un nuevo entorno, una nueva base de código y decidí ayudarlo hasta que se pusiera en marcha. Así que programamos en pareja durante las siguientes horas. Necesitaba que lo ayudara a escribir código una línea a la vez. Cometía errores tontos en su código y necesitaba que yo los corrigiera y le mostrara la forma correcta de hacer las cosas. Pensé que era un poco extraño, pero decidí darle una oportunidad de todos modos. Esperaba que al final de nuestra llamada Stefan supiera lo suficiente para seguir trabajando por su cuenta.
Para mi deleite, al día siguiente no recibí noticias de Stefan. Le envié un mensaje y me dijo que estaba progresando y que no necesitaba nada de mí. Me alegró escuchar eso. Podía concentrarme en mi propio trabajo. Pero al día siguiente, Stefan volvió a contactarme para pedirme ayuda. Para contribuir a nuestra aplicación, Stefan tuvo que escribir tanto C# como C++. Tuvo que escribir la parte numérica del algoritmo en C++ y conectarla con el frontend y hacer algunas otras cosas en C#. Cuando Stefan se comunicó conmigo el tercer día, no había avanzado en absoluto con su código C++. Estaba prácticamente donde lo habíamos dejado al final del primer día, pero avanzó mucho con su código C#. Estaba abordando la tarea desde ambos extremos al mismo tiempo. Stefan me mostró con orgullo las cosas que escribió en C# el segundo día sin mi ayuda. Leí el código y me quedé impresionado. El código era de muy alta calidad. Era conciso, elegante y eficaz. En realidad, Stefan tenía mucho talento, pensé. Tal vez estaba un poco oxidado con la sintaxis de C++ y los detalles del lenguaje, pero su código en C# mostraba que, en general, era un buen programador. Pensé que era una buena señal y que probablemente mejoraría su código en C++ muy rápidamente. Esto me animó a ayudarlo con su C++. Una vez más, pasé varias horas el día 3 trabajando en conjunto con Stefan, ayudándolo con su código en C++. Este ciclo se repitió una vez más. Stefan se fue solo a escribir código en C# el día 4, y volvió a pedirme ayuda con C++ el día 5. En ese momento, comencé a sospechar. El nivel en el que necesitaba ayuda con su código en C++ no era consistente con el código en C# de alta calidad que escribía. En C++, parecía tener dificultades con los conceptos básicos, cómo funcionan las computadoras, cómo funciona la memoria, etc. Obviamente, C# es un lenguaje que recolecta basura y no es necesario saber cómo administrar la memoria, pero algo no estaba bien y no podía identificarlo.
Había pasado una semana entera. Como equipo acostumbrado a trabajar en la oficina, todos odiábamos trabajar de forma remota. En ese momento, durante el confinamiento, se nos permitía reunirnos en grupos de 7 personas o menos. Un compañero de trabajo, llamémosle David, nos invitó a mí y a un par de compañeros más a su casa para hacer una barbacoa durante el fin de semana. Vivía no muy lejos de mí y ya habíamos hecho cosas así antes. El clima era agradable, estábamos pasando el rato en el patio trasero de David con su esposa y su hija de 3 años. Asamos a la parrilla y comimos carne y verduras, tomamos unas cervezas y el ambiente era muy tranquilo. La hija de 3 años de David nos estaba sirviendo tierra en pequeños vasos de plástico fingiendo que era helado. No hace falta decir que no caí en la trampa. David sacó el tema de Stefan y la conversación fue algo así:
David: ¿Cómo va todo con Stefan? Se ha puesto en contacto conmigo varias veces durante la última semana para pedirme ayuda.
Yo: Ah, sí, también lo ayudé bastante. Está empezando, así que no me importó ayudarlo. ¿Qué opinas de él?
David: Sí. Me impresionó mucho su trabajo. Escribe código de muy alta calidad y parece saber lo que hace en C++, pero le cuesta escribir buen código en C#. Lo he estado ayudando a escribir código en C#.
Le pregunté a David: "Espera, ¿te refieres a lo contrario? Porque creo que su C# es muy bueno pero es pésimo en C++". Tan pronto como terminé la oración, ambos entendimos lo que estaba pasando. Yo había estado dándole de comer a Stefan código C++, que él le mostró a David como suyo. Y cada dos días, David le daba de comer a Stefan código C# que me mostraba como suyo. Yo estaba impresionado por la calidad del código C# de David, y David estaba impresionado por mi código C++. Por un lado, David y yo tuvimos este hermoso momento de hermanos en el que admirábamos el código del otro. Pero ese momento se vio eclipsado por el hecho de que Stefan nos había engañado a ambos. Esto parecía sacado de una historia, pero ocurría en la vida real. Era como la historia de ese tipo que no sabía jugar al ajedrez, pero se las arregla para empatar partidas con dos grandes maestros enfrentándolos entre sí. Stefan estaba logrando esto en la vida real. Stefan no tenía ni idea. Nos odiamos a nosotros mismos por tardar una semana en darnos cuenta de ello. Para ser justos, si hubiésemos estado en la oficina, este truco no habría funcionado. Caímos en la trampa porque no se nos daba bien comunicarnos mientras trabajábamos desde casa.
Cuando volvimos a trabajar el lunes siguiente, le dije a Stefan que no molestara a David y que solo me pidiera ayuda a mí. Pronto se hizo evidente que Stefan no sabía mucho de programación, matemáticas o geometría. Estaba claro que su currículum estaba lleno de mentiras. Resulta que es un conversador muy suave y tiene el talento de sonar como si supiera mucho. Esa habilidad le consiguió el trabajo y nos engañó durante toda una semana. Cuanto más trabajaba con Stefan, cuanto más revisaba su código, más incompetente resultaba. Finalmente estaba viendo quién era realmente Stefan, sus verdaderas habilidades de programación. No estoy seguro de si incompetente es la palabra correcta. Stefan escribía un código malo, pero era malo de una manera extraña. Cuando le pregunté al respecto, dio respuestas extrañas. He aquí un ejemplo de lo que realmente sucedió. Una vez le dije a Stefan algo así como: "... Entonces quieres obtener este valor entero, y si ese valor está entre el límite inferior y el límite superior, debes llamar a esta otra función... ¿Está claro?". Stefan me aseguró que entendía lo que había que hacer. Cuando miré su PR al día siguiente vi algo como esto:
int value; // Assigned from somewhere. for (int i = lower_bound; i <= upper_bound; ++i) { if (value == i) { do_stuff(...); } }
Me quedé atónito. No se trataba simplemente de un código malo, era algo más. Recuerdo que cuando era joven se me daba mal programar, pero mi código malo nunca había sido así. Era otra dimensión de rareza. Incluso como programador novato, nunca se me habría ocurrido escribir código como este. La elección de recorrer todos los números enteros entre los límites era bastante extraña, pero lo que realmente me dejó atónito fue el hecho de que incluso cuando encuentra una coincidencia y llama a la función, nunca sale del bucle. Sigue comprobando los valores restantes. ¿Cómo? Le pregunté a Stefan por qué no había hecho simplemente lo siguiente:
if (value <= upper_bound && value >= lower_bound) { do_stuff(...); }
Al recibir mi sugerencia de utilizar desigualdades simples en lugar de comparar con cada número entero en un rango que podría tener decenas o incluso centenas de millares, Stefan me felicitó por haber tenido una idea tan buena y presentó el nuevo cambio en la nota de prensa. Cada vez que Stefan tenía dificultades para hacer algo, le dábamos algo más fácil de hacer. Sorprendentemente, también fracasaba en eso. Fue una pasantía corta, así que no nos molestamos demasiado con Stefan. Después de un tiempo, terminó haciendo tareas que no eran de programación, administrando cosas en hojas de cálculo y otras tareas ad hoc que debían realizarse. Los proyectos originales en los que se propuso trabajar resultaron estar muy por encima de sus habilidades. De alguna manera, Stefan había completado su pasantía remunerada a tiempo parcial de 3 meses. Quería seguir trabajando para nosotros durante el verano. Había presentado un nuevo proyecto de investigación que sería útil para nuestra empresa. Cuando mi gerente me preguntó si quería seguir trabajando con Stefan durante otros 3 meses, dije NO. Le recordé a mi gerente lo horrible que había sido su trabajo durante los últimos tres meses. Pero mi manager era optimista. Tenía fe en la gente. Me pidió que pensara en mí mismo cuando tenía la edad de Stefan, estaba en la universidad y estaba aprendiendo cosas por primera vez.
Mi jefe me pidió que lo pensara y me pidió que considerara darle otra oportunidad a Stefan. Sinceramente, cuando yo tenía la edad de Stefan, escribía juegos 2D en JavaScript utilizando el nuevo (en aquel momento) lienzo HTML5. Stefan era realmente incompetente, incluso después de ajustarlo a su edad y experiencia. Pero mucho peor que su incompetencia era su deshonestidad. En cualquier caso, no quería tomar esta decisión a la ligera. Por un lado, tal vez Stefan sea capaz de aprender, pero por otro lado es deshonesto. Leí la propuesta que escribió para el nuevo proyecto de investigación. La idea era muy novedosa y, si funciona, sería muy útil para nuestra empresa. Fue realmente impresionante. Pero luego tuve un momento de lucidez en el que mi cinismo se impuso al optimismo que mi jefe intentó inculcarme. Me obsesioné con una palabra de la propuesta de investigación de Stefan: "2-variedades".
Después de haber trabajado con él, sabía lo incompetente que era Stefan en realidad, y no había forma de que supiera lo que significaba una variedad de 2. Copié y pegué la propuesta de investigación de Stefan en un detector de plagio en línea. Fue hace años y olvidé cuál era. Simplemente busqué en Google y usé uno de los primeros resultados. El detector de plagio encontró una coincidencia del 97 % con un artículo de investigación y proporcionó un enlace al original. Stefan había copiado todo. A la mañana siguiente hablé con Stefan sobre su propuesta de investigación. Tan pronto como comenzó a hablar, quedó claro que no entendía de qué estaba hablando, y todo era solo una ensalada de palabras. Estaba siendo un charlatán otra vez. Se lo hice saber a mi gerente y esto finalmente rompió su fe en Stefan. Stefan no volvió a trabajar para nosotros.
Lo único que se le daba bien a Stefan era venderse a sí mismo y dar la impresión de que sabía de lo que estaba hablando. Entiendo que hay profesiones en las que estas habilidades pueden llevarte muy lejos, por ejemplo, las ventas, pero me pareció extraño que alguien intentara abrirse camino a base de mentiras en una carrera técnica como el desarrollo de software.