Qué es
Un bug es un error, defecto o falla en el código que causa que el software se comporte de manera inesperada o incorrecta.
Puede manifestarse como:
- Un botón que no funciona
- Un cálculo incorrecto
- Un crash de la aplicación
- Datos que se pierden o corrompen
- Comportamientos extraños bajo ciertas condiciones
Errores comunes de pronunciación
- ❌ “boog” (no como “book”)
- ❌ “bug-ui” (no tiene sonido extra al final)
El Origen del Término
La Leyenda de la Polilla (1947)
El término se popularizó gracias a Grace Hopper, que trabajaba con el equipo del computador Harvard Mark II. En 1947, los operadores rastrearon un fallo hasta una polilla real atrapada en un relé.
La polilla se pegó con cinta en el libro de registro con la nota:
“First actual case of bug being found” (Primer caso real de un bug encontrado)
Este registro histórico se conserva en el Museo Nacional de Historia Americana del Smithsonian.
Nota: El término “bug” ya se usaba en ingeniería antes de esto (Thomas Edison lo empleaba en el siglo XIX); la anécdota, que Hopper contó muchas veces, lo popularizó en computación.
Tipos de Bugs
Por severidad
| Nivel | Nombre | Ejemplo |
|---|---|---|
| 🔴 Crítico / Bloqueante | Critical / Blocker | App no inicia, pérdida de datos |
| 🟠 Mayor | Major | Función principal no trabaja |
| 🟡 Menor | Minor | Error visual, typo |
| 🟢 Trivial | Trivial | Estético, no afecta funcionalidad |
Por tipo técnico
┌─────────────────────────────────────────────────────┐
│ TIPOS COMUNES DE BUGS │
├─────────────────────────────────────────────────────┤
│ Lógico │ El código hace algo diferente a lo │
│ │ esperado │
├─────────────────────────────────────────────────────┤
│ Sintáctico │ Error de escritura que impide │
│ │ compilar/ejecutar │
├─────────────────────────────────────────────────────┤
│ Runtime │ Error que ocurre durante la ejecución │
├─────────────────────────────────────────────────────┤
│ Concurrencia│ Problemas con múltiples hilos/procesos│
├─────────────────────────────────────────────────────┤
│ Memory Leak │ El programa no libera memoria │
└─────────────────────────────────────────────────────┘
Ejemplos de Código
Bug lógico (el más común)
// ❌ BUG: Error de uno (off-by-one)
function obtenerUltimoElemento(array) {
return array[array.length]; // 🐛 Debería ser length - 1
}
// ✅ CORRECTO
function obtenerUltimoElemento(array) {
return array[array.length - 1];
}
Bug de comparación
// ❌ BUG: Comparación incorrecta
function esMayorDeEdad(edad) {
if (edad = 18) { // 🐛 Asignación en vez de comparación
return true;
}
return false;
}
// ✅ CORRECTO
function esMayorDeEdad(edad) {
return edad >= 18; // Usar >= para comparar
}
Bug de null/undefined
// ❌ BUG: No verificar null
function obtenerNombreUsuario(usuario) {
return usuario.nombre.toUpperCase(); // 🐛 Crash si usuario es null
}
// ✅ CORRECTO
function obtenerNombreUsuario(usuario) {
return usuario?.nombre?.toUpperCase() ?? 'Usuario Anónimo';
}
Caso Práctico: El Bug del Carrito de Compras
Imagina esta situación en una tienda online:
El reporte del bug
Usuario reporta: “Cuando agrego un producto y luego lo elimino, el total sigue mostrando el precio del producto eliminado.”
Investigación
// ❌ CÓDIGO CON BUG
function eliminarProducto(carrito, productoId) {
const index = carrito.items.findIndex(item => item.id === productoId);
carrito.items.splice(index, 1);
// 🐛 BUG: Olvidó recalcular el total
}
// ✅ CÓDIGO CORREGIDO
function eliminarProducto(carrito, productoId) {
const index = carrito.items.findIndex(item => item.id === productoId);
if (index === -1) return; // Si no existe, splice(-1, 1) borraría el último item
carrito.items.splice(index, 1);
carrito.total = carrito.items.reduce((sum, item) => sum + item.precio, 0);
}
Lecciones aprendidas
- Tests unitarios habrían detectado el bug
- Code review podría haberlo prevenido
- Documentación del flujo completo ayuda
Bugs Famosos en la Historia
| Año | Bug | Impacto |
|---|---|---|
| 1962 | Mariner 1 | Cohete y sonda destruidos tras el lanzamiento por un símbolo omitido en el software de guiado, popularizado como “el guion faltante” (US$18.5M de la época) |
| 1996 | Ariane 5 (vuelo 501) | Cohete autodestruido por un overflow al convertir un número de 64 bits a un entero de 16 bits (pérdidas de más de US$370M) |
| 1999-2000 | Y2K | Costosa remediación mundial por fechas almacenadas con 2 dígitos |
| 2014 | Heartbleed | Vulnerabilidad en OpenSSL afectó millones de sitios |
| 2021 | Log4Shell | Vulnerabilidad crítica en Log4j |
El Ciclo de Vida de un Bug
┌─────────┐ ┌──────────┐ ┌───────────┐ ┌──────────┐
│ Nuevo │ → │ Asignado │ → │ En progreso│ → │ Resuelto │
└─────────┘ └──────────┘ └───────────┘ └──────────┘
↓ ↓
┌─────────┐ ┌──────────┐
│ Cerrado │ ← ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ← │Verificado│
└─────────┘ └──────────┘
Cómo reportar un bug correctamente
Un buen reporte de bug incluye:
- Título descriptivo: “El carrito no actualiza el total al eliminar productos”
- Pasos para reproducir:
- Agregar producto X al carrito
- Eliminar producto X
- Observar el total
- Comportamiento esperado: Total debe ser $0
- Comportamiento actual: Total sigue mostrando $100
- Entorno: Chrome 120, Windows 11, producción
- Evidencia: Screenshot o video
Términos relacionados
- Debug - Proceso de encontrar y corregir bugs
- Testing - Proceso para detectar bugs antes de producción
- Hotfix - Corrección urgente de un bug en producción
- QA - Quality Assurance, equipo que busca bugs
Recuerda: Los bugs son inevitables. Lo importante es tener procesos para detectarlos temprano (testing), corregirlos rápido (debugging) y aprender de ellos (retrospectivas).