Methodologies

Escopo: transversal. Aplica-se a qualquer linguagem ou stack do projeto.

A metodologia define como o time organiza o trabalho. O estilo arquitetural define como o código é estruturado e implantado. As duas escolhas produzem efeito cedo: uma metodologia que não cabe no time gera retrabalho, e um estilo arquitetural grande demais para o problema gera complexidade que alguém vai precisar operar.

Conceitos fundamentais

ConceitoO que é
DDD (Domain-Driven Design · Design Orientado ao Domínio)Organizar o código em torno do modelo de domínio, refletindo a linguagem e as regras de negócio
BDD (Behavior-Driven Development · Desenvolvimento Orientado ao Comportamento)Descrever o comportamento esperado em linguagem de negócio antes de implementar
TDD (Test-Driven Development · Desenvolvimento Orientado a Testes)Escrever o teste antes do código; o teste guia o design
XP (eXtreme Programming · Programação Extrema)Conjunto de práticas ágeis: integração contínua, feedback curto, refactoring constante
XGH (eXtreme Go Horse · Vai Cavalo Extremo)Anti-metodologia satírica; útil para nomear o que não fazer
Monolith (Monolito)Aplicação inteira em um único processo e deployável
Microservices (Microsserviços)Serviços independentes com deploy e escala separados
Modular Monolith (Monolito Modular)Módulos com limites de domínio dentro de um único processo
Bounded Context (Contexto Delimitado)Limite explícito onde um modelo de domínio é válido e consistente
Ubiquitous Language (Linguagem Ubíqua)Vocabulário compartilhado entre engenheiros e especialistas de negócio, refletido no código

Metodologias de processo

DDD: design orientado ao domínio

O código se organiza em torno do domínio de negócio. Os termos que o especialista usa na reunião aparecem nos identificadores, nas classes e nos limites do sistema, e formam a Ubiquitous Language (Linguagem Ubíqua) que engenheiros e negócio compartilham. Quando o negócio diz "pedido faturado", existe um Order com esse estado no código, com esse nome.

Conceitos centrais:

ConceitoPapel
Entity (Entidade)Objeto com identidade única que persiste no tempo (Order, User)
Value Object (Objeto de Valor)Objeto sem identidade, definido pelos seus atributos (Money, Address)
Aggregate (Agregado)Grupo de entidades com uma raiz que garante consistência interna
Bounded ContextLimite explícito onde um modelo é válido; modelos diferentes coexistem sem conflito
Domain Service (Serviço de Domínio)Operação de domínio sem estado natural em uma entidade (PricingService)

Quando usar: sistemas com regras de negócio ricas e domínio complexo. Em um CRUD simples, as camadas do DDD custam mais do que devolvem.

BDD: desenvolvimento orientado ao comportamento

O BDD escreve o comportamento esperado na linguagem do negócio, antes da implementação. O cenário usa o formato Given / When / Then (Dado / Quando / Então), que um stakeholder (parte interessada, sem perfil técnico) consegue ler e conferir.

Given um pedido com 3 itens
When o cliente aplica um cupom de 10%
Then o total deve refletir o desconto sobre o subtotal

O cenário vira o teste, e a implementação existe para satisfazer o cenário.

Quando usar: features com critérios de aceite definidos por produto ou negócio; colaboração entre times técnicos e não-técnicos.

TDD: desenvolvimento orientado a testes

O ciclo tem três fases, Red → Green → Refactor (Vermelho → Verde → Refatorar):

Red    → escrever o teste que falha (comportamento ainda não existe)
Green  → escrever o mínimo de código para o teste passar
Refactor → limpar o código sem quebrar os testes

Escrever o teste primeiro obriga a decidir como a função vai ser usada antes de decidir como ela funciona por dentro. O código que sai daí tende a ter dependências explícitas e contratos claros, porque foi consumido antes de existir.

Quando usar: qualquer sistema onde mudanças frequentes exigem confiança. O retorno é maior em domínio de negócio com validação e regras de cálculo.

XP: programação extrema

Um conjunto de práticas de engenharia voltadas a feedback rápido e qualidade contínua:

PráticaO que faz
Pair Programming (Programação em Par)Dois engenheiros no mesmo código ao mesmo tempo; revisão em tempo real
Integração ContínuaIntegrar e validar o código várias vezes ao dia
Refactoring contínuoMelhorar o design do código sem adicionar features
Releases pequenosEntregar incrementos pequenos e frequentes em vez de grandes lotes
Posse coletiva do códigoQualquer engenheiro pode melhorar qualquer parte do sistema

O XP é a base conceitual do que hoje se chama DevOps e CI/CD (Continuous Integration and Continuous Delivery · Integração e Entrega Contínuas: CI é Integração Contínua; CD é Entrega Contínua).

Quando usar: times pequenos com entregas frequentes e domínio em evolução.

Desenvolvimento intuitivo

A decisão vem da experiência acumulada, por padrão reconhecido, sem um processo formal que a sustente.

Tem lugar válido:

  • Prototipagem rápida onde velocidade supera estrutura
  • Decisões táticas em domínios já bem conhecidos
  • Contextos onde o custo de processo supera o valor gerado

O risco está na transferência: uma decisão tomada por intuição é difícil de justificar para o time e difícil de repetir por quem não tem a mesma bagagem. Combina bem com TDD, onde a intuição escolhe a direção e o teste confirma a chegada.

Desenvolvimento orgânico

A estrutura emerge da necessidade real, sem planejamento upfront (antecipado) extenso. O código cresce na direção que o problema exige.

Isso descreve um adiamento deliberado das abstrações. A abstração entra quando o padrão se repete pela terceira vez (Rule of Three · regra das três ocorrências), porque só aí ficam visíveis as partes que variam e as que se mantêm.

O risco é a dívida técnica se acumular sem que ninguém perceba, e o refactoring regular é o que evita isso. Com uma suíte de testes cobrindo o comportamento, refatorar deixa de ser aposta e o desenvolvimento orgânico se sustenta.

XGH: eXtreme Go Horse

Anti-metodologia satírica, com a premissa "pensar é perda de tempo; commit primeiro".

Ela serve para nomear o que não fazer: código sem testes, sem revisão, sem limites entre módulos, com dependências ocultas e deploy feito na base da coragem.

Quando alguém descreve uma decisão técnica e você reconhece o XGH ali dentro, o sinal de alerta já apareceu.


Estilos arquiteturais

Monolito

Toda a aplicação em um único processo e deployável. O banco de dados, o servidor web e a lógica de negócio vivem juntos.

Vantagens: simples de desenvolver, depurar, testar e deployar. Uma única base de código, um único deploy, rastreamento direto de chamadas.

Quando o problema aparece: escalar um módulo obriga a escalar tudo. O acoplamento cresce junto com o time quando falta disciplina de limites. Um bug em uma parte pode derrubar o sistema inteiro.

Quando usar: início de projeto, times pequenos, domínio ainda sendo descoberto.

Microsserviços

Serviços independentes, cada um com sua própria base de código, banco de dados e ciclo de deploy. A comunicação entre eles acontece por API (Application Programming Interface · Interface de Programação de Aplicações) ou mensageria.

Vantagens: cada serviço escala e evolui por conta própria. Times diferentes assumem a responsabilidade por serviços diferentes sem coordenação constante.

O custo real:

Complexidade adicionadaImpacto
Latência de rede entre serviçosFalhas parciais e timeouts que não existiam
Distributed tracing (rastreamento distribuído)Necessário para diagnosticar chamadas entre serviços
Eventual consistency (consistência eventual)Transações distribuídas são difíceis
Overhead operacional (custo extra de operação)CI/CD, monitoramento e infraestrutura multiplicados por N serviços

Quando usar: quando a escala do time ou do domínio passa a exigir isolamento real. Começar um projeto aqui paga o custo operacional antes de ter o problema que ele resolve.

Monolito modular

Módulos com limites de domínio bem definidos dentro de um único processo. Cada módulo tem suas próprias camadas internas, expõe uma interface pública e acessa os outros módulos por essa interface.

Monolito Modular
├── módulo: Orders
│   ├── domain/
│   ├── application/
│   └── api/ (interface pública do módulo)
├── módulo: Inventory
│   └── api/ (interface pública do módulo)
└── módulo: Billing
    └── api/ (interface pública do módulo)

Por que é o padrão recomendado em 2026:

  • Deploy simples de monolito, sem overhead operacional de microsserviços
  • Limites de domínio claros desde o início, sem acoplamento invisível
  • Refactoring para microsserviços se torna cirúrgico quando necessário: o módulo já tem limite definido
  • Escala vertical (mais CPU (Central Processing Unit · Unidade Central de Processamento)/RAM (Random Access Memory · Memória de Acesso Aleatório)) resolve a maioria dos casos antes de precisar distribuir

Quando extrair um microsserviço: quando um módulo passa a ter requisito de escala, ciclo de deploy ou equipe muito diferentes dos demais. Enquanto isso não acontece, o limite do módulo já entrega o isolamento que importa.


Referência rápida

Metodologias

MetodologiaBaseMelhor para
DDDModelagem de domínioRegras de negócio complexas
BDDComportamento como especificaçãoTimes mistos técnicos e não-técnicos
TDDTeste como designQualquer sistema com mudanças frequentes
XPFeedback rápido e incrementalTimes pequenos, entregas frequentes
OrgânicaEmergência guiada por necessidade realPrototipagem, domínio em exploração
XGHAntipadrão satíricoNomear o que não fazer

Estilos arquiteturais

EstiloQuando faz sentidoTrade-off principal
MonolitoInício de projeto, time pequenoEscala acoplada ao crescer
Monolito ModularPadrão recomendado; domínio claro, time crescendoExige disciplina de limites
MicrosserviçosEscala de time ou domínio impõe isolamento realComplexidade operacional alta

DoDocs v3.7.0 · Desenvolvido por @thiagocajadev · Baseado no trabalho de pmndrs/docs · Poimandres.