paint-brush
O programador inteligentepor@themachine94
Novo histórico

O programador inteligente

por theMachine9410m2024/10/26
Read on Terminal Reader

Muito longo; Para ler

Uma história de como um aluno do último ano com credenciais elevadas se juntou à nossa pequena equipe.
featured image - O programador inteligente
theMachine94 HackerNoon profile picture

Eu estava morando e trabalhando em uma pequena cidade no noroeste da Alemanha antes da pandemia da COVID. Eu estava trabalhando em uma pequena startup. Eu era um dos 7 engenheiros da empresa. Apesar de sermos uma equipe muito pequena, meus colegas de trabalho eram algumas das pessoas mais inteligentes com quem já trabalhei. Nós construímos um aplicativo de desktop nativo usado por engenheiros mecânicos para projetar peças. Essas peças eram do tipo que entravam em carros, aviões e coisas assim. Era um programa de modelagem 3D (CAD), então, naturalmente, sempre que contratávamos um novo engenheiro ou tínhamos um estagiário, preferíamos pessoas que fossem boas em matemática, geometria, escrever código de alto desempenho de baixo nível etc. Quando entrevistávamos os candidatos, recebi a responsabilidade de fazer a entrevista técnica. Eu havia preparado algumas tarefas de programação que refletiam as habilidades que queremos em um candidato. Eu pedia ao candidato para resolver o problema e falar sobre seu processo de pensamento. Mesmo que eles não terminassem a solução em 45 minutos, era uma maneira útil de aprender o que eles sabem e como pensam. Outros membros da minha equipe entrevistaram os candidatos para outros critérios, como personalidade, etc. Isso funcionou muito bem e contratamos alguns engenheiros realmente talentosos e motivados. Éramos todos muito bons no que fazíamos e nos respeitávamos.


No início de 2020, um aluno do último ano da universidade local entrou em contato conosco pedindo um estágio. Tirei férias muito necessárias e fui para Berlim por algumas semanas. Então, não estava por perto para fazer a entrevista técnica. Meu gerente e o resto da equipe ficaram superimpressionados com o aluno durante a entrevista, e seu currículo era excepcional. Nunca havíamos tido um estagiário antes. Meu gerente achou que uma entrevista técnica poderia ser desnecessária para um estagiário. Então, ele decidiu que ele começasse a trabalhar conosco sem uma entrevista técnica. Voltei das minhas férias e fui informado sobre o novo estagiário que começaria na semana seguinte. Eu tinha que supervisionar o trabalho desse estagiário. Basicamente, garantir que ele entendesse o que tinha que ser feito, responder a quaisquer perguntas, desbloqueá-lo de qualquer maneira possível. Já havíamos definido o conjunto de problemas em que queríamos que o estagiário trabalhasse. A partir de agora, vou me referir ao estagiário como Stefan. Nessa época, havia muita conversa sobre a disseminação do vírus Corona na Alemanha. Estava em todos os lugares nas notícias. Éramos uma equipe pequena e estávamos acostumados a trabalhar em espaços fechados, fazendo perguntas uns aos outros, fazendo brainstorming em quadros brancos etc. Mas, infelizmente, exatamente um dia antes de Stefan se juntar a nós, a Alemanha entrou em bloqueio total. Todos nós começamos a trabalhar remotamente de casa. Tivemos dificuldades com o trabalho remoto durante as primeiras semanas. Como supervisor do projeto de Stefan, disse a ele que ele poderia entrar em contato comigo com qualquer coisa que precisasse para começar. Caso eu estivesse ausente ou ocupado, outros membros da equipe ficavam felizes em ajudar Stefan.


Nossa base de código era uma mistura de C# e C++. Todos os nossos usuários usavam Windows, então escrevemos o front-end e tudo o mais que não fosse crítico para o desempenho em C#. Todos os nossos algoritmos numéricos, renderização 3D e tudo o que era crítico para o desempenho foi escrito em C++. A maioria dos membros da nossa equipe era proficiente em ambas as linguagens, alguns se especializaram em uma ou outra. Stefan afirmou ser muito proficiente em C# e C++. No primeiro dia dele, fiquei de plantão com Stefan por várias horas explicando nossa base de código para ele, configurando tudo em sua máquina local para que ele pudesse começar. Stefan estava um pouco nervoso e disse que fazia um tempo que não escrevia em C++ ou usava Windows. Stefan dirigia diariamente uma máquina Linux. Ele parecia ter dificuldade para escrever em C++. Imaginei que ele estava um pouco confuso por ter que trabalhar em um novo ambiente, nova base de código e decidi ajudá-lo até que ele começasse. Então, programamos em dupla pelas próximas horas. Ele precisava que eu o ajudasse a escrever o código uma linha de cada vez. Ele continuou cometendo erros bobos em seu código, e precisava que eu os corrigisse e mostrasse a ele a maneira certa de fazer as coisas. Achei isso um pouco estranho, mas decidi dar uma chance a ele mesmo assim. Eu esperava que, ao final da nossa ligação, Stefan soubesse o suficiente para continuar trabalhando por conta própria.


Para minha alegria, no dia seguinte não tive notícias de Stefan. Mandei uma mensagem para ele e ele disse que estava progredindo e que não precisava de nada de mim. Fiquei feliz em ouvir isso. Eu poderia me concentrar no meu próprio trabalho. Mas no dia seguinte, Stefan entrou em contato comigo novamente pedindo ajuda. Para contribuir com nossa aplicação, Stefan teve que escrever C# e C++. Ele teve que escrever a parte numérica do algoritmo em C++, conectá-lo ao front-end e fazer algumas outras coisas em C#. Quando Stefan entrou em contato comigo no dia 3, ele não tinha feito nenhum progresso com seu código C++. Era basicamente onde paramos no final do dia 1. Mas ele fez muito progresso com seu código C#. Ele estava atacando a tarefa de ambas as pontas ao mesmo tempo. Stefan orgulhosamente me mostrou as coisas que ele escreveu em C# no dia 2 sem minha ajuda. Eu li o código e fiquei impressionado com ele. O código era de altíssima qualidade. Era conciso, elegante e eficaz. Stefan era realmente muito talentoso, eu pensei. Talvez ele estivesse realmente um pouco enferrujado com a sintaxe C++ e detalhes da linguagem, mas seu código C# mostrou que ele era um bom programador em geral. Imaginei que isso era um bom sinal e que ele provavelmente melhoraria seu código C++ muito rapidamente. Isso me encorajou a ajudá-lo com seu C++. Mais uma vez, passei várias horas no dia 3 em dupla com Stefan, ajudando-o com seu código C++. Esse ciclo se repetiu mais uma vez. Stefan saiu sozinho e escreveu código C# no dia 4, e voltou para mim pedindo ajuda com C++ no dia 5. Nesse ponto, eu estava começando a ficar desconfiado. O nível em que ele precisava de ajuda com seu código C++ não era consistente com o código C# de alta qualidade que ele escreveu. Em C++, ele parecia ter dificuldades com conceitos básicos, como os computadores funcionam, como a memória funciona etc. Obviamente, C# é uma linguagem coletada de lixo e você não precisa saber sobre gerenciamento de memória, mas algo não parecia certo e eu não conseguia identificar o que era.


Uma semana inteira se passou. Como uma equipe acostumada a trabalhar no escritório, todos nós odiamos trabalhar remotamente. Nessa época, durante o bloqueio, podíamos nos reunir em grupos de 7 pessoas ou menos. Um colega de trabalho, vamos chamá-lo de David, convidou a mim e a outros dois colegas para um churrasco em sua casa durante o fim de semana. Ele morava não muito longe de mim e já tínhamos feito coisas assim antes. O tempo estava bom, estávamos no quintal de David com sua esposa e filha de 3 anos. Grelhamos e comemos carne e vegetais, tomamos algumas cervejas e o clima estava muito tranquilo. A filha de 3 anos de David estava nos servindo terra em pequenos copos de plástico, fingindo que era sorvete. Nem preciso dizer que não caí nessa. David trouxe à tona o assunto Stefan e a conversa foi mais ou menos assim:


David: Como está indo com Stefan? Ele entrou em contato comigo pedindo ajuda algumas vezes na última semana.


Eu: Ah, sim, eu também o ajudei bastante. Ele está apenas começando, então não me importei em ajudá-lo. O que você acha dele?


David: Sim. Fiquei bastante impressionado com o trabalho dele. Ele está escrevendo código de altíssima qualidade e parece saber o que está fazendo em C++, mas tem dificuldade para escrever um bom código C#. Tenho ajudado ele a escrever código C#.


Perguntei a David: "Espera, você quer dizer o contrário? Porque eu acho que o C# dele é muito bom, mas ele é péssimo em C++." Assim que terminei a frase, nós dois entendemos o que estava acontecendo. Eu estava dando código C++ para Stefan, que ele mostrou a David como se fosse seu. E dia sim, dia não, David dava código C# para Stefan, que ele me mostrou como se fosse seu. Fiquei impressionado com a qualidade do código C# de David, e David ficou impressionado com meu código C++. Por um lado, David e eu tivemos esse lindo momento de irmão de como admirávamos o código um do outro. Mas esse momento foi ofuscado pelo fato de que nós dois fomos enganados por Stefan. Isso saiu direto de uma história, mas aconteceu na vida real. Era como a história daquele cara que não sabia jogar xadrez, mas conseguiu empatar jogos com dois grandes mestres jogando-os um contra o outro. Stefan estava fazendo isso na vida real. Stefan não sabia de nada. Nós nos odiamos por levar uma semana para perceber isso. Para ser justo, se estivéssemos no escritório, esse truque não teria funcionado. Nós caímos nisso porque éramos péssimos em nos comunicar enquanto trabalhávamos em casa.


Quando voltamos ao trabalho na segunda-feira seguinte, eu disse a Stefan para não incomodar David e só me pedir ajuda. Logo ficou bem óbvio que Stefan não sabia muito sobre programação, matemática ou geometria. Ficou claro que seu currículo estava cheio de mentiras. Ele só é um falador muito bom e tem o talento de soar como se soubesse muito. Essa habilidade lhe rendeu o emprego e nos enganou por uma semana inteira. Quanto mais eu trabalhava com Stefan, mais eu revisava seu código, mais incompetente ele se mostrava. Eu estava finalmente vendo quem Stefan realmente era, suas verdadeiras habilidades de programação. Não tenho certeza se incompetente é a palavra certa. Stefan escreveu um código ruim, mas era ruim de uma forma estranha. Quando perguntei a ele sobre isso, ele deu respostas estranhas. Aqui está um exemplo que realmente aconteceu. Uma vez eu disse a Stefan algo como: "... Então você quer obter esse valor inteiro, e se esse valor estiver entre o limite inferior e o limite superior, você deve chamar essa outra função... Está claro?". Stefan me garantiu que entendeu o que tinha que ser feito. Quando olhei para o seu RP no dia seguinte, vi algo assim:


 int value; // Assigned from somewhere. for (int i = lower_bound; i <= upper_bound; ++i) { if (value == i) { do_stuff(...); } }


Fiquei impressionado. Não era apenas um código ruim, era outra coisa. Lembro-me de ser jovem e ruim em codificação, mas meu código ruim nunca foi assim. Esta era outra dimensão de estranheza. Mesmo como um programador novato, eu nunca teria pensado em escrever um código assim. A escolha de fazer um loop em todos os inteiros entre os limites era estranha o suficiente, mas o que realmente me surpreendeu foi o fato de que, mesmo quando ele encontra uma correspondência e chama a função, ele nunca sai do loop. Ele continua verificando os valores restantes. Como? Perguntei a Stefan por que ele simplesmente não fez:


 if (value <= upper_bound && value >= lower_bound) { do_stuff(...); }


Ao receber minha sugestão de usar desigualdades simples em vez de comparar com todos os inteiros em um intervalo que poderia ter 10s ou até mesmo 100s de milhares de comprimento, Stefan me elogiou por ter tido uma ideia tão boa e empurrou a nova mudança para o PR. Toda vez que Stefan lutava para fazer algo, nós dávamos a ele algo mais fácil de fazer. Surpreendentemente, ele falhava nisso também. Era um estágio curto, então não nos importamos muito com Stefan. Depois de algum tempo, ele acabou fazendo tarefas não relacionadas à programação, gerenciando coisas em planilhas e outras tarefas ad hoc que precisavam ser feitas. Os projetos originais em que ele começou a trabalhar provaram estar muito além de suas habilidades. De alguma forma, Stefan havia concluído seu estágio remunerado de meio período de 3 meses. Ele queria continuar trabalhando para nós durante o verão. Ele havia lançado um novo projeto de pesquisa que seria útil para nossa empresa. Quando meu gerente me perguntou se eu queria continuar trabalhando com Stefan por mais 3 meses, eu disse NÃO. Lembrei meu gerente de quão horrível seu trabalho nos últimos três meses tinha sido. Mas meu gerente era otimista. Ele tinha fé nas pessoas. Ele me pediu para pensar em mim mesmo quando eu tinha a idade de Stefan, na faculdade e aprendendo coisas pela primeira vez.


Meu gerente me pediu para pensar sobre isso e me pediu para considerar dar outra chance a Stefan. Com toda a honestidade, quando eu tinha a idade de Stefan, eu estava escrevendo jogos 2D em JavaScript usando o novo canvas HTML5 (na época). Stefan era realmente incompetente, mesmo depois de ajustar para sua idade e experiência. Mas muito pior do que sua incompetência era sua desonestidade. De qualquer forma, eu não queria tomar essa decisão levianamente. Por um lado, talvez Stefan seja capaz de aprender, mas por outro lado ele é desonesto. Li a proposta que ele escreveu para o novo projeto de pesquisa. A ideia era muito nova e, se funcionasse, seria muito útil para nossa empresa. Foi realmente impressionante. Mas então tive um momento de clareza em que meu cinismo tomou conta do otimismo que meu gerente tentou incutir em mim. Fiquei fixado em uma palavra da proposta de pesquisa de Stefan: '2-manifolds'.


Tendo trabalhado com ele, eu sabia o quão incompetente Stefan realmente era, e não havia nenhuma porra de como ele soubesse o que um 2-manifold significava. Copiei e colei a proposta de pesquisa de Stefan em um verificador de plágio online. Foi há anos e eu esqueci qual era. Acabei de pesquisar no Google e usei um dos principais resultados. O verificador de plágio encontrou uma correspondência de 97% com um artigo de pesquisa e forneceu um link para o original. Stefan havia copiado tudo. Na manhã seguinte, falei com Stefan sobre sua proposta de pesquisa. Assim que ele começou a falar, ficou claro que ele não entendia do que estava falando, e era tudo apenas uma salada de palavras. Ele estava sendo um charlatão de novo. Eu avisei meu gerente e isso finalmente quebrou sua fé em Stefan. Stefan não trabalhou para nós novamente.


A única coisa em que Stefan era bom era em se vender, e parecer que sabia do que estava falando. Eu entendo que há profissões em que essas habilidades podem levar você muito longe, por exemplo, Vendas. Mas eu achava peculiar alguém tentar fazer besteira em uma carreira técnica como desenvolvimento de software.