Desarrollo Básico

Bug

Error o defecto en el código que causa un comportamiento inesperado o incorrecto en el software. Uno de los términos más icónicos de la programación.

Pronunciación

/bʌɡ/
"bag"
Escuchar en: Forvo Cambridge

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

NivelNombreEjemplo
🔴 CríticoBlockerApp no inicia, pérdida de datos
🟠 MayorMajorFunción principal no trabaja
🟡 MenorMinorError visual, typo
🟢 TrivialTrivialEsté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

  1. Tests unitarios habrían detectado el bug
  2. Code review podría haberlo prevenido
  3. Documentación del flujo completo ayuda

Bugs Famosos en la Historia

AñoBugImpacto
1962Mariner 1Cohete destruido por un guión faltante ($18.5M)
1996Ariane 5Cohete explotó por overflow de entero ($370M)
1999Y2KPánico mundial por fechas de 2 dígitos
2014HeartbleedVulnerabilidad en OpenSSL afectó millones de sitios
2021Log4ShellVulnerabilidad 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:

  1. Título descriptivo: “El carrito no actualiza el total al eliminar productos”
  2. Pasos para reproducir:
    • Agregar producto X al carrito
    • Eliminar producto X
    • Observar el total
  3. Comportamiento esperado: Total debe ser $0
  4. Comportamiento actual: Total sigue mostrando $100
  5. Entorno: Chrome 120, Windows 11, producción
  6. 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).