ENGENHARIA / 02 — ARQUITETURA DE SOFTWARE / FABRÍCIO CASTRO
Desenhar o sistema é
justificar decisões.
A arquitetura não começa escolhendo microsserviços, Clean Architecture ou o framework mais recente. Começa reconhecendo riscos, limites do domínio e atributos de qualidade. Uma decisão é útil quando explica o que favorece, o que sacrifica e como saber se deixou de servir.
01 / REQUISITOS ANTES DA ARQUITETURA
O desenho nasce das qualidades que precisam sobreviver.
Imagine uma organização fictícia que solicita aprovações de compras, com regras de alçada e integração a um ERP externo. O botão é um detalhe. A arquitetura precisa preservar autorização, consistência, rastreabilidade e capacidade de recuperação em situações que a tela não revela.
Quais compromissos moldam o sistema?
Integridade: duas aprovações concorrentes não podem produzir decisões incompatíveis. Segurança: uma organização não acessa dados de outra. Modificabilidade: alterar uma política de alçada não deve exigir mudar a interface, o banco e a integração por acoplamento acidental.
Operação: identificar a causa de uma falha de sincronização e reprocessá-la com controle. Disponibilidade, latência e recuperação exigem metas negociadas; não há números reais neste estudo.
O risco de projetar com premissas invisíveis.
Não conhecemos volume, frequência de mudança, tamanho da equipe, criticidade financeira, prazo de retenção, comportamento do ERP e orçamento operacional. Sem esses dados, qualquer escolha de filas, cluster, cache ou microsserviços seria uma hipótese — não a solução inevitável.
Critério: levantar perguntas e alternativas com as pessoas responsáveis. A arquitetura é uma decisão revisável, não uma promessa de complexidade antecipada.
PRÉ-REQUISITO / DESCOBERTA
Sem requisitos claros, não há trade-off honesto.
O capítulo anterior mostra entrevistas, RF, RNF, casos de uso e rastreabilidade. A arquitetura deve explicar como esses acordos se tornam dependências, fronteiras, persistência e testes.
02 / RESPONSABILIDADES E DIREÇÃO DE DEPENDÊNCIAS
Separar o que muda junto. Proteger o que não pode variar.
Um diagrama de pastas não define arquitetura. A fronteira relevante descreve quem toma uma decisão, quais invariantes controla e quais dependências podem ser substituídas sem alterar a regra de negócio.
Compras, identidade e integração não são a mesma responsabilidade.
O contexto Compras é dono do ciclo da solicitação e da invariante de decisão. Identidade/Autorização informa permissões vigentes; Integração ERP traduz eventos e contratos de um sistema externo. A divisão concreta precisa ser validada no domínio — não determinada pelo número de tabelas.
Não confundir: bounded context é limite de modelo e linguagem; não obriga banco ou deploy independente.
Domínio não deve importar o servidor HTTP ou o ORM.
Um caso de uso pode depender de contratos de repositório e de autorização. Controllers, Prisma, mensageria e adaptadores executam esses contratos na borda. A inversão de dependência é uma propriedade dos imports e responsabilidades efetivos, não da presença de diretórios chamados `domain` ou `application`.
Quando simplificar: nem todo módulo precisa de dez interfaces. Introduza uma abstração quando ela reduz acoplamento significativo, melhora testes ou protege uma variação plausível.
- 01Definir vocabulário e invariantes
Solicitação, aprovador, alçada, decisão e versão. Registrar: não pode haver duas decisões finais incompatíveis sobre a mesma versão e ninguém deve aprovar o próprio pedido.
- 02Projetar um caso de uso explícito
A operação de aprovação recebe identidade verificada, ID e versão esperada; consulta política vigente, autoriza e persiste a transição de estado numa fronteira transacional definida.
- 03Escolher contratos de infraestrutura
Repositório, relógio e publicador de eventos podem ter portas quando a substituição ou o teste precisa delas. A política de domínio não conhece o nome do cliente HTTP nem o formato de tabela.
- 04Testar o limite, não apenas a classe
Uma troca de adaptador deve manter regras e respostas do caso de uso. A integração real com PostgreSQL ainda precisa ser testada para provar bloqueios e comportamento concorrente.
03 / ESTILOS E CONSEQUÊNCIAS
Monólito modular ou serviços separados? Depende das forças reais.
A escolha não ocorre entre “antigo” e “moderno”. O que muda é a localização das fronteiras de processo, implantação, dados e falha. Uma opção pode ser mais adequada hoje e menos adequada após uma mudança comprovada de escala, equipe ou operação.
Uma implantação, módulos com limites explícitos.
Como funciona: módulos de Compras, Autorização e Integração coexistem num processo e podem compartilhar um banco com regras de ownership. As mudanças do estado de aprovação podem ocorrer em transação local; integração externa permanece fora desse limite.
Ganha: menor complexidade de deploy, rastreamento e coordenação de dados. Custa: acoplamento de release, necessidade de disciplina para impedir imports cruzados e eventual necessidade de extração futura.
Preferir quando: equipe enxuta, limites ainda em aprendizado e nenhum requisito concreto de implantação independente justifica a rede adicional.
Implantações separadas, falhas também separadas.
Como funciona: serviços possuem contratos e ciclo de deploy próprio; uma atualização entre bancos de serviços não se torna atômica por chamar uma API. Mudanças e eventos exigem versionamento, observabilidade distribuída e política de falhas.
Ganha: autonomia e escalabilidade de componentes quando fronteiras e operação estão maduras. Custa: latência de rede, consistência entre serviços, segurança de comunicação, testes de integração e administração de infraestrutura.
Preferir quando: há razões mensuráveis para isolamento de deploy/equipes ou necessidades distintas de escala e resiliência, com capacidade de operação correspondente.
Talvez seja melhor não construir um ERP adicional.
Se o ERP já oferece workflow de aprovação parametrizável, revisar seu comportamento e controles pode eliminar uma aplicação inteira. Uma API fina de integração ou automação também pode resolver o problema. Análise de licenciamento, aderência, limites e ownership define se é viável.
Armadilha: o entusiasmo com arquitetura própria não é justificativa para custo e superfície de ataque adicionais.
Uma matriz qualitativa, sem pontuação inventada.
Integridade local: favorece limites transacionais simples. Autonomia de release: favorece separação quando há equipes e contratos maduros. Falhas externas: existem em todas as opções. Operação: cresce com o número de processos, bancos e fronteiras remotas.
Decisão revisável: documentar atributos de qualidade, volume observado, limites da equipe, orçamento e gatilhos de extração antes de defender um estilo como definitivo.
04 / DECISÕES EXPLÍCITAS
Uma ADR registra por que a escolha foi feita.
Architecture Decision Record é um registro breve de uma decisão arquitetural significativa: problema, forças, alternativas, escolha, consequências e condições de revisão. O exemplo abaixo é proposta fictícia, não uma deliberação de equipe ou um sistema em produção.
ADR-001 / EXEMPLO PROPOSTO
Adotar inicialmente um monólito modular para o fluxo de compras.
Este registro não afirma que o desenho seja universal. É uma hipótese de arquitetura coerente com uma equipe reduzida e um domínio ainda em descoberta, a revisar diante de fatos observáveis.
CONTEXTOAlçada, auditoria e concorrência precisam de fronteiras transacionais; ERP remoto pode falhar.
FORÇASIntegridade, segurança, custo de operação, capacidade da equipe e mudanças frequentes.
ALTERNATIVASConfigurar ERP, monólito modular, microsserviços separados; rejeições condicionais.
DECISÃOPreferir módulos num deploy e persistência local, se a solução existente for insuficiente.
CONSEQUÊNCIASTransação local mais simples; fronteiras de módulos e release conjunto exigem disciplina.
REVISÃOReavaliar com necessidade comprovada de deploy autônomo, restrição de escala ou mudança de equipe.
O que uma ADR não substitui?
Testes, análise de ameaças, contrato de integração, revisão de orçamento e observabilidade. Uma decisão bem escrita pode estar tecnicamente errada se as hipóteses forem falsas; por isso é versionada e discutida.
Como evitar arquitetura teatral?
Registrar o mínimo necessário para que outra pessoa compreenda o motivo da escolha, sua evidência, seu custo e quando reavaliá-la. Não produzir 40 ADRs para decisões triviais de nomenclatura.
05 / COMUNICAÇÃO ARQUITETURAL
Desenhar limites para conversar, não para decorar.
O modelo C4 organiza a visualização por contexto de sistema, containers, componentes e código, conforme a necessidade da audiência. Não exige quatro desenhos por projeto. O esquema autoral abaixo mostra apenas um contexto de interação simplificado; não pretende substituir diagramas de implantação nem de sequência.
Quem interage e o que está fora?
Mostre pessoas, sistema de compras, serviço de identidade e ERP. Nomeie relações e fronteiras de confiança. É possível compreender o risco de integração sem apresentar controllers, containers Docker ou tabelas.
Onde ficam API, interface e armazenamento?
Somente quando necessário, detalhe aplicação web, API e banco como containers lógicos do modelo C4. Um “container” no C4 não significa obrigatoriamente Docker. Defina responsabilidade, tecnologia quando justificada e modo de comunicação.
O que existe dentro da aplicação?
Um desenho posterior pode mostrar `AprovarSolicitacao`, política de alçada, repositório de solicitações e adaptador ERP. Use sequência/estado ou ER quando a questão for fluxo, concorrência ou dados; C4 não substitui essas perspectivas.
Uma legenda e palavras importam mais que ícones.
Nomeie responsabilidades e relações; descreva alternativas textualmente para quem utiliza leitor de tela. Mantenha diagrama sincronizado com ADRs e contratos. Um desenho desatualizado com muitas caixas pode causar mais risco que uma explicação curta.
06 / PROJETO PARA FALHAS REAIS
Transação local, ERP remoto. O limite importa.
Atualizar o banco e notificar um sistema externo são duas operações com destinos independentes. Se a notificação falhar depois do commit, o pedido pode estar corretamente aprovado no domínio e ainda não sincronizado. A interface, a fila e os alertas precisam refletir estados diferentes.
- 01Não permitir duas decisões contraditórias
O backend confere autorização, tenant, alçada, estado e versão esperada dentro do limite transacional correto. Duas requisições concorrentes precisam resultar em no máximo uma decisão final válida para a mesma versão.
- 02Registrar intenção de integração junto com a aprovação
Se a política permite conclusão local, uma outbox transacional pode persistir estado e evento na mesma transação. Ela não faz a transação abranger o ERP e não entrega exatamente uma vez por magia.
- 03Processar com idempotência e tratamento de duplicação
Uma tentativa pode sofrer timeout depois de o ERP registrar o pedido. Retry cego criaria duplicidade; é necessário contrato de idempotência, correlação e reconciliação conforme capacidade do ERP.
- 04Observar e recuperar
Logs com identificador de correlação, estados de pendência, quantidade de tentativas e runbook permitem distinguir erro temporário de divergência definitiva. Não registrar dados sensíveis além do necessário.
- 05Provar sob falha
Testes devem cobrir autoaprovação, acesso cross-tenant, dupla decisão, indisponibilidade externa, evento duplicado, rollback e restauração. Um mock não prova isolamento transacional de PostgreSQL.
O que precisa ser executado?
T-01: aprovar com alçada vigente. T-02: negar autoaprovação e acesso entre organizações. T-03: executar decisões concorrentes em banco real descartável. T-04: simular 503 e confirmação perdida do ERP. T-05: validar replay sem efeito duplicado.
Estado deste estudo: cenários especificados; nenhum teste de banco, integração ou deploy foi executado para esta página.
O deploy não é o fim do ciclo.
CI precisa demonstrar integridade dos contratos, migrations e testes. O release requer estratégia de reversão. Em operação, backlog pendente, latência, autorização negada e falha de sincronização devem ser observáveis por sinais vinculados aos requisitos, não por métricas decorativas.
Revisar decisão: crescimento de times e falhas, gargalo comprovado, exigência de autonomia ou mudança de orçamento podem invalidar a ADR inicial.
07 / ROTAS DE APROFUNDAMENTO
Arquitetura é uma disciplina. Não uma página de siglas.
Este hub conecta agora capítulos próprios de DDD e Clean/Hexagonal, além de Requisitos, Design Patterns e DevOps. A expansão posterior contempla monólito modular, microsserviços, CQRS, Event Sourcing, integrações, multitenancy, System Design, C4 e ADRs. Temas futuros só ganharão links quando houver páginas reais, critérios e testes.
Da regra de negócio ao módulo.
Investigar linguagem ubíqua, bounded contexts, agregados e invariantes. Depois comparar organização modular e inversão de dependências em Clean/Hexagonal, com código e testes mostrando a consequência de cada escolha.
Quando a rede entra no domínio.
Estudar consistência, filas, event-driven, outbox, Saga, CQRS, event sourcing e contratos. Separar padrões de implementação, estilos arquiteturais e mecanismos operacionais para não criar uma falsa equivalência entre eles.
Design Patterns no ponto em que ajudam.
Investigar Strategy, State, Adapter e Facade no contexto do caso de compras. Mostrar código antes/depois, custo da abstração, alternativa simples, critérios de não uso e testes que protegem a mudança.
Como validar, entregar e operar.
Ligar decisões aos testes de concorrência, requisitos de autorização, CI/CD, observabilidade, SRE e recuperação. Uma arquitetura que ninguém consegue implantar ou depurar continua sendo uma hipótese incompleta.
CAPÍTULO / DDD E FRONTEIRAS DO DOMÍNIO
Uma regra consistente começa no significado.
Estudo independente de bounded contexts, linguagem ubíqua, invariantes, evento de domínio e agregado fictício de compras, com TypeScript e testes de casos negativos.
CAPÍTULO / CLEAN E PORTS & ADAPTERS
O domínio pode ser testado sem instanciar o servidor.
Estudo de casos de uso, portas primárias e secundárias, implementação de fake e limites reais de outbox/controle de versão. Nenhum banco de produção é simulado como comprovado.
JORNADA / VISÃO COMPLETA
Voltar ao ciclo inteiro e continuar a investigação.
Requisitos, arquitetura, implementação, testes e operação se afetam mutuamente. O Atlas aprofunda decisões específicas sem substituir as doze etapas e a identidade existente do portfólio.
08 / FONTES E LIMITES
Confrontar minhas escolhas com referências verificáveis.
O conteúdo é um estudo de arquitetura e o fluxo de compras é hipotético. As fontes são suporte conceitual, não autorização para copiar diagramas ou declarar competência profissional comprovada. Exemplos e diagramas desta página foram escritos para este caso.
Simon Brown — modelo C4.
Documentação do próprio modelo para níveis de zoom, notação flexível e delimitação do que os diagramas estruturais explicam.
Microsoft — Architecture Decision Records.
Referência para registrar contexto, opções rejeitadas, decisão, consequências e necessidade de revisão conforme o sistema evolui.
AWS — Transactional Outbox.
Descreve o problema de gravação em dois destinos, duplicatas e consumidores idempotentes. Não elimina necessidade de decisões sobre ordenação e reconciliação.
Martin Fowler — pré-requisitos operacionais.
Uma perspectiva sobre as competências e o custo de operação exigidos por microsserviços. Não é regra absoluta; confrontar os argumentos com requisitos e situações contrárias.