deep-dives

19 posts

Seu loop de retry assume que a primeira requisição falhou. Provavelmente, não falhou.

Um timeout ou crash não significa que sua requisição de API foi perdida. Veja como idempotency keys tornam retries seguros, e o padrão de armazenamento que realmente previne duplicatas.

Seu serviço quebra no meio de uma requisição . O cliente vê um timeout e faz retry. Agora você tem duas cobranças. O cliente está irritado. O banco de dados…

Um circuit breaker sem goroutines, sem timers e sem overhead em background

A maioria das bibliotecas de circuit breaker cria threads em background para fazer probe de recuperação. Você não precisa delas. Aqui está um design orientado a requests que elimina todo o overhead em background sem sacrificar a corretude.

Todo circuit breaker em produção que analisei eventualmente cria uma thread em background. Pode ser uma goroutine em Go, um em Java, ou uma task do tokio em…

O Seu Serviço Web Tem um Caminho de Encerramento Graceful. Esse é o Bug.

Software crash-only trata toda falha como um crash e toda inicialização como uma recuperação. Para serviços web, isso significa deletar sua lógica de encerramento e projetar estado que sobreviva a um kill -9.

Seu serviço web tem um handler de encerramento. Ele faz flush de buffers, fecha conexões, escreve checkpoints. Você testou isso uma vez, talvez. Em produção,…

Seus Testes Passam. Seu Mutation Score É 40%. Eis O Que Mutantes Sobreviventes Estão Realmente Lhe Dizendo.

O code coverage diz que você está seguro. O mutation testing diz que seus testes são, em sua maioria, decoração. Veja como mutantes sobreviventes expõem a lacuna e como fechá-la.

Seus testes passam. Seu relatório de coverage diz 87%. Mas seu mutation score é 40%, e metade dos seus mutantes ainda está vivo. Esse 40% não significa que seu…

Mutation Testing em Rust Funciona, mas Seus Tempos de Compilação Vão Odiar Você

cargo-mutants encontra os testes que apenas fingem verificar seu código. Veja como mutation testing funciona para Rust, o que ele captura e se o custo de tempo de compilação vale a pena.

Você tem 100% de cobertura de linhas. Cada branch é executada. Cada função é chamada. Aí alguém muda um para na sua lógica de precificação, executa os testes e…

100 Execuções de Teste é uma Mentira: Como Dimensionar Seus Testes Baseados em Propriedades

Os 100 exemplos padrão em testes baseados em propriedades são um compromisso social, não uma estratégia estatística. Veja como escolher uma quantidade de execuções que corresponda às suas necessidades de confiança e ao orçamento de CI.

Se você está executando testes baseados em propriedades com os 100 exemplos padrão, você está tendo o pior dos dois mundos. Seu CI está mais lento do que…

Testes Baseados em Propriedades em Rust Encontram os Bugs que Seus unit tests Deixam Passar

Testes baseados em exemplos cobrem apenas as entradas que você imaginou. Testes baseados em propriedades geram dados aleatórios, verificam invariantes e reduzem falhas aos contraexemplos mínimos.

Você escreveu uma função . Testou com e . Passou. Enviou para produção. Um usuário passa um slice de um único elemento. Sua função o ignora silenciosamente.…

Contratos de Runtime em Rust Podem Ser Gratuitos em Builds de Release, mas o compiler Não Vai Fazer Isso por Você

Rust remove debug assertions automaticamente, mas design-by-contract de verdade precisa de mais do que debug_assert!. Veja como construir contratos de runtime com custo zero que desaparecem do seu binário de release.

Rust pode impor contratos de runtime em desenvolvimento e apagá-los completamente das builds de release. A ressalva é que a linguagem não trata contracts como…

Zero, Um ou Doze: Quantas Assertions uma Função de Produção Realmente Precisa

Desenvolvedores ou espalham assertions como confete ou as evitam completamente. Aqui está o framework de decisão que separa invariants úteis de gatilhos de crash em produção.

A maioria dos codebases de produção se divide em dois campos. O Campo A trata como um tempero decorativo, espalhando-o a cada outra linha até que a função…

O strictNullChecks do TypeScript É uma Proteção em Tempo de Compilação, Não um Escudo em Runtime

O modo strict captura os nulls que você escreve, não os nulls que chegam em runtime de APIs, queries no DOM e JSON.parse. É aqui que o sistema de tipos para e suas defesas começam.

Você ativou no . Corrigiu cada erro. Enviou para produção confiante de que e eram problemas resolvidos. Aí a resposta do backend mudou de forma, uma query no…