Uma das habilidades vitais de um arquiteto é poder visualizar a arquitetura de software de vários pontos de vista diferentes: cada uma delas individualmente pode não ser totalmente relevante, mas combiná-las oferece uma visão de alto nível do produto. Neste post, abordaremos os princípios de arquitetura de software que atribuem seu papel como arquiteto!
Arquitetos de soluções são os especialistas designados responsáveis pela arquitetura de software de um sistema, bem como os padrões técnicos (incluindo tecnologias, plataformas, infraestrutura) de um produto específico. Eles definem a visão e sua análise é essencial para a definição, o design, a entrega e o suporte ao longo da vida útil do produto.
Portanto, eles precisam entender não apenas o que os
negócios precisam, mas também o que é lógico, escalável, econômico e alinhado
com os objetivos gerais de tecnologia da organização. Esses pontos de vista
compreendem princípios, padrões, antipadrões, regras práticas e essenciais para
as tomada de decisões em direção a uma direção específica e também para avaliar
o sucesso do projeto.
Os princípios do SOLID que se aplicam para projetar e desenvolver um software, considerando:
Princípio da responsabilidade única
Cada capacidade do sistema (por exemplo, serviço/módulo/API) deve ter apenas uma responsabilidade e um motivo para mudar. Manter as responsabilidades o mais restritas possível significa que os usuários sabem da finalidade pretendida, o que leva a menos erros.Princípio Aberto-Fechado
Este princípio postula que é preferível estender um comportamento do sistema, sem modificá-lo. Embora muitas vezes não seja uma boa ideia tentar antecipar alterações nos requisitos com antecedência (pois isso pode levar a projetos excessivamente complexos), poder adaptar novas funcionalidades com alterações mínimas nos componentes existentes é essencial para a longevidade do aplicativo.Princípio da substituição de Liskov
No desenvolvimento de soxware, isso significa que as classes derivadas devem ser substituídas por suas classes base, mas a semelhança desse princípio com o Design by Contract de Bertrand Meyer é como ela pode ser aplicada à arquitetura de software distribuída: dois serviços se comunicam de forma eficaz e repetida quando há um contrato comum ‘entre eles, que define as entradas/saídas, sua estrutura e suas restrições. Portanto: dados dois componentes distribuídos com o mesmo contrato, um deve ser substituível por outro componente com o mesmo contrato, sem alterar a correção do sistema.Princípio de Segregação de Interface
As interfaces/contratos devem ser o mais detalhados possível e específicos do cliente, para que os clientes que se ligam não dependam da funcionalidade que não usam. Isso anda de mãos dadas com o princípio da responsabilidade única: ao quebrar as interfaces, favorecemos a composição separando por papéis/responsabilidades e o desacoplamento por não acoplar módulos derivativos a responsabilidades desnecessárias.Princípio de Inversão de Dependência
Módulos de alto nível não devem depender dos de baixo nível; ambos devem depender de abstrações. Da mesma forma, as abstrações não devem depender de detalhes, mas os detalhes devem depender de abstrações. Como tal, esse princípio introduz uma abstração de interface entre componentes ou camadas de soxware de nível superior e inferior para remover as dependências entre eles.The Least Principles
O princípio da menor surpresa
O princípio de menos espanto (ou menos surpresa) sugere que uma solução ou abordagem não surpreenderia uma pessoa razoavelmente experiente na área de assunto quando encontrada pela primeira vez (o público pode variar, por exemplo, usuário final, programador, testador etc.). Em termos mais práticos, o princípio visa alavancar o conhecimento pré-existente dos usuários para minimizar sua curva de aprendizado ao usar um módulo; portanto, qualquer coisa com alto fator de imprevisibilidade é um bom candidato para o redesenho. Aplica-se a todos os aspectos da arquitetura de software: dos serviços de nomeação, à visualização de interfaces do usuário e ao design do modelo de domínio.O princípio do menor esforço
Seu princípio (também chamado de Lei de Zipf) deriva de um comportamento humano básico: todo mundo tende a seguir o caminho que é o mais próximo possível do esforço. Por exemplo, se nosso design seguir um padrão específico, o próximo desenvolvedor seguirá o mesmo padrão repetidamente, a menos que haja uma maneira significativamente mais fácil de executar a tarefa; nesse caso, eles serão alterados! Ou, levando isso adiante, uma vez que eles encontram resultados aceitáveis para uma tarefa, não há necessidade imediata de melhorar a solução atual. Como tal, é imperativo almejar um começo forte, colocando a arquitetura de software certa no lugar: estabelece altas expectativas e garante que todos entendam que a qualidade não é comprometida no ciclo de vida do projeto e será respeitada em caso de mudanças futuras. Para mim, a grandeza desse princípio reside no fato de que seus benefícios extrapolam: uma vez que implementamos um design correto, podemos criar uma estrutura arquitetônica que será a base dos próximos sistemas que construímos. Em outras palavras, somos capazes de estabelecer um modelo bem-sucedido e à prova de futuro para os sistemas de soxware da organização.The principles of “Economics”
Esses dois princípios têm um tema comum: o custo de aproveitar ao máximo uma oportunidade e o custo de adiar a tomada de decisões.O princípio do custo de oportunidade
Toda vez que fazemos uma escolha, há um certo valor que colocamos nessa escolha. O valor tem duas partes: benefícios e custos. O custo de oportunidade de uma escolha é o que desistimos de obtê-la. Para tomar uma boa decisão econômica, queremos escolher a opção com o maior benefício para nós, mas com o menor custo. Por exemplo, se tivermos duas opções, um sistema interno ou um produto de fornecedor pronto para uso e escolhermos o último, nosso custo de oportunidade será o novo sistema brilhante que nossa equipe de desenvolvimento poderia ter desenvolvido, mas não o fez . É disso que se trata a arquitetura de software: ponderar as opções umas das outras e tentar tomar uma decisão informada sobre qual delas agregará mais valor ao projeto. Por exemplo, uma dicotomia muito comum é criar uma solução tática com tempo de comercialização rápido ou uma solução mais estratégica, que agora será mais cara, com o objetivo de alavancá-la em projetos futuros e, portanto, minimizar o custo posteriormente. Aqui estão alguns pontos a considerar:- Qual é o tempo disponível para a análise ou avaliação arquitetônica?
- Qual é o pipeline de produtos para os próximos 1 a 3 anos? E que outros projetos estão alinhados? Você consegue ver alguma sinergia?
- Qual é a sua dívida técnica atual que você poderia enfrentar?
- E, invertendo isso: quanta dívida técnica nova incorrerá se você buscar uma solução tática?
- Quais atributos de qualidade tendem a ser os mais importantes para os sistemas em sua organização e como eles serão comprometidos pela solução proposta?
- Além da equipe de arquitetura de software, quem mais é uma parte interessada que afetará a decisão? O negócio? Seu chefe? A Autoridade de Projeto Técnico? Quais são os principais objetivos de cada parte interessada? Como você irá mitigar necessidades conflitantes?