jueves, 5 de julio de 2012

Technical Debt / Deuda Técnica




Una de las cuestiones que cualquier proyecto Ágil necesita tener en cuenta es cómo solucionar el technical debt o deuda técnica.

El desarrollo en iteraciones cortas puede llevar a entregar una funcionalidad que no está "completa" desde un punto de vista de diseño/arquitectura más general. Desarrollamos una funcionalidad concreta; no tenemos tiempo de pensar cómo ésta encajaría si diseñásemos una aplicación más amplia y nos centrásemos en construir una solución escalable y robusta.

En los proyectos waterfall "tradicionales", la solución está diseñada "por completo" desde un principio. El "gran proyecto" se piensa y se diseña por adelantado y luego la fase de desarrollo consiste en implementar ese diseño al nivel acordado de calidad. Nada de deuda técnica, entonces. Pero... !Esto no es cierto! Y no es cierto porque los proyectos waterfall tienen estimaciones y plazos. Y las estimaciones y los plazos son las dos fuerzas opuestas que comprometen la calidad. Las estimaciones pueden (y serán) erróneas, pero el plazo no se puede modificar (o al menos eso es lo que piensa la dirección). Así que por lo general un proyecto waterfall se inicia con el equipo entregando software de calidad y termina con ese mismo equipo incurriendo en deuda técnica cuando se acerca la fecha límite y se dispara la presión.

De todos modos, volviendo al mundo Ágil. Sí, normalmente tenemos deuda técnica y tenemos que hacerle frente. Mi opinión es que el equipo debe tener el "poder" de decidir la cantidad de deuda técnica que quiere abordar en un sprint en particular, siempre y cuando se consulte con el product owner y esté de acuerdo en las razones eximidas por el equipo.

El equipo técnico es el que conoce mejor el riesgo de acarrear deuda técnica. Así que debe ser capaz de explicar y negociar con el product owner la inclusión de tareas para solucionarlo durante un sprint. Es un ejercicio útil, porque no sólo hace que el product owner sea más consciente de lo que realmente significa el desarrollo de software, sino que también ayuda al equipo de desarrollo a superar la tentación de tener sprints puramente técnicos. ¡Por algo tenemos el product owner!

Y no sólo eso. Cuando se sugiere cuanta deuda técnica debe incluirse en un sprint, el equipo técnico debe tener en cuenta lo siguiente:
  • Naturaleza del proyecto/funcionalidad: Algunas características se desarrollan porque se cree que son una gran idea, pero una vez que se entregan a los usuarios, resulta que no son tan útiles, no son realmente utilizados, o incluso pueden llegar a desaparecer (todo el mundo conoce la regla 80/20).
    Mientras que otras características resultan ser grandes éxitos. Son éstas las que tienen que ser escalables y sólidas. Son estas las que mayor importancia tienen si hablamos de deuda técnica.
    No hay ninguna razón para tratar de abordar toda la deuda técnica, sino centrarse en lo que va a tener continuidad.
  • Encontrar el equilibrio adecuado entre las tareas técnicas y las tareas de desarrollo de nuevas funcionalidades: Cuando se inicia un proyecto Ágil, el negocio comienza a recibir funcionalidad antes que en un proyecto waterfall tradicional. Pero... ¡Cuidado! Si después "gastamos" un montón de sprints dedicados sólo a abordar la deuda técnica y no a la entrega de características tangibles para el negocio, (por muy importante que lo "techie" sea), corremos el riesgo de desilusionar a los usuarios. Es irónico pensar que lo que hemos hecho sea "malcriar" a los usuarios, pero en cierta manera es lo que hacemos con un proyecto Ágil. ¡Y necesitamos tener usuarios satisfechos!