Buscar en Gazafatonario IT

Mostrando las entradas con la etiqueta Iteraciones. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Iteraciones. Mostrar todas las entradas

miércoles, noviembre 05, 2014

Mañana empiezo un nuevo proyecto: ¿qué metodología ágil me pongo?

 Ecosistema de Métodos y Prácticas Ágiles (Parcial)
Ecosistema de Métodos y Prácticas Ágiles (Parcial)
El ecosistema ágil está formado por un conjunto de organismos “vivos” llamados “métodos y prácticas ágiles” (biocenosis) y el medio físico donde se relacionan, llamados Organizaciones (biotopo). Estas últimas están conformadas por personas y estas personas usan distintas clases de biocenosis, es decir, de métodos y prácticas ágiles, según sus necesidades.
Como todo ecosistema, el ágil tiene barreras que a veces impiden su normal evolución. Barreras físicas, como la falta de entornos adecuados dentro de las Organizaciones para albergar equipos que respiren “agilidad”. Barreras culturales y hasta emocionales, arraigos y miedos que se dan entre las personas, quienes experimentan temores muchas veces infundados debido a la falta de información o de acompañamiento efectivo por parte de expertos, de conocedores de ese ecosistema ágil en formación.
Pero, ¿cuáles son esos métodos y prácticas ágiles? ¿Para qué sirve cada uno de ellos? En esta sesión exploraremos, a manera de introducción, las metodologías más usadas, como Scrum, eXtreme Programming (XP), Kanban, Lean; y algunas de las técnicas necesarias en un primer esfuerzo por implementar la Cultura Ágil en una Organización: User Story Mapping, Product Vision Board, User Persona, User Stories, TDD, BDD, para mencionar solo algunas.
Y lo más importante, ¿para qué sirve cada uno de estos especímenes ágiles? ¿Alguno de ellos es adecuado para el proyecto que inicio mañana? ¿Varios de estos? ¿Son complementarios? ¿Qué problemas puedo encontrar si elijo mal? Y en el fondo, ¿cuáles son las razones por las que debo permitir el nacimiento y expansión de un nuevo ecosistema aun si el actual me está rindiendo beneficios? Y hablando de utilidades, ¿cuáles puedo obtener al implementar la “agilidad” en mi Organización?

Finalmente, sabemos que los ecosistemas están gobernados principalmente por eventos estocásticos (azar), por las reacciones que estos eventos ocasionan en sus componentes y por las respuestas de los organismos a las condiciones que los rodean. ¿Cómo controlar estos eventos y sobrevivir en el intento? Una mirada Darwiniana nos ayudará a entender cómo, mediante la inspección y la adaptación, nos iremos adecuando a los cambios que ocurren en todo proceso de evolución y entenderemos que la cultura ágil es el siguiente paso en la evolución de la inteligencia.
Nota:
Esta fue la presentación que hice durante el marco de las VII Jornadas Latinoamericanas de Metodologías Ágiles - Ágiles 2014, en Medellín, Colombia. Del 23 al 25 de octubre de 2014.
Nivel: Principiante

Título: Mañana empiezo un nuevo proyecto: ¿qué metodología ágil me pongo?

Resumen:

Uno de los impedimentos más grandes a la hora de implementar Ágil se origina en el desconocimiento que tienen las personas sobre lo que harán a continuación. ¿Por cuál de los métodos empiezo? ¿Uno solo es suficiente? La respuesta corta a esta última pregunta es “no”. Entonces, ¿qué debo saber para dar el salto de aquí hasta ágil? ¿De qué me “agarro” para no caer en el abismo? Estos son los asuntos que abordaré en esta sesión introductoria.
Con definiciones simples y ejemplificadas, basado en hechos históricos de los cuales he sido protagonista, le contaré a la audiencia de qué se trata toda esta jerigonza ágil, a manera de Gazafatonario.

La presentación completa la pueden descargar aquí:




domingo, octubre 26, 2014

#Agiles2014: Ágil es algo que eres, CMMI es algo que usas

Ser ágil significa reemplazar la predictibilidad falsa por la eficiencia
ser ágil significa reemplazar la predictibilidad falsa por la eficiencia
Con una actualización debido al cambio de audiencia, presenté en #Agiles2014 mi disertación sobre Ágil y CMMI. Como en la versión 1.0, durante la SEPG LA 2014 en Manizales, mi asunto principal era que los métodos ágiles no tienen por qué entrar en conflicto con otros modelos o enfoques de construcción de software, no es la idea de ser ágil o, al menos, no está en el flujo de un proceso de transformación a ágil echar tierra a las prácticas existentes en una organización. Los líderes de los procesos actuales deben trabajar en conjunto con los nuevos líderes para que estos últimos obtengan los beneficios de ambos universos y aprovechar esa sinergia para mejorar dramáticamente el rendimiento del negocio.

Para apoyar este concepto, expliqué que los modelos como CMMI, PMI e ISO nos dan una idea de cuales procesos son necesarios para mantener una organización madura y disciplinada, capaz de predecir y mejorar el desempeño de la organización misma y de los proyectos. Entre tanto, las técnicas ágiles proporcionan guías para un manejo eficiente de los proyectos de una manera que permite alta flexibilidad y adaptabilidad. Al mezclar los dos enfoques, la filosofía ágil asegura que los procesos se implementen eficientemente a la vez que aceptan los cambios; y los modelos tradicionales aseguran que se consideren todos los procesos relevantes.

Pero de inmediato fui al centro de mi exposición: una de las grandes diferencias, radicales por demás, entre los métodos tradicionales y los ágiles es que estos últimos son generativos, no prescriptivos. Los procesos necesitan evolucionar según las necesidades, no prescritos con anticipación. Un enfoque prescriptivo genera procesos complejos y complicados, mientras que un enfoque generativo comienza con un conjunto de procesos simples y adiciona otros a medida que se requieren.

La filosofía ágil reconoce que los procesos de software más efectivos no pueden definirse por adelantado; es un proceso continuo. Los métodos tradicionales se enfocan en definir y reforzar procesos y gastan muy poco tiempo en identificar y entregar lo que los usuarios necesitan. Aunque su propósito es mejorar la consistencia y la calidad, esto muchas veces se consigue a expensas de la productividad y la entrega. El enfoque tradicional de procesos tipo CMMI también usa herramientas monolíticas y pesadas que causan construcciones frágiles y traspasos inefectivos entre desarrollo, pruebas, despliegue y operaciones.

Lo que siguió fue enfatizar en lo que significa ser ágil: específicamente, la interiorización y la práctica de los Valores y Principios del Manifiesto Ágil, nada alejado de lo que se habló en el resto de #Agiles2014.

Hacia el final quise poner mi propio manifiesto, el ‘Ágil es algo que eres…’, se trata de la persona, no de las cosas ni de los procesos. Ya lo he dicho en otras oportunidades, ser ágil significa reemplazar la predictibilidad falsa por la eficiencia.

Para descargar la presentación

Puedes descargar las memorias de esta conferencia de: http://goo.gl/rhNMcf


martes, octubre 21, 2014

Por qué usar métodos + prácticas ágiles

Anualmente, la consultora VersionOne.com publica un estudio sobre el uso de metodologías y prácticas ágiles. Este año, el estudio llegó a su octava edición. El estudio dice, por ejemplo, que Scrum es el método más ampliamente usado en el ecosistema ágil y así ha sido en los últimos 8 años, mismos en los cuales se ha incrementado su uso desde un 40% hasta el 55% de este año. Además, otros sabores de Scrum, combinados con métodos o prácticas como XP y Kanban también son bastante usados. Es un hecho, Scrum está aquí para quedarse.

Clic en la imagen para ampliar
Fuente: VersionOne.com. 8th Annual State of Agile Survey

Pero quiero referirme es a las principales razones por las cuales se usa Ágil. El estudio dice en esta sección que los 3 motivos primordiales que dieron los participantes de la encuesta son:
  • Acelera la salida del producto al mercado: 23%
  • Maneja más fácilmente los cambios en las prioridades: 16% y
  • Mejora la alineación del negocio y de la IT: 15%

Clic en la imagen para ampliar
Fuente: VersionOne.com. 8th Annual State of Agile Survey

El 75% de los encuestados considera que es muy importante o de la más alta importancia el que los métodos ágiles aceleren la salida del producto al mercado. Este es el principal beneficio de usar prácticas y metodologías ágiles. Las salidas “tempranas” se logran construyendo el producto de manera orgánica, en iteraciones cortas de 4 semanas o menos, con preferencia al tiempo más corto posible. Y si bien es cierto que es posible no salir a producción al final de cada iteración, siempre debemos planear para que haya entregas a Operación cada muy pocas iteraciones.

Los equipos ágiles no congelan las prioridades ni las firman con sangre. Es el usuario (por ejemplo, el Dueño de Producto en Scrum), quien establece qué quiere ver primero y qué quiere ver más adelante. En consistencia con el aspecto anterior, es el usuario quien tiene la última palabra en el orden de prioridad conque el mercado llega al mercado o a los usuarios finales. Se trata además, de software con valor, recordemos que en Ágil todo es acerca de entrega de valor al negocio.

En ese mismo orden de ideas, la alineación de la IT con los objetivos del negocio siempre ha sido uno de los pilares de los métodos ágiles, de hecho, tiene sus cimientos en aquel valor del Manifiesto Ágil de Colaboración con el cliente sobre la negociación contractual. Recordemos también que los desarrolladores y el negocio trabajamos juntos cotidianamente durante todo el proyecto, o así reza uno de los principios del Manifiesto. El 65% de los encuestados respondió que esta razón es muy importante o de la más alta importancia para ellos a la hora de hace uso de las metodologías ágiles.

El estudio completo lo encuentran en versionone.com.


lunes, mayo 27, 2013

Scrum Orgánico para Iniciantes

Advertencia: al final de este artículo podrás empezar a usar Scrum en tus proyectos.

Marco de Trabajo Scrum
Marco de Trabajo Scrum
Presentación
Cuando publiqué la lista de chequeo de Scrum, asumí que mis lectores ya conocían este marco de trabajo (para software o productos y servicios de otro tipo) o que estarían familiarizados con el concepto de prácticas y técnicas ágiles y que conocían el suficientemente expuesto manifiesto ágil. Pensé que  no hacía falta abordar los aspectos más básicos del asunto. Me equivoqué. Acaso para algunos de nosotros esta sea la primera vez con Scrum, el primer contacto con un marco de trabajo ágil, la primera incursión en esta forma de construir productos de software. Así es que decidí volver a lo fundamental. Aquí vamos otra vez.

Scrum es un marco de trabajo liviano e iterativo de gestión de proyectos que ayuda a los equipos a ejecutar y a entregar exitosamente el valor de negocio más alto en el tiempo más corto posible. Este método es particularmente bien apropiado para entornos donde los requisitos están sujetos a cambios continuos o donde los requisitos no se entienden correctamente. “Scrum es un marco de trabajo con el cual podemos afrontar problemas complejos y adaptativos y con el cual podemos emplear distintos procesos y técnicas, así como también podemos optimizar nuestra predictibilidad y tener un mejor control de los riesgos”[i].

Métodos Ágiles

Pero Scrum no es el único método ágil que podemos encontrar. Algunos otros marcos de trabajo ágil son:

·         Adaptive Software Development (ASD)
·         Crystal Clear
·         Kanban
·         Extreme Programming (XP)
·         Dynamic System Development Method (DSDM)
·         Feature Driven Development (FDD)
·         Lean Software Development (LSD)
·         Open Unified Process (OpenUP)
·         Essential unified process (ESSUP)
·         Agile Unified Process (AUP)
·         Use Case 2.0

La Filosofía Ágil

Todos estos métodos tienen sus cimientos en lo que se conoce como Filosofía Ágil:

·         Usted no puede predecir o planear con absoluta certeza lo que va a entregar, cuándo lo entregará y cuánto será su costo.
·         Empiece con planes iniciales alrededor de las estimaciones, fechas y alcance, pero enfóquese en la revisión continua de estas restricciones a medida que avanza.
·         La meta es entregar el mejor software posible, dadas estas restricciones, pero ningún método con el enfoque de receta de cocina mejorará lo que es “mejor”.

Scrum

Scrum define explícitamente tres roles, cuatro ceremonias y cuatro artefactos principales. El Dueño del Producto, el Equipo de Desarrollo y el Scrum Master son quienes tienen bajo su responsabilidad entregar software probado y funcionando cada cuatro semanas o menos. Todos ellos forman el Equipo Scrum que, además de las actividades regulares de desarrollo de software, realiza cuatro ritos durante cada iteración que en Scrum se llama Sprint: Planificación del Sprint, Reunión Diaria, Revisión del Sprint y Retrospectiva. Durante estas ceremonias, el equipo actualiza la Lista (Backlog) del Producto, la Lista de Pendientes (Backlog) del Sprint y la Lista de Impedimentos; y al final entrega un incremento del producto potencialmente distribuible.

Actores en Scrum

El Dueño del Producto es la persona encargada de maximizar el valor del producto elaborado por el equipo de desarrollo. Es quien define y prioriza los ítems de la bitácora de producto y quien proporciona al equipo todo el conocimiento del negocio necesario para que este sea transformado en software. Entre tanto, el Equipo de Desarrollo es el responsable de construir el producto, teniendo en cuenta las necesidades y prioridades del dueño del producto. En Scrum no existen roles especializados, es simplemente el equipo, comprometido todo con el éxito del proyecto.

Finalmente, el Scrum Master es un servidor, es quien vela porque se ejecute el proceso como está definido y que se lleven a cabo cada una de las ceremonias Scrum como está consignado en la Guía de Scrum. También es el encargado de introducir nuevas prácticas al proceso y al proyecto, acompañando de cerca su implantación y monitoreando los resultados. Es importante aclarar que el Scrum Master no es un gerente, aunque bien podríamos decir que hace parte de y reporta al área de manejo de la organización, por ejemplo, a la oficina de proyectos. Contando el SM, el equipo Scrum no debe superar las 9 personas.

Ceremonias y Artefactos Scrum

En un proyecto gestionado bajo el manto de Scrum, todo ocurre en el marco de un Sprint: este es una iteración de un tiempo máximo de 4 semanas. La industria del software está gritando a cielo abierto que este tiempo sea de solo 2 semanas o de menor duración. Al principio del Sprint se realiza la Planificación del Sprint. En esta reunión, el dueño del producto asiste con la Lista del Producto actualizada y priorizada, de acuerdo con las necesidades del negocio. Junto con el equipo de trabajo, se seleccionan algunos de los elementos de la lista, usualmente los de mayor valor para el negocio, para ser desarrollados durante la iteración.

Con estos elementos seleccionados se conforma lo que se llama la Lista de Pendientes del Sprint, el trabajo del sprint. A continuación, el equipo de desarrollo define cómo hará el desarrollo y estima el esfuerzo necesario para cada uno de los elementos seleccionados, teniendo en cuenta que el esfuerzo máximo es el definido para el sprint, ni un minuto más. Con estas premisas, el Equipo en pleno elabora la Definición de Terminado y se asegura que todo el mundo la entienda y la comparta. Esta “definición de Terminado” se convierte en una especie de “contrato” del sprint, define las cláusulas sine qua non el incremento del producto no satisface a su dueño ni a la organización.

Con la definición de Terminado en la mente de los miembros del equipo Scrum, este inicia el ciclo de vida del software. Todos los días, a la misma hora y en el mismo lugar, de pie y durante 15 minutos máximo, el equipo se congrega en la Reunión Diaria. En esta sesión, cada integrante del equipo responde tres preguntas: ¿qué hice ayer? ¿Qué haré hoy? Y ¿Qué problemas tengo? Solo tres y nada más que tres. Esta reunión no es para saludarse ni para hablar de asuntos que no estén relacionados con el proyecto o con las personas que lo ejecutan. Tampoco es para resolver los problemas expuestos.

De la reunión diaria sale actualizada la Lista de Impedimentos, la cual es tratada fuera de la reunión, por cada uno de los responsables de solucionarlos. En Scrum, el equipo es autogestionado, multidisciplinario y debería tener la capacidad de resolver sus propios problemas sin la ayuda de alguien externo. Hacia el final de la iteración, se realiza la Revisión del Sprint. En esta sesión, el equipo Scrum y los interesados realizan un escrutinio de lo que se hizo en el sprint y ajustan la lista del producto si fuese necesario. En definitiva, el dueño del Producto verifica que se haya cumplido la Definición de Terminado.

Justo a continuación de la revisión, se hace una Retrospectiva del Sprint: ¿Qué hicimos mal que no repetiremos? ¿Por qué no se alcanzó la Definición de Terminado? ¿Qué hicimos bien que podemos mejorar? ¿Qué hicimos bien que seguiremos haciendo tal cual? Estas son algunas de las cuestiones que, con ayuda del Scrum Master, se responden en esta reunión. En esta sesión también deberíamos separar unos instantes para realizar una introspectiva: ¿Cómo está nuestro estado de ánimo? ¿Seguimos? ¿Paramos? Si seguimos, ¿qué acciones de mejoramiento podemos introducir a partir del siguiente Sprint?

Conclusión

Estos son, grosso modo, los elementos que subyacen el método Scrum. Todas las ceremonias tardan un tiempo fijo definido en el libro de reglas de Scrum o Guía de Scrum. No hay que saber nada más para comenzar a usar el marco de trabajo. Y para usarlo hay que ser ágil, porque Ágil es algo que eres, no algo que haces. Una vez que puedes diferenciar esto, entonces convertirse en ágil será algo fácil. Extrapolando, una organización no puede forzar la filosofía ágil en su cultura, sino que debe permitir que su cultura evolucione hacia un estado ágil. Ágil es un estado de la mente, es una forma de pensar y de ver las cosas.

Se me olvidaba decirles, la retrospectiva siempre debe hacerse al final de cada sprint, a menos que el equipo esté bien ocupado. En cuyo caso, se deberían hacer dos.
Lecturas Adicionales
Mi artículo de Scrum Fundamental lo encuentran en este mismo Gazafatonario, en: http://www.gazafatonarioit.com/2013/05/scrum-lo-fundamental.html.

El libro de reglas de Scrum, la guía de Scrum, lo encuentran en:

La lista de verificación de Scrum que desató esta serie de artículos  la encuentran en: http://www.gazafatonarioit.com/2013/05/lista-de-chequeo-scrum.html.

Otros sitios que pueden visitar para aprender más de Scrum y libros que pueden leer son:


  • http://www.scrum.org/scrumguides
  • http://www.scrumalliance.org
  • http://www.mountaingoatsoftware.com/
  • http://scrum.jeffsutherland.com/
  • http://www.controlchaos.com/
  • http://americalatina.pmi.org/latam/CertificationsAndCredentials/PMI-ACP/PMI-ACPExamPreparation/MaterialsAndResourcesInAgile.aspx
  • Essential Scrum: A Practical Guide to the Most Popular Agile Process. Mike Cohn.
  • Succeeding with Agile: Software Development Using Scrum. Mike Cohn.
  • Agile Project Management with Scrum (Microsoft Professional). Ken Schwaber.
  • Agile Product Management with Scrum: Creating Products that Customers Love. Roman Pichler.
  • Professional Scrum Development with Microsoft® Visual Studio® 2012. Richard Hundhausen.
  • User Stories Applied: For Agile Software Development. Mike Cohn.



  • [i] La Guía de Scrum. © 1991-2011 Ken Schwaber y Jeff Sutherland, Todos los Derechos Reservados.


    martes, octubre 02, 2012

    Casos de Abuso, Parte 11: Cada caso de uso se diseña e implementa de manera independiente


    El diseñador y el desarrollador sólo ven el caso de uso en desarrollo sin importarles el sistema como un todo.  Cuando esto se hace así, y no por paquetes relacionados, corremos el riesgo de no armar el “rompecabezas” con facilidad al final de la operación.
    Y lo que es peor, muchas veces durante el diseño e implementación del caso de uso no tenemos en cuenta los lineamientos arquitectónicos impuestos a la solución. El producto termina siendo una colcha de retazos mal cosidos. Esta situación convierte los hitos de integración del producto, iteración tras iteración, fase tras fase, en un serio dolor de cabeza para el arquitecto, los diseñadores y los mismos programadores. Entonces surgen los reprocesos, el desperdicio de código, rediseños, y el resultado final: un producto de mala calidad.
    El tratamiento: la arquitectura del software. Una que sirva como una gran lista de chequeo para los diseñadores y para los implementadores del producto. La arquitectura de software es la organización fundamental de un sistema, formado por sus componentes, las relaciones entre ellos mismos y con el entorno, y los principios que gobiernan su diseño y evolución (IEEE 1471-2000). Según Booch, Kruchten y otros, la Arquitectura de Software incluye decisiones acerca de la organización de un sistema de software como:
    ·         La selección de los elementos estructurales que componen el sistema y sus interfaces
    ·         El comportamiento del sistema, especificado en las colaboraciones entre esos elementos
    ·         La composición de estos elementos estructurales y comportacionales en subsistemas más grandes
    ·         El estilo arquitectónico que guía esta organización
    Toda arquitectura de software comienza por una arquitectura funcional o vista de casos de uso, un subconjunto del modelo de casos de uso del sistema, compuesto a su vez por los así llamados casos de uso o requisitos arquitectónicos. Después están la vista lógica, que le habla a los analistas y diseñadores sobre la estructura del software. La vista de implementación, que les cuenta a los programadores detalles sobre el manejo del software. Por su parte, la vista de procesos habla de desempeño, escalabilidad y puesta en marcha a los integradores del sistema. Y también está la vista de despliegue que nos explica de manera lacónica la topología del sistema, aspectos de la entrega del mismo, de instalación y de comunicación subyacentes.
    El diseño y la implementación de todo el producto de software debe obedecer a estas restricciones, casi leyes, impuestas por la arquitectura así descrita. Es lo que hace posible que los casos de uso se diseñen en grupos heterogéneos de paquetes o subsistemas diferentes.
    Impacto en la calidad: Alto.

    PD. Para saber sobre Arquitectura de Software, específicamente sobre el modelo de las 4 + 1 vistas expuesto por Krutchen, pueden tener en cuenta la siguiente referencia:
    P.B. Kruchten, “The 4 + 1 View Model of Architecture,” IEEE Software, pp. 42–50, Nov. 1995. http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?tp=&arnumber=469759&isnumber=9910
    También la encuentran en:
    Además, sobre análisis y diseño de casos de uso, en particular, sobre realización de casos de uso, pueden visitar mi Lectura Fundamental 10:
    Y sobre programación orientada a objetos, pueden leer mi Lectura Fundamental 11: Orientación a Objetos: Un Enfoque Teórico Moderno (Actualizado)

    lunes, abril 16, 2012

    ¡Quiero una Porción de Caso de Uso!

    No se trata de una charada ni nada por el estilo. El concepto fundamental de Casos de Uso 2.0 (como fue expuesta por Ivar Jacobson en su eBook “Use Case 2.0 The Definitive Guide”), es el de caso de uso y con este, el de “porción de caso de uso” (Use Case Slide, en inglés).
    Ya sabemos ampliamente qué es un caso de uso y que todos los casos de uso de un sistema constituyen todos los posibles caminos que un usuario puede tomar para usar el sistema. Un caso de uso tiene una meta bien establecida, una estructura de historia entendida por todos los involucrados en el proyecto, pero también un conjunto de historias que el sistema debe satisfacer o cumplir, incluyendo la más simple, la cual es la historia más simple que le permite al usuario alcanzar la meta.
    Y todo esto se puede lograr implementando cada caso de uso porción por porción. Así que ¿qué es una porción de caso de uso? Una porción de caso de uso es una o más historias seleccionadas de un caso de uso para formar un elemento de trabajo que es de valor claro para el usuario. La porción actúa como un contenedor para todo el trabajo requerido para completar la implementación de las historias seleccionadas. Las porciones de casos de uso son más que requisitos y casos de prueba y evolucionan para incluir las porciones correspondientes a través del diseño, la implementación y las pruebas.
    La porción de caso de uso es la parte más importante de Casos de Uso 2.0 y no es solamente usada para ayudar con los requisitos sino también para conducir el desarrollo de un sistema que los solucione. Las porciones de caso de uso:
    ·         Posibilitan que los casos de uso sean divididos en unidades de trabajo más pequeñas e independientemente entregables.
    ·         Posibilitan que los requisitos contenidos en un conjunto de casos de uso sean ordenados, priorizados y tratados en paralelo.
    ·         Enlazan los distintos modelos de un sistema (requisitos, análisis, diseño, implementación y pruebas) usados en el desarrollo dirigido por casos de uso.
    Por ejemplo, en un caso de uso cuyo propósito es que un cliente de un banco retire dinero vía cajeros electrónicos (ATM), una porción básica del caso de uso es aquella en la que el cliente inserta su tarjeta débito, proporciona los datos de su pin y la cantidad a retirar y la máquina le entrega la cantidad solicitada. Otra porción puede ser aquella en la que el pin no concuerda con los datos de la tarjeta, otra porción es cuando el cliente no tiene fondos suficientes, otra es cuando el cliente ingresa varias veces el pin de manera incorrecta y el sistema bloquea la tarjeta. Y así, puede haber muchas porciones de caso de uso en un caso de uso relativamente simple.
    Así que ¿de qué sabor quieres tu porción de caso de uso?
    PD. Sobre casos de uso, los invito a leer las Lecturas Fundamentales de este Gazafatonario IT. http://gazafatonarioit.blogspot.com/2006/11/lecturas-fundamentales.html.
    Sobre casos de uso 2.0, pueden ver mi artículo en:
    Y este otro:

    lunes, abril 09, 2012

    Casos de Uso 2.0 y Métodos Ágiles

    Quienes ven un sabor “ágil” en la práctica Casos de Uso 2.0, como la expone Jacobson, no se equivocan. Esta es una práctica escalable y ágil que puede ser usada junto a prácticas administrativas y técnicas seleccionadas para apoyar el desarrollo exitoso de software y otras formas de sistemas. Su primera característica es que es una práctica liviana y fácil de usar. De hecho, los autores comienzan diciendo que la guía (se refieren al eBook Use Case 2.0 - Guía Definitiva), describe como aplicar casos de uso de una manera “ágil” y escalable. Y estos dos conceptos se extienden a lo largo de cada una de las páginas del documento.

    El concepto de “incrementos” y de “historias de usuario”, generalizado en toda la práctica, es inherente a los métodos ágiles como Scrum. De hecho Casos de Uso 2.0 hace referencia a técnicas como el de “Backlog del producto” también usada en los Sprints o iteraciones de Scrum. el backlog (Product Backlog en Scrum) se crea con casos de uso, historias de usuario y porciones de casos de uso, o una combinación de todas estas.

    Pero también es importante aclarar que esta técnica no es una franquicia solo para estrategias ágiles. También puede ser usada con otros métodos o procesos como RUP o MSF. La práctica “no es solo aplicable a pequeños equipos ágiles ubicados en una misma oficina, sino que también es para grandes equipos distribuidos que desarrollan de multi-sistemas complejos.” 

    Para precisar mi punto quiero referirme al “principio 5: Entregar el sistema en incrementos”, del que habla la guía en el primer capítulo.

    En este apartado, los metodólogos enfatizan que “la mayoría de los sistemas de software evolucionan a través de muchas generaciones. Estos no son producidos de una sola vez, sino que son construidos como una serie de versiones, cada una de las cuales es implementada sobre la anterior. Aun las versiones mismas no son producidas de un solo tirón, sino que evolucionan a través de una serie de incrementos. Cada incremento arroja una versión demostrable o usable del sistema. Cada incremento se construye sobre el incremento previo para adicionar más funcionalidad o mejorar la calidad de lo que se ha hecho antes. Esta es la forma en que todos los sistemas deberían ser producidos.”

    Más adelante remarcan: “Las porciones de casos de uso son una herramienta fabulosa para construir incrementos más pequeños en forma de una versión completa. Esta herramienta permite apuntar independientemente a porciones implementables y verificables de los incrementos, asegurando que cada incremento sea más grande que, y esté construido sobre, el anterior.” El concepto es a todas luces aplicable tanto a los métodos ágiles como a los no ágiles.

    PD. Para quienes entran tarde a la sintonía, estoy extendiendo el tema de Casos de Uso 2.0, que inicié hace algunos días en otra entrada. Lo pueden encontrar en http://gazafatonarioit.blogspot.com/2012/04/casos-de-uso-20.html

    martes, mayo 20, 2008

    Lectura Fundamental 12
    Lectura # 12
    Casos de Uso: de Extensiones y de Inclusiones
    “El hombre vive fascinado por la inmensidad de la eternidad y nos preguntamos: ¿Nuestras acciones perdurarán a través de los siglos? ¿Gente que no conocemos oirá nuestros nombres mucho después de nuestra muerte? ¿Y se preguntarán quiénes éramos, cuán valientemente peleábamos, cuán ferozmente amábamos?”
    Wolfgang Petersen (Troya, 2004)
    Introducción
    De vuelta en el tiempo, hace unas siete Lecturas Fundamentales, prometí hablar de las relaciones entre los casos de uso. Pues bien, he querido extender el tema hacía el no menos complejo asunto de modelar sistemas de información mediante casos de uso. Trataré de mantener una posición minimalista: abordaré sólo la cuestión relacionada con el diagrama de casos de uso.
    Básicamente, un diagrama de casos de casos de uso está compuesto de Actores y Casos de Uso, y las relaciones entre los unos, entre los otros y entre los unos y los otros.
    Para recordar qué es un Actor podemos leer la Definición 5 en [3]. Para recapitular sobre Casos de Uso, podemos leer esencialmente [4] y luego repasar [5], [6], [7] y [3]. Ya sabemos además que podemos usar UML [8] para especificar, visualizar, construir y documentar los artefactos de sistemas de software.
    Generalización de Actores
    Dos o más Actores se relacionan entre ellos mediante la Generalización (de actores). Esta relación significa que uno o más actores pueden heredar las características, pero mejor aún, las responsabilidades de otro actor del sistema. Un Vendedor de Licencias de Software y un Vendedor de Servicios de Ingeniería tienen al menos una responsabilidad en común, una actividad: Registrar Cliente. Si los roles se interceptan en dos o más actividades en el sistema, es posible entonces, por razones de organización del modelo, de abstracción y de simplicidad, crear un nuevo actor: Vendedor de Productos y Servicios. Este parentesco se diagrama como muestro en la figura 1.
    Además, muchas veces enfrentamos el dilema en el que un caso de uso (del sistema) es ejecutado por dos o más actores. Como en un sistema de Administración de Proyectos, donde el Gerente de Proyectos puede Matricular un Proyecto, pero también lo puede hacer el Gerente de la Oficina de Proyectos. Una mala idea es expresar esta situación como lo hago aparecer en la figura 2.
    Figura 1: Diagrama parcial de Actores de un Sistema CRM
    En cambio, usamos la generalización, creando un actor que desde el punto de vista del negocio y del usuario es Abstracto: el Administrador de Proyectos. Entonces, el diagrama se convierte en algo como lo que sugiero en la figura 3.


    Figura 2: Diagrama Incorrecto de Casos de Uso de un Sistema de Administración de Proyectos


    Figura 3: Diagrama Correcto de Casos de Uso de un Sistema de Administración de Proyectos
    Quizás lo que sucede en estos casos es que confundimos Actores del Negocio [3] con Actores del Sistema o, simplemente, cargos o roles de la organización para la cual se construye la aplicación con roles o responsabilidades en el sistema de las personas que ejercen esas funciones. Ese no es el camino.
    Por último, tengamos en cuenta el sentido de la generalización de actores: los casos de uso ejecutados por el actor padre son en la práctica ejecutados por los hijos.
    Relaciones Entre Actores y Casos de Uso
    Un Actor se comunica con casos de uso, componentes y clases [9]. Esta comunicación se representa mediante la relación de Asociación (binaria). En Particular, nos interesa la relación entre el actor y el caso de uso. Esta relación muestra el actor que inicia o ejecuta el caso de uso, normalmente una persona o un grupo de personas, pero también cualquier entidad externa al sistema, como otra aplicación o maquinaria especial.
    Las figuras 3, 4, 5 y 6 son muestras de relaciones de asociación típicas entre actores y casos de uso.
    En estos diagramas, la constante es que la relación es en ambos sentidos, es decir, es una relación de toma y dame, el actor hace-el sistema hace. Pero también se presentan casos donde la asociación es en un solo sentido, o hacia el caso de uso o hacia el actor. Estas situaciones son comunes cuando el actor no es una persona, sino un software externo o una máquina. Como en la figura 4, donde al ejecutarse la funcionalidad de registrar un cliente que es persona natural, el sistema CRM le comunica al sistema contable que matricule un tercero.
    En este diagrama, la funcionalidad que va al sistema externo se representa como un caso de uso “incluido”, una relación de la que hablaré en breve. Pero en la práctica, la comunicación puede ir directamente del caso de uso principal al sistema externo.


    Figura 4: Diagrama Parcial de Casos de Uso donde interviene un sistema externo
    Casos en los que un actor se relaciona con una clase o un componente se presentan cuando el actor es un sistema externo que envía o recibe datos del sistema principal o, cuando siendo persona, el actor se comunica con el sistema vía una página Web, por ejemplo, que se representa como una clase en la aplicación. Este último caso se presenta en los diagramas de Interacción, como los de Secuencia [10] o de Comunicación.
    Relaciones Entre Casos de Uso
    Este es la materia que genera más polémica y la que es menos entendida en la comunidad de la IT, así es que trataré de ir más despacio.
    Dos o más casos de uso se pueden relacionar entre ellos para distintos propósitos: distribuir mejor el modelo, establecer condiciones de reusabilidad (de funcionalidad), de incrementos del software, y para planear las iteraciones, entre otros. Las relaciones son de tres tipos: Inclusión, Extensión y Generalización. Enfatizaré en las dos primeras.
    Relación de Inclusión
    Una relación de inclusión define que un caso de uso contiene el comportamiento definido en otro caso de uso [11].
    Una relación de inclusión es una relación de un caso de uso base a un caso de uso incluido en la que se especifica como el comportamiento definido en el caso de uso incluido es explícitamente insertado en el comportamiento del caso de uso base [1]. Decimos entonces que el caso de uso incluido es abstracto, es decir, no es ejecutado directamente por un actor.
    Esta relación se usa cuando queremos:
    • Factorizar o descomponer (en sentido matemático) el comportamiento del caso de uso base que no es necesario para entender el objetivo principal del mismo y donde solamente el resultado del caso de uso incluido es importante.
    • Distribuir en uno o más casos de uso, funcionalidad del caso de uso base que es común para dos o más casos de uso (reusabilidad).
    La primera opción se usa especialmente en casos de uso largos o complejos donde algunas partes del mismo no son relevantes para el sentido primordial del caso de uso y no son necesarias, en primera instancia, para entenderlo y aprobarlo. Por ejemplo, un caso de uso para Ingresar un Cliente de Naturaleza Jurídica puede solicitar docenas o cientos de datos que se pueden agrupar de acuerdo a algunos criterios como Datos Generales, Datos del Tipo de Entidad y Naturaleza Jurídica, Datos del Gerente o Representante Legal, Datos de los Contactos, Referencias Comerciales, entre otros. Algunos de estos grupos de datos pueden incluirse en casos de uso complementarios que son ejecutados desde el caso de uso principal que podría lucir así:
    Caso de Uso: Registrar Cliente Jurídico
    Actor: Vendedor de Productos y Servicios
    Descripción: este caso de uso permite registrar los datos de una persona de naturaleza jurídica…
    Secuencia Básica:
    1. El caso de uso inicia cuando el Actor decide registrar los datos de una persona jurídica
    2. El sistema pide seleccionar la ciudad y oficina de vinculación
    3. El actor selecciona la ciudad y oficina de vinculación
    4.
    12. Se ejecuta el caso de uso Registrar Datos del Tipo de Entidad y Naturaleza Jurídica
    13. Se ejecuta el caso de uso Registrar Datos del Gerente o Representante Legal
    14. Se ejecuta el caso de uso Registrar Datos de las Referencias Comerciales
    15….
    25. El caso de uso termina
    Poscondiciones: N/A
    Requisitos Especiales: N/A
    En este ejemplo, en los pasos 12 a 14 se ejecutan distintos casos de uso de los que, en principio, interesa el resultado. La palabra clave es “en principio”. En este diagrama también muestro la segunda posibilidad de inclusión, el reuso, con el caso de uso Verificar Centrales de Riesgo, que se ejecuta desde varios casos de uso del modelo.
    Algunos aspectos de los casos de uso incluidos que debemos tener en cuenta:
    • Un caso de uso incluido no contiene una funcionalidad significante para la arquitectura del sistema, especialmente para la vista funcional o de casos de uso.
    • Un caso de uso incluido se puede “prototipar” en las primeras de cambio, es decir, durante el análisis y el diseño del mismo, el diseñador se puede concentrar en el caso de uso base y omitir los detalles particulares del caso de uso incluido.


    Figura 5: Diagrama parcial del caso de uso Registrar Cliente Jurídico
    • Un caso de uso incluido no debe usarse como excusa para hacer descomposición funcional [4], es decir, tener uno o más casos de uso incluidos que especifiquen aspectos CLAB (creación, lectura, actualización o borrado –CRUD en inglés) o que estén vinculados a usuarios concretos específicos, o completamente ligados a un componente del sistema o a un componente arquitectónico específico, o vinculados a una pantalla o función de usuario determinada, o en algún paso de su secuencia ejecutan otros casos de uso incluidos (asunto este que debería evitarse tanto como se pueda). Para saber más de casos de uso funcionalmente descompuestos ver Definición 3 en [4].
    • Un caso de uso incluido está incompleto por naturaleza, es decir, por sí solo no arroja un resultado observable para el actor, o es un resultado parcial, o sus escenarios dependen de lo que ha pasado antes en el caso de uso principal.
    • Un caso de uso incluido no es ejecutado por un actor distinto al actor del caso de uso base. Sin embargo, un caso de uso incluido puede tener asociado un actor pasivo o secundario, normalmente cuando este actor recibe o entrega información al caso de uso incluido, como anotaba en la figura 4.
    • Un caso de uso incluido no se usa para especificar procesos automáticos o semi-automáticos que el sistema realiza en su totalidad sin interacción con el usuario.
    • Un caso de uso incluido siempre se implementa con el caso de uso base o antes, si se trata de un caso de uso que expone funcionalidad común. En otras palabras, el caso de uso incluido se implementa durante la misma iteración en que se implementa el primero caso de uso principal que lo incluya.
    • Un caso de uso incluido no es condicional, es decir, si el ejecutar el caso de uso base se alcanza el paso donde se ejecuta el caso de uso incluido, éste se ejecuta. Por supuesto, la ejecución de la funcionalidad incluida puede depender de si se cumple una condición o no en el caso de uso base, pero esta condición debe especificarse explícitamente en el caso de uso principal, como apunto en el paso 12 del ejemplo siguiente:
    Caso de Uso: Registrar Cliente Natural
    Actor: Vendedor de Productos y Servicios
    Descripción: este caso de uso permite registrar los datos de una persona natural.
    Secuencia Básica:
    5. El caso de uso inicia cuando el Actor decide registrar los datos de una persona natural
    6. El sistema pide seleccionar la ciudad y oficina de vinculación
    7. El actor selecciona la ciudad y oficina de vinculación
    8. El sistema solicita el nombre de la persona
    9. El actor ingresa el nombre de la persona
    10. El sistema pide seleccionar la profesión de la persona
    11. El actor selecciona la profesión de la persona
    12. Si la profesión es “Congresista” se ejecuta el caso de uso Verificar Lista Clinton.
    13. …
    14. Se ejecuta el caso de uso Registrar Datos de las Referencias Comerciales
    15….
    25. El caso de uso termina
    Poscondiciones: N/A
    Requisitos Especiales: N/A
    • Un caso de uso incluido debería incluir, en su documentación, una sección que describa explícitamente los casos de uso base desde los cuales es incluido. Este simple ejercicio hace al documento tan auto-suficiente o auto-contenido como sea posible, es decir, los interesados en el artefacto no tendrán que navegar por ningún otro lado para conocer todo el detalle del caso de uso.
    • En un caso de uso incluido, las precondiciones siempre se han cumplido en el caso de uso base que lo incluye. Entre tanto, las poscondiciones del caso de uso incluido afectan el comportamiento del resto del caso de uso base.
    • Finalmente, un caso de uso incluido no debería tener relaciones de extensión con otros casos de uso. Simplemente no tiene sentido.
    Pasemos precisamente a la trama de las extensiones.
    Relación de Extensión
    La Extensión es una relación de un caso de uso de extensión a un caso de uso extendido que especifica como y cuando el comportamiento definido en el caso de uso de extensión puede ser insertado en el comportamiento definido en el caso de uso extendido [12].
    Esta relación se usa:
    • Para establecer que un fragmento de la funcionalidad del caso de uso es opcional, o potencialmente opcional. A diferencia de lo que ocurre con la inclusión que es una relación que implica obligatoriedad en la ejecución, por decirlo de cierta manera.
    • Para señalar una parte del comportamiento que es ejecutado sólo bajo ciertas circunstancias, a veces excepcionales, tales como el envío de un mensaje a un usuario cuando se produce un hecho determinado. Por ejemplo, cuando un cliente VIP solicita el aumento de un cupo de crédito y la cantidad solicitada sobrepasa la política de crédito que puede soportar al Analista de Crédito, entonces el proceso pasa a una instancia mayor, como un Gerente de Oficina o algo así. Decimos entonces que ha ocurrido una interrupción en el caso de uso. A este dilema nos enfrentamos continuamente y la primera intención de un Ingeniero de Requisitos inexperto es crear un único caso de uso con dos actores. Ahora ya sabemos que realmente son dos parejas actor-caso de uso.
    • Para mostrar que puede haber un conjunto de segmentos de comportamiento de los cuales uno o varios de estos pueden ser insertados en un punto de extensión en un caso de uso base o extendido. Estas secciones insertadas (y el orden en el cual son insertadas) dependerán de la interacción con los actores durante la ejecución del caso de uso base.
    La extensión es condicional, lo que significa que su ejecución depende de lo que ha pasado mientras se ejecuta el caso de uso base. Éste no controla las condiciones para la ejecución de la extensión –las condiciones son descritas dentro la relación de extensión. El caso de uso de extensión puede acceder y modificar los atributos del caso de uso base. Éste, sin embargo, no puede ver las extensiones y no puede acceder a sus atributos.
    Una diferencia fundamental con la inclusión es que, en la extensión, el caso de uso base está completo por sí mismo, es decir, que debería entenderse y tener significado completo sin ninguna referencia a sus extensiones. Sin embargo, el caso de uso base no es independiente de las extensiones, puesto que no puede ser ejecutado sin la posibilidad de seguir las extensiones [2]. También pasa que el caso de uso de extensión puede acceder y modificar los atributos del caso de uso base, pero éste no puede ver las extensiones y no puede acceder a sus atributos. Y más, el caso de uso base se modifica implícitamente por las extensiones. En otras palabras, el caso de uso extendido (base) es ciego a sus extensiones específicas, pero no al contrario.
    Un poco truculento, pero así es. La figura 6 es una muestra típica de extensión de casos de uso.
    Otra gran diferencia entre la inclusión y la extensión es que el caso de uso de extensión puede ser ejecutado por un actor distinto al caso de uso base, como observamos en el diagrama. Observamos también la condición que activa la extensión en cada caso: en una de ellas se trata de un crédito de mayor cuantía, donde la mayor cuantía es un atributo que puede y debería ser configurable; mientras que en el segundo caso se trata de un cliente del sector gubernamental o bien podría ser algún otro tipo de cliente con tratamiento especial.


    Figura 6: Diagrama parcial del caso de uso Aprobar Solicitud de Crédito
    Y más de la cuestión semántica, las extensiones de un caso de uso son suplementarias, lo que quiere decir, que el caso de uso extendido está completo, es un todo. En el ejemplo de la figura 6, Aprobar Solicitud de Crédito es un caso de uso terminado por sí mismo y bien podría ser implementado en una iteración distinta (previa) y hasta en un proyecto diferente a la iteración o proyecto donde se implementan los otros casos de uso. Esta es otra de las razones por las que se usa la extensión.
    Y estos son algunos aspectos de los casos de uso extendidos y de extensión que debemos tener en cuenta a la hora de modelar sistemas de información:
    • Un caso de uso extendido y sus casos de uso de extensión sí entregan un resultado de valor observable para el actor que los ejecuta, ya sea a través de ellos mismos o transfiriéndolo de la extensión al extendido y de allí al actor.
    • Un caso de uso de extensión no es una especialización del caso de uso extendido, es decir, la extensión no es una relación de herencia o de generalización, dependiendo desde el ángulo del cual miremos. Hago énfasis en este aspecto porque tengo la ligera impresión de que, no sólo los analistas noveles, sino también los diseñadores y los programadores estamos entrenamos para ver la extensión como una especialización, cuando en realidad no es así.
    • Quizás es por eso que la OMG tomó la decisión de cambiar la definición formal de la extensión para que sea una relación de dependencia. Aunque quiero aprovechar este punto para decir también que esta situación se desprende de la estructura formal de UML, la así llamada Especificación de Infraestructura de UML [13], algo que nos ha complicado la vida de muchas formas, sin embargo, esta definición formal muchas veces es irrelevante en la vida real, quiero decir, no es práctica en la mayoría de los modelos que construimos.
    • Un caso de uso se puede usar para documentar nuevas versiones del caso de uso original. Este es un gran beneficio de la extensión, porque deja intacto el caso de uso original que posiblemente ya está implementado y hasta en producción y permite que el analista de requisitos se concentre con los usuarios en las nuevas características del caso de uso extendido.
    Aquí nos enfrentamos a la disyuntiva de extender o no extender un caso de uso. Me refiero a que si el cambio es pequeño, posiblemente sea más útil y práctico especificar una secuencia alterna en el caso de uso base; si la modificación es substancial, a juicio del analista, éste tomará la sabia decisión de crear un nuevo caso de uso.
    Ahora bien, un caso de uso extendido luce más o menos así:
    Caso de Uso: Aprobar Solicitud de Crédito
    Actor: Analista de Crédito
    Descripción: este caso de uso permite aprobar una solicitud de crédito realizada por un cliente…
    Secuencia Básica:
    1. El caso de uso inicia cuando el Actor decide aprobar una solicitud de crédito
    2. El sistema solicita el radicado y la fecha de de la solicitud
    3. El actor ingresa el radicado y la fecha de de la solicitud
    4. El sistema valida que el radicado exista para la fecha establecida y muestra los datos de la solicitud: nombre o razón social del cliente, número de identificación y tipo de la misma, dirección, ciudad, …, sector del cliente, cantidad solicitada, …
    5. El sistema pide seleccionar el tipo de desembolso (Cheque, Consignación, Efectivo)
    6. El actor selecciona el tipo de desembolso
    7. El sistema solicita el número de aprobación de la solicitud
    8.
    25. El caso de uso termina
    Poscondiciones: N/A
    Puntos de Extensión
    5A. La cantidad solicitada es de Mayor Cuantía
    7A. El cliente es del sector Gobierno
    Requisitos Especiales: N/A
    Lo único distinto son los puntos de extensión. Observen que la secuencia básica del caso de uso, ni ninguna otra secuencia, hace alusión a uno o más casos de uso de extensión. Es lo que había dicho: el caso de uso base no conoce los atributos ni las características del caso de uso de extensión.
    Por su parte un caso de uso de extensión, se diferencia de un caso de uso normal en que debe tener especificado el evento que lo activa (llamado comúnmente trigger). Por ejemplo, en la figura 7, Asignar Revisión de Arquitectura es considerada una actividad especial por el sistema de Administración de Proyectos:


    Figura 7: Diagrama parcial de casos de usos de un Sistema de Administración de Proyectos
    Este caso de uso, que extiende a Asignar Actividad, podría lucir más o menos así:
    Caso de Uso: Asignar Revisión de Arquitectura
    Actor: Gerente de Oficina de Proyectos
    Descripción: este caso de uso permite al PMO asignar la revisión de una arquitectura de software…
    Evento de Activación: la actividad es una actividad especial: Revisión de Arquitectura
    Secuencia Básica:
    1. El caso de uso inicia cuando el Actor decide asignar una revisión de arquitectura
    2. El sistema pide seleccionar el revisor técnico
    3. El actor selecciona el revisor técnico
    4. El sistema verifica que el revisor técnico tenga el perfil requerido para la actividad
    5. El actor …
    6.
    12. El caso de uso termina
    Poscondiciones: N/A
    Requisitos Especiales: N/A
    La figura 7 también dilucida sobre otro aspecto de las relaciones entre casos de uso: un caso de uso base puede estar asociado con uno o más casos de uso incluidos y con uno o más casos de uso extendidos.
    Otro aspecto importante de las relaciones de extensión es que el diagrama es bastante explicativo. En la figura 8, por ejemplo, está claro que un vuelo cualquiera puede ser reservado por un pasajero cualquiera, pero que si el pasajero está registrado como frecuente, la reserva tiene algunas características especiales (estas particularidades no se pueden observar en un diagrama de casos de uso como este).
    El diagrama 8 también muestra otro aspecto de las relaciones de extensión y es que un caso de uso de extensión puede ser a su vez extendido por uno o más casos de uso de extensión. Y este hecho profundiza más en el proceso del negocio que resuelve este modelo: si el vuelo es internacional, y el pasajero frecuente además está registrado como pasajero VIP, tiene la opción de establecer o seleccionar el menú que consumirá durante el vuelo.


    Figura 8: Diagrama parcial de casos de usos de un Sistema de Reservación de Vuelos
    Del diagrama no se pude extraer información sobre las distintas clases de vuelo que proporciona la aerolínea. Sin embargo, este es precisamente el objeto del siguiente apartado: la clasificación de casos de uso, en el sentido de generalización, llamada también herencia de casos de uso.
    Generalización Entre Casos de Uso
    Una generalización es una relación taxonómica entre un clasificador más general y un clasificador más específico. Cada instancia del clasificador específico también es una instancia indirecta del clasificador general. Así, el clasificador específico hereda las características del clasificador más general [14].
    Esta relación es ampliamente usada en el modelado orientado a objetos, sin embargo, no solo se da entre clases y objetos, sino entre cualquier elemento de UML que actúe como clasificador, como los casos de uso.
    La generalización de casos de uso se usa cuando dos o más casos de uso comparten comportamiento, estructura y propósito. Es decir, si dos casos de uso ejecutan un conjunto amplio de actividades similares y sólo algunas diferentes, es posible tomar todas las tareas comunes y especificarlas en un nuevo caso de uso que generaliza a los dos anteriores y en estos dos sólo se especifican las tareas disímiles. Esa es la primera premisa para usar la relación de generalización entre casos de uso, como en la figura 9, donde es posible que Reservar Vuelo Doméstico y Reservar Vuelo Internacional sólo difieran en que para este último caso el actor pueda seleccionar la ruta y especificar algunas condiciones especiales de vuelo.


    Figura 9: Diagrama parcial de casos de usos de un Sistema de Reservación de Vuelos
    El caso de uso Reservar Vuelo Doméstico puede especificarse de la siguiente manera:
    Caso de Uso: Reservar Vuelo Doméstico
    Actor: Pasajero
    Descripción: este caso de uso permite a un pasajero reservar un vuelo entre dos ciudades nacionales…
    Secuencia Básica:
    1. El caso de uso inicia cuando el Actor decide reservar un vuelo doméstico
    2. El sistema pide seleccionar las ciudades origen y destino del vuelo
    3. El actor selecciona las ciudades origen y destino del vuelo
    4. El sistema solicita las fechas de ida y de regreso del vuelo
    5. El sistema valida la existencia de vuelos con las condiciones establecidas y pide seleccionar la tarifa
    6. El actor selecciona la tarifa
    7. El sistema genera y muestra un código de reserva y el caso de uso termina
    Poscondiciones: N/A
    Entre tanto, el caso de uso Reservar Vuelo Internacional puede ir así:
    Caso de Uso: Reservar Vuelo Internacional
    Actor: Pasajero
    Descripción: este caso de uso permite a un pasajero reservar un vuelo cuya ciudad destino es de otro país…
    Secuencia Básica:
    1. El caso de uso inicia cuando el Actor decide reservar un vuelo internacional
    2. El sistema pide seleccionar las ciudades origen y destino del vuelo
    3. El actor selecciona las ciudades origen y destino del vuelo
    4. El sistema solicita las fechas de ida y de regreso del vuelo
    5. El sistema valida la existencia de vuelos con las condiciones establecidas, muestra las rutas disponibles (escalas intermedias) y pide seleccionar la ruta y tarifa de preferencia
    6. El actor selecciona la ruta y la tarifa de su preferencia
    7. El sistema pide seleccionar las condiciones especiales del vuelo
    8. El sistema genera y muestra un código de reserva y el caso de uso termina
    Poscondiciones: N/A
    Requisitos Especiales: N/A
    La diferencia entre uno y otro se nota en los pasos 5, 6 y 7. En este caso, el caso de uso padre, Reservar Vuelo puede contener exactamente la misma funcionalidad que Reservar Vuelo Doméstico y dejar sólo los pasos distintos en Reservar Vuelo Internacional. De esta manera se simplifica la especificación y el modelado del sistema.
    También puede ocurrir que sea necesario agrupar dos o más casos de uso cuya funcionalidad, estructura y objetivo sean compartidos en un caso de uso puramente abstracto, también para efectos de simplificación del modelo. Como en la figura 10.


    Figura 10: Diagrama parcial de casos de usos de un Sistema de Administración de Proyectos
    Aquí, el caso de uso abstracto no contiene ninguna especificación funcional y se usa como “comodín”, quizás para relacionar los casos de uso hijos con uno o más casos de uso incluidos o de extensión. También para hacer el análisis y diseño de todos ellos al mismo tiempo (hacer una única realización de casos de uso, por ejemplo).
    Aunque no está especificado, los casos de uso hijos pueden ser ejecutados por actores diferentes. También, si el caso de uso padre es abstracto, podría no tener actor relacionado. En esta última instancia, los hijos deberían tener asociado el actor que los ejecuta, necesariamente.
    Mi recomendación final es que usemos la generalización de casos de uso como detallo en esta última alternativa. Para la primera forma, siempre podemos usar inclusión y hasta extensión.
    Conclusiones
    Un modelo es una abstracción de la realidad, una representación simplificada de algunos fenómenos del mundo real. En materia de sistemas de software, esos fenómenos se refieren a requisitos del software y la representación de los mismos se hace mediante actores, casos de uso y las relaciones entre aquellos y estos y entre cada uno de ellos.
    La asociación, la generalización, la inclusión y la extensión son los cuatro tipos de relaciones entre estos elementos de los sistemas de información. Algunas de ellas se quedan en un plano estrictamente teórico o conceptual, en el sentido de que no tienen aplicación práctica, al menos, no una de valor para el modelador. Me refiero a la generalización que en lo que a casos de uso se refiere no tiene el sentido de provecho que tiene, por ejemplo, en un diagrama de clases o uno de objetos.
    La asociación, por su parte, es la relación natural entre actores y casos de uso, su significado es directo y simple: este actor ejecuta o inicia este caso de uso. También, este actor entrega o recibe información de (interactúa con) este caso de uso. Más allá, la inclusión y la extensión constituyen un par de relaciones que despiertan emociones encontradas en la comunidad de analistas, ya sea porque tendemos a confundir su uso o porque nuestros paradigmas mentales (específicamente los de la orientación a objetos) no nos permiten verlas y usarlas con claridad expedita.
    Estos son los temas que he tratado de dilucidar en este artículo. Son aspectos en los que todos debemos mejorar en aras de incrementar la calidad de los productos que desarrollamos.
    ¿Quiere Saber Más?
    Para conocer más sobre especificación de casos de uso, podemos consultar [15] que sigue siendo, sino el mejor, uno de los muy buenos libros sobre el espinoso asunto de escribir casos de uso.
    Para conocer más de modelado de casos de uso, relaciones de inclusión, extensión y generalización, podemos consultar [16], [17] y [18] cuyos autores concentran sus esfuerzos en explicar los distintos patrones que podemos encontrar al momento de modelar requisitos de software con casos de uso.
    Como siempre, está el que considero el mejor libro sobre UML, patrones, análisis y diseño orientado a objetos y el proceso de desarrollo de software, todo en uno. Se trata del libro de Larman [19].
    También está el libro origen de todo, el de los three amigos [20].
    Fin.
    Referencias
    [1] IBM. The Rational Unified Process V7.1.
    [2] IBM. The Rational Unified Process version V7.1.
    [3] Luis Antonio Salazar Caraballo, “Casos de Uso: Origen, Especificación y Evolución”, Gazafatonario IT, http://gazafatonarioit.blogspot.com/2006/11/lecturas-fundamentales-2.html, 17 nov. 2006.
    [4] Luis Antonio Salazar Caraballo, “Casos de Uso: De Vuelta a lo Fundamental”, Gazafatonario IT, http://gazafatonarioit.blogspot.com/2006/11/lecturas-fundamentales.html, 09 nov. 2006.
    [5] Luis Antonio Salazar Caraballo, “Casos de Uso: Del Todo y de Sus Partes”, Gazafatonario IT, http://gazafatonarioit.blogspot.com/2006/11/lecturas-fundamentales-3.html, 23 nov. 2006.
    [6] Luis Antonio Salazar Caraballo, “Casos de Uso: ¿Cuándo Están Terminados?... ¿Y qué hacer con ellos a continuación?”, Gazafatonario IT, http://gazafatonarioit.blogspot.com/2006/12/lecturas-fundamentales-4-1-de-2.html, 07 dic. 2006.
    [7] Luis Antonio Salazar Caraballo, “Casos de Uso: ¿Cuándo Están Terminados?... ¿Y qué hacer con ellos a continuación? Parte 2 de 2”, Gazafatonario IT, http://gazafatonarioit.blogspot.com/2006/12/lecturas-fundamentales-5-2-de-2.html, 22 dic. 2006.
    [8] Luis Antonio Salazar Caraballo, “Prolegómenos Sobre el Lenguaje de Modelado Unificado”, Gazafatonario IT, http://gazafatonarioit.blogspot.com/2005/06/prolegmenos-sobre-el-lenguaje-de.html, 01 jun. 2006.
    [9] Object Management Group, “OMG Unified Modeling Language (OMG UML), Superstructure, V2.1.2”, http://www.omg.org/technology/documents/modeling_spec_catalog.htm#UML, 2 nov. 2007. Pp. 587.
    [10] Luis Antonio Salazar Caraballo, “Realización de Casos de Uso: de los Objetos y sus Interacciones”, Gazafatonario IT, http://gazafatonarioit.blogspot.com/2007/10/lecturas-fundamentales-10-lectura_3046.html, 23 oct. 2006.
    [11] Object Management Group, “OMG Unified Modeling Language (OMG UML), Superstructure, V2.1.2”, http://www.omg.org/technology/documents/modeling_spec_catalog.htm#UML, 2 nov. 2007. Pp. 592.
    [12] Object Management Group, “OMG Unified Modeling Language (OMG UML), Superstructure, V2.1.2”, http://www.omg.org/technology/documents/modeling_spec_catalog.htm#UML, 2 nov. 2007. Pp. 589.
    [13] Object Management Group, “OMG Unified Modeling Language (OMG UML), Infrastructure, V2.1.2”, http://www.omg.org/technology/documents/modeling_spec_catalog.htm#UML, 4 nov. 2007.
    [14] Object Management Group, “OMG Unified Modeling Language (OMG UML), Superstructure, V2.1.2”, http://www.omg.org/technology/documents/modeling_spec_catalog.htm#UML, 2 nov. 2007. Pp. 71.
    [15] Alistair Cockburn, “Writing Effective Use Cases”, Addison-Wesley, 21 feb. 2000.
    [16] Mike O’Docherty, Object-Oriented Analysis & design, Understanding System Development With UML.” John Wiley & Sons. 2005.
    [17] Steve Adolph, Paul Bramble, Alistair Cockburn, Andy Pols. Patterns for Effective Use Cases. Addison Wesley. August 23, 2002.
    [18] Kim Hamilton, Russell Miles. Learning UML 2.0. O'Reilly. April 2006.
    [19] Graig Larman. applying-uml-and-patterns-an-introduction-to-object-oriented-analysis-and-design-and-the-unified-process-2nd-edition. 13 jul. 2001.
    [20] Grady Booch, James Rumbaugh, Ivar Jacobson. The Unified Modeling Language User Guide. 2nd-edition. May 29, 2005.
    Lectura Fundamental Siguiente: Casos de Abuso