deep-dives

19 posts

Tu bucle de reintentos asume que la primera petición falló. Probablemente no lo hizo.

Un timeout o un crash no significan que tu petición a la API se haya perdido. Aquí te explicamos cómo las idempotency keys hacen seguros los reintentos, y el patrón de almacenamiento que realmente previene duplicados.

Tu servicio se cae a mitad de una petición . El cliente ve un timeout y reintenta. Ahora tienes dos cargos. El cliente está enfadado. La base de datos es…

Un circuit breaker sin goroutines, sin timers y sin overhead en segundo plano

La mayoría de las bibliotecas de circuit breaker lanzan hilos en segundo plano para sondear la recuperación. No los necesitas. Aquí tienes un diseño dirigido por requests que elimina todo el overhead en segundo plano sin sacrificar la corrección.

Cada circuit breaker de producción que he revisado eventualmente lanza un hilo en segundo plano. Puede ser una goroutine de Go, un de Java, o una tarea tokio…

Tu Servicio Web Tiene una Ruta de Graceful Shutdown. Ese es el Bug.

El software crash-only trata cada fallo como un crash y cada inicio como una recuperación. Para los servicios web, esto significa eliminar tu lógica de shutdown y diseñar un estado que sobreviva a un kill -9.

Tu servicio web tiene un shutdown handler. Hace flush de los buffers, cierra conexiones, escribe checkpoints. Lo probaste una vez, tal vez. En producción,…

Tus pruebas pasan. Tu mutation score es del 40%. Esto es lo que los surviving mutants te están diciendo.

La code coverage dice que estás a salvo. El mutation testing dice que tus pruebas son, en su mayoría, decoración. Así es como los surviving mutants exponen la brecha, y cómo cerrarla.

Tus pruebas pasan. Tu reporte de coverage dice 87%. Pero tu mutation score es del 40%, y la mitad de tus mutants siguen vivos. Ese 40% no significa que tu…

El mutation testing en Rust funciona, pero tus tiempos de compilación te lo harán pagar

cargo-mutants encuentra los tests que solo pretenden verificar tu código. Aquí te explicamos cómo funciona el mutation testing en Rust, qué detecta y si el coste en tiempo de compilación merece la pena.

Tienes un 100 % de cobertura de líneas. Cada branch se ejecuta. Cada función se llama. Entonces alguien cambia un por un en tu lógica de precios, ejecuta los…

El mutation testing tarda 4 horas. ¿Cómo lo usan los equipos realmente en CI?

La mayoría de los equipos no ejecutan suites completas de mutation testing en cada commit. Así es como los equipos de ingeniería integran el mutation testing en CI sin romper el pipeline de build.

Si tu suite de mutation testing tarda cuatro horas en ejecutarse, enhorabuena. Has demostrado lo que todo el mundo ya sospechaba: tu suite de tests tiene…

100 Test Runs Es una Mentira: Cómo Dimensionar Correctamente Tus Property-Based Tests

Los 100 ejemplos por defecto en property-based testing son un compromiso social, no una estrategia estadística. Aquí te explicamos cómo elegir un número de ejecuciones que se ajuste a tus necesidades de confianza y tu presupuesto de CI.

Si ejecutas property-based tests con los 100 ejemplos por defecto, te estás llevando lo peor de ambos mundos. Tu CI es más lenta de lo necesario, y aún así no…

Los Property-Based Tests en Rust Encuentran los Bugs que tus Unit Tests No Detectan

El example-based testing solo cubre los inputs que se te ocurrieron. El property-based testing genera datos aleatorios, verifica invariantes y reduce los fallos a contraejemplos mínimos mediante shrinking.

Escribiste una función . La probaste con y . Pasa. La envías a producción. Un usuario le pasa un slice de un solo elemento. Tu función lo descarta. Abren un…

Tus pruebas unitarias pasan. Tu código en producción sigue roto.

Las métricas de cobertura de código generan una falsa sensación de seguridad. Aquí te explicamos por qué las pruebas unitarias no detectan los bugs que realmente te quitan el sueño, y qué probar en su lugar.

Tienes un 90% de cobertura de código y aun así te llamaron a las 2 a.m. Las unit tests pasaron. CI estaba verde. El bug llegó a producción de todos modos. La…

Los Runtime Contracts de Rust Pueden Tener Costo Cero en Release Builds, pero el Compilador No Lo Hará por Ti

Rust elimina las debug assertions automáticamente, pero el verdadero design-by-contract necesita más que debug_assert!. Aquí te mostramos cómo construir runtime contracts de costo cero que desaparecen de tu release binary.

Rust puede hacer cumplir runtime contracts en desarrollo y borrarlos por completo de los release builds. La salvedad es que el lenguaje no trata los contracts…

Cero, Una o Doce: Cuántas Aserciones Necesita Realmente una Función de Producción

Los desarrolladores o esparcen aserciones como confeti o las evitan por completo. Aquí está el marco de decisión que separa los invariantes útiles de los detonadores de fallos en producción.

La mayoría de los codebase de producción caen en uno de dos bandos. El bando A trata a como un condimento decorativo, espolvoreándolo cada dos líneas hasta que…

strictNullChecks de TypeScript es un guardia en tiempo de compilación, no un escudo en tiempo de ejecución

El modo estricto atrapa los nulos que escribes, no los nulos que llegan en tiempo de ejecución desde APIs, consultas al DOM y JSON.parse. Aquí es donde el sistema de tipos se detiene y tus defensas comienzan.

Activaste en . Corregiste cada marca roja. Enviaste a producción con la confianza de que y eran problemas resueltos. Entonces una respuesta del backend cambió…