Vivía e traballaba nunha pequena cidade do noroeste de Alemaña antes de que chegase a pandemia de COVID. Traballaba nunha pequena startup. Eu era un dos 7 enxeñeiros da empresa. A pesar de ser un equipo moi pequeno, os meus compañeiros de traballo foron algunhas das persoas máis intelixentes coas que traballei. Creamos unha aplicación de escritorio nativa usada polos enxeñeiros mecánicos para deseñar pezas. Estas pezas eran do tipo que entraban en coches, avións e demais. Era un programa de modelado 3D (CAD) tan naturalmente, sempre que contratamos un novo enxeñeiro ou tiñamos un pasante, preferíamos persoas que fosen boas en matemáticas, xeometría, escribir códigos de alto rendemento de baixo nivel, etc. Cando entrevistamos aos candidatos, dábanme a responsabilidade de facer a entrevista técnica. Tiña preparadas unhas tarefas de programación que reflectían as habilidades que queremos nun candidato. Pediríalle ao candidato que resolva o problema e falase do seu proceso de pensamento. Aínda que non rematen a solución en 45 minutos, foi unha forma útil de aprender o que saben e como pensan. Outros membros do meu equipo entrevistaron aos candidatos para outros criterios, como personalidade, etc. Isto funcionara moi ben e contratamos a algúns enxeñeiros moi talentosos e motivados. Todos fomos moi bos no que facíamos e respectámonos.
A principios de 2020, tivemos un estudante de último ano da universidade local que nos contactara para pedir unhas prácticas. Tomei unhas vacacións moi necesarias e fun a Berlín un par de semanas. Así que non estiven por facer a entrevista técnica. O meu director e o resto do equipo quedaron moi impresionados co alumno durante a entrevista, e o seu currículo foi excepcional. Nunca tivemos unha interna en prácticas. O meu director pensou que unha entrevista técnica podería ser innecesaria para un pasante. Así que decidiu que comezase a traballar connosco sen unha entrevista técnica. Volvín das miñas vacacións e faláronme do novo interno que ía comezar a semana seguinte. Tiven que supervisar o traballo deste interno. Basicamente, asegúrate de que entendeu o que había que facer, responde a calquera pregunta, desbloquealo de calquera xeito posible. Xa tiñamos exposto o conxunto de problemas nos que queriamos que traballase o estudante. A partir de agora, referireime ao interno como Stefan. Por esta época, falouse moito da propagación do virus Corona en Alemaña. Estaba en todas partes nas noticias. Eramos un equipo pequeno e estabamos acostumados a traballar en grupo, a facernos preguntas, a facer unha chuvia de ideas en pizarras brancas, etc. Pero, por desgraza, exactamente un día antes de que Stefan se unira a nós, Alemaña entrou en bloqueo total. Todos comezamos a traballar a distancia dende casa. Loitamos co traballo remoto durante as primeiras semanas. Sendo eu o supervisor do proxecto de Stefan, díxenlle que pode poñerse en contacto comigo con calquera cousa que necesite para comezar. No caso de que estivese ausente ou ocupado, outros membros do equipo estaban encantados de participar e axudar a Stefan.
O noso código base era unha mestura de C# e C++. Todos os nosos usuarios estaban en Windows, polo que escribimos a interface e calquera outra cousa que non fose crítica para o rendemento en C#. Todos os nosos algoritmos numéricos, renderizado 3D e calquera cousa que fose crítica para o rendemento foron escritos en C++. A maioría dos membros do noso equipo eran competentes nos dous idiomas, algúns especializados nun ou noutro. Stefan afirmou ser moi competente tanto en C# como en C++. O seu primeiro día, estiven de garda con Stefan durante varias horas explicándolle a nosa base de código, configurando todo na súa máquina local para que puidese comezar. Stefan estaba un pouco nervioso, e dixo que facía un tempo desde que escribía C++ ou usaba Windows. Stefan conducía diariamente unha máquina Linux. Parecía que lle custaba escribir C++. Pensei que está un pouco desanimado por ter que traballar nun novo ambiente, unha nova base de código e decidín axudalo ata que se poña en marcha. Entón, programamos a parella para as próximas horas. Precisaba que o axudase a escribir código unha liña á vez. Seguía cometendo erros parvos no seu código, e necesitaba que os corrixese e lle mostrara o xeito correcto de facer as cousas. Pareceume un pouco raro, pero de todas formas decidín darlle unha oportunidade. Esperaba que ao final da nosa chamada Stefan soubese o suficiente para seguir traballando por conta propia.
Para a miña alegría, ao día seguinte non souben de Stefan. Envieille unha mensaxe e dixo que estaba a progresar e que non necesitaba nada de min. Estaba feliz de escoitar iso. Podería centrarme no meu propio traballo. Pero ao día seguinte, Stefan volveu contactar comigo para pedirme axuda. Para contribuír á nosa aplicación, Stefan tivo que escribir C# e C++. Tivo que escribir a parte numérica do algoritmo en C++, conectala coa interface e facer algunhas outras cousas en C#. Cando Stefan contactou comigo o día 3, non tiña feito ningún progreso co seu código C++. Foi principalmente onde o deixamos ao final do día 1. Pero avanzou moito co seu código C#. Atacaba a tarefa desde os dous extremos ao mesmo tempo. Stefan mostroume con orgullo as cousas que escribiu en C# o día 2 sen a miña axuda. Lin o código e quedei impresionado. O código era de moi alta calidade. Foi conciso, elegante e eficaz. Stefan era realmente talentoso, pensei. Quizais estaba un pouco enferruxado coa sintaxe e os detalles da linguaxe en C++, pero o seu código C# mostraba que, en xeral, era un bo programador. Pensei que este era un bo sinal e que probablemente mellorará o seu código C++ moi rapidamente. Isto animoume a axudalo co seu C++. Unha vez máis pasei varias horas o día 3 emparellando con Stefan, axudándoo co seu código C++. Este ciclo repetiuse unha vez máis. Stefan foi só e escribiu código C# o día 4, e volveu pedirme axuda con C++ o día 5. Neste momento comezaba a sospeitar. O nivel no que necesitaba axuda co seu código C++ non era coherente co código C# de alta calidade que escribiu. En C++ parecía loitar cos conceptos básicos, como funcionan os ordenadores, como funciona a memoria, etc. Obviamente C# é unha linguaxe recollida de lixo e non necesitas saber a xestión da memoria, pero algo non me pareceu ben e non puiden acabar. poñerlle o dedo.
Pasara unha semana enteira. Como un equipo que estaba afeito a traballar na oficina, todos odiabamos traballar a distancia. Neste momento durante o bloqueo, permitíronnos reunirnos en grupos de 7 ou menos persoas. Un compañeiro de traballo, chamémoslle David, convidoume a min e a outros dous compañeiros de traballo á súa casa a unha churrascada durante a fin de semana. El vivía non moi lonxe de min e fixeramos cousas así antes. O tempo era bo, estivemos no curro de David coa súa muller e a súa filla de 3 anos. Asamos e comemos carne e verduras, tomamos unhas cervexas e o ambiente era moi suave. A filla de David, de 3 anos, serviunos terra en vasos de plástico facendo que fose xeado. Nin que dicir ten que non me caín. David sacou o tema de Stefan e a conversa foi algo así:
David: Como vai con Stefan? Púxose en contacto comigo pedindo axuda algunhas veces na última semana.
Eu: Ah, si, tamén o axudei bastante. Está empezando, así que non me importaba axudalo. Que opinas del?
David: Si. Quedei bastante impresionado co seu traballo. Está escribindo código de moi alta calidade e parece saber o que está a facer en C++, pero loita por escribir un bo código C#. Estiven axudándoo a escribir código C#.
Pregunteille a David: "Espera, queres dicir ao revés? Porque creo que o seu C# é moi bo, pero é unha merda en C++". En canto rematei a frase, os dous entendemos o que estaba a pasar. Estiven alimentando con culler de código Stefan C++, que mostrou a David como propio. E cada dous días, David estaba alimentando con culler de código Stefan C# que me mostrou como propio. Quedei impresionado pola calidade do código C# de David e David quedou impresionado polo meu código C++. Por unha banda, David e eu tivemos este fermoso momento irmán de como admirabamos o código do outro. Pero ese momento viuse ensombrecido polo feito de que Stefan nos enganou aos dous. Isto foi directamente saído dunha historia, pero ocorreu na vida real. Era como a historia daquel tipo que non sabía xogar ao xadrez, pero que logra debuxar partidas con dous grandes mestres xogándoos un contra outro. Stefan estaba logrando isto na vida real. Stefan non sabía unha merda. Odiabamos a nós mesmos por tardar unha semana en darnos conta. Para ser xustos, se estiveramos na oficina este truco non funcionaría. Caémonos disto polo mal que nos comunicamos mentres traballamos dende as nosas casas.
Cando volvemos traballar o vindeiro luns, díxenlle a Stefan que non molestase a David e que só me pedira axuda. Pronto se fixo evidente que Stefan non sabía tanto sobre programación, matemáticas ou xeometría. Estaba claro que o seu currículo estaba cheo de mentiras. Simplemente é un falador moi suave e ten un talento para parecer que sabe moito. Esa habilidade conseguiu o traballo, e enganounos durante toda unha semana. Canto máis traballaba con Stefan, máis revisaba o seu código, máis incompetente resultaba. Finalmente estaba vendo quen era realmente Stefan, as súas verdadeiras habilidades de programación. Non estou seguro de se incompetente é a palabra correcta. Stefan escribiu código malo, pero era malo dun xeito estraño. Cando lle preguntei por iso, deu respostas estrañas. Aquí tes un exemplo que pasou realmente. Unha vez díxenlle a Stefan algo así como: "... Entón queres obter este valor enteiro, e se ese valor está entre o límite inferior e o límite superior, deberías chamar a esta outra función... Está claro?". Stefan aseguroume que entendía o que había que facer. Cando mirei o seu PR ao día seguinte, vin algo así:
int value; // Assigned from somewhere. for (int i = lower_bound; i <= upper_bound; ++i) { if (value == i) { do_stuff(...); } }
Quedei abraiado. Este non era só un código malo, era outra cousa. Recordo que era novo e que era malo codificando, pero o meu código malo nunca foi así. Esta era outra dimensión da estrañeza. Incluso como programador novato, nunca se me ocorrería escribir código así. A elección de facer un bucle sobre todos os números enteiros entre os límites foi o suficientemente estraña, pero o que realmente me sorprendeu foi o feito de que mesmo cando atopa unha coincidencia e chama a función, nunca sae do bucle. Segue comprobando os valores restantes. Como? Pregunteille a Stefan por que non o fixo simplemente:
if (value <= upper_bound && value >= lower_bound) { do_stuff(...); }
Ao recibir a miña suxestión de usar desigualdades simples en lugar de comparar con cada número enteiro dun rango que podería ser de 10 ou incluso 100 de miles, Stefan felicitoume por ter unha idea tan boa e impulsou o novo cambio no PR. Cada vez que Stefan loitaba por facer algo, dábamoslle algo máis fácil de facer. Sorprendentemente tamén fallaría niso. Foi unhas prácticas curtas, así que non nos molestamos demasiado con Stefan. Despois dun tempo, acabou facendo tarefas non programadas, xestionando cousas en follas de cálculo e outras tarefas ad hoc que había que facer. Os proxectos orixinais nos que se puxo a traballar demostraron estar moito máis alá das súas habilidades. Dalgunha maneira, Stefan completara as súas prácticas remuneradas de 3 meses a tempo parcial. Quería seguir traballando para nós durante todo o verán. El lanzara un novo proxecto de investigación que sería útil para a nosa empresa. Cando o meu director preguntoume se quería seguir traballando con Stefan durante outros 3 meses, dixen que NON. Lembreille ao meu director o horrible que fora o seu traballo durante os últimos tres meses. Pero o meu director era optimista. Tiña fe nas persoas. El me pediu que pensase en min mesmo cando tiña a idade de Stefan, na universidade e aprendendo cousas por primeira vez.
O meu director pediume que pensase ben e pediume que considerase darlle outra oportunidade a Stefan. Sinceramente, cando tiña a idade de Stefan, estaba escribindo xogos en 2D en JavaScript usando o novo lenzo HTML5 (naquel momento). Stefan era realmente incompetente, mesmo despois de adaptarse á súa idade e experiencia. Pero moito peor que a súa incompetencia era a súa deshonestidade. En calquera caso, non quixen tomar esta decisión á lixeira. Por unha banda, quizais Stefan é capaz de aprender, pero por outra banda é deshonesto. Lin a proposta que escribiu para o novo proxecto de investigación. A idea era moi novidosa, e se funciona, sería moi útil para a nosa empresa. Foi realmente impresionante. Pero entón tiven un momento de claridade onde o meu cinismo apoderouse do optimismo que o meu directivo intentou infundirme. Fixeime nunha palabra da proposta de investigación de Stefan: "2-variedades".
Despois de traballar con el, sabía o incompetente que era realmente Stefan, e non hai ningún xeito de que soubese o que significaba unha variedade 2. Copiei a proposta de investigación de Stefan nun comprobador de plaxio en liña. Foi hai anos e esquecín cal era. Acabo de buscar en google e usei un dos mellores resultados. O comprobador de plaxio atopou unha coincidencia do 97 % cun traballo de investigación e proporcionou unha ligazón ao orixinal. Stefan copiara todo. Á mañá seguinte falei con Stefan sobre a súa proposta de investigación. En canto comezou a falar quedou claro que non entendía do que falaba, e todo era só unha ensalada de palabras. Estaba sendo charlatán de novo. Deixeille saber ao meu director e isto finalmente rompeu a súa fe en Stefan. Stefan non volveu traballar para nós.
O único no que Stefan era bo era venderse a si mesmo, e parecer que sabía do que falaba. Entendo que hai profesións nas que estas habilidades poden levarche bastante lonxe, por exemplo, Vendas. Pero pensei que era peculiar que alguén intentara abrirse camiño nunha carreira técnica como o desenvolvemento de software.