1.9.2. Fase 1: ¿Qué estamos haciendo?

En la generación previa de diseño de programas (llamado diseño procedural), esto se llamaba «crear el análisis de requisitos y especificación del sistema». Éstos, por supuesto, eran lugares donde perderse; documentos con nombres intimidantes que podrían llegar a ser grandes proyectos en sí mismos. Sin embargo, su intención era buena. El análisis de requisitos dice: «Haga una lista de las directrices que usará para saber cuándo ha hecho su trabajo y el cliente estará satisfecho». La especificación del sistema dice: «Hay una descripción de lo que hará el programa (no cómo) por satisfacer los requisitos». El análisis de requisitos es realmente un contrato entre usted y el cliente (incluso si el cliente trabaja dentro de su compañía o es algún otro objeto o sistema). Las especificaciones del sistema son una exploración de alto nivel del problema y en algún sentido un descubrimiento de si se puede hacer y cuánto se tardará. Dado que ambos requerirán consenso entre la gente (y porque suelen cambiar todo el tiempo), creo que es mejor mantenerlos todo lo escueto posible -en el mejor de los casos, listas y diagramas básicos- para ahorrar tiempo. Podría tener otras restricciones que le exijan ampliarla en documentos más grandes, pero manteniendo el documento inicial pequeño y conciso, puede crearse en algunas sesiones de tormentas de ideas de grupo con un líder que cree la descripción dinámicamente. Esto no sólo solicita participación de todos, también fomenta aprobación inicial y llegar a acuerdos entre todos. Quizá lo más importante sea empezar el proyecto con mucho entusiasmo.

Es necesario no perder de vista lo que está intentando conseguir en esta fase: determinar el sistema que se supone que quiere hacer. La herramienta más valiosa para eso es una colección de los llamados «casos de uso». Los casos de uso identifican características clave en el sistema que pueden revelar algunas de las clases fundamentales que se usarán. En esencia son respuestas descriptivas a preguntas como: [19]:

  1. «¿Quién usará el sistema?»

  2. «¿Qué pueden hacer estos actores con el sistema?»

  3. «¿Cómo puede este actor hacer eso con este sistema?»

  4. «¿Cómo podría alguien más hacer este trabajo si alguien más estuviera haciéndolo, o si el mismo actor tuviera un objetivo diferente?» (para revelar variaciones).

  5. «¿Qué problemas podrían ocurrir mientras hace esto con el sistema?» (para revelar excepciones).

Si está diseñando un cajero automático, por ejemplo, el caso de uso para un aspecto particular de la funcionalidad del sistema es poder describir qué hace el contestador automático en todas las situaciones posibles. Cada una de esas «situaciones» se denomina escenario, y se puede considerar que un caso de uso es una colección de escenarios. Puede pensar en un escenario como una pregunta que comienza con: «¿Qué hace el sistema si...?» Por ejemplo, «¿Qué hace el cajero automático si un cliente ingresa un cheque dentro de las 24 horas y no hay suficiente en la cuenta para proporcionar la nota para satisfacer el cargo?»

Los diagramas de caso de uso son intencionadamente simples para impedir que se atasque con los detalles de implementación del sistema demasiado pronto:

Diagramas de casos de uso

Figura 1.10. Diagramas de casos de uso


Cada monigote representa un «actor», que típicamente es un humano o algún otro tipo de agente libre. (Incluso puede ser otro sistema de computación, como es el caso del «ATM»). La caja representa el límite del sistema. Las elipses representan los casos de uso, los cuales son descripciones de trabajo válido que se puede llevar a cabo con el sistema. Las líneas entre los actores y los casos de uso representan las interacciones.

No importa cómo está implementado realmente el sistema, mientras se lo parezca al usuario.

Un caso de uso no necesita ser terriblemente complejo, incluso si el sistema subyacente es complejo. Lo único que se persigue es mostrar el sistema tal como aparece ante el usuario. Por ejemplo:

Un ejemplo de caso de uso

Figura 1.11. Un ejemplo de caso de uso


Los casos de uso producen las especificaciones de requisitos determinando todas las interacciones que el usuario puede tener con el sistema. Intente descubrir una serie completa de casos de uso para su sistema, y una vez que lo haya hecho tendrá lo esencial sobre lo que se supone que hace su sistema. Lo bueno de centrarse en casos de uso es que siempre le lleva de vuelta a lo esencial y le mantiene alejado de los asuntos no críticos para conseguir terminar el trabajo. Es decir, si tiene una serie completa de casos de uso puede describir su sistema y pasar a la siguiente fase. Probablemente no lo hará todo perfectamente en el primer intento, pero no pasa nada. Todo le será revelado en su momento, y si pide una especificación del sistema perfecta en este punto se atascará.

Si se ha atascado, puede reactivar esta fase usando una herramienta tosca de aproximación: describir el sistema en pocos párrafos y después buscar sustantivos y verbos. Los nombres pueden sugerir actores, contexto del caso de uso (ej. «lobby»), o artefactos manipulados en el caso de uso. Los verbos pueden sugerir interacción entre actores y casos de uso, y pasos específicos dentro del caso de uso. Además descubrirá que nombres y verbos producen objetos y mensajes durante la fase de diseño (y observe que los casos de uso describen interacciones entre subsistemas, así que la técnica «nombre y verbo» sólo se puede usar como una herramienta de lluvia de ideas puesto que no genera casos de uso) [20].

El límite entre un caso de uso y un actor puede mostrar la existencia de una interfaz de usuario, pero no la define. Si le interesa el proceso de definición y creación de interfaces de usuario, vea Software for Use de Larry Constantine y Lucy Lockwood, (Addison Wesley Longman, 1999) o vaya a www.ForUse.com.

Aunque es un arte oscuro, en este punto es importante hacer algún tipo de estimación de tiempo básica. Ahora tiene una visión general de qué está construyendo así que probablemente será capaz de tener alguna idea de cuánto tiempo llevará. Aquí entran en juego muchos factores. Si hace una estimación a largo plazo entonces la compañía puede decidir no construirlo (y usar sus recursos en algo más razonable -eso es bueno). O un gerente puede tener ya decidido cuánto puede durar un proyecto e intentar influir en su estimación. Pero es mejor tener una estimación honesta desde el principio y afrontar pronto las decisiones difíciles. Ha habido un montón de intentos de crear técnicas de estimación precisas (como técnicas para predecir la bolsa), pero probablemente la mejor aproximación es confiar en su experiencia e intuición. Utilice su instinto para predecir cuánto tiempo llevará tenerlo terminado, entonces multiplique por dos y añada un 10%. Su instinto visceral probablemente sea correcto; puede conseguir algo contando con este tiempo. El «doble» le permitirá convertirlo en algo decente, y el 10% es para tratar los refinamientos y detalles finales [21]. Sin embargo, usted quiere explicarlo, y a pesar de quejas y manipulaciones que ocurren cuando publique la estimación, parece que esta regla funciona.



[19] Gracias a James H Jarrett por su ayuda.

[20] Puede encontar más información sobre casos de uso en Applying Use Cases de Schneider & Winters (Addison-Wesley 1998) y Use Case Driven Object Modeling with UML de Rosenberg (Addison-Wesley 1999).

[21] Últimamente mi idea respeto a esto ha cambiado. Doblar y añadir un 10% puede darle una estimación bastante acertada (asumiendo que no hay demasiados factores comodín), pero debe trabajar con bastante diligencia para acabar a tiempo. Si realmente quiere tiempo para hacerlo de forma elegante y estar orgulloso del proceso, el multiplicador correcto es más bien tres o cuatro veces, creo yo.