Executando verificação de segurança...
2

Clean Architecture x DDD x Modular - Qual arquitetura escolher?

Racional

Fala pessoal! Estou pensando em dar uma exercitada/estressada sobre o uso de arquiteturas robustas. Já utilizei algumas durantes os meus anos de xp, mas estou revisitando alguns racionais e tomadas de decisões... Com isso, me veio uma duvida em mente.

Qual arquitetura voce aplicaria em um projeto médio, com chances de crescimento ao longo dos anos?

Primeiro ponto em consideração: Monolith!

Segundo ponto em consideração: Tem de ser modular, com possibilidades futuras de ser desmembrado em serviços/dominios menores (Microservices ou outros monolitos menores)

Com esses pontos em mente, cheguei em algumas arquiteturas a serem aplicadas:

  • Clean Architecture
  • DDD => Ports and Adapters!
  • Hexagonal ou Onion Architecture => Ports and Adapters!

Com isso mente, pensei novamente em outras perguntas...

  • Qual a necessidade de se utilizar arquitetura tão robustas?
  • Para além do contexto de multiplas mãos tocando um mesmo projeto, quais os outros ganhos em se utilizar uma arquitetura robusta?
    • Testabilidade (Unitários + Integração)?
    • Transformação de dominios em serviços menores (Monolith ou Microservice)
  • Uma arquitetura modular e com dominios bem separados/contidos poderia ser aplicada?
  • Sobrecarga de engenharia (Overengineering)?

Para conseguir responder essas duvidas, somente construindo algo e entendendo o uso de cada uma delas aplicadas ao problema. Com isso em mente elaborei algo que considero de baixa complexidade, mas que pode evoluir e se transformar em algo de média complexidade.

Projeto

Gerenciador de bibliotecas/livros que conterá:

  • Editoras => CRUD
  • Autores => CRUD
  • Livros => CRUD
  • Categorias => CRUD
  • Resenhas => CRUD
  • Usuários => CRUD

Regras funcionais podem ser desenhadas da forma como voce quiser.

Exemplo:

  • Um titulo de um livro somente pode conter até 100 caracteres
  • Um livro pode conter multiplas versões

Como processamento async pode conter:

  • CRON JOB
    • Validação de Livros
  • Filas
    • Publicação de resenhas
    • Disparo de e-mails

Sempre é bom ter, mesmo que em estudos

  • Observalidade (Pick one)
    • Prometheus + Grafana = <3
  • Cache
    • Redis OU Memcached
    • in memory
  • Auth
    • Email + Senha
    • OTP
    • Forgot Password

Duvidas

  • Qual arquitetura seria a ideal? Não existe bala de prata
  • Em caso de clean architecture, qual seria o motivo/racional?
  • Em caso de DDD, qual seria o motivo/racional?
  • Porque não seria uma arquitetura modular?

Arquiteturas

  • Clean Architecture
  • Modular by Domains
  • DDD
  • Hexagonal ou Onion

Proposta de Arquitetura

https://pastebin.com/nj6uEJmf

Carregando publicação patrocinada...
2

Geralmente nenhuma das 3 coisas.

Só vai usar uma delas se realmente tiver necessidade. E ela tem que ser muito bem provada, porque o preço que vai pagar por isso é enorme. Faça o simples, se ele não der conta então adote algo. Não adote porque está na moda.

Eu já fiz coisas grandes, complexas (me lembro de uma época que discutiam um se seria o maior da américa latina ou do hemisfério sul em certo critério) e nunca vi necessidade de aplicar nada disso por completo, no máximo pegar algumas ideias. Sempre deixei o dogma de lado, muitas vezes a decisão nem foi minha, mas nunca trabalhei com nada disso de verdade. Mas já vi vários casos onde adotaram, onde dei consultoria ou amigos (eu tenho a sorte de ter contato com muita gente que trabalhou em projetos importantes). Claro que sempre estudei além de ver funcionando. E vi muita atrocidade. No mínimo complexidade onde não deveria ter. Teve várias casos que nada funcionava porque tinha que gastar mais tempo cuidando da água do que o bebê que precisava do banho. Jogue fora a água e deixe o bebê, é ele que importa.

Arquitetura limpa de verdade e bom design é o que importa. Seguir modas não faz nada ficar bom, até porque fazer errado, e quase todo mundo faz (me lembro uma vez em rede social um cara descendo a lenha e uma dessas metodologias e um cara "famoso" que vende curso e consultoria nelas, falou que eles não sabiam fazer, e era verdade, só que aí o cara respondeu para o influencer que eles não aprenderam depois da empresa inteira ter gasto uma fortuna com curso e consultoria dele), então não vai obter resultado bom com o erro, a pessoa só fica satisfeita de ter aderido à moda. Limpo é sem penduricalhos, sem fazer sem pensar.

A tal Clean Arquiteture mesmo é cheia de falhas. Não quer dizer que tenha zero casos para usar, mas ela nunca funciona do jeito que as pessoas imagina,

A ideia do DDD é boa, mas implementar é caro e uma loucura em quase todos os casos, até hoje não bi uma bem feita, nem mesmo mostrada pelos maiores especialistas nisso, pelo contrário. E vi empresas no caos adotando.

Já deu para entender, né?

Mesmo quem vai adotar isso não pode fazer ingenuamente, não pode decidir sozinho, precisa de muita maturidade, não é assim que vai adotar corretamente, não é como primeira experiência, mais do que adotar onde não precisa e não estar 100% preparado criar algo assim, o que é difícil e precisa entrar em equipe onde tem, é necessário e funciona muito bem |(é bem raro achar isso e conseguir uma vaga).

Isso "é tudo", menos robusto, em geral acaba sendo bem frágil, é como montar um castelo de cartas. Você pode até usar cola e o castelo se sustentar, mas isso é bem difícil de fazer.

Por sorte muita gente faz tudo errado, nem adota de fato nada disso , mas faz alguma coisa, e o tempo mostra que não era necessário porque era simples demais, e aí ela acha que foi um sucesso. A desnecessidade era tão profundamente grande que o problema nunca aparece e dá a sensação de dever cumprido. Então pegue a parte de overengineering e a evite.

Só não é pior porque está excluindo arquitetura de microsserviços, que é outro caso que as pessoas adotam por moda e pagam preço sem ter vantagens, e é um dos casos que minha consultoria sempre foi "tira isso e faça o simples" e todo mundo que fez não se arrependeu. Pelo contrário, viram a besteira que estavam fazendo.

Já começa com problema quando boa parte disso nem arquitetura é. Até o que tem arquitetura no nome dá para questionar se é arquitetura ou é só uma metodologia de desenvolvimento.

Se tiver que adotar mesmo uma delas só para dizer que fez, a modular é a menos problemática, mesmo assim se não exagerar.

Vai fazer sozinho? Será o que está no link? Desista disso. Até para aprendizado apenas estará treinando o erro. Sem um projeto com dezenas, provavelmente com centenas, melhor ainda com milhares de pessoas, justifica o uso de algum deles, e mesmo assim condicionalmente.

Se tiver que fazer, você já sabe responder as perguntas por conta própria. Sem saber, deixe pra lá. Não subestime a dificuldade de fazer isso certo. Não seja mais um caindo nessa armadilha.

Claro que pode fazer como quiser. Eu tento fazer minha parte, mas eu sei que o marketing em cima disso é pesado e o cérebro responde de forma semelhante ao de usuário de drogas, ele quer o que está no hype, se todo mundo fala disso, então ele precisa daquilo.

Desculpe jogar uma balde de água fria. Quero que encontre um caminho que produza produtos melhores e atenda melhor que te contrata, mas você será responsável por isso. Se for tão importante para você fazer isso, então fará mesmo assim, uma pena, eu sei que quase ninguém me ouvirá. Tomará que dê certo.

Faz sentido para você?

Espero ter ajudado.


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).