Deuda técnica


¿Qué es la deuda técnica?

La deuda técnica es la acumulación de decisiones de diseño o implementación tomadas por conveniencia o bajo presión que generan un coste adicional en el futuro. Al igual que una deuda financiera, si no se paga, genera “intereses”: cada vez cuesta más trabajar con ese código.

El término fue acuñado por Ward Cunningham en 1992 y sigue siendo uno de los conceptos más relevantes del desarrollo de software.

¿Para qué sirve entenderla?

Comprender la deuda técnica permite:

  • Tomar decisiones conscientes sobre cuándo asumir esa deuda y cuándo no.
  • Planificar tiempo de refactorización antes de que el problema se vuelva inmanejable.
  • Comunicar al equipo o al cliente por qué ciertas tareas técnicas son urgentes aunque no sean funcionalidades nuevas.
  • Evitar que proyectos pequeños se conviertan en sistemas que nadie quiere tocar.
  • Priorizar correctamente entre velocidad a corto plazo y sostenibilidad a largo plazo.

¿Cómo se acumula?

La deuda técnica no siempre es un error. A veces es una decisión deliberada y razonada. El problema es cuando se acumula sin registrarse ni pagarse.

Fuentes habituales:

  • Parches rápidos para cumplir una fecha de entrega sin tiempo de hacerlo bien.
  • Código duplicado porque era más rápido copiar que abstraer.
  • Falta de tests que obliga a probar todo manualmente en cada cambio.
  • Dependencias desactualizadas que nadie se anima a actualizar porque “funciona así”.
  • Documentación inexistente que hace que cada desarrollador tenga que redescubrir cómo funciona el sistema.
  • Malas decisiones de arquitectura tomadas al principio sin prever el crecimiento.

Tipos de deuda técnica

No toda deuda es igual. Martin Fowler propone una distinción útil:

TipoDescripción
Deliberada y prudente”Sabemos que esto no es lo correcto, pero necesitamos publicar ahora y lo arreglaremos después.”
Deliberada e imprudente”No tenemos tiempo para diseñar bien esto.” Sin intención de repararlo.
Accidental y prudente”Ahora entendemos cómo deberíamos haberlo hecho.” Aprendizaje natural.
Accidental e imprudente”¿Qué es un patrón de diseño?” La más peligrosa: no se sabe que existe.

La deliberada y prudente es la única aceptable, y solo si se registra y se paga.

Ejemplo de deuda que se acumula

// Versión rápida para "salir del paso"
function obtenerUsuario(id) {
  // TODO: esto debería buscar en la base de datos
  // por ahora usamos datos hardcodeados
  if (id === 1) return { nombre: 'Ana', rol: 'admin' };
  if (id === 2) return { nombre: 'Luis', rol: 'user' };
  return null;
}

Seis meses después hay 40 funciones así, ningún test, y nadie recuerda dónde están todos los TODO. Eso es la deuda técnica en acción.

Cómo pagarla: refactorización

Pagar deuda técnica significa refactorizar: mejorar la estructura interna del código sin cambiar su comportamiento externo.

// Versión sin deuda: conexión real, separación de responsabilidades
// src/lib/db.ts
import { db } from './connection';

export async function obtenerUsuario(id: number) {
  return db.collection('usuarios').findOne({ _id: id });
}

La refactorización no se improvisa — se planifica. Muchos equipos reservan un porcentaje fijo de cada sprint (el 20% es habitual) para saldar deuda antes de que los intereses se disparen.

La señal de alerta

Cuando el equipo empieza a decir frases como:

  • “No toques esa parte que se rompe todo”
  • “Hay que reescribirlo desde cero”
  • “Nadie sabe cómo funciona ese módulo”
  • “Tardé 3 días en añadir una columna a una tabla”

La deuda técnica ha llegado a un nivel crítico. El momento de actuar era antes.