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
gotoen 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:
- 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)
- Extraer funciones: si algo hace más de una cosa, divídelo
- Poner nombres decentes: un nombre que explica la intención ahorra más tiempo que cualquier comentario
- Añadir tests antes de refactorizar: necesitas saber que la refactorización no rompe nada
- 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.