viernes, 28 de marzo de 2014

7 diferencias entre una planificación tradicional y una ágil

Una de las cuestiones que suele subvalorarse o no entenderse con facilidad al implantar prácticas ágiles es el cambio de chip que conlleva el agilismo en cuanto a la planificación. Normalmente existe una cierta resignación respecto de que el plan, aunque necesario y útil para arrancar el proyecto, luego, pierde protagonismo en el día a día del proyecto. Durante la ejecución del proyecto el plan suele ser visto más como un apoyo para el control del proyecto que para gestionar la posible re-planificación y reorientación del del proyecto. En ámbitos de proyecto con una alta dinámica en cuanto a cambios, la planificación y el plan, para ser útiles, deben acoplarse al día a día del proyecto.

Antes de entrar en materia respecto de las diferencias entre planificación ágil y tradicional hay que enfatizar que al implantar agilismo en un equipo-proyecto/producto/servicio lo primero que debería evaluarse es si efectivamente en dicho contexto específico tiene sentido planificar :-). Cuando la demanda de trabajo proveniente desde la parte cliente NO se agrupa para acordar su entrega en un plazo, es decir, si lo que se espera es que el trabajo solicitado por el cliente se entregue continuamente, en este caso, lo esencial es priorizar continuamente el trabajo pendiente, abordar el trabajo más prioritario y entregarlo en cuanto se termine (intentando cumplir con ciertos niveles de acuerdo de servicio que puedan haberse acordado). Si la dinámica de cambios del proyecto es muy alta, el esfuerzo invertido en planificación puede ser significativo y probablemente no llegue a rentabilizarse. En estos casos lo pragmático sería centrarse en generar ese buen flujo de trabajo terminado que nos lleve a avanzar hasta la finalización del proyecto. En esta situación la estimación del trabajo y su contraste con la capacidad del equipo podría ser opcional o incluso no hacerse. Lecturas recomendadas: Patrones para planificación y seguimiento ágil y ¿Kanban o Scrum? that is not the question.

Bueno, hecho ya este paréntesis previo, en el resto de este post supondré que en el contexto de trabajo al cual nos enfrentamos la planificación tiene sentido.


La imagen anterior ilustra a grandes rasgos las diferencias entre un plan ágil y uno tradicional. A continuación se detalla en una tabla algunos aspectos de la planificación que considero más destacables, pero no pretende cubrir todos los aspectos que podrían contrastarse. Así también, cada aspecto es planteado en términos de lo que usualmente se hace (o se supone que se debería hacer) cuando se aplica cada enfoque. Sin embargo, en un contexto específico para algunos aspectos de la planificación lo más apropiado podría sea una mezcla tradicional-ágil, o que algunos aspectos convenga abordarlos de una forma tradicional y otros de una forma ágil.

Aspecto de planificación
Enfoque Tradicional
Enfoque Ágil
Elementos del plan
Fases o tareas que normalmente se refieren a actividades técnicas que realizará el equipo, no a elementos solicitados explícitamente por el cliente. Se suele incluir tareas asociadas al inicio y cierre del proyecto.
Sprints que contienen ítems de trabajo. Los ítems de trabajo son parte del resultado final del proyecto, es el cliente quien los establece. Normalmente no se incluye el trabajo asociado al inicio y cierre del proyecto, el trabajo en un sprint se centra en lo que sería la ejecución del proyecto.
Resultado asociado a hitos
El resultado de la fase o tareas, no es necesariamente una parte del resultado final del proyecto, podría ser un resultado intermedio que no forme parte de lo que el cliente va a explotar como resultado del proyecto.
Se obtiene un incremento hacia el resultado final del proyecto. Dicho incremento “potencialmente” podría ser utilizado por el cliente, o al menos validado (antes de finalizar el proyecto).
Frecuencia de hitos
No regular, y pueden estar bastante distanciados.
Regular, se intenta que los sprints tengan la misma duración. Un sprint no debería durar más de un mes.
Ordenamiento del trabajo
Basado en el ordenamiento de las tareas técnicas y sus dependencias. No suele intervenir el cliente en el ordenamiento de tareas.
Basado en priorización de ítems de trabajo. La priorización la decide el cliente considerando principalmente el valor del ítem en el contexto del resultado final del proyecto. Los ítems más prioritarios se realizarán en los primeros sprints.
Gestión de alcance
Se hace una distribución global de todo el trabajo indicando fechas de inicio y término de tareas. El alcance suele ser fijo y acorde a él se establecen los recursos y plazos, los cuales podrían quizás irse ajustando. 
Se cuenta con un Backlog (una lista ordenada de todo el trabajo pendiente). Poco antes de iniciar un sprint se cogen los ítems más prioritarios del Backlog y se incluyen en el próximo sprint contrastando el esfuerzo asociado con la capacidad del equipo. Los cambios se reflejan en el Backlog modificando o añadiendo ítems, ante cualquier cambio se debe evaluar el punto del Backlog hasta el cual se sigue considerando como alcance del proyecto. Es decir, lo usual es fijar los recursos  y plazos, y dar la oportunidad de introducir cambios, los cuales posiblemente dejen fuera parte de los ítems inicialmente incluidos en el proyecto (serían ítems de menos valor para el cliente). Lectura recomendada: Gestión de alcance en un proyecto ágil.
Asignación de responsables y estimación
Suele hacerse una pre-asignación de responsables. Tanto dicha asignación como la estimación del trabajo no suele hacerla el equipo.
Se promueve la auto-gestión del equipo. El equipo realiza las estimaciones de esfuerzo. La asignación de responsables la decide el equipo y normalmente se posterga hasta que se va a realizar el trabajo.
Cambios y re-trabajo
Cualquier cambio en el resultado esperado del proyecto así como la aparición de re-trabajo (trabajo que debe repetirse total o parcialmente por detectarse algún defecto) no es bien recibido, no solo por el impacto en el trabajo, sino por los trastornos que genera en la planificación.
El re-trabajo, no suele implicar mayores trastornos pues es tempranamente detectado. Entre la definición de un ítem y su realización no suele haber un tiempo considerable pues los ítem se detallan lo más tardíamente posible respecto de cuando efectivamente se realizarán. Como se comentó antes, los cambios se gestionan sin mayores inconvenientes en el Backlog, intercambiando nuevos ítems con ítems no realizados aún, manteniendo siempre actualizado y acordado el alcance con el cliente.



martes, 18 de marzo de 2014

Gestión ágil de requisitos o ¿cuál y cuánta documentación/especificación es suficiente?

En el 2005 Alan Davis, un reconocido gurú de la ingeniería de requisitos (en su enfoque tradicional), publicó su libro "JERM: Just Enough Requirements Management". Cuando por esos años este libro cayó en mis manos yo llevaba ya unos cinco años experimentando con métodos ágiles . El mensaje del libro, claramente reflejado en su título, fue para mí la confirmación respecto a que la ingeniería de requisitos ágil conlleva un cambio de chip importante, pero que también es más complejo que la ultra simplificación y entusiasmo asociado a especificar requisitos al estilo "Como [usuario] quiero [funcionalidad] para [beneficio]", ... sí me refiero a las Historias de Usuario :-).

La cuestión clave que nos gustaría poder responder es cómo y con cuánto detalle deben establecerse los requisitos. La respuesta obvia es "depende", pero se trata además de un "depende" a nivel de requisito, no de tipo, tamaño o cualquier otra clasificación global a nivel de sistema. Un requisito bien especificado es aquel que el cliente es capaz de validarlo y aquel que el equipo es capaz de entenderlo para implementarlo y probarlo. Según esto también deberíamos considerar la experiencia y conocimientos del equipo, lo cual en una situación favorable podría hacer que se necesite menos detalle en la especificación del requisito. Además, la complejidad o innovación asociada al requisito podría aconsejar hacer su implementación de forma incremental, así la especificación también podría hacerse incrementalmente. Finalmente, en cuanto a cómo especificar un requisito, disponemos de múltiples alternativas: texto narrativo, plantillas, diagramas (UML u de otro tipo), métodos formales, etc., cualquiera de estas alternativas puede ser útil, y por supuesto, también podrían usarse mezclas de ellas.

Según lo anterior, lo que incomoda es no tener una respuesta global, y tener que decidir ese "cómo y cuánto" de la especificación de cada requisito, uno por uno, y quizás con diferentes estrategias. Sin embargo, es precisamente así como se consigue la máxima eficacia y eficiencia; ajustando la estrategia a las necesidades de cada requisito.

Veamos un ejemplo muy sencillo. El siguiente formulario implementa la funcionalidad "Registro de nuevo usuario" en facebook. En términos de requisito clásico probablemente hubiésemos establecido este requisito como un Caso de Uso con el mismo nombre. Si bien la granuralidad típica de una Historia de Usuario tiende a ser más pequeña que la usual en Casos de Uso, aquí por tratarse de una funcionalidad ya de por sí "pequeña" podría también coincidir con una Historia de Usuario, al estilo, "Como [Usuario No Registrado] quiero [Registrarme en facebook] para [Disponer de un espacio en la red social]". Pero independiente de la granuralidad escogida, si nos centramos en lo importante, es decir, qué debería especificarse para poder llegar a una implementación final como la mostrada en este formulario de registro, ¿cuál sería la mínima especificación que podría validar un cliente y a la vez implementar y probar un equipo?.


Una situación extremamente positiva sería la siguiente. Si ya hubiésemos implementado esta funcionalidad en otro sistema, o si en nuestro contexto esta funcionalidad ya viene dada (por ejemplo como parte del framework de desarrollo) y coincide con las necesidades del cliente, es estos casos ni siquiera sería necesario especificar más que el nombre del requisito, probablemente el único trabajo adicional sería configurar dicha funcionalidad y/o integrarla.

Supongamos ahora una situación en la cual dicho formulario habría que desarrollarlo. ¿qué es lo mínimo que deberíamos acordar con el cliente y especificar para que el equipo puede implementarlo y probarlo?.

Ojo! que cuando digo "especificar", cabe la posibilidad que se trate simplemente de una conversación, es decir, que no esté plasmado en una ficha o documento.

Básicamente, para cualquier requisito como el del ejemplo sería conveniente conocer:
  • Lo elementos que se visualizarán y el formato de los valores mostrados (que no sean obvios)
  • Los valores por defecto que puedan necesitar los elementos de entrada de datos
  • Los elementos de entrada de datos que permiten valor nulo
  • Los elementos habilitados o deshabilitados según cierto estado del sistema
  • La lógica asociada a cada una de las interacciones posibles con la página o formulario
En el caso concreto del formulario de registro antes mostrado, en algún momento se llegaría a acordar/especificar aspectos tales como (me los he inventado :-)):
  • El formulario de registro incluye nombre, apellidos, email (introducido en dos campos), contraseña, fecha de nacimiento y sexo. (Además, se podría adjuntar un boceto ilustrando la disposición de los campos y etiquetas asociadas).
  • Ningún campo permite valor nulo.
  • Al lado de la fecha de nacimiento hay un enlace para acceder a la explicación de por qué se solicita esta información.
  • El sexo es un grupo de botones de radio, sin valor por defecto.
  • Sobre el botón de registro se muestra un texto que permite acceder a las Condiciones del registro, la Política de uso de datos  y al Uso de cookies.
  • La contraseña debe cumplir la política de contraseña segura (esta política se supone conocida)
  • La fecha se introduce con año, mes y día, en campos separados y como un alista de valores
  • Al salir de un campo, éste de verifica inmediatamente y en caso de no cumplir con las restricciones establecidas se indicará con un símbolo de exclamación y un mensaje explicativo. 
  • No se permite que el email coincida con uno ya registrado
  • El valor de los dos campos de email deben coincidir 
  • La fecha de nacimiento no puede ser mayor que la fecha actual ni más de 120 años atrás.
  • Al presionar el botón Registrar y cumpliéndose todas las restricciones del formulario se enviará un email con un enlace para activar la cuenta.
  • Si se realiza la activación de la cuenta, el usuario puede acceder a una cuenta nueva usando su email y contraseña. 
  • El enlace caduca después de un día, y en este caso el registro se cancela.
  • El formulario de registro se muestra en el idioma seleccionado por el usuario.  

¿Vale la pena acordar/especificar todo este detalle?. 

Esta funcionalidad es sencilla (comparada con otros requisitos de un sistema), además es una funcionalidad que no aporta valor al usuario (aunque es imprescindible), es decir, no está relacionada con la esencia de la aplicación (en este caso las funcionalidades que apoyan la interacción entre usuarios de la red social). Desde este punto de vista, este requisito debería ser discriminado en cuanto a prioridad de implementación y esfuerzo invertido. Podríamos, por ejemplo, ofrecer una propuesta ya hecha y confirmarla esperando refinamientos de manera informal (mediante conversación). Sin embargo, desde una perspectiva de pruebas, el detalle mostrado es exactamente el necesario a nivel de pruebas de aceptación (pruebas para demostrar que el sistema desde la perspectiva del usuario cumple con el comportamiento esperado). De hecho, si a cada una de las sentencias de la lista anterior le añadimos el prefijo "Comprobar que" tendríamos ya enunciadas las pruebas de aceptación de dicha funcionalidad.

Las especificaciones del software cambian, "todo producto software exitoso tendrá mantenimiento". Este es otro desafío que debe considerarse. En un extremo podríamos resignarnos a que, por ejemplo, si dicha especificación existe y se entrega con la primera versión puesta en producción, posteriormente no se actualiza. En este caso para el mantenimiento se irá directamente al código y BD para conocer el funcionamiento. En otro extremo, podríamos mantener siempre actualizada la documentación para ayudar al mantenimiento del sistema (con el esfuerzo que esto puede suponer), especialmente si el mantenimiento es intenso y la documentación, valga la redundancia, la forman documentos narrativos, de por sí no fáciles de modificar sin caer en inconsistencias. Las pruebas de aceptación constituyen una solución intermedia pues por un lado pueden describir en detalle el comportamiento del sistema, y por otro son más fáciles de gestionar que texto narrativo extenso o plantillas. Básicamente hacer mantenimiento de una documentación basada en pruebas de aceptación consiste en añadir, modificar o eliminar pruebas de aceptación. 

Aún siendo nuestro ejemplo un caso muy sencillo, nos ofrece pistas interesantes respecto de la especificación de requisitos, ellas son:
  • Al comienzo, la especificación podría ser informal, permitiendo comenzar la implementación, pero su posterior verificación mediante pruebas necesitará un mayor detalle, el cual podría aun no estar explícitamente escrito, pero que obviamente el encargado de testear lo agradecería :-). Un inconveniente a tener en cuenta en este caso es que quien realice la implementación podría no contar explícita y detalladamente con las pruebas que deberá cumplir su implementación, con lo cual estaremos asumiendo el riesgo asociado a que se produzca re-trabajo.  
  • La especificación mínima se corresponde con las pruebas de aceptación que comprobarán que el sistema se comporta según lo esperado (desde la perspectiva del usuario). Además, que la especificación se base esencialmente en pruebas de aceptación es rentable, se aprovecha para la implementación (cuando se definen antes), pero también en el momento de hacer el testeo de aceptación, pues ya están enunciadas y acordadas con el cliente.
  • La intensidad, el nivel de detalle, debe ser adaptable a las necesidades del requisito, y debe también considerar la experiencia del equipo de desarrollo.
  • Las pruebas de aceptación pueden ser una forma de documentación especialmente adecuada para sistemas con mantenimiento intenso y en los cuales se quiere mantener actualizada dicha documentación.  
Seguro que alguien estará pensando que estas reflexiones están en la línea de los enfoques ATDD (Acceptance Test Driven Development) y BDD (Behavior-Driven Development), ambos basados en pruebas de aceptación automatizadas. Sí, me parecen enfoques interesantes y coincidentes con la motivación de este post, sin embargo, no comparto el hecho que las pruebas necesariamente deban automatizarse, ni menos de forma tan temprana cuando recién se están generando los requisitos. Tampoco comparto el hecho que "a golpe" de pruebas de aceptación se vaya estableciendo la implementación, me parece más adecuado que esto se haga por áreas, por conjuntos de pruebas de aceptación. Finalmente, no he visto en dichos enfoques mecanismos adecuados para gestionar grandes volúmenes de pruebas de aceptación y que faciliten por ejemplo su organización, su localización, su no duplicación, etc.

En Extreme Programming (XP) las pruebas de aceptación son protagonistas (existen como artefacto y el rol Tester es el encargado de acordarlas con el cliente), cada Historia de Usuario debería tener asociadas sus pruebas de aceptación, sin embargo, en XP no se aportan mayores pautas respecto de cómo establecerlas, ni mecanismos para gestionarlas. Por otra parte, ni Scrum, ni Kanban, ni Lean Development entran en aspectos asociados a la especificación de requisitos o pruebas de aceptación.

Desde hace años hemos venido desarrollando un enfoque propio, enmarcado en el ámbito de métodos ágiles, denominado Test-Driven Requirement Engineering (TDRE), el cual se detalla en un artículo que publicamos en las JISBD en el 2010. Además, nuestra herramienta TUNE-UP Process ofrece soporte específico para TDRE. En el siguiente enlace hay algunos ejemplos de pruebas de aceptación gestionadas por TUNE-UP Process.