Lidar com um desenvolvedor ignorando continuamente casos extremos em seu trabalho

25

Acho que tenho um problema interessante, bastante comum, com um dos desenvolvedores da minha equipe. O cara é um ótimo desenvolvedor, trabalha rápido e produtivo, produz código de boa qualidade e tudo. Bom engenheiro. Mas há um problema com ele - muitas vezes ele falha em resolver casos extremos em seu código.

Conversamos com ele sobre isso muitas vezes e ele está tentando, mas acho que ele simplesmente não pensa assim. Portanto, o que acaba acontecendo é que o controle de qualidade encontra muitos problemas com seu código e o devolve para o desenvolvimento repetidamente, resultando em prazos perdidos e todos na equipe insatisfeitos.

Não sei o que fazer com ele e como ajudá-lo a superar esse problema. Talvez alguém com mais experiência possa aconselhar?

Alex N.
fonte
11
Peça a alguém para cobrir seu código com testes de unidade.
Job
8
A pessoa mais qualificada para testar o código é seu autor.
16
@ Art Developer: Discordo completamente. A pior pessoa para fazer qualquer teste de código é a pessoa que desenvolveu esse código. Todo mundo tem pontos cegos, mas a pessoa que está criando cria o maior ponto cego em referência ao seu código.
James P. Wright
2
@ Art Developer: Eu acredito que escrever testes automatizados é realmente um papel bastante comum. Normalmente, é algo que você faz por um ano ou dois, se não estiver pronto para o horário nobre na empresa em que está. É uma espécie de período purgatório.
Morgan Herlocker
19
Você o descreve como um "grande desenvolvedor", "produtivo", "bom engenheiro" e produz 'código de boa qualidade ". Mas o controle de qualidade continua encontrando problemas com o trabalho dele. Você realmente usaria esses termos para descrever alguém que regularmente e de forma consistente ? injeta defeitos em seu código que estou querendo saber se há mais a esta história, desde a descrição do indivíduo como um profissional e o trabalho que eles estão fazendo não combinam em tudo.
Thomas Owens

Respostas:

29

Exija que ele escreva testes de unidade automatizados para seu código. Escrever testes de unidade obriga a pensar nos casos extremos.

Alguns detalhes:

  1. Para garantir que ele não se sinta destacado, isso deve ser instituído para toda a equipe. Exija que todos escrevam testes de unidade automatizados para o novo código ou código que eles modificam.
  2. Exija que os nomes dos testes de unidade sejam descritivos quanto ao caso em que estão testando.
  3. Cubra os testes de unidade automatizados na revisão de código em um nível alto. Peça aos revisores que procurem casos de teste perdidos (ou seja, aqueles casos extremos dos quais ele sempre perde). Após uma certa quantidade de feedback de sua equipe sobre casos extremos perdidos, ele provavelmente aprenderá a considerá-los antes da revisão.
  4. Aplique esta regra a toda a equipe: se o controle de qualidade encontrar um bug, o desenvolvedor responsável deve o teste automatizado que confirma a falha e prova que a corrigiu. (antes de fazer qualquer outro trabalho)
Matthew Rodatus
fonte
Amém, melhor ainda, exige que todos escrevam seu código primeiro. Usando um quadro BDD geralmente diminui a dor desta
George Mauer
@ George Boa ideia. O TDD ajudaria ainda mais aqui.
Matthew Rodatus
3
Teste de unidade não é sobre encontrar bugs - blog.stevensanderson.com/2009/08/24/…
Dainius
1
@Dainius eu concordo. O teste de unidade facilita um desenvolvedor a pensar nos casos extremos, o que pode impedir (mas não identificar) erros.
Matthew Rodatus
After some amount of feedback from his team about missed edge cases, he will probably learn to consider thoseOs desenvolvedores que têm más práticas geralmente argumentam a irrelevância do esforço adicional necessário para boas práticas (porque não vêem o benefício de fazê-lo). Embora o desenvolvedor possa concordar quando você adiciona casos extremos adicionais, isso não significa que ele acha relevante ou se ele próprio os adicionará.
Flater
23

Dê a ele uma lista de verificação, por exemplo

  • entradas nulas
  • entradas no extremo extremo grande da faixa
  • entradas no extremo pequeno final da faixa
  • combinações
  • entradas que violam os invariantes assumidos (por exemplo, se x = y)

O pessoal do controle de qualidade pode ajudar a elaborar a lista de verificação

Dê a lista de verificação a todos os desenvolvedores, não apenas a este.

Steven A. Lowe
fonte
1
É bom ressaltar que todos os desenvolvedores devem usar a lista de verificação, destacar um desenvolvedor pode causar sentimentos ruins. E isso poderia ajudar a melhorar a qualidade do código de cada um.
FrustratedWithFormsDesigner
Boa ideia, embora eu esteja curioso para saber como isso pode ser visto da perspectiva dos desenvolvedores. Eu nunca me deparei com essa prática em minha carreira como desenvolvedor, por isso é meio difícil avaliar a reação. Alguma ideia aí?
Alex N.
@ Alex: as listas de verificação são uma prática rotineira para alguns desenvolvedores e um insulto horrível para outros. Experimente e veja o que acontece. Se ele sai, então sua qualidade de código irá melhorar ;-)
Steven A. Lowe
4
Seus desenvolvedores não usarão listas de verificação? Se uma lista de verificação pudesse salvar vidas, eles as usariam? Muitos médicos não, e os pacientes sofrem. Leia isto: newyorker.com/reporting/2007/12/10/071210fa_fact_gawande
Barry Brown
1
@ Barry, eu não disse que não. Listas de verificação, neste caso, parecem, IMHO, como um remédio para os sintomas de um problema, não para o problema em si. O problema é disciplina e diligência neste caso. Quando o problema é a complexidade de um sistema que requer manutenção de emergência com um alto grau de responsabilidade e estresse envolvido, que resulta em um nível degradado de atenção aos detalhes, então sim, listas de verificação ftw (pilotos, médicos, etc.) Mas isso é mais de um debate filosófico, acho, fora do escopo desta questão.
Alex N.
17

Bom engenheiro.

OK.

Mas há um problema com ele - muitas vezes ele falha em resolver casos extremos em seu código.

É uma qualidade que os bons engenheiros não compartilham.


Observar casos extremos é uma característica presente ou não nas pessoas. Não tem nada a ver com ser engenheiro ou programador. O desenvolvimento dessa característica é influenciado pelo contexto cultural, ambiente de vida, eventos da infância e experiências de vida. Então, a atitude é simplesmente aplicada a qualquer trabalho que um indivíduo esteja realizando.

O que você precisa é descobrir se sua pessoa é daquele tipo que ainda não desenvolveu esse sentido (talvez ainda). Também é muito provável que ele simplesmente não se importe por algum motivo ou outro. Você precisa analisar toda a situação, se ele está feliz em seu trabalho. Se não, então talvez você deva fazer algo para ajudá-lo primeiro.

Se ele está bem com o trabalho, mas ainda não experimentou o perigo de casos extremos, você pode começar a educá-lo. Se ele levar a sério, pode mudar de atitude com o tempo. Embora eu seja cético em relação a isso, você ainda pode tentar.

Se, no entanto, ele for o tipo de pessoa que não é boa em casos extremos, talvez você não tenha mais nada a não ser removê-lo da equipe. Essa característica é essencial para a programação prática. Infelizmente, sem ele, mesmo uma grande pessoa não produziria um bom trabalho.


fonte
6
+1 Essa é uma habilidade que algumas pessoas têm que aprender a ser um bom programador. No entanto, eu observaria que existem dois tipos de casos extremos: casos extremos de requisitos de negócios ("Se encomendarmos 27 treinadores à esquerda e 28 treinadores à direita, esse pedido provavelmente está errado") deve ser tratado nos requisitos do projeto e real casos extremos de codificação (lidando com entradas inválidas, iterando constantemente nas listas quando um hashset seria mais sensível em termos de velocidade quando o conjunto for maior que x etc.), que são mais algo que você apenas precisa aprender.
Ed James
Obrigado pela sua compreensão. Realmente aprecio isso. Você está certo em todas as frentes aqui, embora eu esteja curioso, se ele é uma ótima pessoa, mas não tem algo que faça grandes engenheiros, como eu ainda posso colocá-lo para fazer outro trabalho e mantê-lo na organização, talvez movendo-se para uma outra equipe ou algo assim ... Embora eu acho que só eu posso responder a essa pergunta :)
Alex N.
Eu estive pensando sobre isso, mas não tenho certeza. Outra função para se tornar aceitável para esse tipo de pessoa não deve exigir atenção aos detalhes e não há muitos deles em uma empresa de software.
O mundo não é tão preto e branco como sua primeira frase implica. Eu acho que existem desenvolvedores que podem identificar alguns casos extremos, mas não todos.
Mike Partridge
5

Você poderia fazer revisões de código ou de design no início do processo?

PSU_Kardi
fonte
4

Ensine-o a programar o teste primeiro. Emparelhe com ele. Você escreverá os casos de teste e ele escreverá o código para passar nos testes.

Kevin Cline
fonte
3

O envolvimento do controle de qualidade com antecedência suficiente no desenvolvimento de recursos pode ajudá-lo a fornecer uma lista de casos extremos desde o início a serem abordados? Embora alguns possam ver isso como não esperando que o desenvolvedor cubra tudo, isso pode ser uma maneira de contornar isso, se ele tende a perder os casos-limite que um testador pode capturar inicialmente.

A outra idéia que eu teria aqui é como ele vê esse problema. Ele está realmente irritado e se irrita com esse padrão ou apenas vê isso como normal e não é algo para se preocupar em resolver? É verdade que isso exige muita confiança e que ele seja aberto em sua perspectiva, mas acho que há um certo grau de empatia aqui que pode ajudar se você puder ver as coisas da perspectiva dele.

JB King
fonte
3

Há um número infinito de casos extremos, cobrindo todos eles é inviável. E se alguém fizer #define TRUE FALSE? Ele adiciona casos extremos, você também os verifica?

Além disso, eu não consideraria a prova de idiotas todas as funções de uma classe privada ou função interna.

A abordagem que escolhi para o código que precisa ser muito sólido e estável é:

if(conditions_met)
{
DoStuff();
}
else
{
CrashAppAndDumpMemory();
}

Dessa forma, você obtém sólidos despejos de aplicativos no controle de qualidade e, quando chega a um lançamento, o aplicativo é sólido e seguro.

Contornar os erros é ruim. Ok, você pode salvar uma função se o identificador do arquivo for nulo e retornar nulo, mas na maioria dos casos, há um erro de design em algum lugar, e a falha do aplicativo é a melhor maneira de forçá-lo a encontrar a causa. A maioria dos casos extremos apenas oculta o erro, ocultando um problema, digamos - o botão parou de funcionar. O Crash informa que algumas suposições sobre o produto estão erradas e você deve revisar a lógica que causou a falha.

Codificador
fonte
#define VERDADEIRO FALSO não é um caso extremo, é um crime de despedida.
gnasher729 21/02
1

Se é um caso extremo, ele precisa ser considerado? Se os casos extremos são importantes, os casos extremos precisam ser inseridos nos requisitos / recurso / história do usuário.

Se os casos de aresta tiverem sido considerados como parte de uma peça de trabalho e for necessário que os dispositivos sejam colocados no local, eles deverão fazer parte do item de trabalho e, por definição, o item de trabalho não estará completo até que o mecanismo para lidar com o caso de aresta seja no lugar.

Isso fornece a você, como líder da equipe, algo para desmarcá-lo após a conclusão do trabalho durante a discussão pós-trabalho, e ao desenvolvedor algo para desestimular quando ele concluir o trabalho.

Bronumski
fonte
Sempre existem casos extremos. Se alguém afirma que os casos extremos nunca serão encontrados, esses não são os casos extremos certos.
Barry Brown
1
@ Barry Brown Eu concordo que sempre há casos extremos, mas há uma diferença entre casos extremos importantes que os Stakeholders consideram importantes, os quais podemos chamar de Cenários e casos extremos que um desenvolvedor considera importantes. Se um Stakeholder acha que algo é importante, ele deve ser discutido na sessão de planejamento e incluído como um Cenário na História do Usuário e não deixado para o desenvolvedor pensar, deve ser um requisito adequado para a tarefa. É muito demorado e não é necessário, mas verifica nulas os parâmetros em todos os métodos não públicos.
Bronumski
1

É por isso que existe um controle de qualidade. Os programadores têm a responsabilidade de realizar o trabalho em tempo hábil. Passar o tempo todo procurando casos extremos é muito ineficiente. Se você tiver um ciclo iterativo razoavelmente rápido, isso não deverá ser um problema. Os casos de borda são quase infinitos. Se houvesse um problema com os casos "principais", eu ficaria um pouco preocupado. Assim como os desenvolvedores são especialistas em desenvolvimento, um testador deve ser um especialista em testes. Quando um testador encontra um problema, ele o envia de volta ao desenvolvimento. O desenvolvedor corrige o problema. Problema resolvido. O tempo para um desenvolvedor rastrear todos os casos extremos é muito mais longo do que o ciclo de teste iterativo deve levar. Observe também que, quando estou falando de testes, não me refiro a testes de unidade de caixa branca, mas estritamente a testes de caixa preta.

Morgan Herlocker
fonte
1
Esta não é realmente a resposta certa. Ser recompensado por produzir um trabalho de meia qualidade é uma prática ruim. A equipe de desenvolvimento deve, como um todo, ser responsável pelo trabalho de alta qualidade.
David
Desenvolvedor decente não precisa procurar casos extremos. Algum código é escrito para não ter casos extremos, em outros casos casos extremos são óbvios. O código que não lida com casos extremos é código incompleto.
gnasher729 20/02
0

Esse é um dos casos em que acredito que o desenvolvimento orientado a testes vem para resgatar, porque ajuda a pensar em termos de casos extremos e qualquer coisa que possa quebrar o código.

Billal Begueradj
fonte