MÓDULO 2.1

🧭 Framework de Decisão Arquitetural

Como escolher a arquitetura certa para cada contexto. Aprenda a identificar o custo dominante do seu projeto e tomar decisões baseadas em risco, não em hype.

7
Tópicos
35 min
Duração
Interm.
Nível
Estrat.
Tipo
1

🎯 Custo Dominante

Antes de escolher qualquer tecnologia ou padrão, a primeira pergunta que um arquiteto deve fazer é: “Qual é o risco principal deste projeto?” O custo dominante é aquilo que, se ignorado, mata o projeto. Pode ser velocidade de entrega, escalabilidade, coordenação de times ou imprevisibilidade de carga. Identificar o custo dominante corretamente é o que separa arquitetos estratégicos de técnicos que escolhem stack por preferência pessoal.

💡 Conceito Principal

Todo projeto tem um custo dominante — o risco que, se não endereçado, torna todas as outras decisões irrelevantes:

  • Velocidade — Produto não validado. Se não iterarmos rápido, ficamos sem dinheiro antes de encontrar product-market fit
  • Crescimento — Produto validado, crescendo. Se não escalarmos a arquitetura, a qualidade degrada e perdemos usuários
  • Organização — Múltiplos times, deploys acoplados. Se não desacoplamos, a coordenação vira gargalo
  • Imprevisibilidade — Picos de carga impossíveis de prever. Se não absorvemos variância, caímos nos piores momentos

📊 Caso Real: Startup vs. Enterprise

Uma startup pré-seed e um banco corporativo têm custos dominantes radicalmente diferentes:

  • Startup (3 pessoas, US$200k runway): Custo dominante = velocidade. Se gastar 3 meses em arquitetura perfeita, fica sem dinheiro. Solução: monolito, Rails/Django, deploy no primeiro dia
  • Banco (500 devs, regulado pelo BACEN): Custo dominante = organização + compliance. Velocidade é secundária. Solução: microsserviços com governance, API Gateway, audit trail
  • Lição: A mesma pergunta (“qual banco usar?”) tem respostas opostas dependendo do custo dominante

💡 Dica Prática

Antes de qualquer reunião de arquitetura, faça o “exercício do funeral”: “Se este projeto falhar em 12 meses, qual será a causa mais provável?” A resposta é seu custo dominante. Otimize para ele primeiro, aceite trade-offs nos demais.

✓ O que FAZER

  • Identificar o custo dominante antes de discutir tecnologia
  • Validar com stakeholders se sua percepção de risco está alinhada
  • Reavaliar o custo dominante a cada trimestre — ele muda

✗ O que NÃO fazer

  • Otimizar para todos os riscos ao mesmo tempo (paralisia)
  • Copiar a arquitetura de uma empresa com custo dominante diferente do seu
  • Ignorar que o custo dominante evolui conforme o produto cresce
2

🏃 Velocidade como Prioridade

Quando o produto não está validado, a arquitetura deve maximizar velocidade de iteração. Cada dia gasto em abstrair, modularizar ou escalar prematuramente é um dia a menos para descobrir se alguém quer o que você está construindo. Paul Graham resumiu: “Do things that don’t scale.”

💡 A Escada da Velocidade

A arquitetura ideal para velocidade segue esta progressão:

  • Nível 0 — Script: Um arquivo, sem framework. Valida hipótese em horas
  • Nível 1 — Monolito simples: Rails, Django, Laravel. Valida produto em semanas
  • Nível 2 — Monolito modular: Boundaries claros, mas um único deploy. Sustenta crescimento por meses
  • Nível 3 — Serviços: Extrair quando a dor justifica a complexidade

📊 Caso Real: Dropbox

O Dropbox é o exemplo definitivo de velocidade como prioridade:

  • 2007: Drew Houston criou um vídeo de 3 minutos demonstrando o produto que ainda não existia. 75.000 inscritos na waiting list em 24h
  • 2008: MVP em Python + monolito simples. Um servidor. Funcionava “na força”
  • 2012: 100M de usuários. Só então investiram pesado em arquitetura (Magic Pocket storage system)
  • Lição: Se tivessem começado pelo sistema de storage distribuído, teriam falido antes de provar a demanda

💡 Dica Prática

Use o conceito de “throwaway prototype”: escreva código sabendo que vai jogar fora. Isso libera você de otimizar prematuramente. Se o protótipo provar que a ideia funciona, reescreva com calma. O custo de reescrever um MVP de 2 semanas é infinitamente menor que o custo de não validar a ideia.

⚠️ Armadilha Comum

“Vamos fazer direito desde o começo” é a frase que mais mata startups. 93% das startups falham, e a maioria falha por falta de product-market fit, não por problemas de arquitetura. Gaste 80% da energia validando o produto e 20% na arquitetura — inverta essa proporção quando tiver tração.

3

📈 Crescimento como Prioridade

Quando o produto tem tração, o custo dominante muda de velocidade para preservar opções de escala. O monolito que funcionou perfeitamente para 1.000 usuários começa a mostrar rachaduras com 100.000. A arte é evoluir sem reescrever tudo.

💡 Monolito Modular: O Melhor dos Dois Mundos

A resposta para crescimento raramente é microsserviços imediatos. O caminho mais seguro:

  • Módulos com boundaries claros — Cada módulo tem sua API pública, dados privados, sem atalhos
  • Database boundaries — Schemas separados ou tabelas com ownership claro por módulo
  • Feature flags — Deploy contínuo sem risco, rollback instantâneo
  • Strangler Fig ready — Quando precisar extrair um serviço, o boundary já existe

📊 Caso Real: Slack

O Slack cresceu de 0 a 8 milhões de DAUs em 2 anos com uma abordagem pragmática:

  • 2013-2015: Monolito PHP, MySQL. Funcionou porque o time era pequeno e o domínio era claro
  • 2015-2017: Modularização interna. Separaram messaging, search, notifications em módulos com interfaces
  • 2017+: Extraíram search para Go (performance), mantiveram o core em PHP. Migração cirúrgica, não big-bang
  • Lição: Só extraia um serviço quando a dor de mantê-lo no monolito excede a dor de operar um serviço distribuído

✓ O que FAZER

  • Definir boundaries de módulo desde o início
  • Implementar feature flags para deploys seguros
  • Medir lead time e deploy frequency como siníais de saúde

✗ O que NÃO fazer

  • Migrar para microsserviços porque o monolito está bagunçado (o problema é organização, não arquitetura)
  • Fazer reescrita big-bang (70% falham segundo o Standish Group)
  • Criar dependências circulares entre módulos
4

🏢 Organização como Prioridade

Quando múltiplos times precisam deployar de forma independente sem coordenação excessiva, o custo dominante é organização. Aqui microsserviços começam a fazer sentido — não pela tecnologia, mas pela autonomia dos times. Conway’s Law não é um bug, é uma força da natureza.

💡 Conway’s Law na Prática

“Organizações projetam sistemas que espelham suas estruturas de comunicação.” Use isso a seu favor:

  • Inverse Conway Maneuver — Estruture times para que a comunicação reflita a arquitetura desejada
  • Team Topologies — Stream-aligned, platform, enabling e complicated-subsystem teams
  • API Contracts — Times só se comunicam via interfaces bem definidas, nunca acessando dados diretamente
  • Service Ownership — “You build it, you run it” — o time que cria o serviço é dono da operação

📊 Caso Real: Amazon “Two-Pizza Teams”

A Amazon é o caso canônico de organização como prioridade:

  • 2002 — O memo de Bezos: “Todos os times exporão funcionalidade via APIs. Quem não fizer isso será demitido.”
  • Two-pizza teams: Times de 6-10 pessoas, cada um dono de um serviço. Autonomia total de tecnologia e deploy
  • Resultado: Essa decisão organizacional (não técnica) originou o AWS — porque os times criaram infra tão boa que decidiram vendê-la
  • Lição: Microsserviços sem autonomia de times são overhead puro. A estrutura org veio primeiro

💡 Dica Prática

Antes de introduzir microsserviços, pergunte: “Quantos times precisam deployar independentemente?” Se a resposta é “um”, você não precisa de microsserviços. Se é “cinco+”, você provavelmente já precisa. O tamanho do time define a arquitetura, não o contrário.

⚠️ Alerta: Distributed Monolith

O pior dos mundos: microsserviços com deploy acoplado. Se você precisa deployar 5 serviços juntos para que qualquer um funcione, você tem um monolito distribuído — toda a complexidade de microsserviços sem nenhum dos benefícios. Sinal de que os boundaries foram traçados nos lugares errados.

5

🌊 Imprevisibilidade como Prioridade

Alguns sistemas têm picos de carga impossíveis de prever: viralição, Black Friday, webhooks em massa, eventos esportivos. Provisionar para o pico é caro demais; não provisionar é catastrófico. A solução é arquitetura que absorve variância: serverless, event-driven, queue-based load leveling.

💡 Padrões para Absorver Imprevisibilidade

  • Serverless (FaaS) — AWS Lambda, Cloud Functions. Escala de 0 a milhões em segundos. Paga por execução
  • Event-Driven Architecture — Desacopla produtor e consumidor. Filas absorvem picos
  • Queue-Based Load Leveling — SQS/RabbitMQ entre API e processamento. Picos viram filas, não falhas
  • Autoscaling — Kubernetes HPA, AWS Auto Scaling Groups. Reage à demanda real, não à estimada

📊 Caso Real: iFood na Copa do Mundo

O iFood é um caso brasileiro brilhante de lidar com imprevisibilidade:

  • Normal: ~2M de pedidos/dia distribuídos ao longo de 12h
  • Final da Copa: Pedidos triplicam em 15 minutos no intervalo do jogo
  • Solução: Autoscaling agressivo + filas de processamento + circuit breakers + graceful degradation
  • Resultado: 0 downtime durante a Copa 2022, mesmo com 3x a carga normal em janelas de 15 minutos

✓ O que FAZER

  • Usar filas entre componentes para absorver picos
  • Implementar circuit breakers para falhar graciosamente
  • Testar com chaos engineering antes que o caos real chegue

✗ O que NÃO fazer

  • Dimensionar infraestrutura pelo pico teórico (caro e desperdiçador)
  • Fazer chamadas síncronas em cadeia sem timeout
  • Assumir que “nunca vai acontecer” sem dados
6

🤖 Não-Determinismo como Prioridade

Quando LLMs ou modelos de ML estão no fluxo crítico do seu sistema, você enfrenta um desafio único: outputs variáveis, latências imprevisíveis e custos por token. A mesma pergunta pode gerar respostas diferentes a cada chamada. A arquitetura precisa de guardrails robustos para controlar o caos criativo da IA.

💡 Guardrails para IA em Produção

  • Output Validation — Valide estrutura (JSON schema), conteúdo (classificação de segurança) e consistência (testes de regressão)
  • Fallback Chains — Se o modelo principal falha ou demora, tente modelo menor, depois cache, depois resposta estática
  • Cost Control — Rate limiting por usuário, budget diário, modelo mais barato para tarefas simples
  • Human-in-the-Loop — Para decisões críticas, IA sugere e humano aprova

📊 Caso Real: Bing Chat (Microsoft)

O lançamento do Bing Chat em fevereiro de 2023 é um estudo de caso sobre IA sem guardrails:

  • Semana 1: O chatbot declarou amor a usuários, ameaou jornalistas e inventou fatos convincentes
  • Correção: Microsoft adicionou classificadores de segurança em cascade, limitou número de turnos e implementou content filtering
  • Lição: Prompt engineering não é suficiente. Você precisa de infraestrutura de validação ao redor do modelo

💡 Dica Prática

Trate prompts como infraestrutura, não como código ad-hoc. Versione prompts no git, teste com datasets fixos, monitore quality scores em produção. Um prompt que funciona em dev pode gerar hallucinations em produção com inputs reais.

⚠️ Alerta: Custos Explosivos

Uma API que chama GPT-4 para cada request pode custar US$10.000/dia com tráfego modesto. Estratégias: cache de respostas similares (semantic caching), usar modelos menores para triagem, batch processing quando possível, e sempre ter um kill switch de budget.

7

🔄 Combinando Prioridades

Na prática, todo projeto real combina múltiplos riscos. Um e-commerce tem velocidade (MVP) + imprevisibilidade (Black Friday) + organização (time crescendo). A arte não é eliminar trade-offs, mas priorizá-los.

💡 Risk Matrix para Arquitetura

Use weighted scoring para priorizar riscos:

  • Passo 1: Liste os riscos (velocidade, escala, organização, imprevisibilidade, IA)
  • Passo 2: Atribua pesos (1-5) baseado em impacto e probabilidade
  • Passo 3: Priorize os top 2 riscos — otimize para eles, aceite trade-offs nos demais
  • Passo 4: Defina “gatilhos de revisão” para quando reavaliar prioridades

📊 Caso Real: Stack INEMA

A INEMA combina múltiplas prioridades com soluções pragmáticas:

  • Velocidade (peso 5): HTML estático + Claude Code para geração. Novas páginas em minutos, não dias
  • IA (peso 4): Claude no fluxo de criação, n8n para automações. Guardrails de validação humana
  • Escala (peso 2): CDN-first, zero JavaScript obrigatório. Suporta tráfego com custo quase zero
  • Organização (peso 1): Time pequeno, não precisa de microsserviços. Monolito modular basta

🛠️ Arquitetura Faseada: Evoluindo com o Produto

1

Fase Exploração (0-100 usuários)

Prioridade: velocidade. Monolito simples, deploy rápido, throwaway prototypes. Zero preocupação com escala.

2

Fase Tração (100-10k usuários)

Prioridade muda para crescimento. Modularizar o monolito, adicionar caching, definir boundaries claros. Preparar para extrair serviços.

3

Fase Escala (10k-1M usuários)

Prioridade: organização + imprevisibilidade. Extrair serviços críticos, implementar event-driven, autoscaling, chaos engineering.

4

Fase Maturidade (1M+ usuários)

Todas as prioridades importam. Platform teams, fitness functions, ADRs formais, evolutionary architecture. A arquitetura é um produto em si.

💡 Dica Prática

Crie Architecture Fitness Functions para cada prioridade: “Deploy em <10min” (velocidade), “P99 <200ms” (performance), “Zero dependências circulares” (modularidade). Quando uma fitness function falha, é sinal de que a prioridade está sendo negligenciada.

📋 Resumo do Módulo

Identifique o custo dominante primeiro — Velocidade, crescimento, organização ou imprevisibilidade? Isso define tudo
Velocidade: comece simples — Monolito, throwaway prototypes, deploy no dia 1. Valide antes de arquitetar
Crescimento: monolito modular — Boundaries claros, feature flags, Strangler Fig ready
Organização: Conway’s Law — Microsserviços só quando múltiplos times precisam de autonomia
Imprevisibilidade: absorva variância — Serverless, filas, autoscaling, circuit breakers
IA: guardrails obrigatórios — Output validation, fallback chains, cost control
Combine com arquitetura faseada — Prioridades mudam conforme o produto evolui

Próximo Módulo:

2.2 - 📊 Análise de Trade-offs — Toda decisão é uma troca. Aprenda a fazer as certas