Se bem se recordam (não foi assim há tanto tempo), estou a meio de uma história sobre a conciliação entre formalidade e agilidade... Entremos nas fases mais interessantes. No post anterior descrevi a fase de Concepção que não tem muito que saber. Avancemos para a próxima.
Elaboração
O Problema
Na fase de elaboração realiza-se a análise funcional e técnica: elaboramos o caderno de requisitos; definimos a arquitectura do sistema; enquadramo-lo com os sistemas e a infra-estrutura existente; fazemos um desenho detalhado do sistema entre outras tarefas. O objectivo é ter tudo o mais planeado possível para diminuir o impacto dos imprevistos... bla, bla, bla. Todos sabem como é, não vale a pena estar a repetir-me. Como provavelmente saberão, as metodologias ágeis não favorecem esta aproximação, pelo que me encontrei num dilema: o facto é que tinha de apresentar aqueles deliverables, mas eu queria à viva força tentar mitigar os problemas deste modo de trabalhar. Como conciliar as duas coisas?
A Solução
A resposta passou pelo aproveitamento do ambiente .Net e das ferramentas que a comunidade disponibiliza e, claro, pela aceitação dos chefes desta... experiência. Uma coisa que defini à partida foi que não queria fazer documentos Word inúteis, como aqueles que especificam o desenho do sistema, já que me parecem uma violação flagrante do princípio DRY (Don't Repeat Yourself). Por outro lado, queria tentar montar desde o início um mecanismo iterativo, que me impusesse um ritmo saudável.
Os meus (três?) leitores regulares do meu blog irregular provavelmente já sabem a resposta: montar a Integração Contínua já nesta fase e programar desde o princípio. E foi mesmo a primeira coisa que fiz nesta fase. Montei todo o ambiente de Integração Contínua:
- Criei imediatamente a estrutura do projecto no sistema de controlo de versões;
- Criei a solução no Visual Studio.Net;
- Configurei um projecto no CruiseControl.Net;
- Criei o script de build, com o Nant;
- Muito importante nesta fase, montei desde logo o FxCop e o NDoc no processo de build;
Depois de tudo montado, iniciei a especificação do código (ou desenho, ou modelação, ....), tal como necessário de acordo com os nossos métodos em vigor. Comecei por analisar os requisitos (que tentei criar em forma de user stories) e procurar os conceitos principais (não sei se alguma vez falei da Linguagem Ubíqua ou não... um dia mais tarde) e depois parti para o desenho detalhado do modelo de objectos.
Foi neste momento que realmente comecei a tirar partido do ambiente de Integração Contínua. No modelo tradicional, o desenho detalhado faz-se através de especificações em documentos Word (eventualmente com UML à mistura) que depois são transformadas em código na fase seguinte. Eu saltei os documentos e comecei logo com o código, mas obedecendo ao facto de esta fase ser somente de desenho:
- Criei apenas os objectos e as suas interfaces. Não criei o corpo dos métodos.
- Utilizei intensivamente os Xml Docs.
O facto de ter realizado o desenho detalhado em código ofereceu-me várias vantagens:
- Obedeci a todos os requisitos, já que o código é apenas uma outra forma de documentação;
- Adiantei trabalho, já que a Integração Contínua ia ser montada de qq das formas;
- Graças ao NDoc, gerei documentação em HTML e CHM de forma automática, sendo que é possível criar um formato de documentação Word, pelo que temos essa documentação à mesma. O ponto importante é que a fonte é comum, pelo que não existem dessincronizações.
- Como o desenho foi realizado directamente no código, foi possível ir compilando tudo a cada momento, validando desde logo uma série de situações.
- Graças ao FxCop, em cada momento da "especificação" foi possível validar o desenho contra as guidelines da Microsoft.
Um dos riscos desta abordagem, pelo menos do ponto de vista de quem defende uma fase de desenho separada da construção, é que a tendência dos programadores para começarem imediatamente a codificar tudo (dar comportamento aos objectos) e não apenas as interfaces é demasiado grande. Na minha experiência, apesar de ser totalmente a favor desse modelo (com algumas regras, naturalmente), consegui evitar a tentação, não foi difícil. Acho que na prática, não é um problema muito grande.
Em resumo, apesar de ter de seguir uma metodologia por fases, foi possível introduzir alguma agilidade no processo. Pouca, é verdade, mas com algumas vantagens que me parecem evidentes. O desenho detalhado que fiz tornou a fase de construção mais simples? Ajudou-me mesmo que não tenha me tenha impedido de redesenhar o modelo nalguns locais?
Na fase seguinte, da Construção foi possível introduzir bastante mais agilidade no processo, com resultados (mais uma vez) muito satisfatórios, mas estou a pôr o carro à frente dos bois...
Posted
28-6-2005 8:21
por
João Hugo Miranda