Dentro de alguns meses, um colega estará migrando para um novo projeto e eu herdarei um de seus projetos. Para preparar, já encomendei o trabalho efetivamente de Michael Feathers com o código legado .
Mas esses livros, assim como a maioria das perguntas sobre o código herdado que encontrei até agora, preocupam-se com o caso de herdar o código como está. Mas, neste caso, eu realmente tenho acesso ao desenvolvedor original e temos tempo para uma entrega ordenada.
Alguns antecedentes do trecho de código que herdarei:
- Está funcionando: não há bugs conhecidos, mas à medida que os requisitos de desempenho aumentam, algumas otimizações serão necessárias em um futuro não muito distante.
- Não documentado: existe praticamente zero documentação no nível do método e da classe. O que o código deve fazer em um nível superior, no entanto, é bem compreendido, porque eu tenho escrito contra sua API (como uma caixa preta) há anos.
- Somente testes de integração de nível superior: Existem apenas testes de integração que testam a interação adequada com outros componentes por meio da API (novamente, caixa preta).
- Nível muito baixo, otimizado para velocidade: como esse código é central para todo um sistema de aplicativos, muitos deles foram otimizados várias vezes ao longo dos anos e são extremamente baixos (uma parte possui seu próprio gerenciador de memória para determinadas estruturas) / registros).
- Concorrente e sem bloqueios: Embora eu esteja familiarizado com a programação simultânea e sem bloqueios e tenha contribuído com algumas partes para esse código, isso adiciona outra camada de complexidade.
- Grande base de código: esse projeto em particular tem mais de dez mil linhas de código, então não há como eu ter tudo explicado para mim.
- Escrito em Delphi: Eu vou colocar isso lá fora, embora eu não acredite que o idioma seja pertinente à questão, pois acredito que esse tipo de problema seja independente do idioma.
Fiquei me perguntando como seria o tempo até a partida dele. Aqui estão algumas idéias:
- Obter tudo para compilar na minha máquina: mesmo que tudo deva ser verificado no controle do código-fonte, quem não se esqueceu de fazer o check-in de um arquivo de vez em quando, então essa provavelmente deve ser a primeira ordem de serviço.
- Mais testes: Embora eu queira mais testes de unidade no nível de classe, para que, quando eu fizer alterações, quaisquer bugs que eu introduza possam ser detectados desde o início, o código atual não é testável (classes enormes, métodos longos, muitos dependências mútuas).
- O que documentar: Eu acho que, para começar, seria melhor focar a documentação nas áreas do código que seriam difíceis de entender, por exemplo, devido à sua natureza de baixo nível / altamente otimizada. Receio que existam algumas coisas que possam parecer feias e que necessitem de refatoração / reescrita, mas na verdade são otimizações que estão por aí por uma boa razão de que eu possa sentir falta (cf. Joel Spolsky, Coisas que você deveria Nunca faça, parte I )
- Como documentar: Eu acho que alguns diagramas de classe da arquitetura e de seqüência de funções críticas acompanhadas de uma prosa seriam os melhores.
- Quem documentar: Eu queria saber o que seria melhor, que ele escrevesse a documentação ou que ele me explicasse, para que eu possa escrever a documentação. Receio que coisas que sejam óbvias para ele, mas não para mim, não sejam cobertas adequadamente.
- Refatoração usando programação em pares: isso pode não ser possível devido a restrições de tempo, mas talvez eu possa refatorar parte de seu código para torná-lo mais sustentável enquanto ele ainda estava por perto para fornecer informações sobre por que as coisas são do jeito que são.
Por favor, comente e adicione a isso. Como não há tempo suficiente para fazer tudo isso, estou particularmente interessado em como você priorizaria.
Atualização: Com o término do projeto de transferência, expandi esta lista com minhas próprias experiências nesta resposta abaixo .