Arquitetura de Software: Características Arquiteturais
Tags: architecture
Published: 2023-05-13 05:10:00

A arquitetura de software é uma área ainda um pouco abstrata para a maioria das pessoas que atuam na área de tecnologia. Entender o que é, ou o papel de um arquiteto é complexo até mesmo para o próprio profissional. No entanto, é necessário que qualquer desenvolvedor tenha um entendimento mínimo sobre arquitetura, pois alguns conceitos são tão cruciais que devem ser compartilhados por todos aqueles que escrevem sistemas com o objetivo de contribuir em algum aspecto para a sociedade. E um desses conhecimentos imprescindíveis é sobre as **características arquiteturais**, que é o que iremos debater um pouco mais nessa postagem.

## Mas afinal, o que é um característica arquitetural?

As Características Arquiteturais podem ser definidas como atributos fundamentais de um sistema, que devem, por si só, descrever toda a sua estrutura, comportamento e propriedades não funcionais. Essas características irão definir a base da arquitetura do seu sistema e ajudarão a garantir o cumprimento dos requisitos de qualidade necessários, como desempenho, segurança, escalabilidade, manutenibilidade, entre outros.

Algumas características arquiteturais são bem comuns, são algumas delas:

1. Modularidade: A capacidade de dividir o sistema em módulos independentes e intercambiáveis que podem ser modificados sem afetar outros módulos.

2.  Escalabilidade: A capacidade do sistema de lidar com um aumento na carga de trabalho sem comprometer seu desempenho.

3. Segurança: A capacidade do sistema de proteger as informações e recursos contra acesso não autorizado, alteração ou destruição.

4. Disponibilidade: A capacidade do sistema de estar disponível e operacional quando necessário.

5. Flexibilidade: A capacidade do sistema de se adaptar a novos requisitos ou mudanças no ambiente em que opera.

6. Interoperabilidade: A capacidade do sistema de se comunicar e interagir com outros sistemas.

7. Manutenibilidade: A capacidade do sistema de ser facilmente modificado e mantido ao longo do tempo.

Essas características arquiteturais são essenciais para o sucesso de um projeto de software e devem ser definidas nas fases iniciais do processo de design e desenvolvimento. É de suma importância que os arquitetos trabalhem junto aos _stakeholders_ do projeto para entender suas necessidades e prioridades, e assim identificar e incorporar essas características no projeto de arquitetura.

## Mas como identificar uma característica arquitetural?

Um arquiteto pode descobrir a característica da arquitetura de pelo menos três formas, são elas:

1. Extraindo-as das preocupações de regra de negócio
2. Por requisitos do sistema
3. Pelo conhecimento implícito da regra de negócio

Iremos falar abaixo um pouco sobre os dois primeiros processos:

### Extraindo características arquiteturais de preocupações de regra de negócio

Um arquiteto tem como responsabilidade traduzir todas as preocupações da regra de negócio em características arquiteturais corretas. É necessário entender os principais objetivos do negócio e sua situação para que seja possível a realização da tradução dessas preocupações pelo arquiteto, e isso irá formar a base para decisões de arquiteturas corretas e justificáveis.

Ao colaborar com os _stakeholders_ do negócio para realizar a definição das características, é necessário se esforçar ao máximo para manter a lista final de requisitos do sistema o mais curta possível. Um anti-pattern muito comum na área de arquitetura é o de tentar projetar uma arquitetura genérica, capaz de suportar todas as características possíveis, pois cada uma delas adiciona uma camada de complexidade ao projeto geral do sistema e suportar diversas dessas características torna o projeto complexo demais para ser mantido. Portanto, uma dica que se pode tomar é a de não ficar obcecado com os números de características e sim com a motivação para manter o design o mais simples possível.

Muitos arquitetos e _stakeholders_ querem sempre priorizar a lista final de características arquiteturais que uma aplicação deve suportar. No entanto, essa é uma tarefa que se torna um grande desperdício de tempo, pois irá gerar frustração e desacordo desnecessários entre as partes interessadas. Uma abordagem que pode ser útil é a de definir as três principais características mais importantes em uma lista final. Isso naturalmente irá gerar um consenso e discussões sobre assuntos mais importantes, ajudando assim o arquiteto a analisar os _trade-offs_ que serão vitais para a tomada de decisões arquiteturais.

É muito importante também ressaltar o fato de que arquitetos e _stakeholders_ conversam em linguagens diferentes. Enquanto um fala sobre escalabilidade, interoperabilidade, tolerância a falhas, capacidade de aprendizado e disponibilidade, as partes interessadas falam sobre fusões e aquisições, satisfação do usuário, tempo de venda e vantagem competitiva. Existe uma tabela que pode auxiliar os arquitetos a traduzir mais facilmente esse diálogo e converter palavras-chave citadas pelos _stakeholders_ em prováveis características arquiteturais. São elas:

| Questões de negócio   | Características arquiteturais                                                                              |
|-----------------------|------------------------------------------------------------------------------------------------------------|
| Fusões e aquisições   | Interoperabilidade, escalabilidade, adaptabilidade e extensibilidade                                       |
| Hora de comercializar | Agilidade, testabilidade e implantabilidade                                                                |
| Satisfação do Usuário | Desempenho, disponibilidade, tolerância a falhas, testabilidade, implementabilidade, agilidade e segurança |
| Vantagem competitiva  | Agilidade, testabilidade, implantabilidade, escalabilidade, disponibilidade e tolerância a falhas          |
| Tempo e dinheiro      | Simplicidade e viabilidade                                                                                 |

### Extraindo características arquiteturais de requisitos

Algumas características podem estar explícitas em documentos de requisitos, como o número de usuários, por exemplo, que costuma aparecer em questões de regra de negócio. No entanto, outras características podem ser extraídas do conhecimento inerente da regra de negócio pelo arquiteto de software. Por isso, é de extrema importância que o arquiteto tenha um entendimento completo da regra de negócio.

Para ilustrar a importância do conhecimento inerente, considere um sistema de registro de aulas para estudantes universitários em que uma escola com mil alunos tem dez horas para a realização da matrícula. Como arquiteto, é necessário questionar e considerar diferentes cenários, como: os mil alunos se cadastrando uniformemente ao longo do período de dez horas ou os mil alunos se cadastrando nos últimos 10 minutos. Detalhes como esses raramente aparecem em documentos de requisitos, mas são fundamentais para auxiliar nas decisões do projeto.


### Referências

- Richards, Mark; Ford, Neal. Fundamentals of Software Architecture. O'Reilly Media.