{adriNcode}

Deuda Técnica - Qué es?

imagen de una casa mitad rota y mitad arreglada

Deuda Técnica

¿Qué es?

La deuda técnica es como el mantenimiento de una casa. Imagina que decides ignorar pequeñas reparaciones en tu hogar para ahorrar tiempo y dinero. Con el tiempo, esos problemas pequeños pueden convertirse en problemas grandes, haciendo más caro y difícil de mantener tu casa en buen estado.

En el mundo del software, ignorar “reparaciones” como refactorizar código o actualizar sistemas puede acumular deuda técnica, complicando futuras mejoras y mantenimiento.

Causas

La deuda técnica puede acumularse por diversas razones, incluyendo decisiones comerciales que priorizan la entrega rápida sobre la calidad del código, la falta de conocimiento o experiencia del equipo de desarrollo, y la evolución natural del proyecto que hace que decisiones anteriores se vuelvan obsoletas o inadecuadas.

Consecuencias

Las consecuencias de la deuda técnica incluyen un aumento en los costos de mantenimiento, disminución de la productividad del equipo de desarrollo, y un mayor riesgo de errores o fallos en el sistema. A largo plazo, la deuda técnica puede hacer que el código sea tan frágil que cualquier cambio adicional sea extremadamente riesgoso, costoso o incluso inviable.

Soluciones para manejar la deuda técnica

  1. Refactorización Regular: Revisa y mejora el código periódicamente para mantener su calidad y reducir la complejidad.
  2. Documentación Clara: Mantén una documentación clara y actualizada para que todo el equipo entienda las decisiones de diseño y las áreas de deuda técnica.
  3. Pruebas Automatizadas: Implementa pruebas automatizadas para detectar errores rápidamente y asegurar que los cambios no introduzcan nuevos problemas.
  4. Revisiones de Código: Realiza revisiones de código regulares para identificar y corregir problemas antes de que se conviertan en deuda técnica.

Precauciones a tomar

  • Evaluación de Riesgos: Antes de acumular deuda técnica, evalúa los riesgos asociados y planifica cómo abordarlos en el futuro.
  • Planificación de Pagos: Establece un plan para pagar la deuda técnica en fases para que no se convierta en una carga insostenible.
  • Priorización de Tareas: Prioriza la corrección de áreas críticas del código que impactan directamente en la calidad y rendimiento del producto.

Ejemplos de código

Código con Deuda Técnica

// Este código tiene deuda técnica debido a su complejidad y falta de modularización
import 'dart:math';

double calculateTotalCost(double basePrice, double taxRate, double discount, double shippingCost) {
  double tax = basePrice * taxRate / 100;
  double discountAmount = basePrice * discount / 100;
  double finalPrice = basePrice + tax - discountAmount + shippingCost;
  return finalPrice;
}

String formatCurrency(double amount) {
  return '\$${amount.toStringAsFixed(2)}';
}

void printOrderDetails(String customerName, double basePrice, double taxRate, double discount, double shippingCost) {
  double totalCost = calculateTotalCost(basePrice, taxRate, discount, shippingCost);
  print('Customer: $customerName');
  print('Base Price: ${formatCurrency(basePrice)}');
  print('Tax: ${formatCurrency(basePrice * taxRate / 100)}');
  print('Discount: ${formatCurrency(basePrice * discount / 100)}');
  print('Shipping: ${formatCurrency(shippingCost)}');
  print('Total: ${formatCurrency(totalCost)}');
}

// Uso de la función
void main() {
  printOrderDetails('John Doe', 100.0, 7.5, 10.0, 5.0);
}

Código sin Deuda Técnica

// Este código ha sido refactorizado para mejorar la modularización y reducir la complejidad
import 'dart:math';

class Order {
  double basePrice;
  double taxRate;
  double discount;
  double shippingCost;

  Order({required this.basePrice, required this.taxRate, required this.discount, required this.shippingCost});

  double get tax => basePrice * taxRate / 100;
  double get discountAmount => basePrice * discount / 100;
  double get totalCost => basePrice + tax - discountAmount + shippingCost;
}

class CurrencyFormatter {
  static String format(double amount) {
    return '\$${amount.toStringAsFixed(2)}';
  }
}

class OrderPrinter {
  static void printDetails(String customerName, Order order) {
    print('Customer: $customerName');
    print('Base Price: ${CurrencyFormatter.format(order.basePrice)}');
    print('Tax: ${CurrencyFormatter.format(order.tax)}');
    print('Discount: ${CurrencyFormatter.format(order.discountAmount)}');
    print('Shipping: ${CurrencyFormatter.format(order.shippingCost)}');
    print('Total: ${CurrencyFormatter.format(order.totalCost)}');
  }
}

// Uso de la clase
void main() {
  Order order = Order(basePrice: 100.0, taxRate: 7.5, discount: 10.0, shippingCost: 5.0);
  OrderPrinter.printDetails('John Doe', order);
}

En el código con deuda técnica, la lógica de cálculo de costos y la impresión de detalles están mezcladas y no modularizadas. En el código refactorizado, separamos la lógica en clases Order, CurrencyFormatter, y OrderPrinter, mejorando la claridad, reusabilidad, y mantenibilidad del código.

Espero que con esta información te haya aclarado un poco mas sobre el tema. Además, como es costumbre, voy a enviarte en los próximos dias otro mail seguido a éste artículo para que conozcas en que aspectos del software se puede generar deuda técnica. Pero claro, todo eso suponiendo que estas suscripto al newsletter! Y si no lo estás, te estás perdiendo del material exclusivo a suscriptores.

Leer Siguiente

Suscribirse a {adriNcode} Newsletter

Exploraremos juntos el mundo de la programación. Recibirás información desde los fundamentos hasta los conceptos más avanzados.