Intro
Olá pessoal, decidi fazer essa postagem sobre arquitetura de software, porque sei lá, eu quis.
Leia isso aí e aproveite.
Software Architect Basics
ANTES DE MAIS NADA, PELO AMOR DE DEUS: Evite Overengineering
"Superengenharia" (over-engineering) refere-se a projetar ou solucionar problemas de forma excessivamente complexa, usando recursos que não são necessários ou que poderiam ser simplificados sem perder a eficácia.
Lembre-se do KISS (Keep It Simple, Stupid): “Não complique o que pode ser simples.”
O que é Arquitetura de Software
Arquitetura de software refere-se às estruturas de alto nível (componentes, módulos) de um sistema de software e à disciplina responsável por sua criação (estilos — monólitos ou microserviços — e padrões).
Formalmente, a arquitetura de um sistema de computador pode ser definida como:
- A estrutura ou estruturas do sistema, que compreendem elementos, as propriedades externamente visíveis desses elementos e os relacionamentos entre eles.
- A maneira como essas estruturas atendem aos requisitos funcionais e não funcionais, bem como aos comportamentos do sistema.
A arquitetura envolve decisões significativas sobre a organização do sistema, incluindo:
- Seleção de elementos estruturais e suas interfaces;
- Definição de comportamentos nas colaborações entre esses elementos;
- Organização fundamental para atingir requisitos e atributos de qualidade.
A arquitetura de software está na base da engenharia de software e desempenha papel fundamental ao fornecer a organização fundamental de um sistema.
Ela influencia diretamente a qualidade do software e é crítica para desempenho e modificações futuras.
A arquitetura fornece uma visão abstrata do sistema — não entra em detalhes de implementação ou algoritmos, mas se concentra em componentes, módulos e padrões de projeto, como:
- Cliente-Servidor
- Camadas (Layered Architecture)
- Event-Driven Architecture
Os princípios de abstração, decomposição e composição organizam o projeto de forma estruturada e facilitam a evolução de sistemas complexos.
A Importância da Arquitetura
Uma boa arquitetura visa preencher tanto os requisitos funcionais (o que o sistema faz) quanto os não funcionais (como o sistema faz).
Com requisitos bem definidos, as decisões arquiteturais se tornam mais assertivas, garantindo qualidade e eficiência.
Imagine um sistema de cadastro de clientes:
- Levante os requisitos funcionais.
- Defina os requisitos não funcionais.
- Tome decisões arquiteturais baseadas nessa documentação.
Sem esses passos, o projeto fica sem direção clara.
Entenda Levantamento de Requisitos: Funcionais e Não Funcionais
O que são requisitos
Requisitos são itens e características indispensáveis para alcançar um objetivo específico.
No desenvolvimento de software, analisar requisitos é essencial.
“Sem requisitos como conectividade, sistema operacional, plataforma e interface, torna-se impossível desenvolver um software operacional para o usuário.”
Especificação de Requisitos
A especificação bem feita impacta positivamente todo o ciclo de vida do sistema:
- Reduz custos,
- Diminui tempo de produção,
- Minimiza retrabalhos.
Funcionalidade
Um requisito deve ser específico e claro, mostrando o que determinada parte do sistema faz e como deve funcionar.
Interface
A interface influencia diretamente a experiência do usuário. Devem ser considerados:
- Posição do elemento,
- Tamanho,
- Cor,
- Ação executada.
Requisitos Funcionais
São as necessidades explícitas do sistema — o que ele deve fazer.
Eles atendem às necessidades dos usuários e definem as funcionalidades do sistema.
Exemplo — Sistema de Gestão Hospitalar (SGH)
-
RF001 – Cadastro de Pacientes
O sistema deve permitir o cadastro completo de pacientes. -
RF002 – Gestão de Agendamentos
O sistema deve permitir o agendamento de consultas, exames e cirurgias. -
RF003 – Prontuário Eletrônico
O sistema deve manter um prontuário eletrônico único por paciente. -
RF004 – Prescrição Eletrônica
O sistema deve permitir que médicos emitam prescrições eletrônicas. -
RF005 – Módulo de Faturamento
O sistema deve gerar cobranças automáticas com base em atendimentos. -
RF006 – Gestão de Leitos
O sistema deve controlar ocupação de leitos, admissões e altas. -
RF007 – Controle de Acesso
O sistema deve permitir perfis de acesso diferenciados. -
RF008 – Integração com Laboratórios
O sistema deve se integrar com laboratórios para resultados de exames. -
RF009 – Painel de Indicadores (BI)
O sistema deve fornecer indicadores de desempenho. -
RF010 – Notificações e Alertas
O sistema deve enviar alertas automatizados para eventos críticos.
Esses requisitos definem o comportamento funcional do sistema sob a perspectiva do usuário.
Requisitos Não Funcionais
Requisitos não funcionais tratam de como o sistema executa as funcionalidades.
Também chamados de atributos de qualidade, influenciam fortemente a arquitetura.
Exemplo — SGH
-
RNF001 – Segurança da Informação
Criptografia de dados em trânsito e repouso (HTTPS, AES-256). -
RNF002 – Autenticação e Autorização
Login com 2FA para perfis sensíveis. -
RNF003 – Disponibilidade
Disponível 24/7 com no máximo 0,5% de downtime mensal. -
RNF004 – Performance
Respostas em até 2 segundos em 95% das requisições. -
RNF005 – Escalabilidade
Suportar aumento de usuários e transações. -
RNF006 – Backup e Recuperação
Backups automáticos diários com recuperação em até 2 horas. -
RNF007 – Compatibilidade
Compatível com navegadores modernos e responsivo. -
RNF008 – Conformidade Legal
LGPD, ANVISA e CFM. -
RNF009 – Auditabilidade
Registro de ações com logs detalhados por 5 anos. -
RNF010 – Usabilidade
Interface intuitiva, padronizada e com feedback visual.
Os requisitos não funcionais se alinham à ISO 9126, que define categorias de qualidade:
- Funcionalidade
- Usabilidade
- Manutenibilidade
- Portabilidade
- Confiabilidade
- Eficiência
Fundamentos da Arquitetura de Software
Na engenharia de software, arquitetura refere-se às estruturas fundamentais de um sistema de software e à disciplina responsável por sua criação.
A arquitetura descreve componentes e como interagem — funciona como um projeto de todo o sistema.
O objetivo é projetar um sistema livre de desafios comuns, atendendo a:
- Desempenho,
- Confiabilidade,
- Manutenibilidade,
- Escalabilidade.
Engenharia Reversa — Atenção
Engenharia reversa significa reconstruir a arquitetura a partir do código existente.
Porém:
- O código costuma divergir da arquitetura ao longo do tempo;
- A arquitetura reconstruída pode não refletir a intenção original;
- Código não documentado carece de abstração e justificativas.
É melhor documentar a arquitetura antes da implementação para evitar divergências.
Princípios Fundamentais
1. Estrutura de Alto Nível
- Define componentes e módulos;
- Estabelece fronteiras claras entre partes do sistema.
2. Decisões Arquiteturais
- Escolhas fundamentais e difíceis de mudar:
- Padrões (MVC, CQRS),
- Estilos (monólito, microservices, event-driven),
- Tecnologias e frameworks.
3. Atributos de Qualidade
- Desempenho
- Escalabilidade
- Manutenibilidade
- Segurança
- Disponibilidade
- Usabilidade
- Reutilização
Melhorar um atributo pode impactar negativamente outro. O arquiteto deve equilibrar.
4. Padrões Arquiteturais
- Camadas (Layered)
- Cliente-Servidor
- Microsserviços
- Event-Driven Architecture
- Domain-Driven Design
5. Documentação e Comunicação
- Facilita entendimento e evolução;
- Modelos úteis:
- C4 Model
- UML
- ADR (Architecture Decision Records)
6. Proatividade e Antecipação
- Arquitetura deve prever mudanças futuras;
- Garantir flexibilidade e modularidade.
SDG.