Deuda técnica
# Deuda técnica

La deuda técnica (también conocida como deuda de diseño o deuda de código, pero también puede relacionarse con otros esfuerzos técnicos) es un concepto en el desarrollo de software que refleja el costo implícito del retrabajo adicional causado por elegir una solución fácil en lugar de utilizar un enfoque que llevaría más tiempo en su desarrollo e implementación.

Este concepto es similar a deuda monetaria, si la deuda técnica no se paga, puede acumular 'intereses', lo que dificulta la implementación de cambios. La deuda técnica no abordada aumenta la entropía del software . La deuda técnica no es necesariamente algo malo, y a veces (por ejemplo, como prueba de concepto) se requiere para avanzar proyectos. Por otro lado, algunos expertos afirman que la metáfora de la "deuda técnica" tiende a minimizar el impacto, lo que resulta en una priorización insuficiente del trabajo necesario para corregirlo.

Cuando se inicia un cambio en un software, a menudo existe la necesidad de realizar otros cambios coordinados en otras partes del código fuente o documentación. Los cambios requeridos que no se completen se consideran deuda y, hasta que se paguen, incurrirán en intereses, lo que dificulta la construcción de un proyecto. Aunque el término se usa principalmente en el desarrollo de software, también se puede aplicar a otras profesiones.

## Causas

Las causas comunes de la deuda técnica incluyen:

* Definición inicial insuficiente, donde los requisitos todavía se están definiendo durante el desarrollo, el desarrollo comienza antes de que se lleve a cabo cualquier diseño. Esto se hace para ahorrar tiempo, pero a menudo se debe volver a trabajar más tarde.
* Las presiones comerciales, donde la empresa considera que se publique algo antes de que se completen los cambios necesarios, acumula una deuda técnica que comprende esos cambios $incompletos.^{:4}^{:22}$
* Falta de proceso o comprensión, donde las empresas son ciegas al concepto de deuda técnica y toman decisiones sin considerar las implicaciones.
* Componentes estrechamente acoplados, donde las funciones no son modulares, provocando que el software no sea lo suficientemente flexible como para adaptarse a los cambios de las necesidades comerciales.
* La falta de un conjunto de pruebas, que fomenta la reparación rápida de errores.
* Falta de documentación, donde el código se crea sin documentación de respaldo. El trabajo para crear documentación representa deuda.
* Falta de colaboración, donde el conocimiento no se comparte alrededor de la organización y la eficiencia del negocio se ve afectada, o los desarrolladores júnior no están debidamente orientados.
* El desarrollo paralelo en múltiples sucursales acumula deudas técnicas debido al trabajo requerido para fusionar los cambios en una sola base de origen. Cuantos más cambios se realicen de forma aislada, más deuda.
* Refactorización retrasada, a medida que los requisitos para un proyecto evolucionan, puede quedar claro que partes del código se han vuelto ineficientes o difíciles de editar y deben ser refactorizadas para admitir requisitos futuros. Cuanto más se demore la refactorización, y cuanto más código se agregue, mayor será la $deuda.^{:29}$
* Falta de alineación con los estándares, donde se ignoran las características estándar del sector, los marcos y las tecnologías. Eventualmente, la integración con los estándares vendrá, y hacerlo antes costará menos (similar a la 'refactorización $retrasada').^{:7}$
* Falta de conocimiento, cuando el desarrollador no sabe cómo escribir código elegante.
* Falta de propiedad, cuando los esfuerzos de software subcontratados dan como resultado que se requiera ingeniería interna para refactorizar o reescribir el código subcontratado.
* Pobre liderazgo tecnológico, donde los comandos mal pensados se transmiten a la cadena de mando.
* Cambios de especificación de última hora, estos tienen potencial para filtrarse a lo largo de un proyecto, pero no tienen tiempo ni presupuesto para llevarlos a cabo con documentación y controles.

## Tipos

En un blog de discusión "Technical Debt Quadrant", Martin Fowler distingue cuatro tipos de deuda en función de dos categorías dicotómicas: la primera categoría es imprudente frente a prudente, la segunda, deliberada frente a involuntaria.

Cuadrantes técnicos de deuda :

| | Temerario | Prudente |
| - | - | - |
| Deliberada | "No tenemos tiempo para el diseño" | "Debemos liberar ahora y lidiar con las consecuencias (más adelante)" |
| Inadvertida | "¿Cuáles son las capas?" | "Ahora sabemos cómo deberíamos haberlo hecho" |
