Posts
O Que a API Retorna vs O Que a Documentação Afirma
Avaliando se um provedor de dados esportivos poderia substituir outro. A matriz de capacidades publicada e a API de trial discordavam, então a análise foi reconstruída sobre sondagens contra o endpoint real. Sobre derivar seu consumo do código em vez da memória, citar evidência por veredito, e rotular um apêndice explicitamente como não comprovado.
Idempotência Pertence ao Banco de Dados
Uma notificação de loja reentregue não pode duplicar uma compra. Verificações em nível de aplicação são necessárias e insuficientes — sob entrega concorrente a única coisa que se sustenta com confiança é uma constraint. Sobre escolher a chave, a correção que tivemos que fazer nela no meio da execução, e por que o critério nomeia o mecanismo de imposição em vez do resultado.
As Melhores Fixtures de Teste Já Estavam em Produção
O monolito vinha armazenando toda notificação de loja crua por anos — 720.183 delas. Isso transformou uma reescrita de um exercício de fixtures num exercício de replay. Sobre reconhecer um corpus acidental, semear um banco efêmero para o harness nunca tocar dados vivos, e por que guardar o payload cru é a coisa mais barata que você já vai fazer.
Uma Loja Nunca Espera Pelo Nosso Banco de Dados
App Store e Google Play fazem retry agressivamente quando você está lento, então um handler que escreve no Postgres antes de dar acknowledgement transforma uma query lenta numa tempestade de retentativas. Sobre separar durabilidade de processamento, o registro de decisão que tivemos que substituir ao descobrir o que "durável" precisava significar, e por que nada pode receber ack sem estar registrado.
Cobertura, Não Apenas Concordância
Um harness de paridade reportando 100% de concordância não diz nada até você saber o que ele perguntou. Sobre transformar cobertura num portão em vez de uma estatística, declarar as lacunas em voz alta, e delimitar um replay ao núcleo determinístico para que a alegação publicada seja uma que você consiga defender.
Provando uma Reescrita Contra 243.325 Compras Reais
Antes de o novo serviço responder a um único usuário, ele computou entitlement para toda compra que tínhamos e suas respostas foram comparadas offline contra as do monolito. Zero discordâncias. A engenharia está inteiramente no que "zero" exigiu: fixar o relógio, escrever a lógica duas vezes de propósito, e tornar toda discordância diagnosticável sem reexecutar.
Tracing: Instrumentado mas Silencioso
Instrumentamos um novo serviço Go com OpenTelemetry no primeiro dia e o configuramos para não emitir nada, porque nenhum coletor havia sido escolhido. Sobre separar uma decisão de código de uma operacional, por que isso vence tanto "adicionar depois" quanto "escolher um backend agora", e as letras miúdas que tornam isso honesto.
Uma Conexão de Banco Que Não Pode Machucar o Monolito
O novo serviço lê o banco do serviço antigo durante a fase de shadow, o que o torna um risco a menos que a conexão seja restrita por construção. Sobre critérios de aceite formulados como capacidades que um serviço precisa não ter, por que readiness e liveness não devem concordar sobre o banco, e configuração que falha alto no startup.
Um Cutover Que Pode Ser Revertido
Reversibilidade como critério de aceite em vez de um plano de rollback escrito na noite anterior. Sobre fasear uma extração para que cada passo possa ser desfeito, por que "a gente reverte o deploy" deixa de ser verdade no momento em que dados se movem, e o critério de que o que fica para trás precisa ser tão explícito quanto o que se move.
Uma Arquitetura Especificada em Números, Não em Adjetivos
"Escalável e confiável" não é uma especificação — é um desejo com boa assessoria de imprensa. Sobre escrever uma arquitetura-alvo como mecanismos e orçamentos, exigir que todo design nomeie seus tradeoffs junto com suas fronteiras, e dar a todo modo de falha conhecido um sinal consultável antes de construir qualquer coisa.