Quais padrões podem ser esperados dos engenheiros graduados / juniores? [fechadas]

38

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 .

brice
fonte
29
Talvez...? Considerando que agora parece que muitas pessoas na escola têm muito mais experiência em Java do que em C. Se os candidatos estão fora da escola e 2/3 de sua exposição de codificação é Java, seu C pode não ser forte o suficiente para passar no seu teste. MAS ... se eles estão abertos e dispostos a aprender, então o que você diria? Afinal, este é um júnior posição ...
FrustratedWithFormsDesigner
4
Também é um código escrito em uma entrevista, talvez perdoável devido a restrições de tempo. Eu teria pelo menos a certeza de mencionar a eles que seu código não deve sofrer com estouro de buffer.
Mansfield
4
Eu segundo @FrustratedWithFormsDesigner. Sou desenvolvedor júnior, e a única vez em que tive que lidar com C foi em algumas tarefas em uma aula sobre arquitetura de CPU. Enquanto isso, eu me considero bem em C #, Java e Ruby.
Kevin - Restabelece Monica
4
E a estrutura de teste inclui um teste que causa um estouro de buffer?
FrustratedWithFormsDesigner
44
Não posso dizer que você esteja fazendo algo errado, mas, depois de entrevistar dezenas de grandes graduados em CS nos últimos anos, descobri que a maioria não tem noção do que se entende por 'código de qualidade da produção'. Eu não acho que a maioria dos instrutores de CS se preocupa em escrever código para uso de outras pessoas.
Jim No Texas

Respostas:

109

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.

Tombatron
fonte
1
+1 é verdade e é uma boa sugestão. De fato, pedimos aos candidatos que revisassem seu código quanto a erros, dando-lhes tempo suficiente para fazê-lo, mas eles voltaram com o tipo errado de correções, em alguns casos piorando o código, sem corrigir os erros que causavam os estouros em primeiro lugar.
Brice #
15
@brice Quase uma demonstração sólida de que eles são de fato desenvolvedores juniores. Evitar erros aparentemente óbvios vem com a prática e a experiência.
Tombatron
34
@ brice: ele estava dizendo para discutir os erros específicos com eles; não diga que houve erros e peça que eles retornem para você. Discuta os erros em tempo real - dê uma dica (número da linha ou talvez uma descrição e função e peça que forneça o número da linha) e depois pergunte como isso poderia ter sido evitado. O objetivo não é o código de teste sem erros, mas uma boa compreensão dos pontos fortes e fracos dos candidatos.
jmoreno
6
Se o desenvolvedor júnior conseguisse ver o problema, ele o teria corrigido. Se fosse eu, testaria a capacidade deles de trabalhar com você. Diga a eles qual é o problema e onde ele pode ser encontrado, ofereça o mesmo tratamento que você daria a seus colegas reais e veja como eles reagem. Se trabalhar com eles é uma tarefa árdua, eles não são adequados para a posição. Se trabalhar com eles é um prazer, contrate-os.
precisa saber é o seguinte
67

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 ..)

Jimmy Hoffa
fonte
1
Eu ainda sou oficialmente um 'Engenheiro de Software Júnior' com 2 anos de experiência! Minha formação é em nem CS nem SW Engineering (It's in Physics). Eu não entregaria voluntariamente o código que segfaults em qualquer entrada, agora ou quando eu fosse recrutado.
Br13 /
31
correção, você não entregaria conscientemente o código que segfaults em qualquer entrada. Se você acabou de afirmar que nunca escreve bugs, lamento incomodá-lo, John Carmack.
Jimmy Hoffa
Harg! recuar! Essa certamente não é a afirmação que faço. Lancei código de buggy, alguns piores que outros. Mas nada que se parecia com o primeiro exemplo do que não fazer quando você google para "buffer overflow"
Brice
Nós até fornecemos uma estrutura de teste para o código, incluindo testes que acionaram o estouro!
Br16 /
@brice Quando você diz que forneceu a estrutura de teste, você forneceu uma ferramenta como o valgrind para testar problemas de memória?
BЈовић
15

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 .. catchinstruçõ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.

Eu não
fonte
2
Concordo totalmente aqui, eu aprendi mais em meus 2 1/2 anos na indústria, então eu já aprendi na faculdade. Aprendi isso dolorosamente depois de conseguir meu primeiro estágio como desenvolvedor da Web enquanto ainda estava na escola.
Ryan
5
Agora eu quero tentar o seu teste de programação ..
Akash
1
Sério? Experiência em instalar software específico e capacidade de fornecer uma versão simplificada do que um servidor da web faz é o que você está procurando? Se alguém pode lidar com a criação de um sistema operacional móvel, pode aprender como os servidores da web funcionam.
Michael Shaw
@ MichaelShaw: Se alguém está escrevendo um sistema operacional, mas ainda não aprendeu as operações básicas do tipo de servidor mais comum, isso mostra que sua escola estava pulando grandes áreas (e altamente relevantes) de sua educação. A questão então se torna o que mais foi pulado?
NotMe
2
@ ChrisLively: Não vejo como essas coisas são um grande problema. Não é como se tivéssemos um campo minúsculo que se move lentamente. Aprender no trabalho vai acontecer. Eu acho que você pode ter um ponto essencialmente bom aqui, mas os exemplos não são convincentes. Se houver um problema com o currículo do CS, adicionar "Como instalar o Visual Studio 101" e "Noções básicas sobre servidores Web 101" não o corrigirá. (Eu gosto da idéia de uma classe "programação defensiva".)
Michael Shaw
5

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:

  • Formado em física, com quase nenhum treinamento formal.
  • Dois anos de experiência profissional. Então, eu sei do que se trata o processo de aprendizado.
  • Inicie o desenvolvedor de software. Eu fiz um trabalho muito exigente e vi todos os diferentes níveis de habilidade de vários indivíduos. Muitos deles não conseguem lidar com muito do que faço.
Matthew Ouellette
fonte
4

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)?

Lawtonfogle
fonte
3

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.

Joop Eggen
fonte
10
Eu quase escrevi exatamente a mesma resposta até perceber que ele estava se referindo a um "junior", lembre-se disso. Eu vi alguns juniores afiados, mas mesmo assim eles fazem coisas estúpidas sem perceber, grande parte da engenharia de software só pode ser ensinada por experiência
Jimmy Hoffa
@ JimmyHoffa sim, basta ler a sua primeira linha, corrigi meu "absoluto não-go". Vale a pena considerar o seu ponto. Até agora eu poderia usar e estimar todos os programadores, exceto um caso psíquico e um "mentiroso".
Joop Eggen
@ JoopEggen: Tenho certeza de que "psíquico" não era a palavra que você estava procurando. Caso contrário, eles deveriam ter conseguido ler sua mente ...;)
NotMe
2

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?

Christopher Martin
fonte