Olá pessoal, esse é meu primeiro post aqui no Blog da Taller e confesso que estou bem nervoso, porém, a vontade de compartilhar conhecimento e ajudar o máximo de pessoas possível é bem maior. Espero poder ajudar vocês de alguma forma com esse assunto que eu aprendi a amar, que é arquitetura de software.
Agradecimentos
Antes de começar a falar sobre o assunto, eu queria muito agradecer algumas pessoas que me ajudaram bastante com esse assunto, que tiveram bastante (muita mesmo) paciência comigo, são eles: Will Corrêa, Raphael Barbosa, Junior Grossi, Vinícius Dias e Erandir Junior.
Acreditem, sem eles eu não estaria aqui com confiança e conhecimento suficiente para criar um post sobre esse assunto.
O que é Arquitetura de Software?
Vamos ver uma definição bem técnica e formal, digamos assim, de arquitetura de software:
“Consiste na definição dos componentes de software, suas propriedades externas, e seus relacionamentos com outros softwares. O termo também se refere à documentação da arquitetura de software do sistema.”
Fonte: Wikipedia
Eu ainda complementaria essa definição adicionando a importação de testes de modo geral.
Serei um pouco mais didático e formal sobre a definição de Arquitetura de Software, mas já adianto que vou atacar bem onde dói para vocês sentirem as dores de uma arquitetura de software ruim, tudo bem?
Arquitetura Gritante
Vamos sair um pouco desse ramo de software e vamos entrar aqui no ramo de arquitetura que é mais popular, que é arquitetura de: casas, apartamentos, prédios e etc.
Eu quero propor um exercício mental para vocês nesse momento. Quero que vocês observem com bastante atenção a imagem da planta baixa abaixo. Vejam cada área, cada limite, cada instrução dada nesse modelo que é comumente utilizado por arquitetos:
Planta Baixa.
Fonte: Passei Direto
Depois de um tempo observando, quero que vocês respondam para si mesmos algumas perguntas:
– Vocês conseguiram identificar do que se trata essa planta ?
– Vocês conseguiram achar a porta de entrada?
– Vocês conseguiram identificar facilmente os cômodos ?
– Vocês conseguiram identificar entradas e saídas entre os cômodos?
– Vocês conseguiram identificar áreas que só serão acessadas se você obrigatoriamente passar por uma outra área antes?
– Vocês conseguiram ter uma ideia de tamanho/porte ?
Se vocês responderam rapidamente “SIM” para todas essas perguntas, podemos dizer que o objetivo dessa planta baixa foi atingida, pois o grande desafio dos arquitetos é tentar estruturar uma ideia macro para uma futura execução.
Quando temos uma arquitetura assim dizemos que a arquitetura GRITA o que ela é. Isso mesmo, é como se ela estivesse constantemente gritando: “ei pessoa que está me vendo, eu sou uma casa plana!”
Tá, mas o que essa planta e essas perguntas tem a ver com Arquitetura de Software?
Simplesmente tudo senhoras e senhores! Vamos ver abaixo uma estrutura de pastas de um projeto de software que é bastante utilizado por aí.
Estrutura de pastas.
Fonte: Elaborada pelo autor.
Apesar de fictícia e bem básica, esse tipo de arquitetura é bastante utilizada em projetos de softwares, algumas pessoas até dizem que ela é quase uma bala de prata (misericórdia dessas almas Senhor, eles não sabem o que falam).
Agora respondam às mesmas perguntas abaixo (com alguns ajustes de contexto), só que agora analisando a arquitetura dada acima:
– Vocês conseguiram identificar do que se trata o projeto?
– Vocês conseguiram identificar a porta de entrada da aplicação?
– Vocês conseguiram identificar facilmente os domínios dessa aplicação ?
– Vocês conseguiram identificar fluxo de informação entre os domínios?
– Vocês conseguiram identificar domínios que só serão acessados se vocês obrigatoriamente passarem por um outro domínio antes?
– Vocês conseguiram ter um ideia de tamanho/porte?
EXTRA: vocês conseguiram identificar dependências internas e externas?
Muito provavelmente vocês devem estar fazendo muita força no cérebro para conseguir responder a essas perguntas, e isso é um forte indício de que essa é uma arquitetura ruim.
Um certo dia foi perguntado para alguns dev’s de um projeto sobre qual arquitetura eles adotaram para o sistema em que estavam trabalhando, e a maioria respondeu:
NodeJS, Redis, Angular, MongoDB, MySQL e RabbitMQ.
Bom, para a tristeza deles NADA DISSO é arquitetura de software, isso são simplesmente ferramentas que resolvem problemas específicos de um sistema. Uma analogia disso com a arquitetura “tradicional” seria dizer que a arquitetura de uma prédio ou uma casa é: Tijolo, Canos da Tigre, Tubulações da Krona e por aí vai. Isso não é arquitetura!
Então fica a pergunta para reflexão: a arquitetura da sua aplicação grita “Sistema de Contabilidade”, “Sistema de Estoque”, “Sistema Financeiro”? Ou ela grita “Rails”, “Spring”, “Laravel”, “Django”, “NodeJS”?
Padrões Arquiteturais
Pelo fato de muitas arquiteturas não gritarem o que elas são, como vocês viram no exercício acima, que existem vários padrões de arquitetura de software e eles são totalmente independentes de linguagem de programação, frameworks ou bibliotecas. Eu acredito muito que vocês provavelmente devem conhecer pelo menos um (nem que seja de nome) dos padrões arquiteturais abaixo:
- MVC (o famoso Model-View-Controller)
- ADR (Action-Domain-Response, uma espécie de evolução do MVC para web)
- SOA (Arquitetura orientada a Serviços)
- Clean Architecture (em português, Arquitetura Limpa)
- Hexagonal Architecture (em português, Arquitetura Hexagonal)
- Onion Architecture (em português, Arquitetura em Camadas (cebola))
Conclusão
Arquitetura de Software é um mundo de coisas e eu tentei sintetizar o máximo possível nesse post mais conceitual. Tentei usar uma linguagem mais formal e menos acadêmica para que todos pudessem entender de forma mais fácil.
No próximo post iremos começar a ver mais sobre Clean Architecture (ou Arquitetura limpa), que é arquitetura que eu aprendi demais a amar durante os últimos anos.
Confira também: Arquitetura é abstrata até ser operacionalizada