MÓDULO 00 · 2 SEMANAS · FUNDAMENTOS I

Fundamentos da Engenharia I — Código

A base que separa código júnior de código sênior.

Duração ~2 semanas
Conceitos 5 fundamentais
Projeto URL Shortener
Pré-requisito Sintaxe básica em alguma linguagem
Qualidade Legibilidade Observabilidade básica

Cinco ideias que voltam a aparecer em cada um dos próximos módulos. Não são teoria — são lentes para enxergar código. Clique em cada conceito para o estudo aprofundado.

princípio orientador

Quando algo der errado em produção — e vai dar — você não terá tempo de aprender fundamentos. Eles precisam estar internalizados antes da crise.

As perguntas que separam júnior de sênior. Não decore as respostas — entenda o porquê por trás do trade-off.

Quando aplicar SOLID?

Em código que vai mudar. YAGNI vence em scripts e protótipos. SOLID é ferramenta para gerenciar mudança — onde não há mudança esperada, é overhead. Aplicar SOLID a uma Calculator de exemplo gera FizzBuzzEnterpriseEdition: pedagogicamente útil para mostrar o exagero, péssimo como referência.

Herança ou composição?

Composição por default. Herança só em hierarquias verdadeiras (Animal → Cachorro), nunca para reuso. "É um" passa, "tem um" passa, "usa um" passa — "quero reaproveitar código" é cilada. Linguagens modernas (Go, Rust) excluíram herança de classe e o mundo continuou girando: isso deveria dar pra pensar.

Quanto testar?

Cobertura é métrica vaidade. Teste comportamento crítico, fronteiras de domínio, e bugs que reapareceram. 100% de cobertura com testes ruins é pior que 60% com testes que importam. O que você quer maximizar é a velocidade de mudança com confiança, não o número no relatório.

O foco não é resolver o problema (trivial). É estruturar como sênior: camadas claras, testes, configs externalizadas, logs estruturados. Implementado três vezes, em três paradigmas distintos.

PROJETO PRÁTICO

URL Shortener (bit.ly mini)

Serviço que encurta URLs com analytics básico. O ganho não está em "rodar" — está em comparar como cada linguagem expressa as mesmas ideias arquiteturais.

REQUISITOS
  • POST /shorten — recebe URL, devolve código de 7 chars
  • GET /:code — redireciona e incrementa contador
  • GET /stats/:code — devolve hits, criado em, última visita
  • Storage começa em memória, depois Postgres (interface preserva)
  • Configuração via env vars, logs JSON, graceful shutdown
Qualidade Legibilidade Observabilidade básica
STACK SUGERIDA POR LINGUAGEM
STACK
.NET 10 (LTS) Minimal API + Entity Framework Core + xUnit
ESTRUTURA / NOTAS
  • Domain/ (entidades, sem deps)
  • Application/ (use cases, interfaces)
  • Infrastructure/ (EF, repos)
  • Api/ (endpoints)
  • Tests/
STACK
FastAPI + SQLAlchemy 2.0 + pytest
ESTRUTURA / NOTAS
  • domain/ (dataclasses)
  • application/ (services, ports)
  • infrastructure/ (sqlalchemy)
  • api/ (routers)
  • tests/
STACK
stdlib net/http + sqlc + testing
ESTRUTURA / NOTAS
  • internal/domain/
  • internal/service/
  • internal/storage/
  • cmd/server/
  • Sem framework — Go puro
entregável

Os três projetos no GitHub (repo por linguagem ou monorepo), README explicando trade-offs, e um ADR único comparando as três implementações: "Estruturando a mesma aplicação em três paradigmas".

Perguntas reais de entrevistas sêniores. Pratique respondendo em voz alta, articulando trade-offs com clareza.

Q.01

Diferença entre acoplamento e coesão? Dê um exemplo de baixo acoplamento e baixa coesão (cilada comum).

Q.02

O que é Liskov Substitution? Mostre código que viola.

Q.03

Por que herança pode ser ruim? Quando é boa?

Q.04

Como você testa código que depende de DB sem subir um DB?