Preparando terreno para o domínio

Domain-Driven Design é um tópico recorrente hoje em dia. Dada a popularidade do assunto em fóruns e a frequência da lista de discussão percebe-se que há muita gente interessada no assunto. Gostaria de aproveitar a oportunidade para opinar sobre o cenário que eu considero mais apropriado para rodar um projeto DDD.

Primeiro é necessário um processo de desenvolvimento que contemple práticas da engenharia de software como design evolutivo e testes automatizados. Testes fornecem a segurança necessária para lidar com as inevitáveis alterações nos requisitos e as correções de rumo motivadas por novas revelações sobre o domínio. Além disso considero importante que o código reflita o modelo sem impor obstáculos ao entendimento do domínio por parte dos analistas de negócio; e se eles não forem capazes de entender este modelo é porque têm algo de errado com o modelo! O uso consciente de frameworks técnicos aliado a uma arquitetura em camadas permitem diminuir o gap entre modelo (domínio) e implementação (código) criando um design que modela simplesmente o domínio. No entanto, a diversidade de opções de frameworks disponíveis e a necessidade de treinamento nessas ferramentas fazem da busca pelo cenário que eu considero ideal o primeiro desafio.

Uma metodologia de desenvolvimento ágil e uma plataforma capaz de libertar o domínio da infraestrutura técnica é apenas o setting que eu acho mais apropriado. Mas DDD é acima de tudo uma especialização do paradigma de desenvolvimento de software baseado em modelos (MDSD) cujo approach consiste na definição de uma linguagem comum de negócio e em técnicas de implementação que permitam o modelo ser expresso diretamente no código.

Em relação à atribuição de responsabilidades na equipe eu considero um anti-pattern para projetos DDD a forma como ela é feita nas softwarehouses, onde os melhores técnicos são alocados na construção de frameworks caseiros enquanto o domínio carece de bons modeladores. Pelo fato de não interessar especializar-se no domínio do cliente este modelo falha ao privilegiar a melhoria do seu processo interno em detrimento à essência do domain-model, que é o business asset do cliente. Na minha opinião treinamento interno de pessoal e/ou consultoria alocada diretamente no cliente funcionam melhor do que fábricas de software para a modelagem de domínio.

Um cavalo sem nome

Aqueles envolvidos com a engenharia de software já devem ter ouvido falar de testes de aceitação e dos seus benefícios para a implementação de sistemas que atendam as necessidades do cliente. A despeito disso a adoção da técnica ainda está longe de ser ideal; na maioria das vezes as empresas se limitam apenas a criar documentos de casos de uso para os seus projetos.

Acredito que o nome utilizado para denominar a técnica seja um dos entraves para uma maior adoção; a idéia de que teste é algo que deva ser considerado depois e não antes é muito enraizada e eu fico imaginando se não devêssemos usar um nome que reforçasse a idéia de testes de aceitação como guia do processo de captura de requisitos, algo como o que Test-Driven Development (TDD) faz com testes unitários. Há quem acredite que testes de aceitação façam parte do escopo TDD mas se analisarmos a questão com cuidado percebemos que se tratam de animais completamente diferentes. Testes de aceitação servem desde stakeholders até os programadores e durante todo o processo, não é algo que deva ser considerado apenas como artefato de desenvolvimento.

A imagem a seguir ilustra minha visão dos testes de aceitação sob o contexto das metodologias ágeis:

Visão Geral de Processo Ágil

Reapre como testes de aceitação aqui estão para os requisitos assim como testes unitários (red-green-refactor na imagem) estão para o desenvolvimento. Claro que os testes de aceitação influenciam o desenvolvimento mas isso se deve mais a característica “onipresente” dos requisitos já que quando desenvolvemos software o fazemos com alguma motivação, afinal a intenção deveria ser de atender as necessidades de alguém ou alguma coisa não é mesmo?

Aqueles que também analisam a evolução da nossa área no decorrer do tempo já devem ter percebido como é comum velhos conceitos serem reconsiderados mais à frente em um momento mais “oportuno” e sob um novo enfoque. Enquanto as metodologias ágeis demonstram o seu valor no desenvolvimento de software talvez seja hora de aproveitar o bonde e reconsiderar testes de aceitação sob um ponto de vista que melhor reflita a sua importância para a comunicação entre os membros de uma equipe. Um nome que expressasse melhor a idéia por detrás do que chamamos hoje de testes de aceitação seria super bem-vindo!