As perguntas que separam quem entende a máquina de quem só consome a abstração.
Threads ou async/await — quando usar cada?
Para I/O-bound (banco, rede, arquivos), async/await é quase sempre superior:
mesmo número de threads atende mais conexões. Para CPU-bound (cálculos pesados,
compressão, criptografia), threads ou processos reais vencem — async não
paraleliza CPU. A heurística: se 90% do tempo é esperar I/O, async; se 90%
é computação, paralelismo de fato.
Container ou VM — onde está a fronteira?
Containers compartilham o kernel do host; VMs têm kernel próprio. Containers
são leves (centenas em uma máquina) e startam em milissegundos; VMs são
caras e startam em segundos. Mas: containers não isolam contra exploits de
kernel — ambiente multi-tenant inseguro precisa de VMs ou
microVMs (Firecracker). Para a maioria dos casos corporativos,
containers ganham; para isolamento forte, VMs continuam relevantes.
HTTP/2 ou HTTP/3 em produção?
HTTP/2 está universalmente suportado e cobre a maioria dos ganhos
(multiplexing, header compression). HTTP/3, baseado em QUIC sobre UDP,
ganha em redes ruins (mobile, alta latência) por eliminar head-of-line
blocking. Para APIs internas, HTTP/2 é o padrão sólido. Para clientes
móveis ou globais, HTTP/3 vira diferencial. Browsers já fazem fallback,
então habilitá-lo no edge é seguro.
Trunk-based ou Git Flow?
Trunk-based vence em times maduros com CI/CD funcional, deploys frequentes
e feature flags. Git Flow (com branches develop, release, hotfix) faz
sentido em ciclos de release longos, software com versionamento explícito
(libs públicas, software embarcado). A maioria dos times de produto
modernos opera em trunk-based — branches curtos (horas a dias), merge
rápido, deploy contínuo.