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!

jueves, 9 de febrero de 2012

Kanban



En este post quiero empezar a hablar del uso de Kanban para soporte a producción. En entornos en los que se utiliza SCRUM para el desarrollo de productos, muchas veces hay aspectos del paradigma SCRUM que no son apropiados para resolver las necesidades de los equipos de operaciones o de infraestructuras.

Por ejemplo:

  • Iteraciones: El concepto de iteración puede resultar no apropiado porque los equipos que dan soporte a producción necesitan tener tiempos de respuesta más rápidos (apaga fuegos).
  • Equipos multidisciplinares vs. equipos especializados: Una de las bases de SCRUM, los equipos multidisciplinares (¿Quien no sueña con un desarrollador de esos a los que a veces se llama “renaissance developer”?), no puede ser aplicable en departamentos de operaciones o infraestructuras, con perfiles altamente especializados.

Y es en esos casos donde se puede utilizar Kanban. Pero… ¿qué es Kanban? ¿Cómo se compara con SCRUM? En este post daré las bases de Kanban, y en otros sucesivos me centraré en problemas más particulares y detalles de ponerlo en marcha.

Kanban se puede resumir de la siguiente forma:

  • El flujo de trabajo debe ser visible: La famosa “pizarra” de SCRUM. O, en otras palabras, divide el flujo de trabajo en diversas etapas y muéstralas. En la siguiente ilustración he puesto un ejemplo de panel Kanban que utilicé en un proyecto:




    En este caso, los diferentes colores correspondían a tipos de tareas. No es necesario distinguir entre tipos de tarea, aunque a veces puede ser útil. También se pueden utilizar diversos tableros Kanban si se tienen diversos equipos, o bien un solo tablero para todos. Además, el diseño del tablero también se puede customizar: los estados de trabajo en vertical y diferentes proyectos / departamentos en horizontal, etc.


    ¿Qué tarea se escoge para pasar al siguiente estado? Por ejemplo, dentro de la lista de tareas que están pendientes, ¿cuál será la siguiente en la que se trabajará? Kanban no prescibe un método en particular. Se pueden realizar reuniones de priorización, o bien un método más fácil: La más antigua, por ejemplo. Esto es una diferencia con el Product Backlog con prioridades de SCRUM.

  • Limita el Work in Progress: Este es el concepto fundamental. El equipo sólo puede trabajar en x elementos a la misma vez. Este número es más difícil de establecer correctamente de lo que parece a simple vista. En un principio, casi seguro que los equipos se equivocarán. Pero por la naturaleza de “prueba y error” de Kanban, el numero se irá modificando hasta que funcione.

    Es el número 4 del ejemplo gráfico anterior:





    Significa que el equipo, pase lo que pase, sólo puede trabajar en 4 elementos a la vez.

    En general:
    • Si el limite WIP es demasiado bajo, podemos tener a miembros del equipo de brazos cruzados. Esto es especialmente crítico si el tipo de tareas no son fácilmente compartidas (tipos de trabajo en los que poner a más personas trabajando en ellas sólo creará problemas).
    • Si el límite WIP es demasiado alto, baja el tiempo de respuesta. Nos acercamos a la forma de trabajar tradicional (estamos en mil cosas y no acabamos ninguna). No se sabe nunca cuando el negocio tendrá resolución y, además, no hay presión para solventar cuellos de botella porque el equipo se puede poner a trabajar en otra tarea sin problemas.


    A veces, encontrar el límite de WIP correcto llega a parecerse más a un arte que a una ciencia.
    En algunos casos, también se pueden poner límites en otras columnas. Por ejemplo, en “paso a producción”. Esto ayuda porque así evita que se acumulen elementos en cualquier estado.
    En general, las ventajas son que limitando el WIP tenemos una forma muy gráfica para detectar cuellos de botella y que conseguimos que el equipo se concentre en resolver el trabajo que tiene entre manos.

  • Mide y optimiza el tiempo medio para completar un elemento: A esto se le llama “tiempo de ciclo”, en inglés “Lead time”. Es importantísimo porque el “Lead time” es la base de las expectativas de negocio y también se utilizará para ir adaptando el límite de WIP hasta llegar a un valor óptimo para cada equipo.




    Aunque ahora no me extenderé sobre el tema, es bastante lógico deducir que para que la métrica de “Lead time” tenga sentido, las tareas deben tener tamaños más o menos equivalentes. O, si no es así, tener una medida en “horas-hombre”, “puntos de historia”, etc. Las tareas se priorizan y se estiman en reuniones de planificación, que en el caso de Kanban se pueden establecer cuando sea más necesario.

Resumiendo, muchas veces se utiliza Kanban para el soporte a produción y SCRUM para el desarrollo. Ambos comparten principios comunes, lo que los hace perfectamente compatibles. Sobretodo, los dos están basados en la evaluación continua. El método de la prueba y el error. En este aspecto, SCRUM es más restrictivo que Kanban. En SCRUM, la reunión de retrospective es imprescindible y se realiza al final de una iteración. En Kanban, no hay limitaciones al respecto. Y cuando “insertamos” retrospectives de forma más o menos organizada en un método Kanban, estamos llegando a un sistema que se ha empezado a llamar “Scrumban”.