Buscar en Gazafatonario IT

Mostrando las entradas con la etiqueta Concepción. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Concepción. Mostrar todas las entradas

jueves, octubre 11, 2012

Los casos de abuso o de cómo hacer un mal uso de los casos de uso


Este fue un estudio de hace unos 5 años. Los resultados los publiqué entonces internamente como la Lectura Fundamental 13, que nunca vio la luz en este Gazafatonario. Solo ahora, revisando los temas que incluiré en mi próximo libro, decidí hacerlos público abiertamente como ustedes los han estado leyendo.
No obstante el tiempo que ha pasado desde entonces, el resultado de mi observación es que seguimos cometiendo estos errores incontables veces. Por eso no quise esperar a que el libro estuviera publicado.
Lo primero que se deriva de este análisis es que los casos de uso no son el único instrumento para especificar requisitos de software, algo que he llamado en otras instancias “el arquetipo de los envoltorios heterogéneos”.
Pero antes de ir a la conclusión de este estudio, revisemos los abusos que estamos cometiendo:
Caso de Abuso
Impacto en la Calidad
Alto
Bajo
Medio
Medio
Medio
Alto
Bajo
Alto
Bajo
Alto
Alto
Medio
Hay muchos más: el problema es mucho más grave cuando no hay el entrenamiento y acompañamiento que todo Analista o Ingeniero novel necesita cuando emprende el viaje hacia lo que significa identificar, documentar, organizar y administrar requisitos de software.
Para No Cometer Más Abusos
En general, las personas creemos que el mejor proceso de aprendizaje es la lectura. Si bien es cierto que leer es fundamental, sobre todo en las etapas tempranas de la carrera de un buen profesional, pienso que la forma principal de aprendizaje es la introspección. Leer siempre ayuda, especialmente porque puede hacernos reflexionar sobre puntos que no habíamos analizado previamente, pero la mejoría como Analista de Requisitos en particular y como Ingeniero de Software en general, más allá de un ingeniero primitivo que hace su trabajo con las prácticas regulares transmitidas por instructores académicos que muchas veces nunca han estado en un proyecto de construcción de software, empieza siempre por el análisis profundo de cada situación. Conocer nuestras debilidades y saber por qué estamos haciendo en cada situación lo que estamos haciendo, es lo que nos acabará convirtiendo en mejores profesionales. Y para eso, aprender de los propios errores es algo esencial, tratando de evitar automatismos que pueden repercutir negativamente en nuestra profesión.
En particular, recomiendo leer a Cockburn [11] de quien ya he repetido es uno de los mejores autores de temas relacionados con la materia que nos ocupa: la escritura de casos de uso. El libro tiene un capitulo completo sobre errores cometidos al momento de escribir casos de uso. Pero también encuentro de mucha utilidad volver a leer y a releer los casos de uso que hemos escrito anteriormente. Y leer los casos de uso de nuestros compañeros. Someter los nuestros al escrutinio de nuestros pares y de otros expertos en el área, recibir con respeto las observaciones que nos hacen y discutirlas abiertamente. Leer las guías y listas de chequeos existentes y seguir las indicaciones de las plantillas ayuda profusamente. Para noveles, recomiendo las cinco primeras lecturas fundamentales de mi Gazafatonario IT [13] (Gazafatonario.Blogspot.com).
El artículo que motivó este estudio lo leí hace unos 13 años [14], lo encargo pródigamente. En [12] hay un compendio expedito sobre la cuestión, a manera de enumeración ejecutiva sobre lo malo y lo feo en las prácticas de casos de uso. De la misma forma, en [7] hay unas guías para cometer abusos, por supuesto, debemos usarlas a la inversa. Finalmente, en [15] y en [10] Ellen Gottesdiener identifica algunos patrones de abuso que siguen los equipos de desarrollo a la hora de crear casos de uso; no puede faltar en nuestra biblioteca digital de consulta. Por su parte, en [16] encontramos algunas sugerencias para aplicar durante el entrenamiento de estudiantes y profesionales en el área de Requisitos de Software, específicamente en modelado y especificación de casos de uso.
Y mi última recomendación: ¡Lanzarnos! Es decir, escribir casos de uso.
(Aclaración)
A propósito de todos estos trabajos relacionados que especifico en la sección anterior, cuando hacía la labor de investigación de fondo sobre este tema (paso 2 del método científico), me encontré inexorablemente en Google buscando por los términos “abuse cases” y “misuse cases” y Oh sorpresa mayor cuando me topé con [8] y [9] y el contexto es totalmente distinto al que deseaba: resulta que un caso de abuso (“abuse case”) es una especificación de un tipo de interacción completa entre un sistema y uno o más actores, donde los resultados de la interacción son dañinos para el sistema, para uno de los actores o para uno de los involucrados (stakeholders) en el sistema. Seguí este hilo y encontré todo un sumario que habla de modelos de casos de abuso para hacer análisis de requisitos de seguridad y de casos de uso con intención hostil (hacia los sistemas de software), no sólo en cuanto a la seguridad de las aplicaciones se refiere sino a los demás requisitos “ilidad” (confiabilidad, mantenibilidad, soportabilidad, funcionalidad y otras “ilidades” conocidas).
Así es que me pareció pertinente contarles el cuento por si llegan al punto o por si llegan a necesitar el dato. No es más.
Conclusiones
Errores se cometen en cualquier actividad, incluso he llegado a creer que la propia Naturaleza se equivocó al seleccionarnos como especie dominante durante este período cuaternario de la era Cenozoica, pero ese es otro asunto. Sin embargo, de los errores se aprende y, al parecer, estamos preparados para aprender muy rápido de nuestros propios sofismas. Es por eso que quise traerles este vademécum que espero se convierta en material de consulta regular y que apoye al elemento sorpresa asociado al descubrimiento de que estamos equivocados, para que así podamos formarnos en el difícil oficio de la Ingeniería de Requisitos y afines.
Sin duda, la lista de faltas puede ser mayor, pero lo que hacemos no define quienes somos, lo que nos define es qué tan bien nos levantamos después de caernos; es decir, lo que hacemos después de cometer la infracción. Algunos de estos abusos son más graves que otros, no tanto para nosotros, individuos reemplazables, sino para nuestros receptores principales: los usuarios.
Referencias
Algunas de estas referencias “bibliowebgráficas” ya las he mencionado en cada uno de los casos de abuso. Aquí están todas en conjunto para su consulta:
[1]  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
[2]   Luis Antonio Salazar Caraballo, “RUP: Fase de Concepción”, Gazafatonario IT,  http://gazafatonarioit.blogspot.com/2007/03/lecturas-fundamentales-8.html, 08 mar. 2007.
[3]  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.
[4]  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.
[5]  Así conocen al célebre trío de metodólogos que lideraron la creación de RUP y UML: Ivar Jacobson, James Rumbaugh y Grady Booch.
[6]  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.
[11]Alistair Cockburn, “Writing Effective Use Cases”, Addison-Wesley, 21 Feb. 2000
[17]Real Academia de la Lengua Española. RAE. http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=abuso

miércoles, septiembre 26, 2012

Casos de Abuso, Parte 9: Todos los requisitos funcionales se documentan en casos de uso


El que un proceso sea dirigido por casos de uso no quiere decir que toda la funcionalidad del software debe estar documentada en casos de uso. Hay requisitos que son transversales al producto, es decir, aplican en varias partes del sistema; también hay requisitos funcionales que se expresan mejor en prosa, siempre en términos del usuario, pero en narrativa; hay otras funcionalidades cuya complejidad amerita el uso de diagramas de actividad o de otro tipo de elementos gráficos o visuales para entenderse. En este último caso, siempre recomiendo el uso formal de UML como mecanismo de comunicación para no dar pie a malos entendidos o a concentración de ambigüedades.
Ya lo he expresado antes, los casos de uso apenas son uno de los mecanismos para identificar, organizar, documentar y administrar requisitos o, en el orden de ideas que estoy formulando, un receptáculo de requisitos, un depósito, un bote, una funda, un artilugio. De hecho, los casos de uso constituyen la práctica industrial más ampliamente usada en materia de requisitos de sistemas de información.
Lo digo de esta manera porque he notado que es muy fácil para las personas extraviar la noción y la práctica correcta de la Ingeniería de Requisitos y volverse “caso-de-uso-dependientes” y en ocasiones crean una especie de religión donde el acto de fe por los casos de uso toma tintes de devoción.
Como cualquier adicción, esta también va a ser difícil de desarraigar de nuestros modelos mentales. Sin embargo, vamos a intentarlo. Pero antes de eso, quiero reiterarles que soy entusiasta de los casos de uso, quienes han seguido mi Gazafatonario IT conocen las Lecturas Fundamentales, un esfuerzo medio modesto medio imponente por transmitir mi experiencia en el tema y que fueron la base de mi próximo libro, actualmente en etapa de edición.
En los últimos meses también he estado publicando sobre casos de uso 2.0, una estrategia que reúne las mejores prácticas tradicionales y ágiles para la documentación de requisitos de software, expuesta recientemente por el Dr. Ivar Jacobson y su equipo. Sobre este tema volveremos más adelante, cuando hayamos entendido, o hayamos vuelto a entender, el verdadero sentido del uso y el abuso de los casos de uso.
Este ha sido el principal objetivo de esta serie así llamada “Casos de Abuso”. En el capítulo 4 de la misma expongo las distintas formas y colores que pueden tomar los requisitos del software:
Impacto en la calidad: Bajo.
PD. Para saber más de ingeniería de requisitos, análisis de requisitos y el papel del Analista de Requisitos y de otros aspectos relacionados, pueden leer mi Lectura Fundamental 9:RUP: Fase de Concepción, Parte 2”, en mi Gazafatonario IT:

jueves, marzo 08, 2007

Lecturas Fundamentales 8

Lectura Fundamental Anterior: “RUP o Todo lo que quisiste saber alguna vez de RUP y no te atreviste a preguntar…”

Lectura # 8
RUP: Fase de Concepción

“No hay nada más difícil de emprender, ni más dudoso de hacer triunfar, ni más peligroso de manejar, que el introducir nuevas leyes.”
Nicolás Maquiavelo (El Príncipe, 1513)


“In principio creavit…”
Génesis 1 {1:1}

Inicio o Concepción es la primera fase de RUP. El nombre no es importante, solo la meta es importante. Lo realmente trascendental es el objetivo que buscamos durante este período de gestación del proyecto: complementando lo que dije en la lectura fundamental # 7, la finalidad cardinal de esta fase es establecer la visión y el alcance del proyecto y del sistema, lo que se hará y no se hará dentro del proyecto y más aún, lo que hará y lo que no hará el producto a construir.

Para ello, RUP nos proporciona herramientas, a manera de mecanismos y maniobras, que bien usadas nos llevan de la mano hacia la consecución del objeto primario que nos ocupa: obtener un acuerdo con todos los involucrados sobre los objetivos del ciclo de vida para el proyecto.

Pero antes de abordar detalladamente la fase de Concepción como la explica RUP, quiero referirme al significado de las características del proceso durante la misma.

RUP es Dirigido por Casos de Uso y es Centrado en la Arquitectura

Esto significa que los casos de uso son la base para el resto del proceso de desarrollo. Durante la fase de Inicio, cuantificamos y cualificamos los requisitos funcionales del sistema en términos de casos de uso. Estos se convierten en el insumo para:
  • Crear y validar el modelo de diseño de la solución
  • Diseñar la arquitectura del sistema
  • Definir los casos y procedimientos de prueba en el modelo de pruebas
  • Planear las iteraciones
  • Elaborar la documentación de usuario
  • Hacer el despliegue del sistema
  • Sincronizar el contenido de los diferentes modelos que forman el sistema

Los casos de uso también son usados para modelar el negocio, actividad que pocas veces es tenida en cuenta a la hora de entender el comportamiento sistemático de una organización.

Cualificar los casos de uso quiere decir en el contexto del proceso que el Arquitecto del software debe hacer una priorización de los mismos desde el punto de vista arquitectónico. Es decir, establecer cuales son los casos de uso que definen la arquitectura o que tienen un impacto mayor en la misma. Para ello, los Arquitectos ponemos de manifiesto nuestra experiencia en proyectos anteriores y similares, si es posible, para reconocer los casos de uso arquitecturales: El ciclo de vida del caso de uso, el número y la calidad de los elementos estructurales (tanto de arquitectura como de diseño como de implementación) que se requieren para implementar el comportamiento del caso de uso en el sistema, requisitos de desempeño, confiabilidad, soportabilidad, concurrencia y restriccio-nes de diseño, la complejidad algorítmica asociada al caso de uso, el número de escenarios del caso de uso, el ranking del caso de uso desde el punto de vista de su criticidad (esto es, si el caso de uso es requerido u obligatorio, o importante, o adicional –normalmente los casos de uso arquitectónicos se cuentan entre los dos primeros), el grado de novedad de la tecnología y las estrategias disponibles para implementar el caso de uso o, en otras palabras, la experiencia del equipo de desarrollo en el uso de tal o cual tecnología o conjunto de técnicas para resolver un problema dado, son todas variables relevantes a la hora de catalogar o evaluar los casos de uso desde una perspectiva de arquitectura.

La fase de inicio es exploratoria, los casos de uso, todavía en estado primitivo, corren por un río de aguas diáfanas que se precipitan desde la mente de los usuarios como huevos prehistóricos. Encontrarlos, darles un lugar en el sistema, clasificarlos, esbozarlos, modelarlos y finalmente presentarlos, es lo que hacemos como analistas durante este período del proyecto. Una vez aprobado el modelo, los casos de uso rigen los designios a veces insondables a veces meta-humanos de todo el proyecto. A los casos de uso no se les puede poner limitantes técnicas y el equipo de desarrollo debe mantenerlos como un libro abierto de referencia para decidir siempre el siguiente paso. Eso significa “dirigido por casos de uso.”

La arquitectura del software, por su parte, asoma tímida durante la concepción, a manera de arquitectura candidata o preliminar y debería contemplar más de una posible solución, un conjunto pequeño de alternativas de cómo se va a implementar el software y la estrategia que usaremos para abordar el tratamiento de los requisitos suplementarios o no funcionales: la vista de casos de uso o funcional, subconjunto propio del modelo de casos de uso, una vista lógica de alto nivel y quizás una perspectiva del despliegue de la aplicación, surgen de la mente creativa del arquitecto, cual visión futurista de lo que será, de cómo lucirán las entrañas del sistema una vez esté construido. Y sea cual fuere la decisión, la elección que tomemos en la siguiente fase del proyecto, la arquitectura es desde todo punto de vista restrictiva, circunscribe el diseño y, consecuentemente, la implementación y el despliegue de la solución software que se conciba. Pero a partir de ella se abordan y mitigan los riesgos técnicos del proyecto, durante las primeras iteraciones del mismo; también se construyen las bases o cimientos del sistema, unas en las que todos los requisitos conocidos y algunos de los no conocidos tengan cabida; por supuesto, la arquitectura es el eje medular alrededor del cual se construye la solución, se planea y se controla el proyecto y también, en torno al cual se asegura la calidad del producto. Eso significa “centrado en la arquitectura.”

Para el Gazafatonario IT

A manera de inventario, y puesto que esto no es más que un Gazafatonario, la palabra Conceptualización[1], aunque aparece en algún diccionario de la lengua española definida simplemente como: “f. Elaboración detallada y organizada de un concepto a partir de datos concretos o reales” no es aceptada por la Real Academia de la Lengua Española. Así que seguiremos usando Inicio o Concepción para referirnos a la primera fase del ciclo de vida de acuerdo a RUP.

Roles y Responsabilidades Durante Concepción

Un Ingeniero de Procesos, un Gerente de Proyectos, al menos un Analista de Requisitos, un Analista del Negocio y un Administrador de la Configuración y el Versionamiento son los responsables de iniciar el proyecto. Con ellos, los usuarios, clasificados en Usuarios Líderes, Usuarios Finales y otros Involucrados (stakeholders es el término que nos llega del inglés) son los encargados de dictar el problema (y el problema detrás del problema, la causa raíz), sus necesidades, y hasta sus ambiciones, sus sueños y sus esperanzas. Más adelante, un Especificador de Requisitos (realmente un escritor técnico de casos de uso que bien podría ser el mismo analista de requisitos –de hecho casi siempre lo es) y un Arquitecto del Software, se unen a los anteriores para establecer las características (de alto nivel) del software, los primeros requisitos funcionales (a manera de casos de uso) detallados, los requisitos no funcionales y la misma solución de software expresada en términos arquitectónicos y de diseño.

Vamos por partes.

El Ingeniero de Procesos

Sí, RUP es un proceso configurable y adaptable a cada proyecto. Es así como lo leen, a cada proyecto. La primera conclusión que viene a mi mente, aunque reiterativa, tiene que ver con la forma de abordar el proceso. Recordemos que el proceso expone prácticas que han funcionado alguna vez, pero que no deberíamos seguir al pie de la letra, cual ensayo de laboratorio.

Un proyecto tiene condiciones muy particulares: el tipo de organización, más exactamente, el contexto del negocio, el tamaño del esfuerzo de desarrollo del software, el grado de novedad, el tipo de aplicación, el proceso actual de desarrollo, los problemas actuales y sus causas primarias, los factores organizacionales, las actitudes y la complejidad técnica y de gestión son algunos discriminantes que el así llamado Ingeniero de Procesos debe tener en cuenta al momento de decidir el mejor de los caminos posibles del proceso para ese proyecto.

Previo a ello, debemos tener claridad sobre las influencias del proceso de desarrollo: factores del dominio, por ejemplo, entre los que se cuentan factores del dominio de la aplicación, del proceso de negocio a soportar, de la comunidad de usuarios y de las ofertas disponibles de los competidores; factores del ciclo de vida como el tiempo de salida al mercado, la vida esperada del software y las versiones futuras planeadas son igualmente importantes; factores técnicos, ni más faltaba, como los lenguajes de programación a usar, las herramientas de desarrollo, las bases de datos, los frameworks de componentes y los sistemas de software existentes, constituyen influjos de peso que actúan sobre el proceso de desarrollo, junto con otros factores organizacionales cuyo nombramiento, al menos, se escapa del alcance de esta lectura fundamental.

Sobre el tamaño del esfuerzo del proceso de desarrollo, tenemos en cuenta aspectos medibles como el número de líneas de código entregadas, el número de casos de uso, el número de personas por mes o por alguna otra unidad de tiempo, el número de clases y de componentes, el número de tablas y de procedimientos almacenados en la base de datos, entre otros, para cuantificar la influencia en el desarrollo: a mayor tamaño de proyecto, mayor tamaño de equipo de desarrollo, el contexto del negocio pierde importancia en favor de más formalidad y más visibilidad en los requisitos, en las interfaces y en los indicadores de progreso del proyecto. Adicionalmente, para equipos geográfi-camente dispersos, incluso transoceánicos, tenemos en cuenta aspectos cruciales de comunicación y el cambio del huso horario.

El grado de novedad es otra condición influyente que tengo en cuenta como ingeniero de procesos. Este grado de novedad es relativo al equipo de desarrollo y a la organización que lo envuelve: factores como la madurez de la organización y del proceso de desarrollo (medido vía CMMi o algún otro modelo similar), los activos del proceso, las habilidades actuales del personal, la composición y el entrenamiento del equipo y la adquisición de herramientas y otros recursos para el proyecto, son definitivos a la hora de configurar el proceso: si se trata de un sistema nuevo, establezco fases de concepción y de elaboración más largas y más iteraciones en esta última; también hago más énfasis en la captura y administración de requisitos, el modelo de casos de uso, la arquitectura y en la mitigación de riesgos. Entre tanto, para un sistema en evolución, enfatizo en la gestión de cambios y en la incorporación o no de código legado.
En breve, durante la concepción, el ingeniero de procesos además elabora el caso de desarrollo, prepara las plantillas y las guías para el proyecto y, con un especialista en herramientas, selecciona las herramientas más adecuadas para el proyecto. Son materias que tienen tanto extensión como profundidad y abordarlas bien podría ser objeto de futuras Lecturas Fundamentales.

Lo que sí tengo que decir antes de cerrar esta puerta es que el ingeniero de procesos es al proceso lo que el arquitecto es al sistema y recuerden: la calidad de un producto está determinada en gran medida por la calidad del proceso que se usa para desarrollarlo y mantenerlo[2].

El Analista de Procesos del Negocio

Hablo de procesos distintos. En el apartado anterior me refería al proceso de desarrollo de software, mientras que en este me refiero al conjunto de procesos mediante los cuales una compañía organiza su actividad para conseguir sus objetivos. Cada proceso del negocio se identifica por un repertorio de datos que son elaborados y operados mediante un conjunto de quehaceres, en los que ciertos agentes (trabajadores, proveedores, departamentos, entre otros) interactúan de acuerdo a un flujo de trabajo determinado. Además, estos procesos dependen de un conjunto de reglas de negocio que fijan las políticas y la arquitectura de la información de la empresa.

El analista de procesos del negocio o simplemente analista del negocio es el responsable de definir la arquitectura del negocio y los actores y casos de uso del negocio, lo mismo que la interacción entre ellos. El modelo producido por este analista delimita la organización desde el punto de vista del sistema a desarrollar.

Entender la organización es un aspecto clave en todo desarrollo de software: enterarse de los procesos de negocio, quienes intervienen en su ejecución, sus entradas y sus resultados, como se manejan las excepciones, como se mantiene la integridad de la información y la consistencia entre procesos; también, conocer hacía donde va la organización, las expectativas de los usuarios, la visión que ellos tienen sobre lo que será y no será el negocio en el futuro, al menos, durante el ciclo de vida esperado del sistema.

Ahora bien, idealmente, la construcción de sistemas de software es uno de esos buenos momentos para cambiar procesos de negocio, no porque el negocio tenga que adaptarse al nuevo sistema, sino porque el esfuerzo de revisión de tales procesos puede llegar a ser tan significativo, tan profundo, que se encuentren oportunidades de mejora. Esto, por supuesto, es completa responsabilidad de la organización para la cual se construye el sistema y el área de TI, como buena conocedora de estos procesos, debe apoyar el diseño y la implantación del nuevo modelo y de paso quedar con el nuevo conocimiento para futuros ejercicios de esta índole.

Por supuesto, este trabajo implica un tiempo y recursos adicionales considerables que casi nunca son estimados a la hora de emprender un proyecto de tecnología informática, de tal forma que la cautela y el tratamiento efectivo de las expectativas de nuestros clientes son recomendables.

El Gerente de Proyectos

Planea, maneja y asigna recursos, determina prioridades, coordina las interaccio-nes con los usuarios y mantiene el foco del equipo del proyecto. También establece un conjunto de prácticas para asegurar la integridad y la calidad de los entregables del proyecto. Es un orquestador, articula y coordina los movimientos que se den en el proyecto.

Es el gerente quien precisamente concibe el proyecto mediante la transformación de una idea inicial a un estado en el que, soportado en razones de peso, pueda tomar una decisión sobre continuarlo o abandonarlo. Para lo que nos ocupa la mayor parte del tiempo, este “abandonarlo” más bien se convierte en un “ajustar” algunas condiciones críticas del proyecto, como el tiempo, el talento humano necesario para llevarlo a cabo y, por consiguiente, el presupuesto y la estrategia para alcanzar el éxito.

Durante la concepción, el gerente del proyecto identifica y evalúa los riesgos, elabora un caso de negocio e inicia el proyecto. Más adelante, en la misma concepción, planea el proyecto, teniendo en cuenta las métricas, los riesgos, los criterios de aceptación del producto, las tácticas para la resolución de problemas, el proceso de aseguramiento de la calidad, la organización del equipo de desarrollo, los modos de monitoreo y control del proyecto y las fases e iteraciones del mismo. Para ello se alimenta de toda la materia prima que los demás responsables de la concepción le transmitan. Es el gerente quien también decide si se han alcanzado los objetivos de la fase de concepción y si es viable empezar la fase de Elaboración.

Tanto en Concepción, como en el resto del proyecto, el gerente tiene una perspectiva de mediana profundidad para poder izar los hilos del proyecto con mayor propiedad y asegurar, casi como un dogma, que se pueda hacer una entrega, que se pueda avanzar o, si por el contrario, que se deba replantear la técnica y reorientar el enfoque (corregir el rumbo). Y el final de la fase de concepción es buen momento para asegurarnos de la idoneidad (en cuanto talento, competitividad, aptitud) del equipo de desarrollo, de indagar si los miembros del equipo tienen las habilidades y destrezas suficientes, comparten todos la misma visión de lo que vendrá, soportarán la presión, están dispuestos a dar ese “delta de t” (y otros deltas) necesarios para triunfar en todo proyecto. Desde este punto de vista, el destino del proyecto, incierto hasta este punto, depende enteramente de su gerente.

Bueno, esto no lo dice ningún proceso, no está escrito en ningún lado, simplemente es y con eso basta.

Continuará…

Hace poco uno de mis revisores de cabecera me dijo que estas lecturas fundamentales estaban quedando muy largas. Yo les reenvío la inquietud, ¿ustedes qué piensan? En cualquier caso, les he dado suficiente tiempo, creo, para que hagan la mejor de las lecturas. Estoy atento, los escucho.

De todas formas, es evidente que esta lectura amerita otra parte, donde concluiremos con los aspectos más importantes de la fase de concepción. Hasta la próxima entonces.

Referencias

Algunas de las características y conceptos expuestos aquí se basan en la documentación de IBM Rational Unified Process.

1. Diccionario de la lengua española © 2005 Espasa-Calpe S.A., Madrid:
Conceptualización
f. Elaboración detallada y organizada de un concepto a partir de datos concretos o reales.

2. Basado en principios de Administración Total de la Calidad enseñados por Shewhart, Juran, Deming y Humphrey.

Lectura Fundamental Siguiente: “RUP: Fase de Concepción. Parte 2.”

lucho.salazar@gmail.com

miércoles, febrero 21, 2007

Lecturas Fundamentales 7

Lectura Fundamental Anterior: “De Procesos y de Humanos”

Lectura # 7
RUP o Todo lo que quisiste saber alguna vez de RUP y no te atreviste a preguntar…

RUP es un proceso punto.

¿Hace falta decir algo más? Sí, todo. Aquí vamos.

RUP es un proceso y una metodología y un framework. RUP nos habla de actividades, de responsables, de procedimientos de trabajo, de casos de uso, de arquitectura del software, de iteraciones e incrementos, de riesgos, de modelos y de modelado con UML, de análisis y diseño del software, de pruebas y control de calidad; RUP también nos habla de guías y listas de chequeo, de herramientas del proceso (no software no hardware), de herramientas de software para apoyar el proceso; y también de gerencia de proyectos, de control de versiones, de configuración y adaptación del proceso, de prácticas contextuales; RUP nos cuenta los porqué de las cosas o, al menos, hace un recuento de la experiencia de otros; RUP tiene dinámica y tiene estática; RUP proporciona mecanismos para que hagamos mejor nuestro trabajo y nos lleva de la mano hacia el éxito y hacia la calidad total.

Framework, Proceso y Metodología

Esto, por ningún motivo es un uso estándar. En el pasado encontré útil diferenciar proceso de metodología como explico a continuación: literalmente, un proceso es un conjunto de pasos para realizar algo, incluyendo quien hace que, cuando y todas esas cosas que expuse en la Lectura Fundamental #6. Estrictamente hablando, RUP no contiene nada de esto. Los flujos de trabajo y las actividades no están entretejidos en procedimientos específicos organizados en el tiempo. De esta forma, RUP es referenciado como un framework de procesos que contiene piezas de las cuales se puede escribir un proceso para una organización. Forzosamente, este proceso debería ser configurado para la organización y sus roles específicos, su estructura y sus objetivos, entre otros.

RUP también es una metodología. Esta afirmación quiere decir que RUP es una base teórico-conceptual detallada para hacer las cosas de cierta manera. Es como una enciclopedia. De este modo, cuando un proceso dice “escriba un caso de uso” hay mucha información en RUP sobre como y aún porqué escribir casos de uso.

Usando los términos así, se aclara la confusión en las empresas que hablan de “hacer el proceso” o “tener un proceso” cuando simplemente quieren decir que tienen algunos procedimientos de trabajo. Adoptar una metodología es algo más –significa involucrarse con un framework conceptual y un conjunto de métodos. Estos métodos entonces necesitan anidarse en procedimientos que concuerden con la organización.

En aquel tiempo también encontré otros dos términos relacionados a los anteriores que debía entender: método y técnica. El primero se refiere a una descripción detallada de quien hace que, cuando y como; se parece mucho a metodología, ni más faltaba, pero hay una diferencia substancial que haré evidente en breve. Mientras tanto, la técnica es mucho más detallada y, por consiguiente, aborda o trata un área muy especializada.

Esto también significa que un framework puede contener varios procesos, un proceso puede contener varios métodos y un método puede contener varias técnicas. Es difícil de decir en que punto se convierte una técnica en método, lo importante es que todos estos conceptos, concluí, es que son parte del mismo cuadro.

Como siempre, hice uso de Mi Gazafatonario para establecer definiciones más semánticas. Este fue el resultado:

Definición 14: Un framework se refiere a un número de bloques de construcción predefinidos con los cuales es posible configurar un proceso, método, etc.

Definición 15: Un proceso se refiere a una serie de acciones, cambios o funciones que entregan un resultado (un flujo). Cuando hablamos de RUP, es útil recordar que el proceso es lo que tiene lugar en el “mundo real” mientras que la descripción del proceso es lo que está documentado en el producto RUP como tal… ¡algunas veces éstas son dos cosas distintas!

Definición 16: una metodología se refiere al cuerpo completo de prácticas (una práctica es una forma regular y sistemática de realizar alguna cosa), procedimientos y reglas usados por quienes trabajan en una disciplina (por ejemplo en la IT); pero una metodología también se refiere al estudio teórico del análisis de tales métodos de trabajo.

Definición 17: un método, por otro lado, se refiere a solamente una de esas prácticas.

Definición 18: Una técnica se refiere al procedimiento sistemático mediante el cual una tarea compleja o científica se lleva a cabo.

Eso era entonces, era feliz e indocumentado y “el mundo era tan reciente, que muchas cosas carecían de nombre, y para mencionarlas había que señalarlas con el dedo."[1]

Hoy, estos conceptos tienen más vigencia que nunca.

Comentario del Autor

Confieso que a pesar de haber hecho docenas de presentaciones sobre RUP y de haber escrito algunos artículos al respecto, me encontré en una encrucijada al momento de abordar este nuevo volumen de lecturas fundamentales sobre el tema. Los enfoques pueden ser muchos: que si las características, que si las fases, que si las disciplinas, que si las actividades, que si las plantillas, en fin, eran muchas las posibilidades. Por fin inicié como acaban de leer, pero entonces algo, quizás sensato quizás absurdo, pasó por mi mente: acaso la mayoría de ustedes nunca ha tenido una primera vez con RUP. Entonces decidí volver a lo fundamental.

Aquí vamos otra vez.

Raíces

Para lo que nos interesa, RUP es un proceso de Ingeniería de Software que busca asegurar la producción de software de alta calidad, satisfaciendo las necesidades de un cliente (y estoy usando un espectro muy amplio de la palabra “cliente” al abordar desde usuarios finales y a otros involucrados hasta las organizaciones que de una u otra forma se ven impactadas por el software), con un plan y presupuesto previsibles.

Pero también podemos mirar a RUP como un conjunto extenso, en lo horizontal, y profundo, en lo vertical, de experiencias documentadas alrededor de los distintos procesos relacionados con el ciclo de vida de los sistemas. Son prácticas dispuestas es una dimensión estática que establecen estándares probados, en principio, para desarrollar software, a través de una dimensión dinámica: el tiempo. Los procedimientos están enmarcados en procesos, conocidos también como disciplinas o flujos de trabajo: Modelado del Negocio, Administración de Requisitos, Análisis y Diseño, Implementación, Pruebas, Administración de la Configuración y Control de Versiones, Administración del Entorno y, por último pero no menos importante, Gerencia de Proyectos. Entre tanto, el tiempo está dividido en Fases: Inicio, Elaboración, Construcción y Transición. A su vez, cada fase, esta fraccionada en etapas o ciclos pequeños llamados Iteraciones.

A través del tiempo hay que alcanzar hitos o cumplir objetivos, en cada fase y, dentro de ellas, en cada iteración. Para alcanzar esas metas, hay que llevar a cabo las funciones definidas en los distintos procesos que, a su vez, tienen objetivos más específicos. La suma de todos estos propósitos alcanzados resulta precisamente en la finalidad universal de todo proceso y RUP no es la excepción: la construcción de un sistema de software de calidad excelsa.

Metas

Inicio o Concepción es la primera fase de RUP. El propósito principal es que alcancemos un acuerdo entre todos los involucrados sobre los objetivos del ciclo de vida para el proyecto. Los involucrados, mejor conocidos como stakeholders, son todas las personas y entidades que de una u otra forma influyen o se ven afectados por el desarrollo del proyecto y por el producto que resulta del proyecto. Ejemplos de involucrados son: usuarios finales, todo el equipo de desarrollo, patrocinadores del proyecto (los productores ejecutivos), socios de negocios, proveedores, clientes, otras áreas de la compañía distintas a aquella para la cual se elabora el software, entre otros.

Al final de la fase de Inicio, revisamos los objetivos del ciclo de vida y decidimos proceder con el proyecto o cancelarlo. Esto último puede ocurrir porque no alcanzamos el hito de la fase o porque, al hacerlo, encontramos que no es posible, tanto técnica como financieramente (y con frecuencia una combinación de ambos factores), continuar con el proyecto.

En particular, durante esta fase elaboramos el modelo del negocio, de ser necesario, y establecemos la visión y el alcance del proyecto, es decir, lo que haremos y lo que no haremos dentro del proyecto; también definimos un plan de manejo de riesgos, lo mismo que diseñamos, implementamos y evaluamos una o más pruebas de concepto arquitectónicas, a criterio del Arquitecto del Software o de los analistas más experimentados del equipo. Estas pruebas se ejecutan para tener la tranquilidad de que distintas estrategias de índole técnica o tecnológica tendrán cabida durante la construcción del software, es decir, es posible realizarlas con éxito. Con todo lo anterior, elaboramos el Plan de Desarrollo de Software o, al menos, una agenda viable para el proyecto que defina tiempos y número de iteraciones potenciales por fase, lo mismo que el talento humano asignado a cada iteración.

Por su parte, el objetivo principal de la fase de Elaboración es delinear la arquitectura del software y proporcionar una base estable para el grueso del diseño e implementación en la siguiente fase. Pero además de bosquejar la Arquitectura, durante la Elaboración probamos esa arquitectura mediante la implementación de la funcionalidad más significativa (precisamente, la que tiene un mayor impacto en la arquitectura) y una evaluación de los riesgos técnicos del proyecto, es decir, los que tienen que ver con el desempeño esperado, la seguridad, la infraestructura requerida para correr el sistema, la usabilidad y otras restricciones de diseño y del entorno de desarrollo del software. Al final de la Elaboración obtenemos una arquitectura estable vía prototipos arquitectónicos sucesivos, que se construyen durante cada uno de los ciclos o etapas en los que se divida la fase.

Mas adelante, en la fase de Construcción, diseñamos, implementamos e integramos el software en su totalidad, basado en la arquitectura prescrita durante Elaboración. En esencia, la Construcción termina con lo que llamamos la versión βeta del producto, listo para someterlo a procedimientos de certificación de calidad. Durante esta fase realizamos pruebas que bien podríamos llamar Pruebas Alfa, completamos la capacidad operacional inicial del sistema y finalizamos la documentación del manual del usuario, cuando hay lugar a ello.

Al final, durante la fase de Transición, nos aseguramos de tener el software listo para entregar a nuestros usuarios quienes, revisan y aprueban todos los entregables del proyecto.

Por su parte, las iteraciones, durante las fases de Elaboración y Construcción sobre todo, tienen un único objetivo: la entrega de software ejecutable y su documentación asociada. Aunque tengo mucho por decir sobre el desarrollo iterativo, esta simple premisa, software ejecutable más documentación, encierra un gran significado que debería ser evidente para todos.

Conocer la intención de cada una de las fases del ciclo de vida nos da una idea inicial de las acciones a seguir para alcanzar tales metas. Les hablo de tareas por hacer, procedimientos por ejecutar, los que finalmente nos conducirán al resultado esperado: un producto de notable calidad y valor. Con esto quiero decir que pensamos en actividades antes que en “entregables”.
Estos últimos son consecuencia inmediata de aquellas, son el recipiente que debemos llenar.

Ahora bien, el propósito principal del Modelado del Negocio gira en torno a entender el problema actual de la organización objetivo e identificar mejoras potenciales; también, evaluar el impacto del cambio organizacional. Esto último debido a que un sistema de software trae un nuevo orden a las cosas, una nueva forma de desempeñar funciones y procedimientos en la organización. En esta disciplina también nos aseguramos de contar con un entendimiento común del negocio para el cual desarrollamos el sistema; y cuando digo común, me refiero a los usuarios, a los desarrolladores y a todos los demás involucrados en el proyecto.

A su vez, la disciplina de Requisitos establece y mantiene un acuerdo entre nosotros y los usuarios sobre lo que el sistema debe hacer; asimismo, define los límites y proporciona bases para la estimación de costos y tiempos para el desarrollo del sistema. Esta disciplina también aporta lo necesario para planear el contenido técnico de las iteraciones y permite definir una interfase de usuario para el sistema, conduciendo nuestro enfoque hacia las necesidades y metas de los usuarios. Un aspecto importante de este proceso de Requisitos es que expone las prácticas recomendadas para instaurar una buena comunicación con los usuarios y el resto de la organización destino del software.

Me queda bien decir en este punto de la lectura es que a menudo no se conoce donde termina la administración de requisitos y donde comienza el análisis y diseño del sistema. Si bien, el Analista del Sistema interviene en ambos procesos, debemos tener claro los límites de uno y otro, para no exponer a los usuarios a aspectos de corte técnico inherentes al Análisis o al Diseño, o aún a la misma Arquitectura del software. Durante la Ingeniería de Requisitos, el Analista del Sistema tiende a ser un Especificador de Requisitos; mientras tanto, durante el Análisis y Diseño, ese mismo Analista tiende a ser un Diseñador y, quizás, un Arquitecto.

Precisamente, el propósito de Análisis y Diseño es transformar los requisitos en un diseño del sistema a construir, adaptar ese diseño para que concuerde con el entorno de implementación teniendo en cuenta, entre otros, factores de desempeño y de usabilidad; Y es también este proceso el que nos ayuda a determinar una arquitectura robusta que albergue el sistema.
Importante es que la línea divisoria entre el Análisis y el Diseño del sistema es bastante tenue pero a la vez bien definitoria. Durante el análisis definimos una arquitectura candidata, ejecutamos una síntesis arquitectónica y analizamos el comportamiento del sistema; en tanto que en diseño, diseñamos componentes, base de datos y servicios, y hasta encontramos una actividad llamada Diseñar Casos de Uso, donde exhibimos todos los aspectos técnicos propios de un caso de uso.

Después del diseño está la Implementación, cuya finalidad es que podamos definir la organización del código, en términos de subsistemas de implementación organizados en capas. Es en este proceso donde convertimos los elementos de diseño en elementos de implementación (archivos fuentes, binarios, programas ejecutables, entre otros); también aquí probamos como unidades los componentes desarrollados e integramos e un sistema ejecutable los resultados producidos por cada uno de nuestros programadores.

Quiero enfatizar en lo de pruebas unitarias o pruebas de unidad. Éstas son ejecutadas por el Implementador, precisamente para verificar tanto la especificación como la estructura interna de una unidad de código, una clase, por ejemplo. Al validar que el componente está trabajando correctamente antes de someterlo a pruebas más formales, estamos asegurándonos de que la transición del código fuente al sistema ejecutable integrado será llevadera. Así como las pruebas hacen parte intrínseca y básica del desarrollo del software, las pruebas de unidad son congénitas a la implementación.

Ya que hablo de Pruebas, esta disciplina, que actúa como un proveedor de servicios a las demás disciplinas de RUP, nos permite enfocarnos en evaluar y valorar la Calidad del Producto mediante la búsqueda y documentación de defectos, y la validación y prueba de las suposiciones hechas en el diseño y en la especificación de requisitos vía demostraciones concretas. Los Probadores también aconsejan o asesoran sobre la calidad percibida en el software; de hecho, el equipo de pruebas es quizás la máxima autoridad del proyecto, dado el carácter restrictivo que tienen sus funciones. Ya alguna vez había señalado que en el futuro no habría gerentes de proyecto como los conocemos hoy, sino gerentes de calidad.

La documentación de RUP anota una diferencia interesante que existe entre la disciplina de Pruebas y las demás disciplinas en RUP: esencialmente, Pruebas encuentra y expone debilidades en el software. Es interesante porque para conseguir mayores beneficios, necesitamos una filosofía general diferente a la que usamos durante la Administración de Requisitos, Análisis y Diseño e Implementación. Estos tres procesos se enfocan en la completitud del software, mientras que Pruebas se enfoca en la incompletitud. Así que no es gratuito aquello de que es mala práctica que sean los mismos desarrolladores quienes ejecuten las pruebas. Además está demostrado que celularmente es cuasi-imposible que un desarrollador tome el camino requerido para encontrar lo que le hace falta a su creación.

Todavía hay más disciplinas. La de Despliegue, por ejemplo, nos guía sobre las actividades necesarias para asegurar que el producto de software esté disponible para los usuarios. Aquí, disponible no sólo quiere decir “en producción”, sino también utilizable para pruebas y demostraciones.

Todos los procesos anteriores, conforman las Disciplinas Básicas del ciclo de vida. Pero existen otros procesos, que son transversales a cualquier proyecto y sirven de apoyo durante todo el ciclo de vida de desarrollo: la disciplina de Administración de la Configuración y Versiones nos permite controlar y sincronizar la evolución del conjunto de Productos de Trabajo que componen un sistema de software. Por su parte, la disciplina del Entorno organiza los elementos del método que suministran el entorno de desarrollo de software que apoya al equipo de desarrollo, incluyendo tanto procesos como herramientas; al hacer esto, esta disciplina soporta los demás procesos.

En breve, la disciplina del entorno es la que nos provee los mecanismos clave para configurar y adaptar el proceso para cada proyecto, brindándonos herramientas para cuantificar y cualificar distintas variables que afectan el desarrollo de un producto de software incluyendo el tiempo y los recursos disponibles, la complejidad del producto, la tecnología a usar, la experiencia del equipo de desarrollo, el conocimiento que este tenga del negocio, el tipo de cliente final, información de la competencia y el grado de formalidad, entre otros.

Finalmente, la Gerencia de Proyectos exhibe las prácticas recomendadas para los procesos de Inicio, Planeación, Ejecución, Control y Cierre de proyectos (incluyendo el cierre de iteraciones y de fases). Esta disciplina nos propone actividades y estructuras para la planeación de proyectos, la administración adecuada de riesgos, lo mismo que para monitorear el avance del proyecto y gestionar las métricas del mismo.

Tendremos mucho espacio, en futuras lecturas fundamentales, para hablar de todos y cada uno de estos procesos. Lo importante, por ahora, es que para alcanzar cada una de estas metas, las actividades propuestas son dirigidas por los casos de uso, centradas en la arquitectura del software además de iterativas, es decir, se repiten una y otra vez, a lo largo de todo el proyecto, quizás hasta el cansancio. Esta última característica ciertamente es como una revolución, de hecho, entender el modelo de desarrollo por ciclos cortos de tiempo implica experimentar una profunda y quizás traumática transformación a varios niveles de nuestras creencias sobre la forma como desarrollamos software.

Aún hoy, muchos proyectos “rupizados” después, muchos años después, me pregunto si lo que hacemos más bien es una secuencia continuada de “cascadas” en vez de seguir prácticas realmente iterativas e incrementales.

Trataremos de dilucidar este y otros temas alrededor de RUP, por supuesto, en nuestra siguiente lectura fundamental.

Referencias

Algunas de las características y conceptos expuestos aquí se basan en la documentación de IBM Rational Unified Process.

1. Cien Años de Soledad, Gabriel García Márquez. Página 1.

Lectura Fundamental Siguiente: “RUP: Fase de Concepción”

lucho.salazar@gmail.com