7 min leitura • Guide 157 of 877
Documentando Decisões Arquiteturais
Decisões técnicas tomadas hoje serão questionadas amanhã por novos membros da equipe, auditores ou seu futuro eu. Registros de Decisões Arquiteturais (ADRs) capturam não apenas o que foi decidido, mas por quê, quais alternativas foram consideradas e quais consequências esperar.
Benefícios dos ADRs
| Sem ADRs | Com ADRs |
|---|---|
| "Por que usamos X?" | Raciocínio documentado |
| Revisitar debates antigos | Histórico de decisões |
| Abordagens inconsistentes | Padrões estabelecidos |
| Contexto perdido | Conhecimento preservado |
| Confusão de novos contratados | Onboarding claro |
Formato ADR
Template Padrão
TEMPLATE REGISTRO DECISÃO ARQUITETURAL
══════════════════════════════════════
# ADR-[NÚMERO]: [TÍTULO]
## Status
[Proposed | Accepted | Deprecated | Superseded by ADR-XXX]
## Data
[AAAA-MM-DD quando decidido]
## Contexto
[Qual é a situação? Que problema estamos tentando resolver?
Que restrições temos? Que forças estão em jogo?]
## Decisão
[Qual é a decisão que estamos tomando? Seja claro e específico.]
## Alternativas Consideradas
### Alternativa 1: [Nome]
- Prós: [lista]
- Contras: [lista]
- Por que não escolhida: [razão]
### Alternativa 2: [Nome]
- Prós: [lista]
- Contras: [lista]
- Por que não escolhida: [razão]
## Consequências
### Positivas
- [benefício 1]
- [benefício 2]
### Negativas
- [desvantagem 1]
- [desvantagem 2]
### Riscos
- [risco e mitigação]
## Decisões Relacionadas
- [ADR-XXX: Decisão relacionada]
## Referências
- [Links para documentação relevante, RFCs, etc.]
Exemplo Real
# ADR-005: Usar PostgreSQL como Banco de Dados Primário
## Status
Accepted
## Data
2024-01-15
## Contexto
Precisamos selecionar um banco de dados primário para nossa aplicação SaaS.
Requisitos:
- Forte consistência para transações financeiras
- Consultas complexas para analytics
- Suporte JSON para esquemas flexíveis
- Confiabilidade comprovada em escala
- Familiaridade da equipe
- Complexidade operacional razoável
Equipe atual tem experiência com MySQL e PostgreSQL.
Carga esperada: 10K transações/dia inicialmente, escalando para 1M+.
## Decisão
Usar PostgreSQL 16 como nosso banco de dados primário, implantado no
AWS RDS com configuração Multi-AZ.
## Alternativas Consideradas
### Alternativa 1: MySQL
- Prós: Familiaridade da equipe, configuração simples, bom desempenho
- Contras: Suporte JSON mais fraco, menos recursos avançados
- Por que não escolhida: Suporte JSON crítico para nossas necessidades de esquema
### Alternativa 2: MongoDB
- Prós: Esquema flexível, bom para documentos
- Contras: Preocupações com consistência eventual para transações
- Por que não escolhida: Precisamos de consistência forte para dados financeiros
### Alternativa 3: CockroachDB
- Prós: Distribuído por design, compatível com PostgreSQL
- Contras: Complexidade excessiva para nossa escala atual, custo
- Por que não escolhida: Otimização prematura para nossa escala
## Consequências
### Positivas
- Ecossistema forte com ferramentas extensivas
- Suporte JSONB para porções flexíveis do esquema
- Planejador de consultas excelente para analytics complexos
- Equipe pode aproveitar conhecimento PostgreSQL existente
- RDS simplifica operações
### Negativas
- Escala horizontal requerá réplicas de leitura ou sharding
- Não ideal para dados de séries temporais (pode precisar solução separada)
- Custos RDS maiores que auto-gerenciado
### Riscos
- Teto de escala: Mitigar com réplicas de leitura, camada de cache
- Lock-in de fornecedor no RDS: Trade-off aceitável para operações reduzidas
## Decisões Relacionadas
- ADR-012: TimescaleDB para dados de métricas
- ADR-003: Redis para camada de cache
## Referências
- Documentação PostgreSQL: https://postgresql.org/docs/16/
- Análise de preços AWS RDS: [documento interno]
Quando Criar ADRs
Critérios de Decisão
CRIE UM ADR QUANDO:
═══════════════════
ALTO IMPACTO:
├── Afeta múltiplos serviços/componentes
├── Difícil ou caro de reverter
├── Esforço significativo de desenvolvimento
├── Equipe teve debate substancial
└── Interesse de stakeholder externo
EXEMPLOS:
├── Escolhendo um banco de dados
├── Selecionando um framework
├── Definindo arquitetura de API
├── Escolhendo abordagem de autenticação
├── Decidindo estratégia de implantação
├── Estabelecendo padrões de codificação
├── Escolhendo provedor de nuvem
└── Definindo política de retenção de dados
NÃO PRECISA ADR:
├── Escolhendo nomes de variáveis
├── Seleção menor de biblioteca
├── Abordagens de correção de bug
├── Estilo de componente UI
└── Escolhas facilmente reversíveis
Fluxo de Trabalho ADR
FLUXO DE TRABALHO ADR
═════════════════════
PASSO 1: Identificar Decisão
├── Escolha técnica significativa à frente
├── Equipe tem opiniões diferentes
├── Afetará desenvolvimento futuro
└── Vale a pena documentar
PASSO 2: Rascunhar ADR
├── Autor cria rascunho
├── Inclui contexto e restrições
├── Lista alternativas consideradas
├── Propõe decisão
└── Status: "Proposed"
PASSO 3: Revisar
├── Compartilhar com equipes afetadas
├── Coletar feedback (comentários/PR)
├── Discussão técnica
├── Pode revisar baseado em input
└── Time-box: 1 semana típico
PASSO 4: Decidir
├── Reunião de equipe ou voto assíncrono
├── Tomar decisão final
├── Atualizar ADR com decisão
└── Status: "Accepted"
PASSO 5: Comunicar
├── Anunciar decisão
├── Link de código/docs relevante
├── Referenciar em PRs de implementação
└── Adicionar a materiais de onboarding
Organizando ADRs
Estrutura de Pastas
ORGANIZAÇÃO ADR
════════════════
NO REPOSITÓRIO:
─────────────────────────────────────
project/
├── docs/
│ └── adr/
│ ├── README.md (índice)
│ ├── 0001-record-architecture-decisions.md
│ ├── 0002-use-typescript.md
│ ├── 0003-graphql-api-design.md
│ ├── 0004-microservices-vs-monolith.md
│ └── 0005-postgresql-database.md
├── src/
└── ...
ÍNDICE README.md:
─────────────────────────────────────
# Registros de Decisões Arquiteturais
| # | Título | Status | Data |
|---|--------|--------|------|
| 1 | Registrar decisões arquiteturais | Accepted | 2024-01-01 |
| 2 | Usar TypeScript | Accepted | 2024-01-05 |
| 3 | Design API GraphQL | Accepted | 2024-01-10 |
| 4 | Microserviços vs monólito | Accepted | 2024-01-15 |
| 5 | Banco de dados PostgreSQL | Accepted | 2024-01-15 |
NUMERAÇÃO:
├── Sequencial: 0001, 0002, 0003...
├── Nunca reutilizar números
├── ADRs depreciados mantêm números
└── Superseded aponta para substituição
No NoteVault do GitScrum
ADRS NO NOTEVAULT
═════════════════
ORGANIZAÇÃO:
├── Criar espaço "Decisões Arquiteturais"
├── Marcar ADRs com #adr
├── Vincular a projetos relacionados
├── Vincular a tarefas de implementação
└── Buscar em todos os ADRs
VINCULAÇÃO:
├── ADR → Tarefa que o implementa
├── Tarefa → ADR que explica por quê
├── Projeto → ADRs chave
└── Referências bidirecionais
TEMPLATES:
├── Salvar template ADR no NoteVault
├── Criar novo ADR do template
├── Estrutura consistente
└── Campos obrigatórios aplicados
Mantendo ADRs
Gerenciamento do Ciclo de Vida
CICLO DE VIDA ADR
═════════════════
PROPOSED:
├── Estágio de rascunho
├── Aberto para discussão
├── Ainda não decidido
└── Pode ser rejeitado
ACCEPTED:
├── Decisão tomada
├── Implementação pode prosseguir
├── Referência no código
└── Estado final mais comum
DEPRECATED:
├── Não mais relevante
├── Tecnologia mudou
├── Negócio mudou
├── Manter para histórico
└── Notar por que depreciado
SUPERSEDED:
├── Substituído por ADR mais novo
├── Link para substituição
├── Original ainda valioso para histórico
└── "Superseded by ADR-XXX"
EXEMPLO:
# ADR-003: Usar API REST
## Status
Superseded by ADR-015 (Migração GraphQL)
[Conteúdo original preservado para histórico]
Melhores Práticas
Para ADRs
- Escreva no momento da decisão — Contexto fresco
- Mantenha-os curtos — Focados na decisão
- Armazene com código — Fácil de encontrar
- Nunca delete — Histórico importa
- Referencie no código — Link implementação
Anti-Padrões
ERROS ADR:
✗ Escrever meses após decisão
✗ Muito longo (múltiplas páginas)
✗ Armazenar separadamente do código
✗ Deletar ADRs depreciados
✗ Nenhuma alternativa documentada
✗ Nenhuma consequência listada
✗ Nenhum processo de revisão
✗ Nunca referenciado novamente