jueves, 25 de mayo de 2017

"Flecos" de implementación y gestión ágil de proyectos

Para implantar métodos que resulten eficaces hay que entender la naturaleza de la construcción de software. Teóricamente, desde el punto de vista técnico, si disponemos de cierto tiempo podremos preparar (definir, diseñar y estimar) adecuadamente el trabajo que se va a implementar (programar y probar), de tal forma que una vez hecha dicha implementación ésta sea totalmente satisfactoria, que no se requiera trabajar más en ella. Sin embargo, por una parte, la certeza en cuanto a corrección y completitud de dicha preparación no suele ser muy alta, y por otra, cuando el cliente ya puede interactuar con algo tangible suele desear mejoras :-). Esto hace que desde unos requisitos ya implementados aparezcan "Flecos"; mejoras (o incluso fallos) que corresponden a una continuación del trabajo iniciado por un ítem (Historia de Usuario) que ya dábamos por terminado. Aunque los flecos incomoden, es más importante saber gestionarlos que conseguir que no aparezcan (objetivo difícil de conseguir en desarrollo de software). Además, una estrategia puramente ágil, centrada en el desarrollo incremental, promueve los flecos y su gestión. Esta inconveniencia se amortiza con creces en comparación con una estrategia tradicional. Solo desde el punto de vista de la especificación ya estamos evitando el "Análisis-Parálisis", un problema mucho más grave (lectura recomendada: ¿Análisis-Parálisis o No Análisis?. MVP la respuesta razonable).

Para gestionar dichos flecos una opción sería continuar (o reabrir) el mismo ítem original para extenderlo con los flecos que se van detectando. Esta alternativa no es recomendable porque no permite fácilmente distinguir entre lo ya realizado y lo pendiente (asociado a los flecos). Además, psicológicamente no es bueno que se trabaje en algo de forma muy prolongada sin terminarlo (o reabriéndolo una y otra vez). Así pues, recomiendo que los flecos siempre se representen con nuevos ítems dando por terminado el ítem original o los flecos ya abordados. Además, si los flecos están representados como ítems por separado pueden competir individualmente por prioridad con otros ítems, es decir, los flecos puede que ya no sean prioritarios cuando los contrastamos con todo el trabajo pendiente. Así pues, los flecos deberían tener una trazabilidad del tipo "es continuación de" o similar con respecto al ítem original.

Esta naturaleza imperfecta pone en jaque a una mentalidad tradicional para construir software, en la cual, un ítem se prepara y se implementa con la idea de ser terminado al primer intento, sin flecos :-). Si desde una perspectiva ágil además añadimos mucha interacción con el cliente, entregas frecuentes, reuniones de revisión, desarrollo incremental, etc., se desata tempranamente la identificación de flecos, especialmente cuando se trata de requisitos implementados y ya entregados, y más aún si esos requisitos tienen cierto éxito entre los usuarios (por ser muy apreciados y/o porque se utilizan con mucha frecuencia).

En la siguiente figura se ilustra cómo en un proceso iterativo e incremental el trabajo se va preparando e implementando incrementalmente. Obviamente en un desarrollo de un nuevo producto hay un breve período inicial de establecimiento del Backlog con la identificación de ítems y la preparación de los que se implementarán en el primer Sprint. A partir de allí la preparación se repite para cada siguiente Sprint, pero a partir del término del primer Sprint ya podríamos estar detectando flecos. Estos flecos aparecerán como ítems en el Backlog y según su prioridad se irán incorporando en los siguientes Sprints como ítems de mejora o de corrección de fallo. Así pues, la implementación de nuevos requisitos no se concentra toda en una fase inicial, ni tampoco la implementación de los flecos tiene que ser relegada a una fase más hacia el final.



Un enfoque ágil promueve la aparición temprana de flecos y su gestión como nuevos ítems que deben ser priorizados. Esto que parecería algo negativo (y lo es en un sentido tradicional) pues representa cambios no previstos, pero resulta ser una gran ventaja ya que los flecos se detectan y gestionan tempranamente.

Cuando afirmamos que con un enfoque ágil se gestionan mejor los cambios, en gran medida nos referimos a dicha identificación y gestión de los flecos de implementación (lectura recomendada: ¿Por qué un enfoque ágil permite gestionar mejor los cambios en un proyecto?). Obviamente los flecos y cambios en general nos incomodan, pero esto hay que valorarlo con una visión global del proyecto, ya que su detección y gestión tardía probablemente comprometería el éxito del proyecto. Más aún, el hecho que los flecos compitan con otros ítems pendientes ofrece la oportunidad para que el cliente discrimine entre lo esencial y lo prescindible de cada uno de los requisitos. El cliente podría ir interactuando con versiones parciales/incompletas pero tangibles (implementadas) del requisito, hasta el punto que considere que se ha alcanzado "un MVP" del requisito, lo cual dejaría espacio para la implementación de otros requisitos que de otra forma se habrían descartado por falta de capacidad o tiempo para implementarlos.

Asumir que existirán cambios y gestionarlos conlleva prestar atención continuamente al alcance del proyecto  (lectura recomendada: Gestión del Alcance en un Proyecto Ágil ) y correspondientemente negociar con el cliente. Una medida preventiva para abordar un margen de cambios imprevistos es considerar un Buffer de Capacidad para proyectos ágiles.



Patricio Letelier

domingo, 21 de mayo de 2017

Una estrategia MVP para abordar Épicas

Una Épica es un ítem "grande" (y/o complejo) que supone un importante esfuerzo para terminarlo. Pero ¿de qué  tamaño de esfuerzo estamos hablando? y ¿por qué tenemos que prestar atención especial a las Épicas?. En cuanto a tamaño me refiero a un ítem que, una vez definido y estimado, en su ejecución (básicamente su implementación y pruebas) se necesitaría más de una semana de trabajo. Uso este tamaño orientativo para una Épica porque un período de una semana, desde que se encarga la ejecución de un ítem al equipo hasta cuando lo termina, es un período "saludable", así no se arrastra trabajo sin terminar de una semana a otra. Además, si trabajamos con Sprints de 2 o tres semanas de duración es razonable que un ítem no cope gran parte de dicha duración, dejando espacio para otros ítems y haciendo más visible el progreso del trabajo medido en ítems terminados.

Las Épicas son más usuales cuando se comienza a construir un producto o cuando se hace una extensión importante de un producto existente. Esto es así porque con los nuevos requisitos tenemos una tendencia natural a ser ambiciosos en cuanto a funcionalidad, y más aún, para conseguirla toda a la vez :-). Las mejoras (de requisitos ya implementados) y correcciones de fallos no suelen caer en categoría de Épicas.

En la siguiente figura se presentan 4 alternativas para enfrentar Épicas, haciendo analogía (un poco forzada) con lo que sería enfrentarnos zanparnos mucha comida.


En la imagen superior izquierda se ilustra la opción por defecto, no hacer nada en especial para abordar una Épica, asumiendo que se tardará un tiempo importante en terminarla y que esto puede conllevar inconvenientes. En la imagen superior derecha, aunque se mantiene la Épica como un solo ítem, éste se aborda colaborativamente, por ejemplo, dos o más desarrolladores trabajando a la vez en en la Épica. Esto haría posible terminar la Épica en un tiempo más corto y evita complicaciones que pueden surgir por dividir la Épica en ítems más pequeños. Esta opción es aconsejable cuando la Épica no es muy grande, es decir, cuando abordada colaborativamente sí que es posible terminarla dentro de una semana de trabajo.

La imagen de abajo a la izquierda ilustra dicha división de la Épica en ítems más pequeños. La división de una Épica en varios ítems es atractiva cuando se pueden abordar en paralelo varios de esos ítems. Pero el hacer trabajo en paralelo se ve obstaculizado cuando los ítems no son bastante independiente debido a las dificultades de coordinación e integración que puede conllevar la terminación dichos ítems.  Otro importante inconvenientes es que al dividir la Épica podemos estar perdiendo la oportunidad de identificar lo esencial respecto de lo secundario, es decir, no cuestionar si es imprescindible implementar toda la Épica.

La opción de abajo a la derecha, intenta ilustrar que en lugar de zamparnos gran cantidad de comida a la vez, que lo mejor es hacerlo de forma progresiva y estratégicamente organizado para una dieta equilibrada. Esta es la opción más alineada con un enfoque ágil auténtico, pero siempre que se lleve a cabo con una orientación de MVP (Minimun Viable Product). Desarrollar una Épica con orientación MVP significa desarrollarla incrementalmente, paso a paso, poniendo el primer objetivo en una implementación mínima pero satisfactoria para una determinada versión del producto. Es decir, tal como se aplica MVP a nivel de producto como un todo, aplicarlo a nivel de una Épica. En la práctica esto conlleva discriminar entre lo esencial y lo secundario de la Épica. En términos de división de la Épica, solo necesitamos establecer dos ítems; uno como primera versión de la Épica y otro representando el "resto" de la Épica. Si trabajamos con Sprints el ítem primera versión se incluye en el Sprint y el "resto" se mantiene en el Backlog. Una vez terminado el ítem correspondiente a la primera versión MVP de la Épica el proceso puede repetirse con el ítem "resto" de la Épica. Esto continuaría hasta que se consuma y termine todo el trabajo restante de la Épica o hasta que el "resto" ya no sea tan prioritario en comparación con otros ítems pendientes. Es precisamente esta última situación la gran diferencia respecto de una división temprana del una Épica en varios ítems. Cuando se desarrolla incrementalmente una Épica, todo su desarrollo puede ser incremental, es decir, no es necesario definir en detalle toda la Épica, sino solo el MVP que se va a implementar inmediatamente (lectura recomendada: ¿Análisis-Parálisis o No Análisis?. MVP la respuesta razonable).  


Patricio Letelier