Você deve refatorar o código existente que não está quebrado em um projeto focado em novos recursos?

11

Dado um pequeno projeto que visa adicionar novas funcionalidades ao aplicativo, as alterações introduzidas tocam algum código existente, envolvendo a atualização em determinadas áreas. Durante a implementação, descobri que alguns desses códigos que foram atualizados têm candidatos para refatoração.

É um momento apropriado para refatorar, o que, por sua vez, exigiria testes de regressão para os componentes afetados (assim, possivelmente, a introdução do escopo não fazia parte originalmente do projeto)? Ou devo adiar, concluir a funcionalidade e talvez ter um projeto separado para refatoração (embora eu esteja um pouco hesitante porque os usuários de negócios podem não patrocinar totalmente um projeto que não adiciona nenhuma funcionalidade, a menos que eles valorizem a manutenção do código ...)?

Carlos Jaime C. De Leon
fonte
2
Você tem os testes prontos para fazer a refatoração desejada?
2
Você respondeu: os clientes não se importarão com a manutenção do código, a menos que o próprio código seja uma entrega. Eles se preocupam com dinheiro e tempo e assumem a qualidade como um dado. Qualidade, tempo e custo estão diretamente relacionados à dívida técnica, mas também são relativos ao que estão dispostos a aceitar. Se você NÃO incorporar a refatoração à medida que for avançando, a manutenção do código será reduzida e a dívida técnica disparará inabalável.
maple_shaft

Respostas:

17

Absolutamente.

A refatoração deve ser feita em um projeto de trabalho e "aprovado". Quando todos os seus testes (nos níveis de unidade, sistema e aceitação) são aprovados, você sabe que seu produto atende aos requisitos. Ao refatorar, você pode continuar confirmando que todos os testes continuam passando. Se algum teste começar a falhar, você fez algo errado e precisará corrigi-lo. Se você tiver falhas nos testes, corrija-os antes da refatoração para garantir sempre que a refatoração não está alterando a funcionalidade do sistema.

Esse também é um momento perfeito para a refatoração, supondo que você tenha tempo e recursos para realizar a refatoração e ainda entregar o prazo e o orçamento. A refatoração agora facilitará a compreensão e a manutenção do seu sistema; assim, à medida que você adiciona ainda mais novos recursos, fica mais fácil. Você precisa lutar contra a podridão do código e a entropia do software .

Como Joel Etherton aponta nos comentários, você precisa gerenciar o escopo da refatoração. Concentre-se em refatorar as partes do sistema às quais você adicionará recursos em breve, executando refatorações que facilitarão o trabalho ou a adição de novos recursos. O uso de análise estática, ferramentas de métricas e revisões de código pode ajudar a identificar as áreas mais críticas. Você não quer perder os prazos porque estava refatorando - ainda precisa continuar agregando valor ao cliente.

Você menciona que o cliente não vê valor na refatoração. Normalmente, o cliente não se importa com a qualidade do código, mas com o produto. A refatoração facilitará a manutenção de uma alta qualidade do produto e a entrega de um produto que atenda às novas necessidades do cliente. Tente negociar tempo para refatorar em sua programação (o cliente deseja recursos X em Y dias, tente ver se você não pode obter dias Y + Z ou recursos XN, para que possa gastar tempo em design, refatoração e implementação), se desejar pode.

Thomas Owens
fonte
1
+1 especialmente para o parágrafo sobre o valor da refatoração para clientes.
Marjan Venema
1
Supondo que você tenha um bom conjunto de testes de unidade para validar a refatoração não altera o comportamento observado. Dada a escolha de refactroring ou testes de unidade. Adicione testes de unidade primeiro.
Martin York
5
@ Thomas Owens: +1 Eu concordo, mas também acrescentaria uma nota de cautela ao refatorar. É muito fácil para a refatoração iniciar uma cascata de refatoração que pode inchar o trabalho real necessário e fazer com que os prazos aumentem.
Joel Etherton
@ Joel Esse é um bom ponto. Você precisa manter a refatoração limitada no escopo para estabelecer prazos.
Thomas Owens
3

Considere responder às perguntas abaixo, então seria fácil para você tomar a decisão. A sabedoria "não conserte se não estiver quebrada" é tentadora, mas nem sempre é verdade para o trabalho profissional.

0-Existe uma reclamação do cliente sobre este código?

1-Isso é necessário para a funcionalidade do aplicativo

2-O código atual é prejudicial?

3-O custo da mudança vale a pena?

4-Você poderia pagar o custo?

5-Esta é a melhor utilização de suas habilidades para a organização

6-Suas alterações exigiriam que o usuário reinstale a nova alteração - Você poderia justificar isso ao cliente?

7-Você poderia tolerar o risco de uma correção ruim?

8-A mudança afeta outro código fora do seu projeto?

9-Este é um produto em evolução ou um produto estável? Se estiver evoluindo, você poderá incluir as alterações na próxima versão?

NoChance
fonte
Você leu minha mente! Eu estava pensando exatamente nessa famosa regra "não conserte se não estiver quebrada" para justificar o adiamento da refatoração!
Carlos Jaime C. De Leon
3

Refatorar em breve, refatorar com freqüência.

Se você puder pagar (tempo, dinheiro, etc.), deve fazê-lo.

Digo isso porque às vezes você pode ficar sem tempo, ou como diz não receber dinheiro para um intervalo de manutenção de código, ou deseja concluir seu projeto o mais rápido possível, e mais em geral porque a refatoração precisa de recursos. Além disso, é sempre um bom momento para refatoração.

Você deseja um código atualizado e, se achar que seu código realmente precisa de algumas alterações, especialmente ao adicionar novas funcionalidades, deverá alterá-lo.

Não se esqueça, com um sistema de controle de versão, você pode realmente dividir seu projeto em uma nova ramificação, para não afetar seu código atual.

Jose Faeti
fonte
2

Se a refatoração for necessária para implementar a nova funcionalidade, ela deverá ser realizada e fatorada como parte do novo desenvolvimento.

A duplicação do código custará a você (a você e à empresa) mais a longo prazo, à medida que as edições são feitas em um local e não em outro.

Você precisa ter um conjunto de testes - testes de unidade automatizados ou testes de regressão que podem ser executados para provar que não introduziu problemas na funcionalidade existente.

Se a refatoração for apenas uma "boa ação" - ou seja, não estiver no código diretamente afetado pela nova funcionalidade, deixarei em branco. Você está introduzindo uma mudança por uma questão de mudança.

ChrisF
fonte
0

Parece que refatorar o código facilitará a adição de novos recursos; essa é a teoria. Inclua isso no escopo dos novos recursos. É mais provável que você obtenha adesão de usuários corporativos dessa maneira. Nesse caso, você deve poder argumentar convincentemente e justificar o tempo para a refatoração. Espero que eles entendam que essa é uma parte necessária do processo de desenvolvimento e terão menos objeções. Nem sempre você pode demonstrar esse benefício direto.

JeffO
fonte