Como determinar a prioridade e a gravidade de um "aprimoramento de código"?

15

Temos campos "prioridade" e "gravidade" em nosso sistema de rastreamento de bugs. Definimos gravidade como "como isso afeta o usuário" e prioridade como "como isso afeta o produto".

Minha pergunta é sobre como categorizar uma tarefa de "aprimoramento de código" em gravidade e prioridade. Suponha que a melhoria não mude nenhum comportamento, mas a torne um "código melhor". Prevemos uma melhoria geral da manutenção a longo prazo, mas é difícil quantificá-la.

Quando usamos nossas definições de prioridade e gravidade, uma melhoria de código obtém os valores mais baixos para ambos, a menos que você introduza alguns benefícios difíceis de prever a longo prazo. Portanto, implica que o aprimoramento do código é uma tarefa privilegiada e nunca deve ser tentada.

No entanto, acredito que é crucial melhorar e refatorar constantemente o código, porque:

  • O desenvolvimento de software é, por si só, um processo contínuo de aprendizado e, sem melhorar o código, você não pode melhorar.
  • Uma equipe deve se orgulhar de seu código.
  • A manutenção futura levará menos tempo e, a longo prazo, a economia será significativa.

Ou você acha que essas tarefas nunca devem ser criadas e que essas melhorias são executadas apenas "sob demanda", "quando associadas a um bug"? Mesmo se estiver associado a um bug, isso não seria um ponto de discussão em uma revisão de código, por exemplo, "por que você fez essa mudança drástica na estrutura?".

Sedat Kapanoglu
fonte

Respostas:

16

Normalmente, eu não gosto de ver as atividades de "aprimoramento de código" como uma tarefa atribuível separada porque a melhoria de código nunca o aproxima diretamente da conclusão de requisitos ou histórias de usuários. É por isso que as tarefas de aprimoramento de código sempre serão de baixa prioridade e nunca são atribuídas.

Vejo o aprimoramento de código como uma constante, algo que todo desenvolvedor deve fazer tão naturalmente quanto digitar em um teclado. Eu o levo em minhas estimativas para qualquer tarefa. Se minha tarefa me envolver tocando em uma classe ou em algum código-fonte que não seja analisado há muito tempo, assumirei que algum trabalho de zeladoria provavelmente está em ordem e aumentarei minha estimativa de acordo.

Na melhor das hipóteses, concluo a tarefa mais cedo e posso usar o tempo restante para aprimorar o código ou até o design. No pior cenário, a tarefa leva muito mais tempo do que o esperado, mas eu tenho esse tempo extra como buffer.

maple_shaft
fonte
4
+1, assim que você vê a melhoria de código como uma tarefa por si só, você acaba com um código de baixa qualidade, porque é sempre de baixa prioridade. Apenas não considere concluir outras tarefas, desde que a qualidade do código não seja boa o suficiente, de acordo com o padrão da empresa. A revisão do código é obrigatória aqui.
Deadalnix 08/03/12
1
@deadalnix Excelente ponto sobre revisões de código. Se eles são feitos desde o início, a qualidade do código é mantida teoricamente por padrão. Com a manutenção de aplicativos legados, esse nem sempre é o caso, e a melhoria do código deve ser tratada à medida que você avança.
Maple_shaft
2
Com o código legado, a melhor maneira é envolvê-lo em uma interface limpa para não espalhar a porcaria por toda a base de código. Em seguida, retira o empacotamento do invólucro, para ter certeza de que podemos confiar nele e, eventualmente, tocar no código legado, se necessário, sem recolher o projeto inteiro.
Deadalnix 28/03/12
1
+1 Particularmente para "Se minha tarefa envolve tocar em uma classe ou em algum código-fonte que não é analisado há muito tempo". Você só deve melhorar o código que precisa ser alterado. Se não for necessário alterar iminentemente, deixe-o em paz.
21812 MarkJack
1
Para projetos e equipes especialmente grandes, ainda faz sentido manter o aprimoramento do código como uma tarefa separada - há apenas um desenvolvedor que pode ir enquanto trabalha em um novo recurso. Normalmente, reservo de duas a três semanas por ano para minha equipe implementar melhorias e refatoração (na prática, acaba sendo mais longa, pois, geralmente, apenas um subconjunto da equipe pode estar offline a qualquer momento)
blueberryfields
2

Se você deseja refatorar seu código, defina a prioridade da tarefa de acordo com sua definição (por exemplo, "como isso afeta o produto"). Algumas refatorações não afetam muito o produto e outras, dependendo do escopo do trabalho necessário. Definir uma prioridade mais alta indicará que mais testes serão necessários após a refatoração ser concluída para garantir que nada inesperado ocorra.

Você também pode querer introduzir uma nova categoria no seu sistema de rastreamento de bugs para categorizar esses tipos de tarefas como tarefas de "Refatoração". Dessa forma, você saberá como interpretar o valor da prioridade; isto é, maior prioridade significa maior impacto e, portanto, é necessário mais teste.

Bernard
fonte
2
Para adicionar a isso, a dívida técnica (por falta de refatoração) faz impactar o produto, pois torna-se mais difícil de manter e introduz mais possibilidade de bugs. Uma vez que o produto é afetado, o usuário é afetado ... Em nossa equipe, temos tarefas "melhoria" que usamos para refatoração, e melhorias de processo / ferramenta
Atif
2

O que está faltando é verificar suas suposições sobre o código existente: menos tempo e economia significativa podem ser alcançados se melhorarmos o código. É cosmético ou há problemas sérios?

Verifique suas estimativas de depuração e aprimoramento. Se eles estiverem demorando mais e houver comentários contínuos sobre a necessidade de refatorar o código primeiro ou limpá-lo, essa pode ser sua melhor medida. Em seguida, você pode identificar sua base de códigos como: Bom, precisa de um pequeno retrabalho ou de uma refatoração séria.

Tudo isso é relativo. É difícil dar essa alta prioridade quando há clientes que desejam mais recursos e desejam pagar imediatamente pelas horas faturáveis.

JeffO
fonte
1

Pergunta interessante.

Eu acho que você teria que estimar quantas linhas de código e quantos módulos essa alteração pode afetar.

Talvez você possa ver quantos testes de unidade, se os tiver, serão quebrados ao fazer a alteração. Provavelmente, isso significaria tentar primeiro a alteração em um ramo para ter uma ideia.

Em seguida, tenha limites para esses níveis correspondentes prioridade e gravidade.

Você também deve levar em consideração que muitos testes de testador precisarão estar envolvidos. Se a alteração tocar em uma grande área de superfície do aplicativo, poderá ser necessário revisar muitos testes do sistema.

ozz
fonte
1

Vamos começar com duas suposições aqui.

  1. Para cada nova história, você escreve seu código da melhor maneira possível, possivelmente reforçado com o conhecimento ambiental de sua equipe.
  2. Sempre que houver uma história que altere a funcionalidade do código existente, use seu novo conhecimento do sistema e melhores habilidades para melhorar o código no processo de implementação da nova história.

Dadas essas duas suposições, nunca há necessidade de um esforço explícito de "aprimoramento de código". Seu código melhora à medida que você escreve o sistema. Isso significa que nem todo o código está de acordo com os melhores e mais recentes padrões de manutenção, mas "Se não estiver quebrado, não conserte". Considero que o código de refatoração que não precisa ser alterado para ser "banhado a ouro", além de adicionar funcionalidades visíveis desnecessárias. Se o código estiver quebrado de alguma forma, escreva um teste válido que falhe; registrar um bug; e refatorar para resolver esse bug.

Michael Brown
fonte
1

Eu roubaria a votação do movimento Agile:

Digite o bug, faça palpites sobre severidade e prioridade,

Em seguida, revise diariamente, semanalmente ou mensalmente todos os novos bugs e vote nas classificações. Idealmente, você faz isso durante uma reunião de planejamento de sprint com os usuários finais. Você também pode falar sobre os próximos recursos naquele momento e ser positivo,

Michael Durrant
fonte