Há um princípio abrangente que governa a necessidade de refatorar e otimizar, tanto em cascata quanto em Agile: YAGNI (você não precisa disso). Um segundo princípio é o corolário do primeiro: "A otimização prematura é a raiz de todo mal", o equivalente de codificação do provérbio geral "o inimigo da excelência é a perfeição".
Vamos pegar os princípios e aplicá-los. Você tem o requisito de criar um algoritmo ETL que pegue um arquivo de um tipo específico, extraia suas informações e as coloque em um banco de dados. Seu objetivo para esta semana (para nossos propósitos, não importa se você está em uma loja Agile ou SDLC) é fazer isso.
Você é um sujeito esperto e teve uma visão geral da situação. Você sabe que esse não é o único tipo de arquivo para o qual o projeto precisará de um ETL. Portanto, considere implementar esse algoritmo ETL para também trabalhar em outro tipo de arquivo, que possui apenas pequenas diferenças. Fazer isso violaria YAGNI. Seu trabalho não é desenvolver o algoritmo para esse outro arquivo; é desenvolver o algoritmo para o único arquivo necessário até o final da semana. Para atingir esse objetivo e passar nos testes de aceitação, você precisa desenvolver esse algoritmo e fazê-lo funcionar corretamente. Você "não precisará" do código adicional para fazê-lo funcionar com o outro arquivo. Você pode pensar que economizará tempo para incorporá-lo agora e pode estar certo, mas também pode estar terrivelmente errado; o algoritmo do outro arquivo pode precisar ser usado em uma área do sistema em que seu código não pode ser usado ou os requisitos para o novo arquivo podem ser diferentes dos do seu, de maneiras que você não conhece (no Agile, esses requisitos ainda não existem). Enquanto isso, você perde tempo e aumenta desnecessariamente a complexidade do seu algoritmo.
Agora, é na próxima semana e, como uma recompensa duvidosa por seu excelente trabalho no primeiro algoritmo, você recebeu a tarefa de criar os algoritmos para dois novos tipos de arquivos. Agora, você precisa de código adicional para fazer seu algoritmo funcionar com mais arquivos. Você pode estender seu algoritmo existente usando um padrão de método de modelo que usará um padrão básico com etapas individuais específicas de arquivo ou simplesmente derivar uma interface comum do algoritmo existente, desenvolver duas novas que seguem a interface e conectá-las ao um objeto que pode escolher qual algoritmo usar.
Durante o desenvolvimento, você sabe que é necessário que o sistema processe 10 KB de dados brutos por segundo. Você faz um teste de carga e acha que seu algoritmo de rascunho inicial lida com 8 KB / s. Bem, isso não vai passar nos AATs. Dê uma olhada e veja que existe alguma estrutura de loop de complexidade O (meu Deus) em seu algoritmo; você simplifica e obtém 12 KB / s. "Muito bom", você pensa, "mas se eu tivesse um loop tão ruim no código, o que mais eu poderia cortar?". buzz Você acabou de violar a regra "otimização prematura". Seu código funciona e passa todos os requisitos. Você está "pronto", até que os requisitos sejam atualizados para exigir 15 KB / s. Se e quando isso acontecer, ENTÃO você recupera o código e procura coisas para melhorar.
Siga esse processo simples durante o desenvolvimento, seja no Agile ou nos SDLCs tradicionais: "Na primeira passagem, faça-o funcionar. Na segunda passagem, faça-o bonito. Na terceira passagem, faça-o SOLID". O que isso significa é que, quando você cria uma linha de código pela primeira vez, faça com que ele funcione corretamente e sem erros, mas não preste muita atenção nas regras de design desse código, pois tudo o que você sabe agora é que você ' Nunca mais tocarei nessa área. Na próxima vez em que você visitar essa linha de código, você apenas estará errado; não é mais uma parte única do sistema. Refatore para legibilidade, concisão de código e / ou princípios DRY (você pode ter copiado e colado algum código para fazer algo cinco vezes; refatorado para um loop e / ou uma chamada de método). Na terceira vez em que você trabalha nessa linha de código,
O(my God)-complexity
se nada mais, me fez rir!