O que é arquitetura?
A palavra “arquitetura” evoca visões de poder e mistério. Isso nos faz pensar em decisões pesadas e
proeza técnica profunda. A arquitetura de software está no auge da realização técnica.
A arquitetura de um sistema de software é a forma dada a esse sistema por aqueles que a constroem. A forma
dessa estrutura está na divisão desse sistema em componentes, o arranjo desses componentes, e as maneiras
pelas quais esses componentes comunicar uns com os outros.
O objetivo dessa forma é facilitar o desenvolvimento, implantação, operação, e manutenção do sistema
de software nele contido.
A estratégia por trás dessa facilitação é deixar tantas opções em aberto quanto possível, pois tanto tempo quanto possível.
O objetivo principal da arquitetura é dar suporte ao ciclo de vida do sistema. Uma boa arquitetura torna
o sistema fácil de entender, fácil de desenvolver, fácil de manter, e fácil de implantar. O objetivo final é
minimizar o custo de vida útil do sistema e para maximizar a produtividade do programador.
Desenvolvimento
Um sistema de software difícil de desenvolver provavelmente não terá uma vida útil longa e saudável. Portanto, a arquitetura de um sistema deve torná-lo fácil de se desenvolver, pela a(s) equipe(s) que o desenvolvem.
Diferentes estruturas de equipe implicam em diferentes decisões arquitetônicas. Por um lado, uma pequena equipe de cinco desenvolvedores pode trabalhar efetivamente em conjunto para desenvolver um sistema monolítico sem componentes ou interfaces bem definidos. Na verdade, tal equipe provavelmente acharia as restrições de uma arquitetura algo como um impedimento durante os primeiros dias de desenvolvimento. Esta é provavelmente a razão pela qual tantos sistemas carecem de boa arquitetura: Começaram sem nenhuma, porque a equipe era pequena e não queria o impedimento de uma superestrutura.
Por outro lado, um sistema sendo desenvolvido por cinco equipes diferentes, cada uma incluindo sete desenvolvedores, não pode progredir a menos que o sistema seja dividido em componentes bem definidos com interfaces confiáveis e estáveis. Se nenhum outro fator for considerado, a arquitetura desse sistema provavelmente evoluirá para cinco componentes—
um para cada equipe.
Essa arquitetura de componente por equipe provavelmente não é a melhor arquitetura para implantação, operação e manutenção do sistema. Não obstante, é o arquitetura em que um grupo de equipes irá gravitar se forem movidos apenas por cronograma de desenvolvimento.
Implementação
Para ser eficaz, um sistema de software deve ser implantável. Quanto maior o custo de implantação, menos útil é o sistema. Um objetivo de uma arquitetura de software, então, deve ser criar um sistema que possa ser facilmente implementado com uma única ação.
Infelizmente, a estratégia de implantação raramente é considerada durante o desenvolvimento inicial. Isso leva à arquiteturas que podem tornar o sistema fácil de se desenvolver, mas deixá-lo muito difícil de implementar.
Operação
O impacto da arquitetura na operação do sistema tende a ser menos dramático do que o impacto da arquitetura no desenvolvimento, implementação e manutenção. Quase qualquer dificuldade operacional pode ser resolvida jogando mais hardware no sistema sem afetar drasticamente a arquitetura do software.
De fato, vemos isso acontecer repetidamente. Sistemas de software que possuem arquiteturas ineficientes muitas vezes podem ser feitas para funcionar de forma eficaz simplesmente adicionando mais armazenamento e mais servidores. O fato de que o hardware é barato e as pessoas estão caras significa que as arquiteturas que impedem a operação não são tão caras quanto arquiteturas que impedem o desenvolvimento, implantação e manutenção.
Manutenção
De todos os aspectos de um sistema de software, a manutenção é o mais caro. O não termino de novos recursos e o inevitável rastro de defeitos e correções consomem grandes quantidades de recursos humanos.
O custo primário de manutenção está em espeleologia e risco. Espeleologia é o custo de vasculhando no software existente, tentando determinar o melhor lugar e a melhor estratégia para adicionar um novo recurso ou reparar um defeito. Ao fazer tais mudanças, o a probabilidade de criar defeitos inadvertidos está sempre presente, aumentando o custo do risco.
Uma arquitetura cuidadosamente pensada reduz amplamente esses custos. Ao separar o sistema em componentes e isolando esses componentes por meio de interfaces, é possível iluminar os caminhos para futuras funcionalidades e, em muito, reduzir o risco de quebra inadvertida.
Resumo de tradução livre: primeira parte do capítulo 15 Clean Architecture