Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Share
El siguiente caso de estudio es una
traducción del capítulo 23 del libro de Mike
Cohn titulado Agile Estimating and Planning.
Este capítulo, el autor, con la intención de
resumir y ejemplificar la mayoría de los
puntos clave del libro, desarrolla el caso
práctico de la experiencia del primer
proyecto ágil en una empresa ficticia
llamada Bomb Shelter Studios, en el que
participan las siguientes personas:
Este post reproduce la traducción del mencionado capítulo, desde que surge la necesidad
de probar métodos ágiles para gestionar un nuevo proyecto software hasta que comienza
la primera reunión de recopilación de requisitos en forma de “historias de usuario”.
[…]
largo vuelo, pero el congreso había merecido la pena. Volar de vuelta desde la
Era un
costa este se hacía siempre largo y agotador, pero esta vez Francisco había
promocionado a primera clase canjeando algunas millas a cambio de un poco más de
espacio y confort. Francisco iba cómodo en su asiento, reflexionando sobre los
acontecimientos de la semana.
Desde sus difíciles comienzos tres años atrás, Bomb Shelter Studios se había convertido
en una empresa de desarrollo de juegos muy reconocida en el sector de los juegos de
estrategia. Además del último juego Deep Black & White, Bomb Shelter había
desarrollado muchos otros juegos (ajedrez, backgammon, reversi, bridge, damas,
mancala, etc.). Cuando se terminaba un juego, los derechos se vendían a un distribuidor
que se hacía cargo de la producción y la distribución, permitiendo que Bomb Shelter
pudiera centrarse en desarrollar nuevos juegos.
Santiago estuvo investigando algunas ideas que el equipo tenía, y finalmente sugirió
usar lo que llamaban “proceso ágil” para el siguiente proyecto. Francisco no entendía lo
que eso significaba, pero estaba seguro de que necesitaban probar algo diferente: No se
podían permitir un nuevo retraso de seis meses en el próximo juego. Todos los
miembros del equipo estaban entusiasmados con el proceso ágil, y sabían perfectamente
lo que estaba en juego.
–Buenos días a todos –dijo Francisco al entrar en la sala de reuniones. Todavía faltaba
un minuto para las nueve, y casi todos ya estaban esperando. Eso era buena señal. A
pesar de que el equipo quedó exhausto por el empujón final de Deep Black & White, ya
estaban listos para empezar a trabajar en Havannah.
–Buenos días, Francisco. He visto tu email sobre Deep Black & White. Una gran
noticia lo del acuerdo de distribución –dijo Alberto, el programador en C++ que había
codificado el motor de inteligencia artificial que hizo de Deep Black & White un juego
tan potente.
–Francisco, este es Carlos –dijo Santiago–. Carlos es un coach en métodos ágiles con
mucha experiencia. Le hemos traído para que nos ayude a aprender a trabajar de esta
nueva forma.
–No podemos empezar, Francisco –dijo Carlos–. Esto es importante: Necesitamos a todo
el equipo. Buena parte de los beneficios del proceso ágil se producen cuando todos
participan. Rosa quizá no tenga mucho que decir sobre el motor de inteligencia artificial,
pero aun así, necesitamos su opinión si queremos conseguir el mejor juego que somos
capaces de hacer.
–Ella siempre llega cinco minutos tarde los lunes. Tiene que dejar a su hijo en el colegio
los lunes, miércoles y viernes. Estará a punto de llegar –estaba diciendo Paula, justo
cuando Rosa abrió la puerta.
–Por supuesto, Francisco. En primer lugar, el tablero es como este –dijo Diana mientras
sacaba un tablero de madera de su bolso y lo ponía en la mesa.
–Es para dos jugadores, que van colocando por turnos una ficha blanca o negra en el
tablero. Cuando una ficha se coloca en el tablero, ya no se puede mover.
–Sí, pero al contrario que en el Go, aquí las fichas no se pueden capturar. El objetivo
en Havannah es ser el primer jugador en hacer un anillo, un puente o un tenedor. Quien
haga una figura primero gana el juego.
–¿Y qué es un anillo, un puente o un tenedor? –preguntó Francisco, mientras Diana iba
colocando unas cuantas fichas en el tablero.
–El anillo es la figura más sencilla. Es así. Un anillo es un conjunto de fichas conectadas
que encierran uno o más huecos.
–Parece bastante fácil. ¿Dónde está la dificultad? –dijo Alberto, que ya estaba pensando
en el motor de inteligencia artificial para seleccionar movimientos.
–Recuerda: el anillo es solo una de las formas de ganar. Se puede ganar también con un
tenedor o un puente –continuó Diana mientras colocaba más fichas en el tablero-. Un
puente conecta dos esquinas cualesquiera. Un puente puede ser una línea entre dos
esquinas no consecutivas, pero es más probable entre dos esquinas adyacentes:
–¿El jugador tiene que decir qué figura quiere hacer antes de empezar a jugar? –
preguntó Alberto.
–No, ahí está la gracia y también el reto. Puedes empezar intentando un puente, darte
cuenta de que no va a funcionar, y quizá intentar un tenedor, por ejemplo.
–¿Qué es un tenedor?
–Es así, Francisco –dijo Diana mientras añadía más fichas al tablero–. Un tenedor
conecta tres lados, no esquinas. Las esquinas no son lados, así que no pueden usarse en
un tenedor. Si pueden usarse en un puente.
–Va a ser un reto programar el motor de movimientos. Con tantas formas posibles de
ganar y tantos espacios en el tablero, las combinaciones son muchísimas.
–Tienes razón, Alberto –dijo Diana–. Mucha gente piensa que este juego es más difícil
que el ajedrez porque hay más opciones y porque no se pueden usar libros de fin de
juego, como en el ajedrez. En el ajedrez, cuando quedan pocas piezas, es posible usar un
libro de mejores jugadas. En ese momento ya no hace falta que el motor deduzca los
movimientos. En el Havannah, hay demasiadas piezas y demasiadas posiciones.
–No querrías programar un juego sencillo. ¿Verdad, Alberto? –bromeó Santiago, el otro
programador. Alberto puso cara como si hubiera preferido un juego más sencillo, esta
vez.
–No te preocupes. La buena noticia es que como sabe jugar muy poca gente, no
necesitamos un motor tan potente como el de Deep Black & White –dijo Diana, viendo
que Alberto se relajaba un poco–. Al final querremos un motor potente, sí, pero no en la
primera versión. Un motor potente que gane a la mayoría de los jugadores la mayoría de
las veces será suficiente.
–De acuerdo, Diana. ¿Alguna otra regla que tengamos que saber? –preguntó Francisco.
–No, ya está. Las reglas son simples, pero el juego te hace pensar de verdad. Por eso
pensamos que se venderá bien a los clientes que ya compraron otros juegos.
–Eso parece bastante fácil. ¿Qué hacemos con las historias de usuario una vez
terminadas?
Ir al siguiente post
Este texto se ha traducido del libro:
Agile Estimating and Planning
Mike Cohn. Prentice Hall, 2012
Las historias del proyecto Havannah
Share
Una regla básica que hay que recordar es que las historias de usuario deben ser
independientes, negociables, valorables, estimables, pequeñas y verificables
(Independent, Negotiable, Valuable, Estimatable, Small, Testable -INVEST-).
[…]
–Una buena forma de escribir todas las historias es… –comenzó a decir Carlos.
–¿Quieres decir todas, Carlos? –le preguntó Santiago al nuevo coach del equipo.
–Sí, en cierto modo. Me gustaría emplear esta reunión para escribir tantas historias
como podamos. Deshacer y rehacer son historias muy pequeñas. No necesitamos que
nuestras historias sean tan pequeñas. De hecho, podríamos combinarlas.
–De acuerdo, lo haré –dijo Francisco y se puso a escribir una nueva tarjeta– ¿Cómo
indicamos que esta tarjeta está relacionada con estas otras? ¿Las numeramos?
–No, simplemente raja las dos primeras –dijo Francisco Carlos– Ya no las necesitamos.
Francisco rajó las dos primeras tarjetas por la mitad, y escribió la nueva historia: “Como
jugador, me gustaría deshacer y rehacer movimientos”.
–Carlos, Francisco no ha incluido una razón en la tarjeta. No hay un “para que…”. ¿Eso
es un problema? –preguntó Alberto.
–¡Eh, que estoy aprendiendo! –se defendió Francisco.
–En realidad –clarificó Carlos– no siempre necesitamos una frase “para que…”. Si
ayuda a hacer la historia más clara, debe usarse, pero no merece la pena preocuparse por
eso, especialmente en una historia como esta, en la que resulta obvio por qué un usuario
podría querer hacer eso.
–Carlos, has dicho que queremos escribir todas las historias hoy, aunque sea a alto nivel.
Asumo que podremos añadir más luego, ¿verdad? –preguntó Rosa.
–Por supuesto. Pensaremos más historias en adelante. De lo contrario, significaría que
no pensamos con la creatividad necesaria. No quiero pensar que no seremos capaces de
descubrir ideas mejores a las de hoy. El propósito de escribir “todas” las historias hoy es
para que seamos todos conscientes –a alto nivel– de las funcionalidades posibles. Esto
ayudará sobre todo a Santiago y Alberto a pensar en la arquitectura del juego e incluso
en cómo deben diseñar el motor de movimientos.
–Estupendo Carlos, suena genial. Sigamos. ¿Empezamos a escribir historias todos a la
vez?
–Podríamos hacerlo –dijo Carlos– pero es mejor si aplicamos algún tipo de orden.
Analicemos qué hará un usuario durante las distintas fases del juego (antes de empezar,
durante la partida y después) –los miembros del equipo asintieron–. Nada más cargarse
el juego, ¿qué querrá hacer cualquier usuario?
–Comenzar una partida.
–Restaurar una partida grabada previamente.
–Elegir el grado de dificultad.
–De acuerdo, pongámoslo por escrito –dijo Carlos.
Unos minutos después, el equipo había escrito estas nueve historias:
Como jugador, puedo iniciar una nueva partida
Como jugador, puedo recuperar una partida grabada
Como jugador, puedo elegir el nivel de juego del ordenador
Como jugador, me gustaría ser capaz de jugar contra otra persona desde
mi ordenador
Como jugador, me gustaría que la apariencia del juego fuera agradable
estéticamente
Como jugador, me gustaría ser capaz de elegir entre tablero y fichas de
madera o metal
Como jugador, quiero ser capaz de ver un tutorial interactivo para el
juego
Como jugador, quiero que el juego tenga música de fondo
Como jugador, puedo elegir la música de fondo
–Carlos –preguntó Francisco–. Si estas historias son cosas que un jugador puede querer
hacer antes de comenzar el juego, ¿por qué incluimos “Como jugador, quiero que el
juego tenga música de fondo”? ¿No se trata de algo que el jugador quiere mientras está
jugando, no antes de jugar?
–Simplemente estamos haciendo
un brainstorming sobre historias de usuario –respondió
Carlos– No vamos a monitorizar qué historias ocurren antes o después del juego. Solo
uso esta distinción para que nos ayude a pensar qué necesitamos que haga el juego, de
principio a fin.
–De acuerdo. ¿Qué
hacemos ahora?
–Ahora pensaremos qué quiere hacer
un usuario durante la partida.
–De acuerdo, supongo que ahora podríamos avanzar a las cosas que un usuario puede
querer hacer después de terminar una partida –dijo Francisco.
–No hay mucho que un jugador quiera hacer después de la partida. Antes no hemos
pensado en grabar el juego, añadámoslo ahora –dijo Paula.
–Un jugador puede querer también retroceder y anotar movimientos. Deep Black &
White permite hacerlo –dijo Rosa.– Puedo hacer una anotación como “Pensaba jugar en
en la posición A3”.
–De acuerdo. Escribamos estas historias –dijo Carlos. Obteniendo esta otra lista:
–Pero antes de terminar hoy, deberíamos crear una estimación de alto nivel para cada
historia –dijo Carlos.
–Lo que vamos a hacer ahora –reanudaba Carlos la reunión– es estimar cada historia con
un número de story points.
–¿Qué son los story points? –preguntó Francisco.
–Un story point es una estimación adimensional del tamaño y complejidad de una
historia de usuario –contestó Carlos–. Supongan que decidimos que grabar una partida
son 3 puntos. Si pensamos que restaurar una partida grabada tendrá el mismo esfuerzo,
diremos 3 puntos también. Si es un poco menos, diremos 2 puntos.
–Entonces ¿los números no significan nada? –preguntó Francisco.
–Solo relativamente. Un 2 es el doble de un 1. Un 8 es cuatro veces un 2. Es lo único
que importa –aclaró Carlos–. Vamos a estimar jugando al “planificación-poker”
(planning poker) –Carlos le entregó a cada uno una baraja de cartas con los valores 1, 2,
3, 5 y 8.
Procederemos así: Diana nos leerá una historia de usuario. Podemos comentar y debatir.
Después, cada uno elegirá una de estas cartas y las mostraremos todos al mismo tiempo.
Si todos estamos de acuerdo, esa será la estimación. Si no, discutiremos nuestras
estimaciones y la propia historia de usuario durante un par de minutos, y repetiremos el
proceso hasta que nos pongamos de acuerdo.
Carlos contestó algunas preguntas sobre esta técnica y después le pidió a Diana que
leyese la primera historia: “Como jugador, puedo iniciar una nueva partida”.
–La primera o segunda historia deberían ser siempre las más difíciles, ¿no?– añadió
Santiago–. Puesto que estimamos las historias por comparación con otras, es difícil
cuando no hay contra qué comparar. Solo podemos decir si esta historia inicial es grande
o pequeña. Si después de estimar cuatro o cinco decidimos cambiar la estimación de esta
primera, eso se puede hacer.
–¿Qué queríamos decir con esta historia?– preguntó Alberto–. No tengo claro lo que
significa iniciar una nueva partida.
–Esta historia la escribimos cuando estábamos pensando lo que querría hacer un usuario
después de arrancar la aplicación –dijo Diana–. Dijimos que probablemente querría
empezar una nueva partida o recuperar una antigua. Esto era todo lo que queríamos
decir.
–¿Incluye pintar un tablero vacío y la configuración inicial para que el sistema pueda
empezar la partida? –preguntó Alberto.
–Creo que sí. No creo que el tablero tenga que ser muy vistoso para esto. Ya tenemos
otra historia para hacer la pantalla agradable estéticamente, pero sí es cierto que en esta
historia requiere que el sistema dibuje un tablero de Havannah en la pantalla.
Carlos esperó unos segundos mas para ver si había más preguntas.
–Está bien. Ahora, que todo el mundo elija una carta con la estimación de la historia.
–Es un 1 –dijo Alberto, enseñando su carta a todos.
–Aún no, Alberto –dijo Carlos–. Todos necesitamos la oportunidad de pensar en ello sin
ver la estimación de los demás. Hacerlo así evita cualquier tipo de condicionamiento –
hizo una pausa–. Parece que todos tienen su carta. Denles la vuelta, por favor.
Carlos repasó las puntuaciones: desde los 1 de Alberto y Rosa hasta el 5 de Paula.
Carlos permitió que la discusión se prolongase un poco más. Después volvió a pedir que
todos eligieran una carta con su estimación. La mayoría eran ahora 1, salvo el 2 de
Paula. Carlos reabrió el debate y le preguntó a Paula si podía estimar un 1, a lo cual
Paula se mostró de acuerdo. Finalmente, la primera historia se estimó con 1 punto.
Tras dos minutos de discusión sobre lo que tendría que hacer esta historia, Carlos les
pidió que eligieran una carta. No hubo consenso en primera ronda. Santiago argumentó
que esta historia era el doble de grande que la primera porque implicaba configurar un
tablero vacío, leer la partida grabada desde un fichero, y colocar en el tablero las piezas
jugadas. Convencido por sus argumentos, el equipo estimó esta historia con 2 puntos.
Descomponiendo las historias grandes
Hubo asentimiento general sobre que las dos historias eran del mismo tamaño.
–Por supuesto– contestó Paula.– Podemos tener un fichero que relacione las posiciones
de las fichas con los movimientos que el motor debería responder.
–Puede haber más de un movimiento aceptable– dijo Alberto.– Ese fichero debería
permitirnos especificar múltiples respuestas.
–Estupendas respuestas. Ahora no tenemos que diseñar ese fichero, basta con saber que
habrá algunas opciones. Estimemos la historia– dijo Carlos.
Se hizo el silencio en la sala mientras cada persona pensaba qué implicaría esa historia.
Cada uno eligió una carta y las mostraron al mismo tiempo.
–Alberto, se supone que hay que elegir solo una carta, no todas. ¿No te has decidido?
–No tengo una carta suficientemente grande, así que las elijo todas– el programador
enseñó las cartas con 1, 2, 3, 5 y 8 puntos.– Suman 19. Me parece bien.
–Tengo cartas más grandes: 13, 20, 40 y 100– dijo Carlos, repartiendo más cartas a cada
persona.– Esperaba que no las necesitáramos.
–¿Por qué esperabas que no las necesitáramos?
–Considerando las historias que hemos estimado hasta ahora, cualquier historia de 100
puntos no cabría en una iteración. Sería demasiado grande. Lo mismo es cierto para el
resto de números que acabo de pasaros. Está bien que tengamos algunas historias
grandes, y es normal estimarlas con valores grandes. Pero tenemos que recordar que
tendremos que descomponerlas antes de trabajar en ellas para que quepan en una
iteración. También hemos de recordar que las estimaciones de funcionalidades muy
grandes son poco precisas (tienen mayor rango de incertidumbre).
–Así pues, Alberto, ¿piensas de verdad que son 19 puntos?– preguntó Santiago mirando
la carta de 18 que tenía en la mano.
–Por supuesto. El motor tendrá que reconocer si el jugador está intentando hacer un
anillo, puente o tenedor. Va a tener que decidir qué figura debería tratar de hacer, y si
debe atacar o defender. Incluso el más sencillo de los motores va a llevar algún tiempo
desarrollarlo.
–Tú sabrás, pero 19 es mucho. –dijo Santiago.
–Paula, ¿por qué piensas que son 3 puntos? –preguntó Carlos, focalizando la discusión
en los valores divergentes.
–Las pruebas no parecen difíciles. No creo que tenga mucho que hacer. Crearé esos
ficheros de pruebas y ya está.
–Sí pero estamos estimando la historia completa, no solo nuestra parte. Las pruebas
pueden puntuar 3, pero hay que tener en cuenta el tiempo de Alberto, también –explicó
Carlos.
–¡Ah!, entonces Alberto tiene razón –dijo Paula.– Esta historia va a ser de las grandes.
–Veamos si tiene razón. Escojan de nuevo una carta y hagan una reestimación basándose
en lo que acaban de oir –instruyó Carlos. Hizo una breve pausa para asegurarse de que
todos tenían tiempo de pensar– Denles la vuelta.
–Parece que les has convencido a todos, Alberto –dijo Carlos.– Sin embargo, 20 puntos
son muchos para una sola historia. Alberto, ¿hay alguna forma de descomponerla?
Quizá con un motor incluso menos potente la primera vez? Después se mejoraría antes
de la primera entrega.
–No se me ocurre –dijo Alberto. Meditó por un momento y luego continuó.– Podríamos
hacer que atacase siempre, tratando de hacer su figura ignorando los movimientos del
jugador, pero no me parece una buena idea.
–¿Y si solo reconociese anillos? –preguntó Rosa.– Podríamos olvidarnos de los puentes
y los tenedores (solo al principio). Alberto: ¿podrías programar un motor que jugase
atacando y defendiendo pero solo intentando formar (y bloqueando) anillos?
–Claro. Podría funcionar. Podemos descomponer en tres historias, una para cada forma.
–Cuando estas tres historias eran una, la estimamos con 20 puntos. Ahora son 21. ¿No
deberíamos quitar un punto? –preguntó Francisco.
qué ser tan precisas –respondió
–No. Las estimaciones son lo que son, no tienen por
Carlos.– Descomponer historias nos ayuda a conocer mejor lo que hay que hacer. La
estimaciones de las descomposiciones no tienen que sumar la estimación de la historia
original, necesariamente.
–Alberto, ¿qué deberíamos hacer con las historias para el motor de dificultad media y
alta? ¿Quieres una historia para cada uno, o prefieres descomponer en anillos, puentes y
tenedores de la misma manera?
–Una historia por cada uno. Pienso que deberíamos definir nuestro motor de dificultad
media como uno que nunca mete la pata –dijo Alberto– quizá no siempre haga el
movimiento óptimo, pero nunca comete errores muy graves. Podemos probarlo como
dijimos antes, y también podemos hacer que algunos buenos jugadores lo prueben.
Mientras haga movimientos razonables, es suficiente. Para el motor de dificultad alta,
podemos aumentar la restricción para que solo haga el mejor movimiento que pueda
encontrar. Considerando el rendimiento, podemos determinar lo complicado que puede
ser el motor.
–Entonces, ¿cómo quieres escribirlo en forma de historias? –preguntó Francisco.
–Creo que así es suficiente: “Como jugador, puedo jugar contra un motor medio” –
respondió Diana.
–Sí –se mostró de acuerdo Carlos–. En la tarjeta de la historia puedes anotar la
condición de satisfacción: “siempre juega movimientos razonables para un buen jugador
humano”.
–La siguiente historia es: “Como jugador, me gustaría que la apariencia del juego
fuera agradable estéticamente” –leyó Diana.
–Por fin, una de las mías –dijo Rosa, la diseñadora gráfica.
–Sí, pero no me gusta cómo está escrita –dijo Santiago.– Es ambigua y grande. Me gusta
la siguiente: “Como jugador, me gustaría ser capaz de elegir entre tablero y fichas de
madera o metal”. ¿Qué más hace falta para ser “agradable estéticamente”?
–Tenía que ver con la apariencia global del juego –respondió Francisco.– Seguramente
no habrá muchos menús, pero queremos que tengan buen aspecto. Queremos que los
elementos de los menús estén en sitios lógicos. Al cargarse el juego, queremos una
pantalla atractiva con relieve. El tablero y las fichas son la interfaz de usuario completa.
Habrá probablemente algún diseño de fondo detrás del tablero. Rosa necesita tiempo
para hacerlo.
–Suena bien. ¿Podemos descomponer en historias separadas? –preguntó Santiago.
–Podríamos –dijo Diana– pero sería difícil. Creo que los elementos de menú deben
desarrollarse en el contexto de las funcionalidades que necesiten opciones de menú.
Rosa ¿qué piensas de tener una historia para una pantalla de relieve y otra para el diseño
de fondo?
–Por mi parte, bien. Obviamente las voy a desarrollar por separado en cualquier caso.
El equipo avanzó rápidamente sobre el siguiente grupo de historias.
Historias dependientes
El proceso de estimación continuó de esta forma hasta que el equipo hubo estimado
todas las historias escritas.