MÓDULO 1.1

🏛️ O que é Arquitetura de Software

A arte de tomar decisões estruturais que resistem ao tempo. Neste módulo, você vai entender o que realmente significa arquitetura de software, qual o papel do arquiteto, como lidar com trade-offs e por que contexto é tudo.

7
Tópicos
35 min
Duração
Básico
Nível
Teoria
Tipo
1

📐 Definição e Escopo

Arquitetura de software é o conjunto de decisões estruturais que definem como um sistema é organizado, como seus componentes se comunicam e como ele evolui ao longo do tempo. Não se trata de escolher linguagens ou frameworks — trata-se de entender trade-offs e fazer escolhas que moldam o futuro do sistema. Como Martin Fowler definiu: arquitetura são “as coisas difíceis de mudar depois”.

💡 Conceito Principal

Arquitetura de software opera em três dimensões fundamentais:

  • Estrutura — Como os componentes são organizados (módulos, camadas, serviços)
  • Comunicação — Como os componentes interagem entre si (síncrono, assíncrono, eventos)
  • Evolução — Como o sistema se adapta a mudanças ao longo do tempo (extensibilidade, modularidade)

📊 Caso Real: Twitter

O Twitter começou como um monolito Ruby on Rails em 2006. Quando atingiu 200 milhões de tweets por dia, a arquitetura original simplesmente não aguentou:

  • 2007-2009 — A “Fail Whale” aparecia constantemente, com o sistema ficando fora do ar durante picos de uso
  • 2010-2012 — Reescrita completa para JVM (Scala/Java), decompondo em serviços. Custo estimado: centenas de milhões de dólares
  • Lição — Decisões arquiteturais tomadas no início definem o custo de evolução futura

✓ O que FAZER

  • Pensar em decisões reversíveis vs. irreversíveis antes de começar
  • Documentar o porquê de cada decisão, não apenas o quê
  • Considerar como o sistema vai evoluir em 2-3 anos

✗ O que NÃO fazer

  • Confundir arquitetura com escolha de framework
  • Projetar para problemas que você não tem (over-engineering)
  • Ignorar requisitos não-funcionais e focar só em features

💡 Dica Prática

Ao iniciar qualquer projeto, faça a si mesmo a pergunta de Jeff Bezos: “Essa decisão é uma porta de mão única (irreversível) ou de mão dupla (reversível)?” Decisões de mão única exigem análise profunda. Decisões de mão dupla podem ser tomadas rapidamente e ajustadas.

2

🎯 O Papel do Arquiteto

O arquiteto de software é quem conecta requisitos de negócio a decisões técnicas. Não é o “programador sênior” que decide tudo sozinho — é quem garante que o sistema atende necessidades atuais e futuras, facilitando a comunicação entre times e stakeholders.

💡 Arquiteto vs. Tech Lead vs. Dev Sênior

Entender as diferenças é crucial para posicionamento de carreira:

  • Dev Sênior — Resolve problemas complexos dentro de um componente ou serviço
  • Tech Lead — Guia decisões técnicas do time e garante qualidade do código
  • Arquiteto — Define a estrutura do sistema como um todo, alinhando técnica com estratégia de negócio

📊 Caso Real: Amazon

Antes de 2002, a Amazon era um monolito gigante onde cada time escolhia tecnologias diferentes e a integração era um pesadelo. O que mudou:

  • O famoso memo de Bezos (2002) — “Todos os times devem expor dados e funcionalidade através de interfaces de serviço”
  • Two-pizza teams — Times pequenos o suficiente para serem alimentados com duas pizzas, cada um dono de um serviço
  • Resultado — Essa decisão arquitetural originou o AWS, hoje um negócio de US$90B/ano

✓ Habilidades Essenciais

  • Comunicação — Traduzir conceitos técnicos para stakeholders não-técnicos
  • Visão sistêmica — Enxergar como decisões locais impactam o todo
  • Pragmatismo — Escolher “bom o suficiente” em vez de “perfeito”
  • Mentoria — Elevar o nível técnico do time inteiro

✗ Antipadrões do Arquiteto

  • Ivory Tower Architect — Decide tudo isolado, sem codar ou ouvir o time
  • Resume-Driven Architecture — Escolhe tecnologias para enfeitar o currículo
  • Analysis Paralysis — Nunca decide porque sempre falta “mais informação”
  • Architecture Astronaut — Cria abstrações que ninguém pediu

💡 Dica Prática

A melhor forma de desenvolver habilidades de arquiteto é participar de design reviews e post-mortems. Toda vez que um sistema falha, pergunte: “Que decisão arquitetural levou a isso? O que poderíamos ter decidido diferente?” Esse exercício constante vale mais que qualquer certificação.

3

🔄 Requisitos Funcionais vs. Não-Funcionais

Requisitos funcionais descrevem o que o sistema faz (login, checkout, busca). Requisitos não-funcionais descrevem como o sistema faz (responder em <200ms, suportar 10k req/s, 99.9% uptime). A maioria dos projetos falha não por falta de funcionalidade, mas por ignorar os requisitos não-funcionais.

💡 Os “-ilities” que Definem o Sucesso

Os principais requisitos não-funcionais que todo arquiteto deve conhecer:

  • Performance — Tempo de resposta e throughput sob carga normal
  • Escalabilidade — Capacidade de lidar com aumento de carga
  • Disponibilidade — Percentual de tempo online (99.9% = 8.7h de downtime/ano)
  • Segurança — Proteção contra acessos não autorizados e vazamento de dados
  • Manutenibilidade — Facilidade de modificar, corrigir e evoluir o sistema
  • Observabilidade — Capacidade de entender o que está acontecendo em produção

⚠️ Caso Real: Healthcare.gov

Em outubro de 2013, o Healthcare.gov foi lançado para ser o portal de seguro saúde dos EUA. O resultado foi catastrófico:

  • Planejado: 50.000 usuários simultâneos
  • Real: 250.000 usuários simultâneos no primeiro dia
  • Resultado: Apenas 6 pessoas conseguiram se cadastrar no primeiro dia
  • Custo da correção: US$2.1 bilhões (valor final do projeto)

A funcionalidade estava correta. O sistema falharia em qualquer teste de carga — mas nunca fizeram esse teste.

✓ O que FAZER

  • Definir requisitos não-funcionais com números concretos (p99 < 200ms)
  • Testar carga antes de ir para produção
  • Incluir requisitos não-funcionais no Definition of Done

✗ O que NÃO fazer

  • Dizer “o sistema deve ser rápido” sem definir métricas
  • Assumir que “funciona na minha máquina” é suficiente
  • Deixar segurança e performance para “depois do MVP”

💡 Dica Prática

Use a técnica SMART para requisitos não-funcionais: Specific (específico), Measurable (mensurável), Achievable (alcançável), Relevant (relevante), Time-bound (com prazo). Exemplo: “A API de busca deve responder em p95 < 150ms para 5.000 requisições/segundo até o lançamento em março.”

4

📊 Trade-offs e Restrições

Não existe arquitetura perfeita. Cada escolha favorece uma qualidade em detrimento de outra. O CAP Theorem é o exemplo clássico: consistência, disponibilidade ou tolerância a partição — escolha dois. Arquitetos juniores buscam a “melhor” solução. Arquitetos sêniores entendem que toda solução tem custo.

💡 Os Principais Trade-offs Arquiteturais

Todo arquiteto navega entre esses eixos constantemente:

  • Consistência vs. Disponibilidade — CAP Theorem: dados sempre corretos ou sistema sempre online?
  • Latência vs. Throughput — Respostas rápidas individuais ou maior volume total?
  • Complexidade vs. Flexibilidade — Sistemas mais flexíveis são inevitavelmente mais complexos
  • Custo vs. Performance — Mais performance geralmente significa mais infraestrutura e mais dinheiro
  • Velocidade de entrega vs. Qualidade — O clássico dilema: entregar rápido ou entregar bem?

📊 Caso Real: Netflix e Eventual Consistency

A Netflix fez uma das escolhas de trade-off mais famosas da história:

  • Escolha: Eventual consistency em vez de strong consistency
  • Ganho: 99.99% de disponibilidade para 230+ milhões de assinantes
  • Custo: O catálogo pode estar até 30 segundos desatualizado para alguns usuários
  • Justificativa: “É melhor mostrar um catálogo ligeiramente desatualizado do que não mostrar nada”

Esse trade-off é inaceitável para um banco, mas perfeito para streaming. Contexto define a resposta certa.

🛠️ Como Analisar Trade-offs em 4 Passos

1

Identifique os atributos de qualidade

Liste o que mais importa para o sistema: performance? disponibilidade? segurança? custo? Priorize os 3 mais críticos.

2

Mapeie as tensões

Identifique onde os atributos conflitam. Querer alta consistência E alta disponibilidade é fisicamente impossível em sistemas distribuídos.

3

Documente a decisão

Registre o que foi escolhido, o que foi sacrificado e por quê. Use ADRs (Architecture Decision Records) para isso.

4

Defina critérios de revisão

Estabeleça quando revisitar a decisão. Ex: “Se ultrapassarmos 10k req/s, reavaliamos a escolha de banco de dados.”

5

🗺️ Contexto e Restrições do Projeto

Arquitetura que ignora contexto é exercício acadêmico. A melhor arquitetura é aquela que funciona dentro das restrições reais: tamanho do time, budget, prazo, conhecimento técnico existente e regulação do setor. Microsserviços são elegantes, mas se seu time tem 3 pessoas, é suicídio operacional.

💡 Lei de Conway

“Organizações que projetam sistemas são obrigadas a produzir designs que são cópias das estruturas de comunicação dessas organizações.” — Melvin Conway, 1967

  • Se você tem 3 times, vai acabar com 3 componentes
  • Se os times não se comunicam, os sistemas deles também não
  • Inverse Conway Maneuver: estruture os times para que a comunicação reflita a arquitetura desejada

📊 Caso Real: Basecamp

A Basecamp (37signals) é a prova de que contexto é tudo:

  • Faturamento: US$100M/ano
  • Time: ~70 pessoas (total, não só engenharia)
  • Arquitetura: Monolito Ruby on Rails
  • Infraestrutura: Servidores próprios (saíram da cloud em 2023, economizando US$7M/ano)

Não precisam de microsserviços porque o time é pequeno, o domínio é estável e a carga é previsível. A arquitetura certa depende do contexto.

📋 Checklist de Restrições

Antes de decidir qualquer arquitetura, responda:

  • Quantas pessoas tem no time de engenharia?
  • Qual o budget para infraestrutura?
  • Qual o prazo para entrega do MVP?
  • Que tecnologias o time já domina?
  • Existem regulações do setor (LGPD, HIPAA, PCI-DSS)?
  • Qual a expectativa de crescimento em 12 meses?

✓ O que FAZER

  • Aceitar dívida técnica planejada quando justificada pelo prazo
  • Escolher tecnologias que o time já domina
  • Começar simples e evoluir conforme a necessidade

✗ O que NÃO fazer

  • Copiar a arquitetura da Netflix quando você tem 100 usuários
  • Ignorar Conway’s Law na estruturação dos times
  • Acumular dívida técnica acidental sem plano de pagamento
6

📝 Documentação Arquitetural

“Se não está documentado, não foi decidido.” Documentação arquitetural é o registro formal das decisões, seus motivos e os trade-offs aceitos. Sem ela, cada novo desenvolvedor redescobre (e frequentemente reverte) decisões anteriores, gerando retrabalho e frustração.

💡 Modelo C4: 4 Níveis de Abstração

Criado por Simon Brown, o modelo C4 organiza a documentação visual em camadas de zoom:

  • Context (N1) — Visão de altíssimo nível: como o sistema se relaciona com usuários e outros sistemas
  • Container (N2) — Aplicações, bancos de dados, filas — as unidades deployáveis
  • Component (N3) — Módulos e componentes dentro de cada container
  • Code (N4) — Classes, interfaces — raramente necessário documentar neste nível

📄 Estrutura de um ADR (Architecture Decision Record)

1

Título e Status

ADR-001: Usar PostgreSQL como banco primário

Status: Aceito | Data: 2024-01-15 | Autores: Time de Plataforma

2

Contexto

Qual o problema que motivou a decisão? Quais as restrições? Ex: “Precisamos de um banco relacional com suporte a JSON, full-text search e extensões geoespaciais.”

3

Decisão e Alternativas

O que foi escolhido e quais alternativas foram consideradas (MySQL, MongoDB, CockroachDB). Por que cada alternativa foi descartada.

4

Consequências

O que melhora e o que piora com essa decisão. Ex: “Ganhamos ecosistema maduro, mas precisamos de expertise em tuning de PostgreSQL.”

📊 Caso Real: Spotify

O Spotify implementou ADRs públicos para todos os times e mediu o impacto:

  • 40% menos discussões repetidas sobre decisões já tomadas
  • Onboarding 30% mais rápido para novos desenvolvedores
  • Decisões mais consistentes entre squads que trabalham em domínios similares
  • Rastreabilidade — Sempre se sabe por que algo foi decidido daquela forma

💡 Dica Prática

Comece com apenas 2 artefatos: um diagrama C4 nível 2 (containers) e ADRs para cada decisão significativa. Armazene os ADRs junto ao código (pasta docs/adr/ no repositório). Documentação que vive longe do código morre primeiro.

7

🌍 Evolução da Arquitetura de Software

A história da arquitetura de software é uma progressão de centralizado para distribuído: mainframes, client-server, SOA, microsserviços, serverless, edge computing. Entender essa evolução ajuda a não repetir erros e a avaliar tendências com ceticismo informado.

🕑 60 Anos de Arquitetura de Software

60s

Mainframes e Batch Processing

1960-1980

Um computador central processava tudo. Usuários submetiam jobs e esperavam. Simples, centralizado, caro. IBM dominava o mercado.

80s

Client-Server

1980-2000

PCs como clientes, servidores centralizados. Surge o modelo de 2 e 3 camadas. Bancos de dados relacionais dominam. Oracle, SQL Server crescem.

00s

SOA e ESB

2000-2010

Service-Oriented Architecture prometeu reutilização e modularidade. Na prática, ESBs viraram gargalos monolíticos. SOAP e XML complicaram tudo.

10s

Microsserviços

2010-2020

Serviços pequenos, independentes, com deploy autônomo. Docker e Kubernetes viabilizam. Netflix, Uber, Spotify popularizam. Mas trazem complexidade distribuída.

20s

Serverless e Edge Computing

2020+

FaaS (Lambda, Cloud Functions), computação na borda (Cloudflare Workers, Vercel Edge). Pagamento por execução. Ideal para workloads event-driven e variáveis.

⚠️ Alerta: A História se Repete

SOA dos anos 2000 prometia exatamente o que microsserviços prometem hoje: serviços independentes, reutilizáveis, com interfaces bem definidas. E falhou pelas mesmas razões quando mal implementada:

  • Complexidade distribuída subestimada
  • Falta de ferramentas adequadas para observabilidade
  • Times sem maturidade para gerenciar sistemas distribuídos
  • Cargo cult: adotar porque “todo mundo usa” sem entender o porquê

📊 Dados do Mercado

  • 78% das empresas Fortune 500 usam arquitetura de microsserviços em pelo menos um sistema
  • 53% das empresas que migraram para microsserviços relatam aumento significativo na complexidade operacional
  • Serverless cresce ~25% ao ano, mas representa apenas ~5% dos workloads em produção
  • Monolitos modulares estão voltando a ser tendência como alternativa pragmática

💡 Dica Prática

Quando alguém disser “devemos usar [tecnologia X]”, pergunte: “Que problema específico isso resolve que não podemos resolver com o que já temos?” Se a resposta for vaga (“é mais moderno”, “todo mundo usa”), provavelmente é cargo cult. Ceticismo informado é a arma mais poderosa do arquiteto.

📋 Resumo do Módulo

Arquitetura é sobre decisões estruturais — Não é sobre linguagens ou frameworks, mas sobre trade-offs que moldam o futuro do sistema
O arquiteto conecta negócio e técnica — Comunicação é a habilidade n°1, não profundidade técnica
Requisitos não-funcionais matam projetos — Defina métricas concretas (p95, uptime, throughput) desde o início
Toda decisão é um trade-off — Não existe arquitetura perfeita, apenas adequada ao contexto
Contexto é tudo — Conway’s Law, tamanho do time, budget e prazo definem o que é possível
Documente decisões com ADRs e C4 — Se não está documentado, não foi decidido
A história se repete — Ceticismo informado sobre novas tendências evita cargo cult

Próximo Módulo:

1.2 - 🏢 Estilos Arquiteturais — Monolito, microsserviços, serverless: quando usar cada um