segunda-feira, 31 de maio de 2010

Ubiquitous Language



Sempre que encontro com meus amigos guitarristas é uma festa... O assunto principal, como não poderia deixar de ser, é sempre sobre guitarras e tudo que essas preciosidades podem fazer. Falamos sobre as pickups que nossos ídolos utilizam, se vamos colocar jumbo frets em nossos necks para obter maior sustain, comentamos sobre os tipos de bridge que mais gostamos, entre outros assuntos.

Não está entendendo nada desse assunto? Não esquenta, somente nós guitarristas (malucos) entendemos. Essa é a nossa linguagem, a que usamos normalmente para comunicar nossas ideias e nossa paixão pela música.

Imagine uma situação hipotética, na qual esse grupo de amigos tivesse encomendado a uma equipe de programadores um sistema de controle de guitarras, um software no qual pudéssemos encontrar e colocar todo o tipo de informação pertinente da nossa área de atuação. De que modo você pensaria em modelar esse sistema? Qual seria um design apropriado para esse problema?

Um programador com linguagem puramente técnica tentaria explicar como desenvolveria o sistema usando DAOs, controladores, queries, Design Patterns e outras coisas que nada tem a ver com a área (apenas me deixando preocupado se ele realmente teria entendido) o negócio que gostaríamos de ver solucionado.

De outra forma, um programador poderia aproveitar o nosso vocabulário para modelar uma solução que usasse a nossa linguagem como apoio para o design. Nesse modelo, ele me mostraria como criaria guitarras, pickups, tremolos e repositórios diretamente na solução. Deixaria bem claro como esses elementos estão associados usando a mesma linguagem que nós utilizamos normalmente. A essa linguagem damos o nome de ubiquitous language.


Repare onde a ubiquitous language naturalmente se encontra, um meio-termo que une especialistas em domínio com especialistas em tecnologia:



A ubiquitous language é fundamental para o Domain Driven Design, metodologia que foca na construção de sistemas a partir do desenvolvimento (e isolamento) de um rico domain model, capaz de resolver problemas com eficiência e apoiado na linguagem que os usuários utilizam no dia a dia.

Eric Evans nos dá a direção:
"Use the model as the backbone of a language. Commit the team to exercising that language relentlessly in all communications within the team and in the code. Use the same language in diagrams, writing, and especially speech. Recognize that a change in the ubiquitous language is a change to the model."

Nós devemos ser capazes de desenvolver sistemas que comuniquem bem seu design para os usuários que realmente o utilizarão. Mantenha apenas o modelo, código e testes como artefatos permanentes do desenvolvimento. Use a linguagem no dia a dia e a incorpore em todo o lugar, dos diagramas de classe aos códigos Java e C#. Isole o domain model e deixe o aparato técnico para ser discutido apenas por especialistas em tecnologia.

Próximos posts veremos como a arquitetura DDD é feita de forma a permitir o isolamento desse domain model.


6 comentários:

  1. Belo exemplo. Nos perdemos em nosso mundo e esquecemos que tanto nós, quantos os clientes precisamos falar a mesma língua.

    ResponderExcluir
  2. Não vale nada ter o domínio da linguagem e não saber o que o cliente quer. Ele vai pedir "Cidade" e vai acabar sendo desenvolvido "Idade". Mas, por outro lado, existem clientes que vão relutar ao passar informação talvez por medo de perder a vaga, ou por estarem demasiadamente ocupados.

    ResponderExcluir
  3. Fala Hebert,

    A criação de uma linguagen comum não é meramente um exercício de aceitar informações de clientes e/ou especialistas do domínio e aplicá-la.

    Muitas vezes, problemas de comunicação ocorrem dentro das equipes de desenvolvimento, não somente devido à má compreensão da linguagem do domínio, mas também devido ao fato da própria linguagem do domínio ser ambígua.

    O DDD tem o objetivo de não apenas implementar a linguagem a ser utilizada, mas também de melhorar e refinar continuamente o vocabulário desse domínio.

    Abs,

    ResponderExcluir
  4. O caminho para um bom software é conhecer a fundo a sua utilização. Acho que esse mecanismo de desenvolvimento nos proporciona justamente isso. Prevendo as situações que os clientes vão enfrentar achamos as melhores soluções.

    ResponderExcluir
  5. Abstração e conflito de mundos.

    Cabe aos técnicos de informática e aos clientes sairem da imersão profunda do tecniques e da sopa de letrinhas, de suas respectivas áreas, para atenuar o conflito que existe entre seus mundos.

    É necessário abstrair um pouco mais para encontrar um ponto de interceção, onde ambos consigam expor suas idéias, utilizando exemplos mais próximos do mundo real.

    Acredito que esse ponto abstrato permita:
    um diálogo mais compreensível; uma aproximação dos mundos técnicos; e, a elaboração de documentos mais coerentes com a realidade.

    ResponderExcluir
  6. Fala Jorge,

    Concordo com você.

    É claro que essa linguagem não surge do dia para a noite, ela evolui conforme os dois lados (técnico e negócio) vão ganhando maior compreensão sobre o domínio estudado.

    Por isso que o Domain Driven Design apresenta melhores resultados em um ambiente de cultura ágil, que favoreça:

    - A colaboração entre todos os envolvidos no projeto,
    - O desenvolvimento baseado em iterações curtas e rápidas,
    - O feedback constante,
    - A livre circulação de ideias.

    Nesse momento, o quebra-cabeças que começamos a montar na matéria de processos de desenvolvimento, começa a tomar uma forma mais concreta...

    Abs,

    ResponderExcluir

Related Posts with Thumbnails