¿Qué Es una Tabla Hash? Hashing y Colisiones Explicados

Buscar una clave en un dict de Python con diez entradas tarda lo mismo que buscarla en uno con diez millones. No es casualidad de un lenguaje rápido. El dict de Python, el HashMap de Java y el Map de JavaScript son tablas hash, y todo su diseño existe para que búsqueda, inserción y borrado funcionen en O(1) de media. La notación Big O llama a esa búsqueda “tiempo constante”. Este es el mecanismo que se lo gana. ...

4 de noviembre de 2026 · 8 min · 1665 palabras · SpaghettiCoder

Ownership y Borrowing en Rust Explicados

Un programa en C que libera un buffer y sigue leyéndolo compila sin problema. Luego corrompe la memoria, a veces de inmediato, a veces tres peticiones más tarde, en una parte del código que nunca tocó ese buffer. Rust rechaza ese programa ya en el cargo build, y no hay ningún garbage collector de por medio. El compilador rastrea quién posee cada valor y quién puede acceder a él. Ese rastreo es ownership y borrowing. ...

3 de noviembre de 2026 · 8 min · 1627 palabras · SpaghettiCoder

Mock, Stub, Fake y Spy: los Test Doubles Explicados

Un test para place_order necesita una pasarela de pago, un cliente de SMS y una calculadora de impuestos. Conecta las versiones reales y cada ejecución del test cobra una tarjeta y manda un SMS a un número real. Un test unitario tiene que correr en milisegundos y sin red, así que las tres dependencias hay que sustituirlas por otra cosa. Ese “otra cosa” llega en cinco variantes. Cada una resuelve un problema distinto, y tratarlas como intercambiables explica por qué las discusiones de “pon un mock y ya” en code review no llegan a ningún lado. ...

2 de noviembre de 2026 · 9 min · 1725 palabras · SpaghettiCoder

ESLint vs Prettier: Diferencias y Cómo Combinarlos

Guardas un archivo, Prettier lo reformatea, y ESLint marca de inmediato un error en la línea que Prettier acaba de tocar. Las dos herramientas están configuradas, las dos están activas, y en vez de ayudarte se pelean entre sí. Las dos herramientas hacen trabajos distintos. El problema es que ambas tienen una opinión sobre una sola cosa: cómo debe verse el código en la pantalla. Qué comprueba realmente ESLint ESLint analiza tu código en un árbol de sintaxis abstracta y ejecuta reglas sobre su estructura. La mayor parte de su valor viene de reglas que detectan bugs reales: una variable que nunca se define, un return inalcanzable después de otro return, un import que quedó sin usar tras una refactorización, una clave duplicada en un objeto que sobrescribe la primera en silencio. Son comprobaciones semánticas: ESLint lee lo que el código hace. ...

1 de noviembre de 2026 · 7 min · 1288 palabras · SpaghettiCoder

Expresiones Regulares Explicadas: Cómo Funciona el Regex

<.+> contra <b>bold</b> and <i>italic</i> no encuentra <b>. Encuentra toda la cadena, desde el primer < hasta el último >. No hay ningún error. Eso es justo lo que debe hacer un cuantificador greedy, y también es el bug más común de “el regex está matcheando de más”. Una vez que sabes qué hace el motor mientras lee tu patrón, este bug y la mayoría de sus parientes dejan de ser un misterio. ...

28 de octubre de 2026 · 8 min · 1633 palabras · SpaghettiCoder

Generics en TypeScript Explicados con Ejemplos

¿Por Qué any Hace que Pierdas el Tipo que Pasaste? Tipa un parámetro como any y TypeScript deja de comprobar todo lo que sale de la función: 1 2 3 4 5 6 function firstElement(arr: any[]): any { return arr[0]; } const n = firstElement([1, 2, 3]); n.toUpperCase(); // compila, falla en tiempo de ejecución Tú sabes que pasaste un array de números. El compilador no, porque any le dice que deje de mirar. n queda tipado como any, así que llamar a un método de string sobre un número compila sin problemas y lanza TypeError: n.toUpperCase is not a function cuando se ejecuta. ...

27 de octubre de 2026 · 8 min · 1614 palabras · SpaghettiCoder

Excepciones vs Valores de Error: Cómo Elegir una Estrategia

Abre un archivo que no existe en Python y open() lanza un FileNotFoundError que sube por la pila de llamadas hasta salir de tu función. Haz lo mismo en Go y os.ReadFile te devuelve un valor error junto a un slice de bytes nil. El mismo fallo, dos formas de código completamente distintas a su alrededor. La diferencia no es cosmética: decide si quien llama puede ignorar el fallo por accidente, y si el compilador se da cuenta cuando lo hace. ...

26 de octubre de 2026 · 8 min · 1680 palabras · SpaghettiCoder

Rate Limiting de APIs: Algoritmos y Cómo Construir Uno

Un cliente atascado en un retry loop sin backoff puede meterle más carga a tu API en un minuto que tus otros diez mil clientes juntos. Desde tu lado no parece un ataque. Parece un bug de su parte, y se convierte en un incidente del tuyo. Un rate limiter frena a ese cliente antes de que llegue a ese punto. ¿Qué decide realmente un rate limiter? En cada request, el limiter se hace una sola pregunta: ¿esta clave ha hecho demasiadas requests en la ventana actual? Tres decisiones convierten eso en algo que puedes implementar. ...

23 de octubre de 2026 · 8 min · 1606 palabras · SpaghettiCoder

Intersection Observer: Lazy Loading y Scroll Infinito

Un listener scroll en window puede dispararse cientos de veces durante un solo swipe. Si en cada uno de esos eventos ejecutas getBoundingClientRect() sobre todas las tarjetas de un feed, cincuenta imágenes bastan para que la página empiece a ir a tirones. La Intersection Observer API elimina esa comprobación del flujo del scroll: registras qué elementos observar y el navegador te avisa cuando su visibilidad cambia de verdad. Cómo funciona IntersectionObserver Un observer vigila uno o más elementos target respecto a un root (el viewport, por defecto) y llama a una callback cada vez que un target cruza un umbral de visibilidad. ...

21 de octubre de 2026 · 6 min · 1169 palabras · SpaghettiCoder

Qué Son Unicode y la Codificación UTF-8

Abre un archivo guardado en UTF-8 con una herramienta que asume otra codificación y café se convierte en café. Los bytes del disco no cambiaron. Lo que cambió es la regla usada para volver a convertirlos en caracteres, y las dos reglas no coinciden en qué significa el byte 0xC3. La mayoría de los bugs de “caracteres raros” vienen de la misma fuente: nombres de archivo rotos, formularios ilegibles, un emoji que hace fallar un insert en la base de datos, dos cadenas que se ven idénticas pero fallan al compararlas. Detrás de todos ellos hay la misma confusión entre dos cosas distintas: Unicode y UTF-8. ...

20 de octubre de 2026 · 8 min · 1679 palabras · SpaghettiCoder