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
Pronunciación
IPA: /bʌɡ/
Suena como: “bag” - una sílaba corta, la ‘u’ suena como una ‘a’ breve
Errores comunes:
- ❌ “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 y su equipo en Harvard. Encontraron una polilla real atrapada en el computador Mark II que causaba fallos.
Hopper pegó la polilla 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, pero este incidente lo popularizó en computación.
Tipos de Bugs
Por severidad
| Nivel | Nombre | Ejemplo |
|---|---|---|
| 🔴 Crítico | 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);
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 destruido por un guión faltante ($18.5M) |
| 1996 | Ariane 5 | Cohete explotó por overflow de entero ($370M) |
| 1999 | Y2K | Pánico mundial por fechas de 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).