agosto 26, 2010

Agile

Ontem assisti a uma palestra sobre desenvolvimento de software chamada: "Desenvolvendo software com qualidade". Dentre os assuntos abordados, o palestrante falou sobre RUP e XP.

Eu não concordei com muitas das idéias passadas pelo palestrante, sobre desenvolvimento ágil, em especial, não concordei com dois tópicos colocados por ele:

  1. Metodologia ágil é só para projetos pequenos;
  2. Metodologia ágil gera código de baixa reusabilidade.
Na minha opinião, processos mais tradicionais como o RUP, são mais cômodos, pois são cartilhas a serem seguidas, desenvolvimento ágil requer mais disciplina. 

Disciplina é uma palavra que vejo sempre associada à métodos ágeis, isso por vezes, tira os envolvidos da sua zona de conforto.

Com o arcabouço oferecido pelo Agile, acredito que uma equipe consiga lidar com projetos de grande porte e se suportada pelo DDD, a questão da reusabilidade não será problema.

Compartilhei minha opinião com o mestre Vinícius e ele escreveu um excelente post sobre o assunto.

agosto 16, 2010

É só um 'cadastrinho'...

O processo de desenvolvimento de software é uma via de mão dupla: a equipe de desenvolvimento e o(s) domain expert(s) aprendem sobre o domínio em questão.

A equipe de desenvolvimento aprende, na maioria das vezes, sobre uma área de atuação completamente nova e o domain expert, ou a equipe de domain experts, descobrem novas funcionalidades que a principio, não haviam sido identificadas, é um processo evolutivo.

Eu diria que é impossível, o cliente ter uma idéia 100% correta com relação às funcionalidades a serem implementadas em um sistema. Alguns têm uma noção muito boa, com esses, o trabalho normalmente flui muito bem, mas muitos, têm uma noção bem distante da realidade de seus domínios.

Nesse contexto, é comum surgirem os 'cadastrinhos', como eu costumo chamar. O domain expert, por não ter uma noção muito correta do que precisa, ou por querer de certa forma, minimizar a complexidade do próprio processo, diz: "Esse sistema é só um cadastrinho, é muito simples, basta salvar meia dúzia de campos de um formulário."

Por vezes, a afirmação anterior se mostra verdadeira. Para uma primeira iteração, entregar um simples cadastro de seis campos, pode atender às necessidades do momento. Mas é normal que, idéias comecem a borbulhar na cabeça do domain expert, após ver o 'cadastrinho' funcionando.

Aí vem o problema:

Partindo do princípio que desenvolvimento de software é um processo evolutivo, isto é, novas necessidades surgem e mudanças ocorrem em funcionalidades já existentes, a escolha de uma metodologia de desenvolvimento apropriada, que privilegie extensibilidade e manutenibilidade, é essencial para o sucesso do projeto, pois o cadastrinho de 6 campos pode facilmente evoluir para o Cthulhu.

Estudos e a prática, mostram que a maior parte do tempo de um projeto de software, é gasto na fase de manutenção e melhorias. Muitas vezes, por questões de prazos apertados, escolhas inadequadas acabam sendo feitas com relação à implementação, por oferecerem produtividade alta e imediata. Isso pode gerar um design "engessado", pouco extensível e de difícil manutenção, a complexidade pode rapidamente engolir a equipe de desenvolvimento.

Já ouvi muitos colegas dizerem que o sucesso se mede pela satisfação do cliente. Concordo que satisfação é essencial, mas no meu ponto de vista, deixar o cliente satisfeito, é o mínimo que se pode esperar quando se oferece um produto. 

Satisfação do cliente e software com qualidade, não são (ou não deveriam ser) objetivos mutuamente exclusivos. A filosofia de Domain-Driven Design (Eric Evans), introduz ao processo de desenvolvimento de software: 

  • uma arquitetura em camadas, para organização de responsabilidades; 
  • ubiquitous language, para facilitar a comunicação entre equipe técnica e domain experts, além de gerar documentação em nível de código;
  • patterns que simplificam e consolidam o design
Ao utilizá-la, associada ao paradigma orientado a objetos, uma equipe ágil, deve ser capaz de vencer cenários onde os prazos são curtos e os clientes exigentes, com a vantagem de gerar um produto final que reflete o domínio do cliente, com um design extensível, de manutenibilidade e legibilidade simplificadas, tanto para os profissionais envolvidos, quanto para futuros profissionais que venham a se envolver no projeto.


Para saber mais:

agosto 02, 2010

TDD... eu recomendo!

Chega a requisição, de uma nova funcionalidade, para um dos sistemas em que estou envolvido.

O sistema em questão, gerencia a vida do aluno no programa de pós-graduação, stricto sensu, da UERJ. A requisição era algo do tipo:

"Os cursos de pós-graduação, devem poder lançar as notas dos alunos inscritos em suas turmas no semestre."

Meu caminho natural, para começar a atender este pedido, seria: (i) configurar os xmls do STRUTS, (ii) criar actions e (iii) criar telas do sistema. Basicamente, eu trabalharia primeiro as camadas de apresentação, controle e provavelmente de infraestrutura, para abrir caminho até a camada de modelo e a partir daí, iniciar a programação das regras de negócio.

Mas neste dia, decidi testar uma nova abordagem. Eu já tinha lido à respeito, ouvido falar e até aplicado em projetos acadêmicos, a técnica de Test Driven Development ou TDD.

Ao ler a requisição que me foi passada, percebi três funcionalidades principais que precisaria desenvolver: (i) listar para o usuário as turmas do semestre, (ii) listar os alunos da turma selecionada e (iii) permitir o lançamento das notas.

As três funcionalidades descritas acima, tornaram-se meus casos de teste e eu iniciei o desenvolvimento dos testes unitários utilizando as bibliotecas do JUnit.

Por mais que estivesse acostumado a fazer da forma antiga, enxerguei grandes vantagens utilizando o TDD:

  1. Trabalhei diretamente na camada de modelo.
  2. Pude focar meus esforços nos casos de teste, isoladamente, sem me preocupar com as outras funcionalidades a serem desenvolvidas.
  3. Quando parti para as camadas de apresentação e controle, já tinha certeza de que minhas regras de negócio estavam 100% funcionais e sem erros, tive apenas que lidar com erros técnicos (configurações do struts por exemplo) e de camada de apresentação (jsp's).
  4. Os teste unitários, passam a fazer parte do sistema e são artefatos valiosos para a detecção de possíveis bugs futuros.
  5. O desenvolvimento, pelo menos no meu caso, foi mais rápido.

Ao avaliar as vantagens obtidas utilizando o TDD, neste projeto, com certeza aplicarei a técnica em projetos futuros.