Abordando a fórmula do DDD estratégico
Agora que já refletimos um pouco sobre como realizar aquele projeto, considerando que estamos na liderança do time, vamos abordar a fórmula do DDD Estratégico e o que ele representa. Primeiramente, vamos discutir a Lei de Conway. Basicamente, a Lei de Conway afirma que qualquer organização que projeta um sistema produzirá um projeto cuja estrutura é uma cópia da estrutura de comunicação da organização. Isso significa que, ao criar projetos e sistemas, não necessariamente de software, a forma como modelamos esse sistema é diretamente influenciada pela estrutura de comunicação da organização.
Não se trata apenas do organograma ou da hierarquia dos times, mas também de como eles se comunicam. Por exemplo, dois times que não estão próximos hierarquicamente podem estar próximos fisicamente no local de trabalho, o que facilita a comunicação entre eles. Essa proximidade pode influenciar o sistema, refletindo a comunicação entre esses times. Isso tem um impacto significativo no desenvolvimento de software, pois, se nossos sistemas refletem a estrutura da organização, como podemos criar um sistema verdadeiramente modular e autônomo em suas partes? Essa é uma questão complexa.
Discutindo a arquitetura sociotécnica e a Lei de Conway
Vale a pena discutir que a arquitetura do software é uma construção sociotécnica. Isso significa que, além do código e da qualidade dele, o mais importante são os times que representam esse código, as pessoas que o constroem e a comunicação entre esses times. Se quisermos criar uma aplicação modular, com partes independentes, precisamos fazer o inverso da Lei de Conway. Ou seja, devemos organizar nossos times de forma que a arquitetura seja desacoplada. Se precisamos que dois módulos do sistema conversem entre si, é essencial que as equipes responsáveis por esses módulos também se comuniquem. Se queremos que dois módulos tenham autonomia, as equipes que os desenvolvem também precisam ter autonomia, evitando sobreposição de responsabilidades.
A Lei de Conway oferece uma visão interessante. Já refletimos sobre como resolver isso, mas, basicamente, a solução para tomar decisões de negócio e aplicá-las no desenvolvimento é a modelagem estratégica do domínio de Event Design (Design de Eventos). Isso envolve, entre outros aspectos, os core domains (domínios principais), que trazem vantagem competitiva para o negócio, e como diferenciá-los dos demais. Também abordamos os bounded contexts (contextos delimitados), que definem as fronteiras de autonomia entre nossos módulos do sistema e entre os times que os desenvolvem.
Explorando o baixo acoplamento e o Fast Flow
Discutimos ainda o baixo acoplamento entre os diferentes módulos do sistema. Com vários módulos diferentes, é importante garantir que a comunicação entre eles não vaze contexto de um para o outro, evitando que mudanças em um módulo impactem seriamente outro. O DDD estratégico oferece ferramentas para isso. Por último, mencionamos o Fast Flow, uma ferramenta complementar ao DDD estratégico, relacionada a Team Topologies (Topologias de Equipe), que ajuda a organizar equipes de forma orientada ao fluxo de negócio, promovendo independência.
A modelagem estratégica envolve o conceito de Bounded Context (Contexto Delimitado), que é um limite onde o modelo do software é aplicável, geralmente relacionado à linguagem. Quando termos de negócio são usados de forma diferente em diferentes times ou áreas do sistema, isso geralmente indica sistemas diferentes, possivelmente até microserviços distintos. O contexto delimitado é a fronteira de consistência e autonomia, preservando a linguagem ubíqua e as regras de domínio.
Diferenciando subdomínios e contextos delimitados
Devemos diferenciar subdomínios de contextos delimitados. O subdomínio é o espaço do problema, no campo do negócio, onde o time de produto se preocupa em resolver problemas e atender às necessidades do usuário. O subdomínio ajuda a separar diferentes problemas que a empresa ou o software precisa resolver. Já o contexto delimitado está na parte da solução, indicando como resolver o problema identificado.
Que tipo de solução vamos aplicar? Como vamos organizar nossos times e sistemas para que, em conjunto, resolvam os problemas? É essencial compreender a diferença entre subdomínio e contexto delimitado. Vamos agora discutir os diferentes níveis do Domain Driven Design (DDD). Basicamente, são dois: o nível tático e o nível estratégico.
Explorando os níveis tático e estratégico do DDD
No nível tático, damos um zoom no projeto de DDD, chegando ao nível do código, no baixo nível. Discutimos agregados, entidades, objetos de valor e repositórios, tudo isso na implementação. No entanto, este curso foca na parte estratégica, que se distancia do espaço de solução e aborda o espaço do problema, organizando-o para projetar soluções.
No nível estratégico, falamos sobre contextos delimitados, subdomínios, mapas de contextos e a organização dos times. Este curso enfatiza como desenhar o sistema antes de codificar, definir divisões entre contextos delimitados, identificar partes prioritárias e estabelecer a comunicação entre equipes.
Relacionando o DDD estratégico e tático
Vamos fazer um panorama sobre a relação entre o DDD estratégico e o tático. No foco estratégico, discutimos contextos delimitados e subdomínios. No tático, abordamos a agregação de entidades e outros padrões de implementação do código. Em termos de escopo, a estratégia abrange o sistema sociotécnico completo, incluindo times, sistema, regras de negócio, variações, clientes e suas necessidades. No tático, o escopo é dentro de um contexto delimitado, selecionando uma parte dos problemas para expandir e implementar a solução.
Algumas perguntas relacionadas ao nível estratégico incluem quantos contextos existem, quais são core (aqueles que geram diferencial competitivo), quais são de suporte e quais são genéricos. No nível tático, as perguntas focam em como modelar invariantes, preservar comportamentos dentro do contexto delimitado e evitar impactos de outros contextos.
Ferramentas e momentos para aplicação do DDD
As ferramentas no nível estratégico incluem event storming e mapas de contexto, entre outras que serão apresentadas no curso. No nível tático, temos ferramentas voltadas à codificação, como diagramas UML e padrões de modelagem de eventos.
O momento para a parte estratégica é antes da codificação, quando ainda estamos pensando no espaço do problema, em contato com usuários, levantando requisitos e modelando a solução. A parte tática é usada durante a implementação, organizando padrões táticos para um código robusto com separação de responsabilidades.
Importância da visão estratégica antes da codificação
Pode surgir a dúvida sobre por que não estamos vendo o código ainda. No primeiro curso, introduzimos padrões táticos, mas agora focamos na estratégia. Partir direto para a codificação pode gerar problemas, como agregados grandes sem fronteiras corretas, devido à falta de delimitação do espaço do problema e definição clara das responsabilidades.
Sem a parte estratégica, podemos ter acoplamento indesejado entre contextos, dificultando a manutenção e evolução do sistema. Além disso, podemos ter sobreengenharia em módulos genéricos, aplicando padrões táticos onde não são necessários e não aplicando onde são essenciais.
É crucial ter uma visão estratégica antes de iniciar a codificação. Em seguida, apresentaremos a modelagem estratégica do DDD na visão original de Eric Evans e uma ferramenta atualizada para auxiliar no processo de descoberta do domínio e modelagem da solução. Fiquem conosco para mais informações.