⚙️ Arquitetura II: Não dê sorte ao azar
Tags: braziliandevs, architecture, beginners, softwareengineering
Published: 2023-08-14 11:04:14

Olá queridos(as) devs!

Sejam bem-vindos ao segundo artigo de uma série que estou começando a publicar. Neles, vou abordar diversos temas de arquitetura, desde os fundamentos até modelos, padrões, etc.

No entanto, neste artigo, iremos discutir algo de extrema importância: as **características arquiteturais**.

Neste artigo, você irá aprender rapidamente:
* Você considera explicitamente a arquitetura ao desenvolver um software?
* O que são características estruturais?
* O que é uma característica operacional?
* O que é uma característica estrutural?
* Pontos importantes a serem considerados no dia a dia

Vamos começar! 🔥

---

### Não de sorte ao azar

No cotidiano, é comum desenvolvermos diversas funcionalidades, resolver problemas e entregar produtos. No entanto, muitas vezes fazemos escolhas automáticas, sem pensar muito nelas.

Com o tempo, essa abordagem pode prejudicar a qualidade do software, uma vez que negligenciamos aspectos que podem ser cruciais. Por isso, quero abordar um tópico **extremamente** importante na arquitetura de software: as **características arquiteturais**. São vários pontos que não devemos ignorar.

Tenho certeza de que, ao compreender um pouco mais sobre isso, sua abordagem ao desenvolvimento de projetos mudará completamente.

Vamos lá! 🚀

---

### Características Arquiteturais

Ao desenvolver uma solução, sempre temos requisitos - os requisitos funcionais estão mais relacionados ao negócio e suas funcionalidades de valor, enquanto os requisitos não funcionais focam mais no sistema em si.

Com o tempo, o termo "requisito não funcional" tem sido substituído cada vez mais por "características de arquitetura". Isso envolve pensar e destacar aspectos importantes do software, que, se bem desenvolvidos, trarão maior segurança e qualidade à aplicação.

Ao considerar essas características, estamos usando uma abordagem de análise arquitetural em vez de focar apenas no domínio de negócio. Isso nos permite analisar os pontos de arquitetura do software.

Hoje em dia, não é possível listar **todas** as características arquiteturais que um software pode ter, mas podemos agrupá-las em três categorias: **Características Operacionais**, **Características Estruturais** e o que chamamos de **cross-cutting**.

Ter uma compreensão desses grupos lhe dará mais confiança ao opinar sobre uma solução e entender a visão macro e micro do software. Além disso, você deixará de apenas superficialmente considerar esses pontos em seu cotidiano e passará a ter um olhar mais crítico sobre as decisões tomadas.


![Características arquiteturais](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e5eyy544dztvfo4t5p6u.png)

---

### Características Operacionais

Quando consideramos essas características, estamos analisando a operação do software. Isso inclui:

* **Disponibilidade**: Quanto tempo meu projeto estará disponível (24/7)?
* **Confiabilidade**: Segurança, autenticação, segurança em geral, etc.
* **Escalabilidade**: Como meu sistema escala? Horizontalmente (adicionando máquinas)? Verticalmente (aumentando o poder computacional)?
* **Recuperação**: Caso algo dê errado, tenho algum tipo de backup preparado?

Note que tudo relacionado às operações (inclusive o papel do DevOps) faz parte desse grupo.

Ter um entendimento mínimo sobre esses aspectos ao desenvolver o sistema é crucial, uma vez que todos podem afetar a forma como o sistema será operado.

---

### Características Estruturais

Como o nome sugere, esta seção trata da estrutura do sistema. Aqui, discutimos os suportes que sustentarão nosso software. Isso inclui aspectos relacionados ao código, configuração da aplicação, instalação, etc.

Alguns exemplos de conceitos importantes nesta categoria:

* **Configurabilidade**: Quão fácil é configurar o software e seus componentes.
* **Extensibilidade**: Os componentes da aplicação devem estar prontos para evoluir.
* **Facilidade de Instalação**: O software deve ser facilmente instalável e não apresentar problemas durante o deployment.
* **Reutilização de Componentes**: Os componentes da aplicação devem ser projetados para reutilização em diferentes contextos.
* **Facilidade de Manutenção**: Um software com boas práticas de código e baixo acoplamento será mais fácil de manter.

---

### Características Cross-cutting

Este grupo engloba conceitos importantes para o software, mas que não se encaixam diretamente nas categorias anteriores.

Estes incluem:

* **Acessibilidade**: O sistema deve ser acessível para os usuários.
* **Conformidade Legal e Privacidade**: O software deve atender às leis e termos de privacidade, como a LGPD no Brasil.
* **Segurança**: Embora possa ser considerado como parte da Confiabilidade, a segurança do projeto merece atenção extra.
* **Usabilidade**: Compreender como o usuário interage com o software e melhorar esses aspectos.

---

### Pontos importantes

É praticamente impossível incorporar todas as características em um software, devido ao custo e ao tempo envolvidos. Você sempre terá que definir uma lista de características mais importantes, seja em colaboração com as partes interessadas do projeto, requisitos ou conhecimento técnico sobre possíveis problemas que o software pode enfrentar.

Por exemplo:

Imagine que sua solução envolve um processo de pagamento. Você pode ter duas opções:
1. Se esse processo for realizado por um terceiro, não precisamos de certificações de segurança; criptografia de dados seria suficiente.
2. Se o processo de pagamento for feito pelo software, precisamos focar na confiabilidade e na segurança do usuário.

Toda arquitetura de software envolve trocas - você ganha algo em troca de outra coisa. Por isso, é crucial manter o objetivo da solução em mente.

A maior dica que posso dar é: **Não busque a melhor arquitetura possível; escolha a menos ruim**.

Ao manter esses pontos em mente, comece a observá-los nos softwares com os quais você trabalha! Tente não negligenciar esses temas enquanto desenvolve.

---

## Me acompanhe em minhas redes sociais. 

Obrigado pelo seu tempo!

Compartilhem com seus colegas de estudo/trabalho.
Me chama nas redes sociais a baixo para trocarmos uma ideia e tirar dúvidas:
* [GitHub](https://github.com/matskira)
* [LinkedIn](https://www.linkedin.com/in/matheuspoda/)
* [Twitter](https://twitter.com/devmpoda)
* [YouTube](https://www.youtube.com/@devmpoda/videos)

Até a próxima!