Os estouros de buffer são aceitáveis por um desenvolvedor graduado? Estamos definindo a fasquia muito alta? Quais são as capacidades esperadas dos engenheiros graduados / juniores?
Contexto:
Atualmente, estamos recrutando para uma posição de desenvolvedor júnior, trabalhando principalmente em C no Linux.
Como parte do processo, exigimos que os candidatos concluam um teste de código à vontade em C.
Até agora, rejeitamos dois candidatos com base no fato de que seu código, embora legível e, em um caso, bastante idiomático, sofria de erros de estouro de buffer devido a gravações ilimitadas de buffer.
[Editar]:
- Solicitamos explicitamente um código de qualidade de produção verificado por erro.
- Fornecemos uma estrutura de teste e construção para os candidatos
[Atualizar]:
Como resultado desse encadeamento e das conversas que tivemos com outros desenvolvedores pessoalmente, estamos mudando a maneira como realizamos testes de código e a quem direcionamos nosso recrutamento.
Decidimos que um candidato incapaz de corrigir ou entender um estouro de buffer significa que ele seria inadequado para o trabalho que realizamos, em particular, ele precisaria de mais orientação do que estamos acostumados. Portanto, ainda rejeitaremos candidatos que não possam enviar um exemplo de código robusto.
No entanto, adotamos algumas medidas para tornar o processo de recrutamento mais produtivo para nós e para os candidatos.
Em particular:
- Tornamos nossa expectativa mais explícita, com uma explicação clara do que queremos dizer com qualidade de produção e um aviso de que o código deve ser robusto com relação a entradas e erros.
- Agora, vinculamos candidatos a recursos em programação defensiva e à biblioteca padrão C na descrição do teste de código.
- Mudamos nosso público-alvo de desenvolvedores Júnior e graduados para atingir pessoas com alguma experiência relevante.
- Caso o código enviado falhe de alguma forma, mas de outra forma seria aceito, agora fornecemos um caso de teste mínimo que causa a condição de erro e damos aos candidatos a chance de corrigir seus erros (a menos que o código seja rejeitado por algum outro motivo). Também apontaremos linhas / funções problemáticas, se apropriado.
- O objetivo dos testes em si agora mudou ligeiramente de um filtro de front-end para uma chance de criar uma imagem melhor do candidato, em particular, isso informará nossa discussão por telefone. Dito isto, ainda estamos dispostos a rejeitar com base apenas no código.
[Atualização 2015-07-09]: Andy Davis, da Nujob, escreveu um artigo interessante e relevante sobre o uso de um teste de código da perspectiva do candidato, e vale a pena examinar o artigo. Encontre aqui .
fonte
Respostas:
Eu não acho que você definiu a fasquia muito alta, acho que pode precisar de uma barra diferente.
Acho que os testes de código são úteis para determinar a competência de um candidato, mas não devem ser aprovados / reprovados. Você deve usar os resultados do teste de código para iniciar um diálogo com o candidato.
Se você vir os erros que eles cometeram (especialmente se forem desenvolvedores juniores), indique-os e pergunte o que eles fariam de maneira diferente ou se eles entendem por que existe um problema.
fonte
Eu acho que o qualificador júnior é o que faz toda a diferença aqui. Os juniores não devem ser testados quanto à competência, devem ser testados quanto à capacidade de aprendizado, curiosidade, paixão, ética e definitivamente humildade. A suposição com um júnior deve ser que eles não são competentes ; é seu trabalho como sênior fazê-lo.
Obviamente, eles devem ser capazes de escrever código básico como fizzbuzz e ter um conhecimento geral de conceitos; se você apontou para eles e eles nem sabiam o que era um estouro de buffer, então eu diria que não é possível, mas não espero que um júnior escreva mais de 5 linhas de código sem erros.
O dia em que você confia na competência de seu filho mais novo é o dia em que a sua deve ser questionada, os filhos mais novos devem ser tratados com muita orientação e uma boa dose de "confiança, mas verifique". Eu era júnior uma vez, e para todos aqueles que estavam lá na época: me desculpe. Lembra das coisas terríveis que você fez quando júnior? (Por favor, não me diga que era só eu; você me dará um complexo ..)
fonte
Eu vejo alguns problemas aqui.
O primeiro é supor que um graduado médio em ciência da computação saiba tudo. Eles não. Francamente, fico agradavelmente surpreso quando vejo um graduado em ciência da computação que sabe como instalar e configurar o Visual Studio . Heck, recentemente trabalhei com um cara que afirma ter mais de cinco anos de experiência na pilha da Microsoft escrevendo código .NET que não conseguia descobrir o que era o TFS ou como se conectar.
O segundo é a sua piscina muito limitada. Também temos candidatos a fazer um teste de programação. Existem cinco "programas" separados que eles precisam escrever. Eles fazem isso em casa e enviam o código. Os testes são extremamente simples (sem banco de dados, sem dependências externas) e podem ser feitos facilmente usando a versão Express do Visual Studio. Os testes em si são facilmente concluídos por um veterano em cerca de 30 minutos. Observe que geralmente só fazemos isso para recém-formados com até três anos de experiência de trabalho verificável.
O que quantificamos é que cerca de 70% dos participantes do teste simplesmente nunca retornam para nós. Aproximadamente 15% entregam coisas que não serão compiladas, geralmente devido a erros de sintaxe flagrante (por exemplo, ausentes
;
). Outros 10% são compilados, mas não conseguem executar as ações necessárias.Isso deixa um enorme 5%. Nesse ponto, nem estamos considerando condições como inserir um caractere alfa como entrada quando for necessário um numérico. É puramente dado um conjunto muito limitado de X como entrada, o aplicativo faz a saída apropriada. Além disso, esses números vêm de cerca de 500 candidatos nos últimos quatro anos: mantivemos as estatísticas porque queríamos saber.
Se analisássemos mais a estrutura do código e as técnicas de codificação defensiva, como o descarte adequado de recursos não gerenciados ou o uso de
try .. catch
instruções, quase ninguém passaria.A questão, é claro, é por quê?
Por que uma criança com um diploma neste campo de uma universidade de quatro anos não consegue realizar o que são simples tarefas de programação? A resposta é que as faculdades estão completamente fora de contato com as necessidades dos negócios e ficam muitos anos atrás do que consideramos o estado da arte. Há dez anos, os padrões de codificação eram de tal ordem que segurança era algo que você fazia após o fato; e os testes de unidade ainda não estavam em voga. Considerando que hoje a segurança é melhor estar na vanguarda de sua mente com todos os recursos ou aprimoramentos. Lembre-se: a maioria dos professores nunca realmente trabalhou neste campo OU não trabalha há muito tempo. Depois que você souber disso, começará a entender por que eles estão tão atrasados. Pior, alguns desses professores gastam muito tempo em uma tecnologia específica ( Java , PHP, seja qual for) e falham em discutir questões fundamentais sérias, como estrutura de código ou abordagens aceitáveis (e POR QUÊ!).
Apenas um exemplo lateral. Um recém-formado me contou sobre parte de sua experiência na criação de um sistema operacional móvel para uma de suas aulas, mas ele não conseguiu explicar, mesmo em termos básicos, como funcionava um servidor web. Ele simplesmente não sabia. 15 ou 20 anos atrás, provavelmente foi o momento certo para entender como criar um sistema operacional. Hoje ... nem tanto. No entanto, essa era uma aula obrigatória quando uma aula de programação defensiva seria muito mais útil para eles e para o mundo exterior.
Então, o que fazemos?
Desses 5%, entrevistaremos um pouco mais para ter uma idéia de sua personalidade e adequação. Depois, escolhemos os "melhores" com pleno conhecimento de que vamos passar cerca de seis meses "reprogramando-os" para se livrar da porcaria que seus professores os encheram.
fonte
Eu acho que você está olhando para o problema da maneira errada. O que você deve se perguntar é o seguinte: o que exigimos de um candidato para que ele seja capaz de fazer o trabalho? Você deve avaliar adequadamente a posição e o que ela implica. Abaixo estão algumas sugestões sobre quando contratar um desenvolvedor júnior e quando não.
Quando contratar um desenvolvedor júnior: - Se houver um excesso de trabalho fácil a ser feito, isso seria uma perda de tempo para um desenvolvedor mais sênior. - Se você estiver disposto a orientar e treinar essa pessoa nos próximos anos. - Se você está tentando expandir a empresa e quer alguém que fique por um longo tempo. Um desenvolvedor júnior que fica apenas um ano seria um desperdício de recursos da empresa, faria pouco para produzir qualquer coisa e a maioria dos resultados estaria em seu próprio crescimento pessoal. - Quando você sentir vontade de gastar dinheiro com o crescimento de alguém. Mais uma vez, a maioria dos benefícios será o que aprenderem.
Quando não contratar um desenvolvedor júnior. - Quando o trabalho é muito complicado. Neste caso, é apenas fora de sua liga. - Quando você quer economizar dinheiro. Um desenvolvedor sênior deve concluir as mesmas tarefas em uma fração do tempo, com resultados de melhor qualidade e, portanto, sempre deve ser mais barato. - Quando o trabalho é terceirizado ou não é suficiente para manter um funcionário ocupado. Nesses casos, seria melhor transferir parte do trabalho para um empreiteiro particular.
Um último ponto importante. Não contrate um desenvolvedor júnior porque "é tudo o que podemos pagar" ou "é tudo o que estamos dispostos a gastar" quando eles não são adequados para o trabalho. No final, tudo o que você acaba fazendo é jogar dinheiro no vaso sanitário. Além disso, uma vez adquiridas essas habilidades, eles solicitarão muito dinheiro de qualquer maneira.
Sobre mim:
fonte
Como outros mencionaram, os cargos juniores podem ter pouca experiência com C. Eu pessoalmente só fui ensinado brevemente sobre estouros de buffer em C e, mesmo que eu pudesse observá-los, é provável que eu ainda apresentasse alguns (especialmente se recebesse uma tarefa que emprestasse para criar estouros de buffer). Provavelmente, muitos desenvolvedores juniores terão uma situação semelhante em que possam conhecer estouros de buffer, mas não foram preparados para identificá-los e manipulá-los de maneira abrangente.
Diante disso, acho que a resposta apropriada é trazer o problema para a próxima interação possível e perguntar o que eles sabem sobre estouros de buffer para testar seu conhecimento geral. Depois disso, diga a eles que você encontrou um no código supostamente pronto para produção. Isso lhe daria uma boa janela para julgar como eles reagiriam à correção e às instruções.
Não é o pensamento comum que um desenvolvedor júnior que sabe menos, mas está disposto e capaz de aprender e melhorar, é mais valioso do que um desenvolvedor júnior que sabe mais, mas que não pode ou não melhora?
Dito isto, em um de seus comentários, você mencionou que os entregou testes que indicariam o estouro de buffer no código deles, se eles os tivessem usado. Então, talvez a questão maior seja: por que eles não executaram os testes (ou, se o fizeram, por que eles entregaram código de buggy)?
fonte
Um estouro de buffer é absolutamente impossível. Você pode ter uma pergunta de código correspondente. No que tudo está errado (pode dar errado) com esse trecho de código, o candidato deve ser capaz de identificar o problema. A questão é se o problema é irrelevante, pois você está executando o clint de qualquer maneira.
No entanto, em um teste de código de forma livre artificial, eu seria moderado em uma violação como o sprintf. Muito pouco tempo (presumido), mente hiperativa, um desejo muito grande de apresentar algo funcionando.
fonte
Eu acho que você está fazendo a pergunta errada. Não existe uma barra objetiva para ser um programador profissional. Se houvesse, haveria um exame de programação padrão, mas não. Sua barra individual apenas deve ser definida com base em quão exigente você pode ser, quanto pode pagar, quanto erro seu software pode aceitar e quanto tempo você pode gastar para ensinar.
Nesse caso, estou supondo que uma saturação de buffer provavelmente signifique que esse código, que o candidato apresentou como uma amostra de trabalho exemplar, trava com uma falha de segmentação em vez de fazer o que você pediu. Portanto, você deve aceitar um codificador que escreve um código que trava com uma falha de segmentação em vez de fazer o que você pediu? Pergunte:
Sua organização é capaz de atrair alguém que possa escrever código funcional?
Seu processo de desenvolvimento é robusto o suficiente para que alguém que possa quase escrever código possa escrever código funcional com a ajuda da revisão por pares e do suporte a testes?
Você é capaz de ensinar alguns programadores a ser programador e está disposto a gastar esse esforço e esperar talvez alguns anos e esperar que o talento interno do candidato seja concretizado?
fonte