Organizando código não comentado e sujo?

22

Gostaria de fazer algumas perguntas sobre código sujo. Existem alguns iniciantes que codificaram em um projeto médio. O código é uma enorme bola de barro. Eles não são programadores avançados. Eles apenas sabem como usar o teclado um pouco sobre java. Eles apenas escreveram código com 12.000 linhas em sua classe principal, no entanto, 6.000 linhas pertencem ao próprio NetBeans.

Meu trabalho é analisar o código e sugerir uma boa maneira de manter o código. Minha idéia é descartar o projeto e iniciar um novo com a metodologia OOP. Recentemente, coletei algumas notas e idéias sobre o problema, neste site e em outros.

Agora, tenho as seguintes perguntas:

  1. Devemos reparar o código e alterá-lo para um OOP? Agora estamos depurando.
  2. O código não possui comentários, documentação, estilo particular de programação e assim por diante. Mudá-lo é realmente caro e demorado. O que podemos fazer sobre isso?
  3. Como posso ensiná-los a seguir todas as regras (comentários, POO, boa qualidade de código etc.)?
  4. O código está incorreto e propenso a erros. O que podemos fazer? Testando? Quase escrevemos dois ou três papéis A4 para correção, mas parece interminável.

Eu deveria dizer que sou novo com eles. Eu acho que violei as regras sobre adicionar pessoas muito tarde ao projeto também. Você acha que eu tenho que deixá-los?

Salivan
fonte
Isso precisa ser dividido em duas ou três perguntas, é amplo demais no momento.
Jon Hopkins
2
Este projeto está sob controle de versão?
precisa saber é o seguinte
2
O código atual está em produção?
JeffO
Sim, Jeff. É uma produção, um projeto de gerenciamento para administrar uma questão financeira!
Salivan
Desculpe JBR, eles não ouviram falar de algo assim. Apenas fazer um cupê de copiar e colar códigos em todo o disco rígido são suas técnicas para executar o controle de versão.
Salivan

Respostas:

36

Etapa 0: Faça backup no SCM

Porque, como sugerido por JBRWilkinson nos comentários, o controle de versão é sua primeira linha de defesa contra desastres (irreversíveis).

Também faça backup dos detalhes de configuração do software, procedimentos para criar entregas, etc.

Etapa 1: teste primeiro

Então comece escrevendo testes :

  • pelo que funciona,
  • e pelo que falha.

Não importa o que você decida fazer, você está coberto. Agora você pode:

  • comece do zero e reescreva ,
  • ou conserte .

Meu conselho seria iniciar a arquitetura geral do zero , mas extrair da bagunça as partes que validam os pontos de verificação e refatorá-las como achar melhor.

Etapa 2: verificar e monitorar

Configure um sistema de integração contínua (para complementar as etapas 0 e 1 ) E um sistema de inspeção contínua (para preparar a etapa 4 ).

Etapa 3: Ficar nos Ombros dos Gigantes

(como você sempre deveria ...)

Etapa 4: limpar

Isso é desnecessário, mas em vez de analisar o código você mesmo, convém executar linters / analisadores estáticos e outras ferramentas na base de código quebrada para encontrar erros no design e na implementação.

Então, você também pode querer executar um formatador de código, que já ajudará um pouco na limpeza.

Etapa 5: Revisão

É fácil introduzir pequenos erros refatorando ou limpando as coisas. É preciso apenas uma seleção errada e um toque rápido em uma tecla, e você pode excluir algo bastante importante sem perceber a princípio. E às vezes o efeito aparecerá apenas meses depois. Obviamente, as etapas acima ajudam você a evitar isso (especialmente implementando um forte equipamento de teste), mas você nunca sabe o que pode e o que passará. Portanto, certifique-se de revisar suas refatorações por pelo menos um outro par dedicado de bolas de olho (e de preferência mais do que isso).

Etapa 6: teste seu processo de desenvolvimento para o futuro

Pegue todas as opções acima e torne-a parte inerente do seu processo de desenvolvimento usual, se já não estiver. Não deixe que isso aconteça novamente no seu relógio e trabalhe em conjunto com sua equipe para implementar salvaguardas em seu processo e aplicar isso (se isso for possível) em suas políticas. Faça da produção de Código Limpo uma prioridade.


Mas realmente, teste . Muito .

haylem
fonte
Uma ótima sugestão - não importa que dano você cause se você tiver testes que possam detectar os problemas. Claro, todos nós estamos assumindo que eles têm controle de versão já ..
JBRWilkinson
@JBRWilkinson: bom ponto, na verdade! De fato, assumiram completamente que sim.
haylem
2
Inicie o controle de versão primeiro; Antes tarde do que nunca.
JeffO
@ Jeff O: Sim, já é o que eu adicionei à resposta.
haylem
Reescreva para tornar mais claro após as edições. Atribuições à esquerda :)
haylem
15

Pessoalmente, eu não iniciaria esse projeto até ter uma cópia do Working Effective with Legacy Code à mão. Sério, ele foi escrito exatamente para esse tipo de coisa. Está cheio de estratégias para lidar com códigos complicados e entra em muito mais detalhes do que posso lhe dar aqui.

Jason Baker
fonte
1
+1 para uso de extensa referência externa que diz tudo.
haylem
Infelizmente, aqui as pessoas não têm idéia sobre a leitura de livros. Apenas desenvolver um projeto que funcione é tudo o que eles precisam. Comecei a ler o livro que você mencionou e o CODE COMPLETE 2 também. Deixe-me dizer que eles estão maravilhosamente escritos.
Salivan
1
@ Salivan - Talvez eles simplesmente não tenham convencido ninguém de que vale a pena ler esses livros. Se ao menos houvesse uma pessoa que trabalhasse com eles que estivesse interessada em ler esses livros ...
Jason Baker
1
@ Salivan - a chave é encontrar uma vitória rápida ou duas. Faça algo que tenha um retorno quase imediato. Como o controle de versão, da próxima vez que alguém disser "como isso aconteceu", você poderá pesquisar. Em seguida, leve-os a algumas sugestões da sua leitura da sua cópia do WELC. Não basta jogar o livro para eles.
2
@Salivan Você pode ler os livros para eles e colocar o conteúdo para eles como um conselho. Você pode se tornar o guru da equipe.
MarkJ
8

Eu estive lá várias vezes. Minha regra é: se o software não for trivial (mais de 1 semana de trabalho para o recurso que você possui) e funcionar, mantenha-o e continue com a refatoração incremental.

Se o software realmente não funcionar (número muito alto de bugs, requisitos pouco claros etc.), é melhor reescrevê-lo do zero. O mesmo se for bem pequeno.

O ponto da refatoração (como no livro de Fowler e no de Kerievsky, http://www.industriallogic.com/xp/refactoring/ ) é que ele mantém o sistema funcionando, talvez a refatoração demore duas vezes, mas os riscos são zero.

Reescrever do zero pode apresentar muitos riscos, desde requisitos de mal-entendidos até implementação incorreta (afinal a maioria da equipe será a mesma).

Na verdade, vi um procedimento complexo sendo reescrito do zero duas vezes e ainda não funcionando conforme o esperado.

Uberto
fonte
Eu também sugeriria escrever testes de unidade para métodos apropriados, se possível. Eles ajudarão a definir claramente o que o código deve fazer em primeiro lugar, o que ajudará no processo de refatoração.
Michael K
2
Escusado será dizer ... Considero o TDD um requisito para qualquer bom código (também conhecido como o novo).
Uberto 5/12
Escrever desde o início é uma ideia muito boa. Mas primeiro você precisa ter alguns diagramas do trabalho. Mas o que você fará se precisar analisar o código para extrair as relações? Além disso, o tamanho do projeto torna impossível, ou nos fará contratar outros programadores.
Salivan
Desenvolvimento orientado a teste é apreciado!
Salivan
"Mas o que você fará se precisar analisar o código para extrair as relações?" -> se for esse o caso, significa que o projeto não é minúsculo nem quebrado. Aka, eu vou começar a refatorar uma peça de cada vez. Veja também o método Mikado. danielbrolund.wordpress.com/2009/03/28/…
Uberto
2

Eu o reescreveria completamente. Às vezes é impossível reparar esse código. Outra opção é fazê-lo funcionar, sem adicionar novos recursos. Para ensinar a equipe a escrever um bom código (bem projetado, documentado e com testes), deixe-os corrigir o código que você possui agora. Permita a todos que corrijam bugs / revisem o código de outros desenvolvedores, não da parte dela. Após algumas tentativas, eles entenderão que é quase impossível revisar / corrigir esses códigos.

Adicionar pessoas a projetos atrasados ​​ajuda muito raramente. Geralmente ele quebra os prazos. Você deve fazer todo o possível para concluir o projeto com sucesso e depois pensar em sair.

duros
fonte
Quanto custaria reescrevê-lo completamente versus melhorá-lo iterativamente? Qual abordagem daria resultados mais rapidamente?
precisa saber é o seguinte
@JBRWilkinson Depende. A abordagem iterativa é boa quando você tem código de trabalho.
duros
1
@duros, para código quebrado, sim. Este código é executado em produção.
2

Meu conselho será não descartar completamente o código inteiro. Esse é o problema da vida cotidiana, que toda equipe de desenvolvimento enfrenta. Ataque uma parte do código de cada vez. Corrija, limpe e documente. E depois vá para a outra parte. O principal é sempre manter algum código transportável à mão. Reescrever todo o código do zero levará a quantidade de tempo gasto até agora e não haverá garantia de que será melhor do que o atual.
Mas também as pessoas devem evitar escrever o código dessa maneira. Passe mais algum tempo nas revisões de código. Adapte-se a algum estilo de codificação uniforme. Discuta o design primeiro e depois escreva o código. Coisas simples assim farão grandes mudanças.

Bom blog dizendo por que o Netscape está solto

Manoj R
fonte
2
Iniciar um novo projeto, enquanto atualiza / depura a versão antiga nesse meio tempo (e você não pode evitar isso, por isso não sonhe com isso), está tentando atirar em vários alvos em movimento.
JeffO
"Atacar uma parte do código de cada vez" não funcionou, Manjo. com uma profunda tristeza, o código contém muitos erros. Sempre se transforma em outra coisa. Devemos atacar e destruir uma parte do código e construí-lo então. Sugeri esse pensamento ao gerente uma vez, mas os codificadores precisam deixar de escrever novos códigos.
Salivan
@ Salivan ... precisa estar sem escrever novos códigos . Tenho certeza que a gerência está dizendo isso. Mas a primeira coisa a fazer quando você está em um buraco é parar de cavar (não continue a cometer os mesmos erros). Permitir que mais sejam criados nessas condições é continuar cavando o buraco. A parte difícil é como fazer com que o gerenciamento e os codificadores entendam os problemas.
SeraM
1

Se funcionar, refatorar. Existem ferramentas para ajudá-lo a fazer isso. Se não funcionar, use o comando de aprimoramento de código mágico, ou seja, deltreeno Windows resp. rm -rfno Linux.

user281377
fonte
2
Sugerir "apagar completamente todo o código" é particularmente inútil - você tem uma resposta mais construtiva?
JBRWilkinson
RI MUITO. Estou completamente de acordo com você, munição!
Salivan
JBRWilkinson: Fazer uma nova reinicialização provavelmente é uma abordagem melhor do que tentar fazer a bagunça funcionar e limpar. Uma empresa em que trabalhei tentou isso e, ano após ano, eles desperdiçaram muitos recursos e não chegaram a lugar algum.
user281377
@ ammoQ, você precisa do código antigo para ver o que ele realmente fez quando errou.
1
Thorbjorn: Estamos falando de código que não funciona , certo? Analisar o código não comentado e sujo que não faz a coisa certa me diz mais sobre a condição mental de seus criadores do que qualquer outra coisa.
user281377
1

Devemos reparar o código e alterá-lo para um OOP? Agora estamos depurando. [... contém erros, nenhuma documentação ...]

Eu estive lá, você tem minhas simpatias. Eu até escrevi um artigo sobre isso que pode ajudá-lo a ter alguma perspectiva. Mas em suma:

Se o código contiver muita duplicação, você deve reescrever. Se não houver uma estrutura discernível (sem interfaces claras, espaguete), a refatoração falhará e você provavelmente deverá reescrever.

Como posso ensiná-los a seguir todas as regras?

Comece explicando por que eles podem querer fazer isso, mostrando a eles o que podem ganhar com isso pessoalmente. Quando eles concordarem com isso e estiverem dispostos a aprender, comece a ensiná-los a usar shuhari .

Martin Wickman
fonte
Obrigado Martin. "Comece explicando por que eles podem querer fazer isso, mostrando a eles o que podem ganhar com isso pessoalmente. Quando eles concordarem com isso e estiverem dispostos a aprender, comece a ensiná-los a usar shuhari."
Salivan
0

Minha sugestão é uma combinação das respostas de @ duros e @Manoj R.

Comece do zero, lembrando-se de criar um bom código / OOP / comentado / etc, desta vez, consulte / copie e cole a partir do seu código antigo. À medida que você encontrar as partes ruins do seu código antigo, reescreva / refatore-as.

Se seus desenvolvedores não são bem treinados, acho bom enviá-los para os cursos. É importante para a reciclagem regular no setor de TI em rápida mudança

Jiew Meng
fonte