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”.

jueves, 17 de noviembre de 2011

Un buen SCRUM Master / A good SCRUM Master



Mucho se habla (sobretodo en los procesos de selección) sobre las cualidades que un buen SCRUM Master debería tener, aparte de los conocimientos técnicos.

Es un tema de vital importancia y como tal, se discute también en trainings, cursos de certificación y en muchos foros. Porque, como en todos los trabajos, a veces son las "soft skills" las más difíciles de evaluar. Cuando contratamos a un desarrollador de software, tenemos claro las habilidades técnicas que requerimos (Java, C++, SQL, lenguajes de scripting, etc...), pero a la hora de identificar las “soft skills”, muchas veces nos limitamos a listar una serie más o menos estándar, porque tampoco somos capaces de darles la justa importancia: Queremos a alguien con capacidad de comunicación, entusiasta y "team player". Seguro que las habéis leído en las ofertas miles de veces.

En el caso de un SCRUM Master, estas "soft skills" son aún más importantes si cabe. Precisamente son sus "soft skills" las que le harán tener éxito. Si el SCRUM Master ha sido en un pasado (o es todavía) jefe de proyecto, muchas de las cualidades que necesitará ya las ha tenido que poner en práctica. Pero si el SCRUM Master es un técnico, la cosa se complica.

Según mi experiencia, las cualidades que van a hacer que un SCRUM Master tenga éxito son:
  • Ser un buen comunicador.

    La comunicación no es una parte importante... ¡es esencial! Se calcula que un 90% del tiempo de un jefe de proyecto es la comunicación. No conozco datos sobre qué % aproximadamente pasa un SCRUM Master comunicando (cuando ejerce como tal, no cuando hace otras tareas), pero me atreviría a decir que es un porcentaje similar.

  • Ser "bueno" con la gente.

    Puesto que esta definición es demasiado amplia y abstracta, me concentraré en los rasgos que más importantes me parecen: Ser paciente, ser capaz de entender que cada persona es diferente, saber tratar con diferentes caracteres, saber escuchar y saber razonar. A veces se dice que ser SCRUM Master es un poco como ser el padre/madre del grupo. Y para los que tienen background de jefes de proyecto, este símil no les parecerá extravagante.

  • Conocer bien la teoría de SCRUM.

    Sí, es importante. Por eso es recomendable que quien ejerza de SCRUM Master esté certificado o haya atendido alguna formación. Por ejemplo, es básico conocer y ser capaz de explicar la importancia del SCRUM diario. Si tenemos un miembro del equipo que sistemáticamente no atiende el SCRUM diario, no dejarlo pasar ("lo importante es que saca el trabajo adelante"), sino hacer hincapié, razonando, en que ciertas "reglas" de SCRUM hay que seguirlas. Por algo hay pocas.

  • Y finalmente, ser expeditivo, o en otras palabras, ser bueno resolviendo problemas.

    Tener esa capacidad de "arreglar las cosas", y no me refiero a arreglar descalabros técnicos, sino situaciones comprometidas, obstáculos, dificultades de todo tipo. No en vano, una de las tareas más habituales del SCRUM Master (que se cita y se practica al obtener la certificación) es la de "quitar obstáculos" (en inglés "remove blockers / remove impediments"). Por cierto, que en este ámbito, tener una "lista de obstáculos pública" muchas veces ayuda. Da visibilidad.

viernes, 21 de octubre de 2011

Estimaciones / Estimations



Es de sobras conocido que la estimación es una de las áreas más problemáticas en todo proyecto de software. Pero en esta entrada no quiero centrarme en los problemas más habituales cuando estimamos (cómo conseguir estimaciones lo más cerca de la realidad posible), sino en un punto directamente relacionado con SCRUM. Un punto en el que he visto, muchas veces, que hay confusión.

Por si fuera poco con los problemas intrínsecos de la estimación, cuando estamos empezando a trabajar con SCRUM surgen dudas, que yo llamo "logísticas", sobre cómo vamos a estimar. ¿En horas? ¿En puntos de historia? ¿Qué relación hay entre las unidades de estimación y estimar en tareas o historias de usuario?

Voy a explicar mi punto de vista, basado en mi experiencia. Pero quiero dejar claro que no hay un método estándar. Es cierto que algunas herramientas (estoy pensando en TFS) pueden predeterminar cómo entrar las estimaciones (por ejemplo en horas), pero no hay una fórmula mágica. Y esto es bueno, porque es flexible.

SCRUM te da la posibilidad de adaptar cómo estimamos a nuestra necesidad. En general, las historias de usuario se estiman en puntos de esfuerzo mientras que las tareas en horas.

Las historias de usuario forman el Product Backlog. Del Product Backlog, las escogeremos para nuestro Sprint (el Product Backlog está ordenado por prioridades del negocio) y compondremos con él el Sprint Backlog.

En la reunión de Sprint Kickoff, analizaremos las historias de usuario y refinaremos su estimación. Aquí es donde yo suelo descomponer las historias de usuario en tareas y asignar horas.

Es decir:
  • Las estimaciones de las historias de usuario son más globales y las utilizo para dar estimaciones al negocio. Es muy útil en el caso que el negocio necesite tener buenas estimaciones del proyecto en sí: cuando, por ejemplo, es crítico cumplir plazos.

  • Las estimaciones en horas por tareas las utilizaré para controlar el Sprint, con el Burndown Chart.
Esta es una forma de hacerlo, pero no la única. Por ejemplo, en un proyecto que realicé tuvimos suficiente con las estimaciones de historias de usuario, puesto que eran pequeñas, (de 1 o 2 días de duración), y no valía la pena dividirlas en tareas. Como en ese caso tampoco utilizábamos ninguna "herramienta sofisticada" para llevar el tracking del proyecto (nuestro Sprint Backlog era un fichero excel y nuestro Burndown Chart, un gráfico derivado de dicho excel), pudimos cambiar nuestro "modus operandi" y trabajar con puntos de esfuerzo sin mucha complicación.

En general es importante entender los conceptos básicos (historias de usuario, tareas, etc.), pero es más importante aún saber adaptarlas a tu entorno (necesidades del negocio, equipo, etc.). Y, muchas veces, cambiar: A veces el equipo puede tener dificultad estimando en puntos de esfuerzo por estar muy habituado a estimar en horas, mientras que otras veces, al cabo de poco, estimar en puntos de esfuerzo resultará más afinado.