Pessoas cansadas de entrevistas no estilo LeetCode
(nelson.cloud)- Depois de sair da Robinhood no fim de novembro de 2023 por questões de saúde, passou por vários processos seletivos e sentiu que as avaliações no estilo LeetCode não combinam com o trabalho real de engenharia de software
- Acredita que muitas empresas repetem entrevistas parecidas ao seguir o modelo de grandes empresas de tecnologia como Google, Facebook/Meta e Amazon
- Critica o fato de que engenheiros dizem não precisar decorar conhecimento pesquisável, mas nas entrevistas fazem perguntas em formato de quiz sobre coisas difíceis de lembrar na hora
- Já passou tanto por sucesso quanto por fracasso nesse tipo de entrevista, e a base dessa insatisfação tem mais relação com a experiência prática anterior do que com experiências de reprovação
- Acrescenta que podem entrar em contato caso sejam uma empresa que procura um engenheiro com experiência em AWS, Kubernetes e Ruby on Rails e que não faça quizzes inúteis
Onde entrevistas no estilo LeetCode divergem do trabalho real
- Depois de sair da Robinhood no fim de novembro de 2023 por motivos de saúde, participou de entrevistas com várias empresas
- Os processos não avançaram por diversos motivos, mas sentiu cansaço com a repetição das entrevistas no estilo LeetCode em si
- Considera que esse tipo de entrevista não reflete adequadamente as responsabilidades reais de engenharia de software
- Parece que muitas empresas adotam o mesmo modelo de avaliação porque grandes empresas como Google, Facebook/Meta e Amazon usam esse método
O choque entre avaliações em formato de quiz e experiência prática
- Há engenheiros que dizem no dia a dia que não é necessário decorar conhecimentos que podem ser facilmente encontrados no Google
- Mas, nas entrevistas, às vezes perguntam sobre conteúdos que poderiam ser pesquisados, mas que são difíceis de lembrar de imediato, o que parece contraditório
- Não há uma solução clara para esse problema, mas considera que o problema em si é evidente
- Já vivenciou tanto sucesso quanto fracasso nesse tipo de entrevista, e essa visão foi mais influenciada pela experiência profissional anterior do que pela taxa de reprovação
- Diz que podem entrar em contato se precisarem de um engenheiro de software com experiência em AWS, Kubernetes e Ruby on Rails e que não façam entrevistas em formato de quiz
- Sugere também a leitura de Re-imagining Technical Interviews: Valuing Experience Over Exam Skills
1 comentários
Opiniões no Hacker News
Entendo a frustração, mas no fim acho que esse tipo de entrevista também tem um propósito. Mesmo que não seja perfeito, é suficientemente utilizável e, em geral, faz sentido para a empresa porque tende a produzir mais falsos negativos do que falsos positivos
O custo de deixar uma pessoa inteligente de fora é baixo, mas contratar a pessoa errada custa caro, porque é preciso passar meses avaliando, demitindo e contratando de novo. Dito isso, para o candidato é um processo extremamente doloroso, e mesmo um excelente engenheiro de software pode ficar nervoso, deixar algo passar ou ter um dia de azar e acabar reprovando algumas vezes. A entrevista não é uma avaliação final do seu valor na vida, é só uma ferramenta grosseira, então o melhor é seguir em frente
Perguntas “pegadinha” são idiotas, mas é preciso ver se o candidato conhece o básico e, ao mesmo tempo, mostrar que tipo de empresa somos. Por exemplo, perguntar “posso modificar os argumentos?” ou dizer “não lembro se
strleninclui o byte 0, então vou somar 1; normalmente eu procuraria isso” é um bom sinal. O problema era algo comoatoiou “embaralhar um baralho”, básico, mas não tão trivial quanto FizzBuzz. Uma das melhores pessoas que contratamos cometeu um erro fundamental, mas, quando perguntamos se aquilo funcionaria como pretendido, disse “sou um idiota do caralho” e corrigiu na hora. Esse tom talvez não seja adequado numa entrevista, mas vimos como um forte sinal positivo. Por outro lado, também houve um candidato que insistiu até o fim que uma pergunta sobre fazer o parsing de uma string e retornar um inteiro era injusta porque já existia uma função de biblioteca; na prática, parte do nosso sistema rodava em um ambiente embarcado sem bibliotecaEu gostaria que não imitassem aquele formato horrível de provas de escolas e universidades, que primeiro testam memória. Eu sofro muito porque não consigo lembrar das coisas na hora quando preciso, e certamente não sou o único. Quando eu entrevistava desenvolvedores Android, fazia perguntas e observava a forma de pensar, sem esperar que todas as respostas fossem exatas. Depois de verificar se havia uma compreensão básica de Android, pedia que a pessoa fizesse um pequeno app em casa
No fim, em uma contratação em que a vaga precisa ser preenchida, quanto mais falsos negativos houver, maior também será a probabilidade de contratar um falso positivo. No extremo, se só existe uma pessoa no planeta adequada para aquele trabalho e você a reprova como falso negativo, a única opção restante é contratar a pessoa errada
O problema não é falta de inteligência; é que a pessoa pode resolver bem problemas de algoritmo, mas não ser engenheira de software, ou não ter as capacidades exigidas por aquela posição. Trabalho em uma equipe contratada em grande parte por entrevistas com puzzles, e todos são inteligentes, mas não são engenheiros de software, e essa diferença aparece muito
Se alguém resolveu, é muito mais provável que tenha visto um problema igual ou parecido fazendo exercícios do que realmente derivado uma solução ótima nova
Uma vez fiz uma entrevista de que gostei bastante; era em um banco. Eles me deram um código sujo, escrito às pressas, mas não ofuscado de propósito, e pediram para eu refatorar da melhor forma possível
O entrevistador ficou sentado ao lado e conversou comigo durante todo o processo; na prática, foi quase uma sessão de programação em par conduzida pelo candidato. Depois de entrevistas de LeetCode, foi uma experiência refrescante. Claro, aquele banco sabia exatamente quais tecnologias usava e tinha menos necessidade de medir a capacidade de aprender tecnologias novas, então esse formato era possível. Para eles, era mais importante saber se a pessoa conseguia produzir código manutenível, escolher bons nomes e se comunicar com colegas
O interessante é que já houve pessoas que quase fracassaram nas perguntas básicas, mas se saíram tão bem na revisão de código que revelaram profunda especialização. Entrevistas são uma ferramenta bastante ruim para mostrar a capacidade de trabalho de alguém, mas, se a pessoa consegue enxergar o problema tanto de forma ampla quanto específica e também programar suficientemente bem, em geral considero um sucesso
Entrevistas no estilo LeetCode provavelmente cumprem duas funções. Primeiro, são um meio de conter os salários e a mobilidade de engenheiros de software. Para trocar de emprego, a pessoa precisa estudar por um ou dois meses; quem mudaria com facilidade assim?
Se você der azar e pegar um entrevistador que se preparou demais e joga uma bomba no nível LeetCode hard, fica difícil se candidatar de novo àquela empresa por um ano. Segundo, elas servem para encobrir vieses do processo, sob a alegação de que deram a todos um objetivo parecido e claro. Se a pessoa for da mesma escola, gênero ou raça, mesmo recebendo o mesmo problema, podem dar dicas, relevar erros de sintaxe e, mesmo que ela não chegue à abordagem ótima, dar uma avaliação forte de contratação por causa da “comunicação”. Se não gostarem da pessoa, basta jogar um problema difícil e ficar em silêncio durante a entrevista inteira. Para a empresa, é um ruído aceitável; para o indivíduo, é perder uma oportunidade de remuneração de centenas de milhares de dólares. Já fiz entrevistas em FAANG e também já fui entrevistador, e vi pessoas contratadas com critérios baixos ao mesmo tempo em que ótimos engenheiros perdiam oportunidades por causa de perguntas absurdas como árvores quádruplas ou teoria dos números
Partindo da premissa de um entrevistador justo, esse método dá a candidatos que não têm nomes famosos no currículo uma chance de mostrar competência. Algumas das oportunidades que tive, sem ter diploma em ciência da computação, jamais teriam existido se não fosse por entrevistas no quadro branco. É difícil imaginar uma forma de impedir um entrevistador de distorcer o processo de propósito para contratar um amigo
Muitas empresas têm bancos de questões projetados para serem justos e, em alguma medida, relacionados a problemas reais. As empresas em que entrevistei em geral eram assim e, mesmo quando não eram problemas literalmente do LeetCode, no fim ainda eram problemas isolados de programação, então considero isso estilo LeetCode. As entrevistas de empresas que operavam bem esse método foram bastante razoáveis. Boas empresas e bons entrevistadores olham para mais coisas do que apenas o código final, e também dão notas de contratação em uma escala, reduzindo o binarismo
Na prática, só fizzbuzz já filtrava 75%. Muita gente não consegue escrever código sob pressão, e há também quem sobreviva na marra com copiar e colar. Não é que essas pessoas não consigam fazer nada, mas elas são lentas, produzem abstrações estranhas e consomem muito tempo até se obter um resultado aproveitável. E essas pessoas também rebatem do mesmo jeito, porque há centenas de milhares de dólares em jogo
Do ponto de vista da empresa, é racional. Ela quer funcionários que não se distraiam e possam fazer hora extra
Há muitas críticas válidas às práticas atuais de contratação em tecnologia, mas a reclamação de que “não dá para ficar absurdamente rico sem vender a alma” não é muito convincente
Ao selecionar engenheiros de software, o importante não é conhecimento, mas a capacidade de resolver problemas e de construir um modelo mental do problema
Se o candidato nunca viu aquele problema antes e o entrevistador entende o que deve observar, a entrevista no quadro branco é uma boa forma de avaliar essa capacidade. Mas, como na lei de Goodhart, quando a métrica vira objetivo, ela deixa de ser um bom indicador. Pessoas com pouca capacidade de resolver problemas ou de modelar também querem cargos de software com salários altos, então moem LeetCode; com o tempo, quando essas pessoas viram entrevistadores, conduzem entrevistas como testes de memória, assim como fizeram com elas. Ainda assim, dadas as restrições da empresa, a necessidade de reduzir perda de tempo dos candidatos e de manter uma ficha de avaliação consistente que o RH gosta, ainda não vi um método de entrevista melhor ser proposto, e isso deve continuar sendo usado por um bom tempo
Isso fica mais próximo do trabalho de criar software. LeetCode é distante demais do trabalho real, e o desempenho tem correlação fraca demais com a adequação real
É um balde furado, mas a empresa está satisfeita com o estado atual, e os desenvolvedores continuam moendo LeetCode. Não parece que vá mudar tão cedo, mas felizmente, quando procuro um novo emprego, estou em uma situação em que posso recusar esse tipo de entrevista
Um amigo meu, no meio de uma entrevista técnica, de repente parou de falar, levantou e foi embora. O pessoal da empresa foi atrás dizendo “o que houve, você está indo bem!”, mas ele disse que tinha ficado deprimido demais e não tinha mais interesse
É triste, porque para a maioria das pessoas deveria ser uma profissão divertida
Só que, mais ou menos no meio da entrevista, surgiu um quadro branco e colegas entraram para me pedir que implementasse coisas básicas com uma caneta; conforme avançava, eles foram ficando cada vez mais hostis e grosseiros, a ponto de parecer uma humilhação ritualizada. Parecia que estavam testando se eu conseguia suportar insultos e hostilidade enquanto entregava resultados tecnicamente triviais. No fim, interrompi a entrevista e disse: “já vi como vocês trabalham, então decidi que não quero trabalhar aqui. Agradeço a oportunidade e peço desculpas por desperdiçarmos o tempo um do outro”, e fui embora. O CEO me seguiu até o estacionamento para perguntar por que aquilo tinha acontecido, e pareceu genuinamente chocado com o fato de um candidato poder tomar uma decisão durante a entrevista. As pessoas esquecem que uma entrevista de emprego é uma via de mão dupla. Depois daquele dia, percebi que tenho o direito de observar todos os aspectos de uma empresa onde eu talvez trabalhe, e que, se eu vir algo negativo no processo, não preciso aceitar concessões. No dia seguinte, encontrei em uma concorrente pessoas que até hoje são bons amigos e colegas, então foi a decisão certa. Esta profissão é divertida, mas quando essa diversão é colhida e explorada como em uma fazenda, não é diferente de outras formas de escravização
Quando eu disse “acho que hoje não é meu dia e gostaria de encerrar a entrevista”, eles se esforçaram bastante, pelo resto do tempo, para me fazer ficar. Acho que, se o candidato quer sair, devem deixá-lo ir
Mesmo passados 5 anos, ainda me recuso a fazer esse tipo de entrevista e não quero nunca mais passar por esse processo. Fui atormentado e ridicularizado por pessoas que tratam candidatos como se fossem um jogo de chutar alguém por uma hora, e não quero mais lidar com isso
Como houve muitas entrevistas de LeetCode sem aviso prévio, deixei claro nos meus perfis do LinkedIn [1] e do GitHub [2] o que é aceitável e o que não é. “Tenho uma política pessoal contra qualquer forma de live coding ou teste de programação online durante entrevistas, e não gosto nem participo de programação competitiva. Em vez disso, aceito de bom grado desafios de programação offline com objetivos e prazos razoáveis, além de discussões técnicas profundas sobre arquitetura e design de software e tecnologias relacionadas.”
[1] https://www.linkedin.com/in/mtodor
[2] https://github.com/mihaitodor
Dito isso, ouve-se que fraudes são generalizadas em entrevistas com tarefas para casa, então me preocupa que o número de empregadores dispostos a usá-las caia drasticamente
Fazendo o papel de advogado do diabo, o LeetCode é usado para filtrar uma ou ambas de duas coisas na contratação de um colaborador individual médio: se a pessoa é esforçada — isto é, alguém que estudou muitos problemas, decorou soluções e consegue repeti-las —, ou se é inteligente — isto é, alguém que conhece os fundamentos e consegue sintetizar conhecimentos anteriores para responder a uma pergunta nova mesmo sem praticar LeetCode
Na ausência de qualquer outra informação, eu diria que alguém que não consegue passar em um problema de LeetCode tem maior probabilidade de não ser nenhuma das duas coisas. Se a função exige programação, acho que a pessoa deveria conseguir resolver ao menos um problema fácil a médio de LeetCode, ainda que com alguma orientação do entrevistador. Na prática, as empresas reduzem o peso da habilidade em LeetCode quanto mais sênior é a vaga ou quanto mais especializada é a função. Também há muitas entrevistas de correção de bugs, design de sistemas, comportamentais, tarefas, perguntas de conhecimentos variados e perguntas específicas do histórico da pessoa; em contratações acima do nível júnior, LeetCode não é tudo. Não é uma ferramenta mágica para escolher os melhores engenheiros, mas apenas mais um sinal usado pelo comitê de contratação
Ela não mede a capacidade de engenharia de levar algo até o fim dentro do orçamento. Na melhor das hipóteses é algo periférico; na pior, é uma métrica substituta para discriminação etária, favorecendo pessoas mais próximas dos 19 anos. Talvez seja por isso que esta indústria tenha tanta dificuldade em entregar software de boa qualidade. Um método melhor é dar uma situação de falha, como um build quebrado ou código que está crashando, e pedir para a pessoa corrigir. Se ela consegue explorar o sistema, diagnosticar o defeito, encontrar a causa, propor um patch e seguir o estilo de código e comentários, então é alguém que realmente é necessário. Pode haver branches e um issue tracker, uma discussão de bug já em andamento, ou um arquivo de patch nos comentários que precisa ser aplicado manualmente. O patch pode conter um novo bug, ou pode ser uma isca que mexe em um problema parecido, mas não relacionado. Pode ser uma regressão de um bug fechado sem teste unitário; ou, mesmo havendo teste, o candidato talvez tenha que encontrá-lo, ou o próprio teste pode estar obsoleto e cheio de bugs. Esse é o trabalho de verdade. No fim, dizer “os testes unitários estavam quebrados” e dizer “não entendi como executá-los corretamente, então pulei” revela uma grande diferença de postura, e o jogador de equipe é o segundo
Por isso, ao contrário, você pode acabar contratando um candidato que não tem grande desempenho no cargo atual, mas gastou a energia excedente moendo LeetCode
Depois de apenas algumas semanas em um projeto, uma pessoa inteligente consegue obter os insights realmente necessários. Os quebra-cabeças repentinos que o LeetCode lança são mais parecidos com palavras cruzadas de revistas antigas
A única razão para conseguir fazer isso é já ter estudado antes
Se fosse 2022, eu concordaria que LeetCode não é uma ferramenta para escolher os melhores engenheiros, mas em 2024 as pessoas são filtradas com muito mais frequência porque, mesmo acertando o problema, não foram rápidas o suficiente ou não resolveram sem dicas. Eu não sou um gênio de LeetCode, tenho coisas demais para estudar, e o LeetCode responde por cerca de 20% das entrevistas; ainda assim, não sinto que tenha ficado tão pior do que há 2 anos. As expectativas das empresas é que dispararam para o céu, e o clima é de querer comprar cargos com mais de 15 anos de experiência pagando salário de alguém com 5 anos
Um ponto interessante pouco mencionado sobre entrevistas ao estilo LeetCode é que elas são uma espécie de trote intelectual
Já foi demonstrado várias vezes que, quanto mais duro é o rito de iniciação, maior se torna o comprometimento das pessoas que entram no grupo
Quando uma empresa capitalista contrata programadores, o que é melhor: “pessoas inteligentes e parecidas, que acreditam em respostas certas” ou “um grupo aleatório de profissionais habilidosos”? Se você responde que é a segunda opção, está sendo idealista, e essa opinião não importa de verdade. A natureza vai substituí-lo por alguém mais inteligente e realista
Em algumas entrevistas recentes, mostramos um código de exemplo ao candidato e pedimos que ele fizesse uma revisão. O exemplo tinha pelo menos um bug ou problema em cada linha
Depois vem uma tarefa de modelagem, geralmente feita no quadro branco. Também há um exercício simples no estilo fizzbuzz para ver se um júnior realmente consegue atuar como júnior, e isso serve como ponto de partida para conversar sobre temas como complexidade de tempo de execução ou layout de memória. O processo é bem interativo, dependendo do desempenho do candidato, com o objetivo de filtrar impostores que de algum modo passaram pela triagem e também sentir um pouco o fit cultural
Crio um problema bagunçado, como validação de fuso horário ou de número de telefone, e uso um documento da Wikipedia como especificação. Ao final, pergunto sobre a solução e fazemos uma revisão de código. Os melhores seniores simplesmente usam uma biblioteca. Bons candidatos implementam por conta própria, mas conseguem explicar os trade-offs. Juniores apenas fazem os testes passarem e param por aí
https://github.com/emilybache/GildedRose-Refactoring-Kata
Deixei o candidato usar a linguagem que preferisse, e foi um filtro muito eficaz
Já entrevistei candidatos a desenvolvedor que pareciam saber muita teoria, mas fracassavam miseravelmente quando tinham que escrever código de fato. Não conseguiam nem implementar fizzbuzz, e um desenvolvedor Java sênior não conseguia importar HashMap sem pesquisar
É parecido com matemática. Para 562 * 1041, o certo é usar uma calculadora, mas, se alguém pega a calculadora para saber quanto é 3 * 7, você passa a duvidar que seja especialista. Muitas empresas exageram nas entrevistas no estilo LeetCode, mas uma entrevista de live coding que mostre manipulação de arrays, controle de fluxo e uso de estruturas de dados básicas revela se a pessoa tem aquela memória muscular que só vem da experiência. Se for preciso estudar algoritmos de travessia de grafos para passar, provavelmente já está LeetCode demais
Mas um programa precisa de vários desses pequenos elementos e, nessa visão de mundo, seria preciso decorar todos. Em 562 * 1041, espera-se que a pessoa conheça o princípio do cálculo, ou seja, saiba como fazer. O cálculo em si pode sair errado, mas a ideia da multiplicação longa não deveria estar errada. Nesse contexto, não há problema em esquecer um item da tabuada como 3 * 7. Programadores são pessoas que organizam o cálculo, não que calculam diretamente; quem faz isso é o computador. Concordo que, para algoritmos de travessia de grafos, basta saber onde encontrar a solução, não é preciso ter todas as soluções na cabeça
Em que situação essas pessoas precisaram importar manualmente? Não havia IDE?
Não sei bem se isso foi uma sátira aos estereótipos de entrevistadores