Tag: Deuda técnica

  • Cómo evitar la deuda técnica al integrar agentes de IA en el desarrollo

    Cómo evitar la deuda técnica al integrar agentes de IA en el desarrollo

    ¿Y si la velocidad que te vendieron como progreso es, en realidad, el motor que va a deshacer tu arquitectura?

    Tiempo estimado de lectura: 8 min

    • Ideas clave:
    • Integrar agentes de IA sin capturar intención produce deuda técnica a escala.
    • Necesitas trazar decisiones → requerimiento → test → código y hacerla canónica.
    • Una herramienta como Plum no pinta paredes; convierte intención volátil en artefactos persistentes.
    • Gobernanza debe vivir fuera del agente: hooks, CI y aprobaciones humanas son imprescindibles.

    Introducción

    ¿Y si la velocidad que te vendieron como progreso es, en realidad, el motor que va a deshacer tu arquitectura?

    Poca gente lo dice sin rodeos: integrar agentes de IA para escribir código sin un sistema que capture la intención es una receta perfecta para deuda técnica a escala industrial. Y no hablo de “posibles problemas”. Hablo de que, hoy, el código puede crecer más rápido de lo que cualquier humano puede leer —y eso duele en producción.

    This is her code. This is what she was managing. This is her VS code.

    Margaret Hamilton sujetó esa complejidad con una pila de impresiones. Ella no tenía prompts; tenía procedimientos. Nosotros tenemos prompts y convicciones ingenuas.

    Vamos al punto.

    Resumen rápido (lectores con prisa)

    Plum es una herramienta de gobernanza que intercepta commits, extrae decisiones y las convierte en artefactos trazables. Úsala cuando quieras que las decisiones que toman agentes o developers queden registradas y enlazadas a specs, tests y código. Importa porque previene deuda técnica acelerada por IA y funciona mediante git hooks, diffs, y un flujo de aprobación humana.

    1) El problema (simple y aterrador)

    Si un Product Manager edita una regla en producción, ¿el resto del sistema cambia con ella?

    En la práctica, no.

    Los hotfixes saltan directo al trunk.

    Los tests se rompen en silencio.

    Las specs siguen siendo documentos en Markdown que nadie actualiza.

    Y cuando introduces agentes de IA en ese mix, la cosa se acelera: los LLMs toman micro-decisiones en chats, tú implementas, haces commit y la “intención” se evapora.

    Resultado: código con autoría pero sin porqué. Comportamiento sin contrato. Equipos que arreglan cosas por intuición y no por diseño.

    2) Por qué los tests y specs no bastan

    Un test valida un output. No captura intención.

    Un spec define un contrato —hasta que alguien lo ignora.

    La implementación revela límites: casos borde, problemas de estado, compromisos de rendimiento. La única forma real de enriquecer una spec es escribir el maldito código. Implementar obliga a decidir. Y esas decisiones deben quedar registradas.

    3) ¿Qué hace falta?

    • Capturar decisiones. No dejar que vivan en el chat.
    • Vincular decisión → requerimiento → test → código.
    • Hacer que esa trazabilidad sea canónica y no opcional.

    Sin eso, tus agentes son obreros hiperproductivos que construyen habitaciones sin planos. Velocidad sin planos = casa que se cae.

    4) Plum: la plomada que no pinta paredes

    No es mágica. No genera código bonito.

    Plum hace otra cosa muchísimo más valiosa: transforma intención volátil en artefacto persistente.

    Qué hace Plum (sí, práctico)

    • Intercepta commits via git hooks.
    • Lee diffs y scans de traces de agentes.
    • Extrae decisiones (qué, por qué, quién).
    • Deduplica lógicas repetidas.
    • Te obliga a aprobar/rechazar/editar antes de permitir el commit.
    • Si apruebas, actualiza specs Markdown y genera un .jsonl con la decisión, autoría y trazas.
    • Ejecuta un sync que mapea spec ↔ tests ↔ código y muestra huecos de cobertura.

    Metáfora: la plomada cuelga del trípode y te dice si la pared está vertical. Plum no pinta; evita derrumbes.

    5) Por qué esto no puede ser una “skill” dentro del agente

    Una skill vive dentro del agente. Es una sugerencia.

    Un control de gobernanza tiene que vivir fuera. Debe poder bloquear commits, correr en CI y ser determinista.

    Si la herramienta fuera sólo otra respuesta del LLM, se ignoraría. Punto.

    6) Problemas reales a resolver (y por qué no es trivial)

    • Umbral de interrupción: si cada hotfix genera cinco decisiones para revisar, los devs odian la herramienta. Necesitas tolerancias dinámicas: que el sistema sólo te despierte para decisiones vagas, peligrosas o contradictorias.
    • Dedupe y fuzzy decision ID: identificar decisiones no es binario; es difuso y repo-específico. Necesitamos algoritmos ajustables y feedback humano.
    • Rollbacks automáticos: si rechazas una decisión, el sistema debería revertir el cambio relevante o pedir al agente que rehaga la tarea coherentemente. Hoy eso no está pulido.
    • Spec sharding: las specs crecen. Hay que fragmentarlas en requisitos testables. Un LLM puede ayudar a shardear, pero hay que diseñarlo.
    • Integración de test runners: en la versión actual Plum está acoplado a pytest. Necesitamos soporte agnóstico: conformance tests, runners multi-lenguaje, harnesses de integración.
    • Escalabilidad: en proyectos monolíticos gigantes aún no sabemos si el approach escala. Téstealo en una rama pequeña antes de clonar tu repo legacy.

    7) Cómo se gana valor real (dejando de ser postura)

    • Haz que cada decisión importante deje rastro. No excepciones.
    • Exige aprobación humana para decisiones con impacto.
    • Vuelve la spec viva: que el archivo Markdown no sea un monumento a la intención, sino el contrato vigente.
    • Los tests deben describir intención, no solo outputs. Property tests e invariantes sistémicas son tus nuevos héroes.
    • Si un agente necesita leer 50 archivos para cambiar una función, rehace la arquitectura: modularidad extrema, boundaries claros.

    8) Diseño técnico inteligente (lo que aprendí construyéndolo)

    • Usa git hooks como checkpoint. Si el commit no pasa la validación de decisiones, el commit falla.
    • Mantén un .plumignore para no disparar reviews por cambios triviales (README, docs, etc.).
    • Almacena estado y config en una carpeta oculta (.plum). Versiona el .jsonl.
    • Deduping y parsing de specs: estructura las llamadas LLM con DSPy para hacerlas más deterministas y testables.
    • Router de modelos: no todo exige GPT-costoso. En dedupe puedes usar un modelo OSS rápido. La experiencia del dev gira alrededor de latencia.
    • Diseña la UX: permitir modos (silent, strict, dangerously-approve) para distintos contextos.

    9) Ejemplo mínimo de flujo (para que lo pruebes en 15 minutos)

    • pip install plum-dev
    • cd repo (with specs.md and pytest suite)
    • plum init → apunta a folder de specs y a tests
    • Haz cambios con tu agente y commit
    • Si hay decisiones, git commit fallará y te pedirá revisión
    • Aprobar actualiza spec; reject detona rollback o workflow manual según tu configuración

    10) Umbral y gobernanza: políticas prácticas

    • En sistemas críticos: tolerancia cero. Todo pasa por aprobación humana.
    • En prototipos: modo “agile fast-lane” para no morir de fricción.
    • En equipos mixtos: definir perfiles por carpetas/paquetes. Modules core = strict; UI experimental = lenient.
    • Pipeline: bloquear merges si spec↔tests↔código no están sync. Es duro, sí. Necesario, también.

    11) Cultura y disciplina

    No se automatiza cultura. Se diseña.

    Pide que cada PR incluya:

    • ¿Qué decisión justificó este cambio?
    • ¿Qué requisitos se actualizaron?
    • ¿Qué tests nuevos cubren la decisión?

    Y deja que la herramienta coja esos metadatos y los convierta en .jsonl rastreables.

    12) Lo práctico y lo urgente

    • Si ya usas agentes y no tienes este tipo de control, estás acelerando una deuda técnica que no podrás pagar. No es dramático; es inevitable.
    • Prioridad de adopción:
      • 1. Empezar a capturar traces.
      • 2. Agregar hooks que bloqueen commits sin revisión de intención.
      • 3. Transformar specs en contratos testables.
      • 4. Automatizar sync y coverage mapping.

    13) ¿Qué pasa si no lo haces?

    Velocidad hoy = caos mañana.

    Cuando un bug crítico aparezca a las 2 AM, nadie sabrá por qué la regla se cambió. Commits huérfanos. Blame que no sirve. Migraciones peligrosas. Equipos quemados. Clientes enfadados.

    14) No todo es miedo: oportunidades enormes

    • Auditoría real sobre decisiones: útil para compliance y seguridad.
    • Mejor onboarding: nuevos devs leen el árbol de decisiones para comprender el porqué.
    • Menos discusiones eternas en PRs: si la decisión está bien documentada, la discusión baja y la calidad sube.
    • Productividad con control: velocidad + gobernanza = ventaja competitiva.

    15) Cierre con acción concreta

    Instala la plomada. Prueba en una rama pequeña. No por postureo. Por supervivencia técnica.

    Si quieres:

    • Te mando un template de .jsonl para decisiones.
    • Te paso un flujo de PR que puedes pegar en tu repo.
    • Te doy el checklist para integrar Plum en CI en 15 minutos.

    Respóndeme este mensaje con “Mándame el template” o corre ahora:

    • pip install plum-dev
    • cd tu-repo
    • plum init
    • haz un commit con un agente y observa qué decisiones aparecen.

    Esto no acaba aquí.

    Si no empiezas a capturar intención hoy, tus agentes construirán un legado que nadie querrá mantener mañana. Empieza por un archivo .jsonl. Empieza por una regla dura en tu CI. Haz que la próxima vez que alguien pregunte “¿por qué esto existe?” la respuesta esté en el repo y no en el recuerdo difuso de una conversación vieja.

    ¿Quieres el checklist y el template ahora? Dímelo. Y mientras lo instalas, piensa en esto: velocidad sin plomada es solo una forma elegante de cavar tu propia trampa.

    Para quien está explorando gobernanza de agentes y workflows, una continuación lógica es revisar investigaciones y herramientas de integridad técnica desarrolladas por equipos que experimentan con estos retos. Consulta Dominicode Labs como punto de referencia para materiales y experimentos relacionados con trazabilidad de decisiones y automatización segura.

    FAQ

    ¿Qué es Plum y para qué sirve?

    Plum es una herramienta de gobernanza que intercepta commits, extrae decisiones desde diffs y trazas de agentes, obliga a revisarlas y las convierte en artefactos persistentes (.jsonl) y actualizaciones en specs Markdown. Sirve para capturar intención y vincularla con tests y código.

    ¿Por qué no bastan los tests y las specs?

    Porque un test valida un output y una spec es un contrato que puede quedarse desactualizado. La implementación revela decisiones operacionales que deben quedarse registradas; solo ejecutar y aprobar esos cambios garantiza que la spec refleje intención real.

    ¿Cómo se integra Plum en el flujo de trabajo?

    Plum se integra mediante git hooks que interceptan commits, revisan diffs y traces, y requieren aprobación humana para cambios con decisión. Si se aprueba, Plum actualiza specs y genera el registro .jsonl; si no, puede revertir o pedir una re-ejecución coherente.

    ¿Qué pasa si rechazo una decisión durante el commit?

    Según la configuración, el rechazo puede detonar un rollback automático del cambio relevante o iniciar un workflow manual que pida al agente rehacer la tarea coherentemente. El comportamiento exacto depende de la policy definida.

    ¿Plum afecta la experiencia del desarrollador?

    Sí: introduce una fricción intencional para decisiones relevantes. Para evitar rechazo por exceso de ruido, Plum debe soportar tolerancias dinámicas (modos silent, strict, dangerously-approve) y un .plumignore para cambios triviales.

    ¿Es Plum dependiente de un test runner?

    En su versión inicial Plum está acoplado a pytest, pero el objetivo es soportar runners multi-lenguaje y conformance tests para ser agnóstico respecto al ecosistema de pruebas.

    ¿Cómo empezar con Plum sin romper el equipo?

    Prueba en una rama pequeña, habilita modos lenientes para partes experimentales del repo y aplica tolerancia cero solo en módulos críticos. Empieza por capturar traces y agregar hooks progresivamente.

  • Cómo identificar y gestionar la deuda técnica en proyectos de software

    Cómo identificar y gestionar la deuda técnica en proyectos de software

    ¿Quieres que tu equipo deje de temer los viernes por la noche? Entonces presta atención: la deuda técnica no es un problema técnico, es un problema comercial disfrazado de código.

    Tiempo estimado de lectura: 6 min

    • Ideas clave:
    • La deuda técnica es una decisión con coste futuro; hay que tratarla como deuda comercial: medirla, priorizarla y pagarla en cuotas.
    • Las estrategias prácticas funcionan: Boy Scout, presupuesto técnico en sprints, tickets visibles, patrón Strangler y tests donde más duelen.
    • Detecta síntomas (deploys con miedo, PRs largos, regresiones) y aplica un plan de 90 días con diagnósticos y quick wins.

    Introducción

    Poca gente habla claro sobre esto. Todos hablan de “refactorizar” como si fuera una pócima mágica. Nadie te dice que hay que pagar esas facturas en cuotas, con interés, y con plan.

    Voy a contarte cómo identificarla, cuándo pagarla, cómo priorizarla y, sobre todo, cómo evitar que se convierta en una morgue de proyectos. No es teoría: es un manual de supervivencia para equipos que quieren seguir entregando valor sin enterrarse en yeso.

    Resumen rápido (lectores con prisa)

    Deuda técnica: decisión que acelera hoy y encadena mañana. Mide impacto en negocio, reserva presupuesto en cada sprint, prioriza por ROI y aplica mejoras incrementales (Boy Scout + Strangler).

    ¿Qué es la deuda técnica, de verdad?

    No es solo código feo o tests faltantes. Es cualquier decisión que acelera hoy y te encadena mañana.

    Pedir velocidad a cambio de calidad es pedir un préstamo. Si sabes que lo pides, es deuda deliberada. Si lo hiciste por ignorancia, es otra cosa — y merece formación, no romántica metáfora.

    La deuda tiene un interés: cada cambio posterior será más lento. Cada bug será más caro. Cada onboarding tomará más tiempo. Y cuando llegue la crisis, el interés se come tu ritmo de entrega.

    Cómo suena la deuda en la sala de engineering

    Frases que delatan deuda

    • “No lo toques, no vaya a romper algo” — frase clásica.
    • “Los rollouts se hacen los lunes por la mañana” — signo de miedo.
    • “Necesitamos 3 semanas para entender esto” — onboarding fallando.

    Si tu equipo dice estas frases, tienes deuda. Si además las frases salen con cara de resignación, tienes un problema estratégico.

    Tipos que importan (y cómo tratarlos)

    No todas las deudas se pagan igual.

    1) Deuda deliberada y prudente

    • Lo haces con los ojos abiertos.
    • Ejemplo: lanzar un MVP sin caché óptimo para validar mercado.
    • Cómo pagarlo: ticket en backlog, plazo definido, regla de “no crecer la superficie sin pagar”.

    2) Deuda deliberada y temeraria

    • Se hace por presión sin plan.
    • Ejemplo: copiar-pegar soluciones, no tests, no CI.
    • Cómo pagarlo: es urgente. Priorizar mitigación, pruebas, y quizá revertir la decisión de negocio si falla.

    3) Deuda inadvertida

    • Por falta de conocimiento o negligencia.
    • Ejemplo: código espagueti porque nadie revisa PRs.
    • Cómo pagarlo: formación, pair programming, código con owners claros.

    4) Deuda evolución/tecnológica

    • Dependencias sin actualizar, plataformas obsoletas.
    • Cómo pagarlo: calendarizar upgrades por riesgo, no por fecha bonita.

    Síntomas que deberían encender una alarma

    No lo adivines: mide. Estos son síntomas que indican bancarrota técnica:

    • Deployments con sudor frío y rollback semanal.
    • PRs que duran semanas por complejidad.
    • Reducción dramática de la velocidad del equipo sin razón aparente.
    • Regresiones frecuentes donde arreglas una cosa y rompes tres.
    • Tests que mienten o tardan horas en ejecutarse.

    Si ves dos o más, levanta la bandera y para la próxima feature hasta tener plan de pago.

    Estrategias que funcionan (no cuentos)

    Olvídate de “vamos a parar todo y reescribir”. Eso solo suena bien en presentaciones.

    La estrategia que funciona es incremental y política. Aquí las más efectivas:

    Regla del Boy Scout

    Deja el campamento un poco más limpio. Si tocas un archivo, arréglalo: renombra, añade un test, extrae funciones. Pequeñas mejoras constantes suman.

    Presupuesto técnico en cada sprint

    Reserva un % fijo del capacity (10–25%). Lo ideal depende de tu contexto. Si estás en hypergrowth, sube al 20%. Si estás estable, 10% puede bastar.

    Tickets visibles y priorizados

    La deuda que no está en el backlog no existe. Traduce deuda en tickets claros con impacto de negocio (tiempo de dev, riesgo, seguridad). Prioriza igual que features.

    El patrón Strangler (reconstrucción por partes)

    No reescribas el monolito. Construye nuevo alrededor y estrangula lo viejo. Migración por capas, desvío de tráfico y pruebas A/B hasta que lo antiguo deje de respirar.

    Writer único para datos críticos

    Si la deuda viene de concurrencia en escritura (bases, archivos), centraliza el writer. Evita múltiples procesos escribiendo el mismo artefacto.

    Tests donde duela

    No necesitas 100% coverage. Necesitas tests donde duele: integración crítica, pagos, seguridad y puntos con historial de fallos.

    Checklist para Tech Leads (haz que te obedezcan)

    Un listado que puedes imponer como política sin sermones:

    1. Cada PR > 200 LOC exige refactor simple o tests.
    2. Problema no documentado → no merge.
    3. Sprint: 15% de capacidad para deuda técnica.
    4. Métricas públicas: tiempo de build, tiempo de despliegue, tasa de rollback.
    5. Owners claros: cada módulo con responsable técnico.
    6. Registro de decisiones técnicas (ADR) obligatorio.

    Cómo priorizar: regla del ROI técnico

    No pagues lo que no frena tu negocio. Pregunta: ¿esta deuda impide ventas, seguridad o escalabilidad inmediata?

    Prioriza por:

    • Impacto en cliente (bugs críticos).
    • Riesgo de seguridad o cumplimiento.
    • Tiempo que retrasa nuevas features.
    • Coste de mantenimiento actual (horas/semana).

    Haz una matriz rápida: impacto vs esfuerzo. Ataca primero lo alto-impacto/bajo-esfuerzo.

    Evolución de personajes: el equipo, la feature y el legacy

    Imagina una escena: la feature (entusiasmada) quiere salir al mercado. El legacy (cansado) susurra “no me toques”. El equipo (dividido) corre para lanzar.

    Con el plan correcto, la feature sale, el equipo aprende y el legacy muere por asfixia controlada. Sin plan, la feature se convierte en otro parche que alimenta más deuda. La clave es dirigir la narrativa: que la feature evolucione, no que se enrede.

    Casos prácticos: qué hacer hoy mismo

    No necesitas permiso del CEO para estas acciones:

    1. Haz un sprint de diagnóstico (1 semana).
      • Recolecta métricas: tiempo CI, fallos, PR cycle.
      • Lista top 10 hotspots (archivos o módulos más cambiados/rotos).
    2. Empieza con 3 quick wins.
      • Añade tests en módulos críticos.
      • Elimina imports duplicados y variables globales peligrosas.
      • Automatiza un job de lint/format en CI.
    3. Define owner por módulo.
      • Asigna y documenta quien manda sobre cada componente.
    4. Programa un mes de mejoras
      • Plan de 4 semanas: cada semana 1 objetivo de deuda con entregable claro.

    Herramientas y métricas que realmente importan

    No más dashboards bonitos que no sirven.

    • MTTR (Mean Time To Recovery): si sube, hay deuda.
    • Tiempo medio de PR (days): cuando sube, complejidad.
    • Tasa de rollback: fricción operativa.
    • Coverage en paths críticos: no porcentaje general.
    • Tiempo de build y test: si CI crece, la velocidad muere.

    Cómo vender el pago de deuda al negocio (el argumento que funciona)

    No hables en técnico. Habla en riesgo, dinero y velocidad.

    • “Invertir X horas reduce tiempo de entrega de features en Y% y fallos en Z%”.
    • Muestra casos: “Reducimos rollbacks en 70% y ganamos N horas de dev/mes”.
    • Propón un plan con milestones y rollback: “Si no vemos mejora en 3 sprints, revertimos la política”.

    Cuándo sí reescribir (y cuándo no)

    Reescribir es una opción legítima. Pero sólo cuando:

    • La base de código es inentendible y ralentiza todo por encima del 50%.
    • Hay problemas legales o de seguridad que no se pueden parchear.
    • La plataforma actual impide crear valor competitivo.

    Si no, aplica strangler. Reescribir por ego o miedo es receta de desastre.

    Errores comunes que deberías evitar

    • No documentar la deuda: desaparece y vuelve peor.
    • Pay only when there are fires. (Pagar sólo cuando hay incendios.)
    • Pensar que QA soluciona deuda: QA encuentra errores, no reestructura código.
    • Ignorar la deuda cultural: sin code reviews, la deuda vuelve.

    Metáfora que pega: la deuda como jardín

    La deuda es jardín salvaje. Si lo ignoras, crece maleza y come el césped bonito. Podés dejarlo crecer por un tiempo si sólo querés probar el terreno (MVP). Pero a la larga, o contratas jardineros o el jardín se vuelve intransitable.

    Urgencia y plan de 90 días (si quieres resultados reales)

    Si te sientes valiente, este es el plan que recomiendo:

    • Día 0–7: Diagnóstico y métricas.
    • Día 8–30: Quick wins + políticas (Boy Scout + Sprint budget).
    • Día 31–60: Migraciones pequeñas (Strangler) y tests críticos.
    • Día 61–90: Medir impacto, ajustar presupuesto, presentar resultados al negocio.

    CTA directo (haz algo ahora)

    Haz esto ahora: abre tu tablero de issues, crea un epic llamado “Deuda Técnica — Sprint 0” y añade:

    • 3 métricas que vas a medir.
    • 3 hotspots para arreglar esta sprint.
    • Asignación del 15% de la capacidad.

    Respóndeme con “DEUDA YA” y te mando una plantilla de epic + checklist de 90 días que puedes pegar en tu Jira/Linear. Además te daré el mail corto y convincente para que envíes a Product/CEO y consigas el presupuesto técnico.

    Cierre — por qué esto no acaba aquí

    La deuda técnica no es un monstruo que se elimina de una vez. Es una economía: cobran intereses y cambia con el mercado. La idea no es purismo, es sostenibilidad.

    Si haces lo básico —visibilidad, presupuesto y pequeños pagos constantes— recuperarás velocidad y reducirás noches de pánico. Si no, la deuda comprará una hipoteca sobre tu tiempo de desarrollo.

    No te estoy pidiendo que seas perfecto. Te pido que seas estratégico. ¿Quieres la plantilla? Di “DEUDA YA”. Esto no acaba aquí: esto es el inicio de que tu equipo vuelva a confiar en sus despliegues.

    FAQ

    Respuesta: La deuda técnica es cualquier decisión que acelera hoy y genera coste futuro en forma de mayor complejidad, bugs o tiempo de desarrollo.

    Respuesta: Si observas dos o más síntomas (deploys con miedo, PRs largos, regresiones, subida del MTTR), detén nuevas features hasta tener un plan de pago.

    Respuesta: Reserva entre 10–25% del capacity por sprint. Ajusta según contexto: hypergrowth ≈ 20%, estable ≈ 10%.

    Respuesta: Reescribe solo si la base de código es inentendible y ralentiza más del 50%, hay problemas legales/seguridad o la plataforma impide crear valor competitivo.

    Respuesta: Publica tiempo de build, tiempo de despliegue, tasa de rollback, MTTR y tiempo medio de PR, además de coverage en paths críticos.

    Respuesta: Deuda deliberada se contrata con conocimiento y plan; inadvertida surge por falta de formación o procesos (ej.: PRs sin revisión).

    Respuesta: Traduce problemas técnicos en tickets con impacto de negocio (tiempo de dev, riesgo, seguridad), priorízalos como features y asigna owners claros.