# Arquiteto de software: um papel que muitos desenvolvedores desempenham!

> Reflexão sobre o papel de arquitetura de software e como ele aparece no dia a dia de quem desenvolve.

- Autor: Marcelo Silva
- Publicado em: 2025-03-05
- Tema: Carreira
- URL: https://marcelxsilva.dev/artigos/arquiteto-de-software/

A arquitetura de software de forma simplificada, pode ser vista como a organização das diferentes camadas e componentes dentro de um sistema. A definição mais comum remete à decisão sobre o como construir o software e quais são os melhores caminhos para atender aos requisitos.

A arquitetura envolve diversas áreas, como:

- **Design:** Como será feita a renderização, no servidor ou no cliente? Qual banco de dados escolher: relacional ou não relacional?
- **Tecnologias:** Optar por REST ou GraphQL? E no backend, .NET ou Node?
- **Sistema Design:** O sistema será monolítico ou em micros-serviços?
- **Infraestrutura:** Onde o software será hospedado?

No entanto, o título “Arquiteto de Software” muitas vezes transmite a ideia equivocada sobre a natureza do trabalho, a realidade é que muitos desenvolvedores ao tomarem decisões sobre os atributos de qualidade do sistema, estão efetivamente desempenhando o papel de arquiteto, mesmo sem reconhecer isso como tal. Toda vez que optam por como lidar com requisitos não funcionais, como escalabilidade, desempenho e segurança, estão moldando a arquitetura do sistema.

## Habilidades Arquitetônicas

Existem habilidades cruciais que ajudam os profissionais a melhorar a qualidade do seu trabalho arquitetônico:

### Atributos de Qualidade

Embora os requisitos funcionais sejam frequentemente o centro das atenções, coisas como escalabilidade, desempenho e segurança são os elementos essenciais para garantir que um sistema se mantenha viável a longo prazo. Esses atributos moldam a arquitetura, garantindo que o sistema consiga evoluir sem se tornar obsoleto.

### Visão Holística

Uma boa arquitetura requer a capacidade de abordar o sistema como um todo, considerando como diferentes partes interagem e afetam uns aos outros. A separação de preocupações e a modularidade são essenciais, mas também exigem uma visão ampla do que está acontecendo em todo o sistema.

- **Compreensão do Ciclo de Vida do Sistema:** Um arquiteto precisa entender não apenas a construção do sistema, mas também sua implantação, manutenção e evolução ao longo do tempo. Isso inclui o conhecimento sobre os desafios de longo prazo, como a gestão de débitos técnicos e como o sistema responde a mudanças.
- **Equilíbrio de Preocupações e Compromissos:** A arquitetura de software raramente envolve soluções definitivas. Muitas vezes, é necessário fazer trade-offs entre requisitos conflitantes, como desempenho e segurança ou entre escalabilidade e custos. Essas escolhas exigem uma análise profunda das implicações de cada decisão.
- **Aprendizado com a Experiência:** A arquitetura não deve ser vista como um conjunto de normas rígidas. Ela precisa evoluir com base na experiência e nas lições tiradas ao longo do tempo. Arquitetos devem ser capazes de testar e revisar os padrões, adaptando conforme as novas necessidades da equipe e do sistema.
- **Capacidade de Liderança:** A boa arquitetura não é só técnica, mas também envolve o gerenciamento da comunicação entre a equipe. Levantar questões, promover discussões e facilitar a busca por consenso são habilidades que ajudam a superar os obstáculos técnicos e a garantir uma arquitetura sólida.

## Arquitetura como uma Atividade Contínua

A arquitetura de software é um processo exploratório por natureza. Todos enfrentam desafios técnicos novos e frequentemente imprevisíveis. Em vez de definir toda a arquitetura de forma antecipada, o processo deve ser contínuo, testando hipóteses sobre como melhor atender aos atributos de qualidade.

Cada decisão arquitetural é um experimento, todos constroem soluções parciais para testar suas suposições, documentam os resultados e avaliam se o caminho escolhido atende aos requisitos desejados. Esses aprendizados moldam a arquitetura ao longo do tempo.

> **Importante:** a documentação e os diagramas são importantes, mas não são a arquitetura em si, o “porquê” por trás das escolhas feitas é que realmente importa.

Ao tomar decisões, é crucial documentar:

- **O custo de reverter uma decisão:** Se uma escolha arquitetural precisar ser alterada no futuro, é importante avaliar o impacto dessa mudança, seja substituindo um serviço ou reescrevendo partes do código.
- **Restrições e suposições:** Entender e documentar as limitações que influenciam as decisões ajuda a equipe a evitar surpresas no futuro. Por exemplo, uma hipótese sobre a quantidade de usuários simultâneos pode afetar decisões sobre concorrência e escalabilidade.
- **Atributos de Qualidade:** Para cada atributo de qualidade (QAR), é necessário descrever como ele foi abordado e quais testes foram feitos para garantir que o sistema atenda a esses requisitos.
- **Justificativas para as decisões:** É fundamental documentar não apenas as escolhas feitas, mas também as alternativas descartadas. Isso não apenas mostra o raciocínio por trás da arquitetura, mas também oferece insights sobre limitações que podem ser removidas no futuro.

## A Importância da Experiência

A experiência é fundamental para entender as nuances das diversas decisões. O simples conhecimento teórico, como o que se aprende em tutoriais ou livros, é valioso, mas apenas a experiência prática nos permite construir hipóteses fundamentadas sobre o que funciona e o que não funciona.

Portanto, o ideal é experimentar novas tecnologias e ferramentas, só assim você será capaz de formar hipóteses sólidas sobre o que é bom ou ruim para um determinado cenário.

Embora seja impossível explorar tudo, plataformas como o ThoughtWorks Radar ajudam na escolha de tecnologias recomendadas e alertam sobre aquelas que ainda não são maduras ou precisam de cuidado.

## Conclusões

Pessoalmente acredito que a arquitetura de software precisa ser repensada, sua visão ainda carrega muitos conceitos antigos sobre os problemas que precisa resolver e sobre como abordá-los.

Adotar a arquitetura de software como um processo contínuo e empírico, focado em testar hipóteses e usar o aprendizado para validar decisões, é essencial para a construção de sistemas resilientes e sustentáveis.

Talvez a arquitetura de software melhoras possam ocorrer quando essa prática for trazida para dentro do desenvolvimento e quando os próprios desenvolvedores assumirem o papel de arquitetos, aplicando seus conhecimentos para resolver problemas concretos.

## Bônus

Se você deseja se aprofundar mais em arquitetura de software deixo aqui alguns roadmap para te ajudar na sua jornada:

- **Arquitetura de Software:** [roadmap.sh/software-architect](https://roadmap.sh/software-architect)
- **Arquiteto de Software:** [scaler.com/blog/software-architect-roadmap](https://www.scaler.com/blog/software-architect-roadmap/)
