Para muitas pessoas de TI, inclusive eu há alguns anos, o processo ideal de desenvolvimento de software envolveria a criação de documentos de projeto detalhados com muitos diagramas UML antes que uma linha de código fosse escrita. (Isso parece uma descrição do modelo em cascata, mas é o mesmo com o ágil, exceto que as iterações são menores.)
Nos últimos dois ou três anos, mudei completamente de idéia. Ainda acho que uma especificação detalhada de requisitos com casos de teste associados é absolutamente essencial. Para projetos grandes, eu também exigiria um esboço da arquitetura geral antes de começar a codificar. Mas todo o resto deve ser feito em código, tanto quanto possível. No caso ideal, não deve haver descrição do design do software, exceto o próprio código.
Como cheguei a essa conclusão? Aqui estão alguns argumentos:
Comentários
As ferramentas para escrever documentos ou criar diagramas fornecem pouco feedback. Sim, existem ferramentas de modelagem que realizam algumas verificações de consistência nos diagramas UML, mas são limitadas e têm muita sobrecarga.
Sem feedback, é difícil reconhecer e corrigir erros.
Assim que você escreve o código, recebe muitos comentários, por exemplo:
- Erros e avisos do compilador
- Resultados da análise de código estático
- Testes unitários
Os erros podem ser rapidamente reconhecidos e corrigidos.
Consistência
Para garantir que o código seja consistente com seus documentos, você deve verificar novamente e novamente. Se houver alterações frequentes, é difícil manter o código e os documentos sincronizados.
Reestruturação
Existem ferramentas e técnicas poderosas para refatorar código, enquanto a refatoração de descrições ou diagramas textuais geralmente é difícil e propensa a erros.
Há uma condição prévia para fazer isso funcionar: O código deve ser fácil o suficiente para ler e entender. Provavelmente isso não pode ser alcançado com o Assembler, Basic ou Fortran, mas as linguagens modernas (e as bibliotecas) são muito mais expressivas.
Portanto, se meus argumentos são válidos, deve haver uma tendência a especificações ou documentação de design de software menos ou mais leves. Existe alguma evidência empírica para esta tendência?