Código espagueti


¿Qué es el código espagueti?

El código espagueti es código cuya estructura es tan caótica y enredada que resulta extremadamente difícil de leer, modificar o mantener. El término viene de la imagen de un plato de espaguetis: intentas seguir un hilo y apareces en un punto completamente diferente, cruzado con otros hilos que no sabes de dónde vienen.

No es un problema de que el código “no funcione” — el código espagueti a menudo funciona. El problema es que nadie entiende por qué funciona, y tocarlo es una ruleta rusa.

¿Cómo se genera?

El código espagueti rara vez se diseña así. Se acumula:

  • Funciones que crecen sin límite porque “es más rápido añadir aquí”
  • Condicionales anidados en cinco niveles porque cada caso fue un parche
  • Variables globales modificadas desde múltiples sitios sin orden
  • Lógica de negocio mezclada con lógica de presentación y acceso a datos
  • Sin separación de responsabilidades: todo en un mismo archivo o función
  • Uso indiscriminado de goto en lenguajes que lo permiten (el origen histórico del término)

Ejemplos

// ❌ Código espagueti: una función que lo hace todo
function procesarPedido(datos) {
  if (datos) {
    if (datos.usuario) {
      if (datos.usuario.activo) {
        let total = 0;
        for (let i = 0; i < datos.items.length; i++) {
          if (datos.items[i].stock > 0) {
            total += datos.items[i].precio * datos.items[i].cantidad;
            datos.items[i].stock--;
            // actualizar base de datos aquí mismo
            db.query(`UPDATE items SET stock=${datos.items[i].stock} WHERE id=${datos.items[i].id}`);
            if (total > 100) {
              total = total * 0.9; // descuento hardcodeado
            }
          }
        }
        // enviar email también aquí
        sendMail(datos.usuario.email, 'Tu pedido: ' + total);
        return total;
      }
    }
  }
  return null;
}
// ✅ Mismo resultado, estructura legible
async function procesarPedido(datos) {
  validarPedido(datos);

  const total = calcularTotal(datos.items);
  const totalConDescuento = aplicarDescuento(total);

  await actualizarStock(datos.items);
  await notificarUsuario(datos.usuario, totalConDescuento);

  return totalConDescuento;
}

La diferencia no es solo estética — la segunda versión se puede probar, modificar y entender en segundos.

Las señales de alerta

Estás ante código espagueti cuando:

  • Tienes miedo de modificar una función porque “no sabes qué puede romperse”
  • Para entender qué hace algo, tienes que saltar entre 8 archivos distintos
  • Una función tiene más de 100 líneas (o más de 200, o más de 500…)
  • Los condicionales tienen más de 3 niveles de anidación
  • Hay variables con nombres como x, temp2, aux_final_v3
  • El último desarrollador que tocó esto ya no trabaja en la empresa y nadie pregunta por qué

Cómo salir de él

No se arregla de golpe. La estrategia es incremental:

  1. No añadir más espagueti: cada cambio que hagas, deja el código un poco mejor que como lo encontraste (Regla del Boy Scout)
  2. Extraer funciones: si algo hace más de una cosa, divídelo
  3. Poner nombres decentes: un nombre que explica la intención ahorra más tiempo que cualquier comentario
  4. Añadir tests antes de refactorizar: necesitas saber que la refactorización no rompe nada
  5. Separar responsabilidades: lógica de negocio, acceso a datos y presentación en capas distintas

El código espagueti es la forma más honesta de ver qué pasa cuando la velocidad cortoplacista gana sistemáticamente a la claridad. El coste siempre llega — solo que lo paga el siguiente que lo toca.