Requerimientos https://sg.com.mx/ en La Importancia de la Ingeniería de Requerimientos https://sg.com.mx/revista/54/la-importancia-la-ingenier-requerimientos <span class="field field--name-title field--type-string field--label-hidden">La Importancia de la Ingeniería de Requerimientos</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/pen-idea-bulb-paper.jpg" width="1280" height="856" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/47654" lang="" about="/user/47654" typeof="schema:Person" property="schema:name" datatype="" class="username">ana2lp</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 05/03/2017 - 01:17</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/54" hreflang="und">SG #54</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/revista/secciones/requerimientos" hreflang="und">Requerimientos</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/guilherme-siqueira-simoes" hreflang="und">Guilherme Siqueira Simões</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p dir="ltr"><span>La ingeniería de requerimientos es una de las disciplinas fundamentales de la ingeniería de software y proporciona información para la mayoría de las demás disciplinas. Este artículo presenta resultados de investigaciones que fundamentan de manera cuantitativa esta cuestión. El propósito es demostrar las consecuencias del descuido de la disciplina de requerimientos: retrasos en el cronograma y costo adicional, nivel alto de defectos en el software y principalmente la entrega de un software que no satisface las necesidades del cliente. &nbsp;</span></p><h3 dir="ltr"><span>Fallos famosos</span></h3><p dir="ltr"><span>Para ilustrar, a continuación se muestran casos famosos de fallos en proyectos de software relacionados con algún tipo de discapacidad en el ejercicio de la ingeniería de requerimientos. </span></p><h4 dir="ltr"><span>La sonda espacial Mars Climate Orbiter (MCO)</span></h4><p dir="ltr"><span>La MCO fue una sonda espacial cuyo objetivo principal era estudiar el clima de Marte. Fue lanzada en diciembre de 1998, alcanzando Marte nueve meses y medio después. Al entrar en la órbita de Marte, la sonda fue destruida en la atmósfera debido a un error de cálculo en la maniobra. El error fue causado porque el software responsable del cálculo de ruta de entrada esperaba datos usando el sistema de medidas imperial (libras fuerza) y recibió datos en sistema métrico universal (newtons). No se sabe si la NASA proporcionó la especificación equivocada al proveedor que desarrolló el software o si hubo una falla del proveedor en el levantamiento de requerimientos.</span></p><h4 dir="ltr"><span>Misil antibalístico Patriot </span></h4><p dir="ltr"><span>Durante la Guerra del Golfo, los Estados Unidos usaron un sistema de defensa con misiles antibalísticos llamado Patriot. El 25 de febrero de 1991 este sistema falló y no interceptó el misil Scud lanzado por Irak que mató a 28 militares y lesionó otros 98. </span></p><p dir="ltr"><span>La raíz de la falla fue que el software original del sistema utilizaba datos de las señales del radar para calcular la ruta del Patriot y trabajaba con una precisión de fracciones por segundo. Para hacer frente a misiles de más alta velocidad, se creó una subrutina para manejar el tiempo con mejor precisión (más decimales). Sin embargo, esta subrutina no fue aplicada a todas las partes necesarias del software lo que generó una acumulación de fallas de precisión; y después de cierto tiempo, el sistema se quedaba ineficaz. No fue sólo un fallo de programación, fue también un fallo de evaluación en el impacto del cambio.</span></p><h4 dir="ltr"><span>Cohete Ariane 501</span></h4><p dir="ltr"><span>El 1996, el cohete Ariane 501 fue lanzado y unos 37 segundos después del despegue, se desvió del curso esperado para después explotar. Fue el primer lanzamiento de la serie Ariane 5. La pérdida del cohete y su carga ascendieron a una pérdida de más de 370 millones de dólares. La comisión de investigación señaló que la falla había estado en el sistema de referencia inercial, el cual había sido reutilizado de la serie Ariane 4. El problema fue que el Ariane 5 estaba diseñado para transportar más carga, lo que implica otros estándares de trayectoria y velocidad diferentes, y esto no se tomó en cuenta al realizar el diseño y pruebas pertinentes.</span></p><h4 dir="ltr"><span>Archivo Virtual FBI</span></h4><p dir="ltr"><span>A principios del 2000, el FBI comenzó el desarrollo de un software llamado Virtual Case File (VCF) que permitiría el intercambio de información de casos entre los agentes. Originalmente se estimó que el desarrollo tomaría 3 años. Después de la tragedia del 11 de septiembre de 2001 el FBI recibió fuertes críticas por no anticipar el ataque; las evidencias estaban expuestas, el error fue no enlazarlas entre sí. Ante esto, se decidió aumentar la prioridad del VCF y extender su alcance. Cinco años y 170 millones de dólares después, el sistema no había podido ser terminado y se canceló su desarrollo. La investigación a cargo determinó que las principales causas de fracaso fueron:</span></p><ul><li dir="ltr"><p dir="ltr"><span>Cambios frecuentes en los requerimientos. El proveedor alegó que el FBI adoptó la filosofía de trabajo de: "Yo sé lo que quiero después de ver el producto."</span></p></li><li dir="ltr"><p dir="ltr"><span>Alta rotación de gestión (también contribuyó a los cambios frecuentes).</span></p></li><li dir="ltr"><p dir="ltr"><span>Aumento descontrolado del alcance, con requerimientos agregados incluso cuando el proyecto ya estaba retrasado.</span></p></li></ul><h3 dir="ltr"><span>El principal motivo de fracaso</span></h3><p dir="ltr"><span>De acuerdo con cifras del Project Management Institute (PMI) [1], el 47% del fracaso de los proyectos es causado por una deficiencia en el ejercicio de la ingeniería de requerimientos. Algunos casos comunes:</span></p><ul><li dir="ltr"><p dir="ltr"><span>El producto se entrega sin cumplir con los requerimientos necesarios, sin identificar varios de ellos.</span></p></li><li dir="ltr"><p dir="ltr"><span>La entrega final es un producto que no satisface al cliente, aunque a tiempo y dentro del presupuesto.</span></p></li><li dir="ltr"><p dir="ltr"><span>El proyecto incorpora requerimientos que no deben estar en el alcance. </span></p></li><li dir="ltr"><p dir="ltr"><span>La estimación de costo/esfuerzo se hace en base a un alcance equivocado ya que no considera algunas áreas funcionales y procesos de negocio. </span></p></li><li dir="ltr"><p dir="ltr"><span>Fallas de comunicación sobre requisitos, lo que resulta en la entrega de un producto defectuoso.</span></p></li><li dir="ltr"><p dir="ltr"><span>Cambios innecesarios debido a la falta de atención por comprender correctamente las necesidades del cliente al principio.</span></p></li></ul><h3 dir="ltr"><span>Una de las principales causas de defectos</span></h3><p dir="ltr"><span>Los defectos pueden surgir en cualquier etapa del ciclo de vida del proyecto, siendo el más común aquellos insertados durante la construcción, donde el producto construido tiene un comportamiento diferente al especificado. </span></p><p dir="ltr"><span>Asimismo, un número &nbsp;significativo de defectos se origina a partir de los requerimientos. &nbsp;Pero, ¿La calidad no es cumplir con los requerimientos? ¿Cómo sería posible ello? Simple, basta que la especificación no represente correctamente las necesidades del usuario. </span></p><p dir="ltr"><span>Según, Capers Jones [2], 1 de cada 5 posibles defectos se origina en los requerimientos, y estos pueden ser hasta el 60% del total de errores en el proyecto según explica Pohl [4]. La problemática es que estos sólo se detectan en etapas avanzadas del proyecto, a menudo cuando se aprueba el producto. Por otro lado, Leffingwell [5] acota que en proyectos complejos la fuente más común de errores son los requerimientos. Esto último se refleja en los resultados mostrados por Jones y Bonsignour [3] que se capturan en la tabla 1 donde se muestra la tasa potencial de defectos por punto de función segregados por la fuente del defecto y estratificado de acuerdo al tamaño del sistema.</span></p><div dir="ltr"><table><colgroup><col width="156" /><col width="156" /><col width="156" /><col width="156" /></colgroup><tbody><tr><td rowspan="3"><br /><br /><p dir="ltr"><span>Origen del Defecto</span></p></td><td colspan="3"><p dir="ltr"><span>Tamaño del sistema (en puntos de función)</span></p></td></tr><tr><td><p dir="ltr"><span>100</span></p></td><td><p dir="ltr"><span>1,000</span></p></td><td><p dir="ltr"><span>10,000</span></p></td></tr><tr><td colspan="3"><p dir="ltr"><span>Defectos potenciales (bugs/PF)</span></p></td></tr><tr><td><p dir="ltr"><span>Requerimiento</span></p></td><td><p dir="ltr"><span>0.75</span></p></td><td><p dir="ltr"><span>1.00</span></p></td><td><p dir="ltr"><span>1.25</span></p></td></tr><tr><td><p dir="ltr"><span>Arquitectura</span></p></td><td><p dir="ltr"><span>0.10</span></p></td><td><p dir="ltr"><span>0.25</span></p></td><td><p dir="ltr"><span>0.50</span></p></td></tr><tr><td><p dir="ltr"><span>Diseño</span></p></td><td><p dir="ltr"><span>1.00</span></p></td><td><p dir="ltr"><span>1.25</span></p></td><td><p dir="ltr"><span>1.50</span></p></td></tr><tr><td><p dir="ltr"><span>Código fuente</span></p></td><td><p dir="ltr"><span>1.70</span></p></td><td><p dir="ltr"><span>1.75</span></p></td><td><p dir="ltr"><span>2.00</span></p></td></tr><tr><td><p dir="ltr"><span>Material de pruebas</span></p></td><td><p dir="ltr"><span>1.50</span></p></td><td><p dir="ltr"><span>1.85</span></p></td><td><p dir="ltr"><span>2.00</span></p></td></tr><tr><td><p dir="ltr"><span>Documentación</span></p></td><td><p dir="ltr"><span>0.65</span></p></td><td><p dir="ltr"><span>0.70</span></p></td><td><p dir="ltr"><span>0.75</span></p></td></tr><tr><td><p dir="ltr"><span>Base de datos</span></p></td><td><p dir="ltr"><span>2.00</span></p></td><td><p dir="ltr"><span>2.75</span></p></td><td><p dir="ltr"><span>3.00</span></p></td></tr><tr><td><p dir="ltr"><span>Website</span></p></td><td><p dir="ltr"><span>1.50</span></p></td><td><p dir="ltr"><span>1.75</span></p></td><td><p dir="ltr"><span>2.00</span></p></td></tr><tr><td><p dir="ltr"><span>Total</span></p></td><td><p dir="ltr"><span>9.20</span></p></td><td><p dir="ltr"><span>11.30</span></p></td><td><p dir="ltr"><span>13.00</span></p></td></tr></tbody></table></div><p><span><span>&nbsp;</span></span></p><p dir="ltr"><span>Tabla 1. Defectos en potencial por tamaño de sistema y origen.</span></p><p dir="ltr"><span>Los defectos originados en requerimientos son más difíciles de eliminar por métodos tradicionales: pruebas y análisis estático. Esto se debe a que cuando se aprueba la especificación con un requerimiento defectuoso, los casos de prueba son elaborados a partir del comportamiento equivocado.</span></p><p dir="ltr"><span>Adicionalmente, los cambios en requerimientos tienden a una densidad de defectos mayor, debido a que típicamente son tratados a toda prisa. Y son más difíciles de eliminar porque “saltan” el control de calidad del proyecto. Por ejemplo, un crecimiento del 10% en el alcance del proyecto implica un aumento del 12% en el número de defectos.</span></p><h3 dir="ltr"><span>El costo de reparación de los defectos</span></h3><p dir="ltr"><span>La industria del software tiene un gran potencial para explotar las ganancias de eficiencia. Según Boehm [6] del 40 al 50% del esfuerzo en los proyectos de software se gasta en la corrección de defectos. Uno de los factores que contribuyen para esta ineficiencia es que al corregir un defecto existe un 20-50% de posibilidades de introducir otro error al software [7].</span></p><p dir="ltr"><span>Pohl [4] sostiene que la mayoría de los errores originados en los requerimientos se detecta en las etapas avanzadas del proyecto. Él afirma que una parte significativa de estos errores se identifica durante la validación por el cliente. El esfuerzo de encontrar y corregir un defecto después de la entrega, suele costar a menudo 100 veces más que corregirlo cuando todavía se está desarrollando los requerimientos. Como se observó en los casos citados, los errores detectados con el software en operación pueden causar daños en varios órdenes de magnitud mayor al costo de corrección del defecto.</span></p><p dir="ltr"><span>El objetivo es desarrollar el producto correcto en el primer intento. De esta manera, se reducen los errores en las primeras etapas del proyecto en donde se puede mitigar con mayor intensidad la reanudación. El método de ensayo y error, además de ser más caro y demorado, crea insatisfacción en el cliente. Por lo que se busca es evolucionar en la calidad del trabajo con requerimientos para lograr un impacto positivo en el costo, el tiempo y la satisfacción del proyecto.</span></p><p dir="ltr"><span>Referencias</span></p><ol><li dir="ltr"><p dir="ltr"><span>PMI - Project Management Institute. PMI’s Pulse of the Profession: Requirements Management - A Core Competency for Project and Program Success, 2014.</span></p></li><li dir="ltr"><p dir="ltr"><span>C. Jones. Software Defects Origins and Removal Methods, 2012.</span></p></li><li dir="ltr"><p dir="ltr"><span>C. Jones, O. Bonsignour. The Economics of Software Quality. Addison-Wesley, 2012.</span></p></li><li dir="ltr"><p dir="ltr"><span>K. Pohl, C. Rupp. Requirements Engineering Fundamentals. Rocky Nook Computing, 2011.</span></p></li><li dir="ltr"><p dir="ltr"><span>D. Leffingwell. “Calculating the Return on Investment from More Effective Requirements Management”. American Programmer 10(4); 13-16; 1997. </span></p></li><li dir="ltr"><p dir="ltr"><span>B. Boehm &amp; V. Basili, V. “Software Defect Reduction Top &nbsp;10 List”. Computer 34(1). IEEE, 2001.</span></p></li><li dir="ltr"><p dir="ltr"><span>F. Brooks. The Mythical Man-Month: Essays on Software Engineering. Addison-Wesley, 1995.</span></p></li></ol><p><span style="font-size: 13.008px;">&nbsp;</span></p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p dir="ltr"><span>Guilherme Siqueira Simões es socio de FATTO Consultoría y Sistemas, donde actúa en consultoría y entrenamiento en medición, estimación y requisitos de software. Es graduado en Ciencias de la Computación por la UFES, posgraduado en Gestión Empresarial por el IEL/UFES, certificado como experto en Puntos de Función por IFPUG y COSMIC, Director de Proyectos (PMP) por PMI e Ingeniero de Requisitos por IREB.&nbsp;</span><a href="mailto:guilherme.simoes@fattocs.com">guilherme.simoes@fattocs.com</a></p><p>&nbsp;</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> <div class="field field--name-field-tags field--type-entity-reference field--label-above field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label">Tags</h3> <ul class='links field__items'> <li><a href="/buzz/tags/requerimientos" hreflang="und">Requerimientos</a></li> </ul> </div> Wed, 03 May 2017 06:17:27 +0000 ana2lp 7265 at https://sg.com.mx https://sg.com.mx/revista/54/la-importancia-la-ingenier-requerimientos#comments Los Niveles de Granularidad del Requerimiento Funcional https://sg.com.mx/revista/51/los-niveles-granularidad-del-requerimiento-funcional <span class="field field--name-title field--type-string field--label-hidden">Los Niveles de Granularidad del Requerimiento Funcional</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/levels.jpg" width="414" height="283" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Fri, 07/08/2016 - 12:27</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/51" hreflang="und">SG #51</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/revista/secciones/requerimientos" hreflang="und">Requerimientos</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/guilherme-siqueira-simoes" hreflang="und">Guilherme Siqueira Simões</a></li> <li><a href="/buzz/autores-sg/carlos-v-zquez" hreflang="und">Carlos Vázquez</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Como la mayoría de los lectores de SG saben, todo software posee dos dimensiones de requerimientos: funcional y no funcional. Los requerimientos funcionales (RF) describen el comportamiento del software para proporcionar tareas y servicios a sus usuarios; estos tipos de requerimientos están relacionados a lo que el software debe hacer. Los requerimientos no funcionales (RNF) están relacionados al cómo las funcionalidades del software serán entregadas a sus usuarios y pueden incluir aspectos de calidad, técnicos, ambientales y organizacionales.</p><p>Teniendo en cuenta un sistema de cajero automático de un banco se podría suponer los siguientes ejemplos para los dos tipos de requerimientos:</p><ul><li>RF: Consultar saldo de la cuenta corriente (el qué).</li><li>RNF: Toda transacción debe ser completada en un máximo de 30 segundos (el cómo).</li></ul><p>Aunque no sea una regla, el RF se acostumbra manifestar de manera explícita en el software, es un comportamiento que se puede determinar claramente en qué parte del software está. El RNF, por lo contrario, se acostumbra manifestar de manera general, se aplica a todo o casi todo el software.</p><p>Para la Ingeniería de Requerimientos los dos tipos son igualmente relevantes: ambos deben ser identificados, analizados, especificados, modelados y gestionados. Sin embargo, hay algunas diferencias entre estos dos tipos de requerimientos que valen la pena comentar por separado. Este artículo se enfocará en los RF, con el objetivo de presentar sus niveles de granularidad y su importancia en el trabajo de la Ingeniería de Requerimientos.</p><h3>Los niveles de granularidad</h3><p>Continuando con el ejemplo del sistema de cajero automático, las siguientes descripciones podrían estar presentes en su especificación de requerimientos:</p><ol><li>Realizar transacciones con la cuenta corriente.</li><li>Transferir una cifra de una cuenta corriente para otra cuenta corriente.</li><li>Validar la tarjeta y la contraseña del cliente.</li><li>Garantizar que la suma de todas las transacciones del cliente en el día no puede ser superior a $5,000.</li></ol><p>Aunque estos cuatro ejemplos sean casos válidos de RF, es posible percibir que el nivel de detalle (o granularidad) entre ellos es distinto. Lo más frecuente es que una especificación presente los requerimientos en distintos niveles de granularidad.</p><p>El nivel de granularidad es la mayor o menor amplitud de la descripción del comportamiento esperado para el software en una especificación funcional. Esto está relacionado al tipo de objetivo asociado al requerimiento. La Figura 1 ilustra la relación entre estos objetivos y el nivel de granularidad, utilizando una clasificación de tres niveles (agregado, usuario, subfunción) propuesta por Cockburn (2000) para casos de uso y generalizada por los autores para requerimientos funcionales. Esta clasificación no significa que el proceso de la ingeniería de requerimientos deba utilizar una estrategia de desarrollo por descomposición funcional.</p><p><img src="/sites/default/files/images/stories/sg51/granularidad.jpg" alt="" width="263" height="381" /></p><p>Figura 1. Niveles de granularidad.</p><div id="_idContainer003"><h3>Nivel de usuario</h3><p>El requerimiento a nivel de objetivo de usuario es aquel que:</p><ul><li>Abarca una única tarea bajo la responsabilidad de un único individuo;</li><li>Es realizado en el momento en que el usuario posee todo lo que es necesario para que la tarea sea completada hasta el límite de su responsabilidad en el flujo operativo donde está contenida.</li></ul><p>Al final de la tarea el usuario alcanza su propósito, está satisfecho y no hay nada más que necesite hacer. Una vez que el requerimiento fue completado, todo lo que debería de realizarse para tratar un evento externo fue realizado. Esta tarea es casi siempre parte de un proceso de negocio que puede tener un flujo operativo más amplio y por esto puede aún no estar completa. Sin embargo, la perspectiva relevante en este caso no es del proceso de negocio, es de la tarea.</p><p>En general, si un trabajo involucra más de un individuo es porque hay más de una tarea presente en el contexto. Hay excepciones como un retiro en la cuenta corriente en la sucursal del banco donde dos individuos participan: la caja del banco que solicita e informa datos para el retiro y el cliente que informa la contraseña.</p><p>Esta es la granularidad del ejemplo 2 (“Transferir una cifra de una cuenta corriente para otra cuenta corriente.”). Es una única tarea (seguramente compuesta por varios pasos y reglas), bajo la responsabilidad de un único individuo que al final de todos los pasos está satisfecho con el objetivo alcanzado: una cifra fue transferida a otra cuenta corriente.</p><h3>Nivel agregado</h3><p>El requerimiento en este nivel agrega varios requerimientos a nivel de objetivo de usuario en una única especificación de más alto nivel. Tanto más alto sea su nivel, más generales son sus objetivos y para que un objetivo de nivel más alto sea alcanzado, otros objetivos de nivel más bajo deben ser alcanzados primero.</p><p>Este tipo de requerimiento está relacionado a objetivos más generales y su amplitud está asociada a objetivos colaborativos o asociados a procesos de negocio de alto nivel. No es relativo a una única tarea, por lo contrario, agrega un conjunto de tareas de uno o más usuarios. Esta es la granularidad del ejemplo 1 (“Realizar transacciones con la cuenta corriente.”).</p><p>¿Cuáles son las tareas asociadas a este tipo de requerimiento? Tal vez sean obvias para los lectores de la especificación (los interesados) o tal vez aún no sean conocidas. Sin embargo, es sabido que hay actividades a realizar para levantar (refinar) este requerimiento. Lo que importa es que ya está claro que este requerimiento está dentro del alcance del software a ser desarrollado.</p><p>Sin embargo, algunos RF de este tipo poseen patrones que eliminan la necesidad de proporcionar más detalles. Un ejemplo clásico son los formularios CRUD (Create, Read, Update, Delete) para que el usuario pueda mantener datos por medio del software. Es muy común que esto sea expresado como: “El sistema debe mantener productos.”. Hay un conocimiento tácito entre los interesados que el verbo “mantener” agrega las tareas del CRUD. Por lo tanto queda claro a todos los lectores que el software debe permitir al usuario realizar las siguientes tareas: agregar, modificar, eliminar y consultar datos de producto.</p><h3>Nivel de subfunción</h3><p>Estos requerimientos son pedazos de requerimientos con objetivo de usuario; están relacionados a un conjunto de pasos o a reglas de una o más tareas de los usuarios.</p><p>El requerimiento en nivel de subfunción que representa un conjunto de pasos describe el cambio de datos en los dos sentidos entre el usuario y el software; y entre el software y los requerimientos de almacenamiento. Este es el caso del ejemplo 3 (“Validar la tarjeta y la contraseña del cliente.”). Cada tipo de transacción que utiliza la cuenta corriente (ej.: retiro, transferencia, pago, etc.) exige el mismo conjunto de pasos descrito por el ejemplo 3, que se podría suponer como:</p><ul><li>Verificar si la tarjeta es válida.</li><li>Verificar si la transacción elegida es compatible con el tipo de tarjeta.</li><li>Verificar si la contraseña informada es correcta.</li><li>Incrementar el control de errores de contraseña en caso que la contraseña informada sea incorrecta.</li><li>Cambiar a cero el control de errores de contraseña en caso que la contraseña informada sea correcta.</li></ul><p>Validar la tarjeta y contraseña del cliente no es el objetivo del cliente al utilizar el sistema de cajero automático, sin embargo son pasos necesarios y intermediarios para alcanzar su objetivo: por ejemplo, hacer un retiro.</p><p>El requerimiento en el nivel de subfunción que está relacionado a reglas, en general se vincula a las leyes que gobiernan el negocio y describen de manera que complementan los procesos de negocio. También llamadas muchas veces como reglas de negocio. La regla puede describir políticas corporativas, reglamentos gubernamentales o estándares de la industria por los cuales el software debe estar subordinado.</p><p>Este es el caso del ejemplo 4 (“Garantizar que la suma de todas las transacciones del cliente en el día no puede ser superior a $5,000.”). Las reglas de negocio muchas veces son compartidas entre varios RF, hasta entre distintos productos de software en la empresa.</p><h3>Importancia de la granularidad</h3><p>En una visión simplificada se puede decir que hay dos momentos clave donde una especificación de requerimientos es necesaria:</p><p>&nbsp; A. Proporcionar una visión amplia del software (y tal vez aún no profunda).</p><p>&nbsp; B. Proporcionar una visión profunda del software (de una parte o del todo).</p><p>El caso A es muy común en etapas tempranas de proyectos. El objetivo en este momento es primero obtener una visión amplia del alcance, por ejemplo: para planificar el proyecto, estimar un orden de magnitud de costo o plazo, o hacer un análisis de factibilidad. Un documento de visión es un ejemplo de documento que cumple este propósito. Especificar los RF en el nivel agregado es suficiente y más adecuado a este caso. El costo para obtener información y especificar en un nivel de granularidad más bajo puede significar desperdicio de esfuerzo para detallar lo que no es necesario.</p><p>Entonces el documento de requerimientos para el propósito A, tendrá la mayoría de los RF especificados en el nivel agregado. Es posible también que haya especificaciones en el nivel de usuario o subfunción, esto no es un error. A veces puede ser interesante especificar los RF más críticos (no todos o la mayoría) en un nivel más detallado, ya sea para facilitar la comprensión del alcance por el interesado o permitir una estimación con menos incertidumbre.</p><p>El principal propósito para especificar requerimientos en niveles agregados es establecer áreas de proceso objeto de informatización y/o automatización para que las necesidades de negocio queden resueltas.</p><p>Si el objetivo de la especificación es proporcionar una visión profunda de parte o de todo el software, por ejemplo para iniciar su desarrollo, la existencia de RF en el nivel agregado puede significar que varias decisiones sobre el alcance todavía siguen pendientes. Es decir, hay trabajo de levantamiento que debe ser hecho.</p><p>Para el propósito B, el nivel de granularidad más adecuado es del objetivo del usuario pues es el único que proporciona una definición de alcance del software de manera inequívoca; no hay dudas sobre lo que es abarcado. Esto es también el único nivel de descripción de procesos que puede ser estandarizado y consecuentemente es el nivel utilizado por todos los métodos de medición de tamaño funcional adherentes a la norma ISO/IEC 14143.</p><p>Consecuentemente, para el propósito B, lo más común es que un documento de requerimientos tenga los RF especificados en su mayoría con el objetivo de usuario. RF en el nivel agregado puede estar presente sólo cuando es el caso de que esté claro a todos los interesados que tareas son abarcadas por este RF.</p><p>La definición de un requerimiento en el nivel de subfunción es adecuada cuando el comportamiento especificado es común y compartido por varias otras tareas que el software entrega a los usuarios. Esto hace con que la especificación de requerimientos sea más fácil de modificar en respuesta a cambios, pues disminuye la redundancia de información al evitar describir el mismo conjunto de pasos o reglas más de una vez. También ayuda a alcanzar una especificación más consistente.</p><h3>Conclusión</h3><p>Aunque el concepto de los niveles de granularidad del requerimiento funcional sea sencillo, en términos prácticos se percibe que muchos ingenieros de requerimientos no están atentos a esto cuando elaboran las especificaciones. Tener en cuenta los niveles de granularidad ayuda a definir el esfuerzo adecuado para ser dedicado a la elaboración de la especificación y también a alcanzar una especificación de requerimientos de mejor calidad.</p><p>El estándar 830 de la IEEE presenta los siguientes criterios para evaluar la calidad de una especificación de requerimientos: correcta, completa, clara (no ambigua), consistente, modificable, priorizada, verificable, trazable.</p><p>Siendo el propósito de la especificación proporcionar una visión profunda del alcance, estar atento al nivel de granularidad del RF permite que:</p><p>• Se descubra que la especificación puede no estar completa cuando hay RF agregados.</p><p>• Se proporcione la comprensión del alcance sin ninguna ambigüedad con respeto a las tareas que el software entregará cuando se enfoca el RF con objetivo de usuario.</p><p>• Se genere un documento de requerimientos más fácil de mantener y consecuentemente más consistente al especificar los RF adecuados con objetivo de subfunción.&nbsp;</p><p>Referencias</p><ol><li>A. Cockburn. Writing Effective Use Cases. Addison-Wesley, 2000.</li><li>COSMIC Measurement Manual: 4.0.1. Common Software Measurement International Consortium, 2015.</li><li>IEEE Std. 830–1998: IEEE Recommended Practice for Software Requirements Specifications. IEEE Computer Society, 1998.</li><li>Function Point Counting Practices Manual. Release 4.3.1. IFPUG, 2010.</li><li>C. Vazquez, G. Simões &amp; R. Albert. Análise de Pontos de Função, Medição, Estimativas e Gerenciamento de Projetos de Software. Saraiva, 2013.</li><li>C. Vazquez, G. Simões. Engenharia de Requisitos: Software Orientado ao Negócio. Brasport, 2016.</li></ol></div></div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Fri, 08 Jul 2016 17:27:01 +0000 sg 6564 at https://sg.com.mx https://sg.com.mx/revista/51/los-niveles-granularidad-del-requerimiento-funcional#comments Casos y Cosas de los Casos de Uso https://sg.com.mx/revista/39/casos-y-cosas-los-casos-uso <span class="field field--name-title field--type-string field--label-hidden">Casos y Cosas de los Casos de Uso</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/72" lang="" about="/user/72" typeof="schema:Person" property="schema:name" datatype="" class="username">lasr21</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 03/20/2013 - 17:40</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/39" hreflang="und">SG #39</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/revista/secciones/requerimientos" hreflang="und">Requerimientos</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/autores-sg/efrain-cordero" hreflang="und">Efraín Cordero</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><h4>Reordenando racimos de uvas</h4><p>Es común encontrar sistemas con varias decenas o incluso cientos de casos de uso. Intentar representar todos estos casos en unos pocos diagramas no es muy útil ya que debido al exceso de elementos se complica el entendimiento del alcance. Los diagramas dan la apariencia de contener racimos de uvas que amenazan derramarse de tanto peso.</p><p>Para solventar esta situación, una estrategia es establecer un criterio de subdivisión del modelo y fragmentar los diagramas saturados. El criterio normalmente proviene del negocio, y pueden ser roles, áreas de la empresa, áreas de proceso, prioridades, etc. Por ejemplo, si el criterio fuera “Roles” y como tales hubiera “Cajero”, “Contador”, etc., por cada uno de ellos se crea un paquete y en él se colocan los elementos que le correspondan. Este mecanismo facilita la comprensión del alcance, enfoca las revisiones con usuarios, permite establecer prioridades y simplifica las búsquedas de elementos.</p><h4>Un hermoso martillo dorado</h4><p>Un “martillo dorado” se refiere a abusar del uso de cierto recurso o herramienta, queriendo aplicarla incluso en problemas para los que no está diseñada. Veamos el siguiente caso de uso:</p><p><code> Caso de Uso: Generar Reporte X.<br /> Objetivo: Generar y desplegar el reporte X.<br /> Actores: Actor X.<br /> Flujo Básico:<br /></code></p><ol><ol><li>El actor X indica al sistema que desea consultar el reporte X.</li><li>El sistema permite al actor X indicar los valores para filtrar el reporte.</li><li>El actor X proporciona los valores a usar para filtrar el reporte.</li><li>El actor X solicita al sistema que genere el reporte.</li><li>El sistema genera el reporte y lo muestra al actor X.</li>Flujo Alterno: Información no existente</ol></ol><ol><ol>&emsp;5.1 El sistema determina que no hay información y lo notifica al actor X.</ol></ol><ol><ol>&emsp;5.2 Regresa al paso 3 del flujo básico.</ol></ol><p>&nbsp;</p><p>¿Qué tiene de malo el caso de uso anterior? Describe la interacción completa de un usuario con el sistema, el objetivo es claro, y la secuencia de pasos parece lógica. El problema es que en casos como este, lo más importante es la información que debe contener el reporte, cómo se obtiene y se despliega, y el caso de uso no dice nada sobre esto.</p><p>El siguiente ejemplo muestra un extremo de esta situación:</p><p><code> Caso de Uso: Ejecutar Proceso Z<br /> Objetivo: Que el proceso Z sea ejecutado.<br /> Actores: Actor X<br /> Flujo Básico:<br /></code></p><ol><li>El actor X indica al sistema que ejecute el proceso Z.</li><li>El sistema ejecuta el proceso Z.</li></ol><p>¿En situaciones como estas agrega algún valor tener casos de uso? Los casos de uso son útiles cuando hay gran interacción entre el actor y el sistema, pero cuando no es así o la cantidad de reglas es abrumadora (ej. procesos batch, interfaces B2B), es mejor considerar otras alternativas. Gottesdiener proporciona una lista de opciones para documentar diferentes tipos de requerimientos tales como diagramas de estado, mapas de procesos, prototipos y modelos de datos. Para situaciones donde hay una gran cantidad de reglas, la opción es extraerlas de la narrativa y colocarlas en anexos o documentos separados, dejando en la narrativa las correspondientes referencias.</p><h4>A ritmo de “copy-paste”</h4><p>Imaginemos un caso de uso de registro de elementos en un catálogo, que tendría un flujo básico similar al siguiente:</p><ol><li>El actor X indica al sistema que desea registrar un elemento X.</li><li>El sistema despliega la forma de registro para un elemento X.</li><li>El actor X llena la forma de registro e indica al sistema que desea proceder con el registro.</li><li>El sistema revisa que la información proporcionada sea válida.</li><li>El sistema registra el elemento X.</li></ol><p>Es muy posible que para todos los catálogos simples el proceso de inserción sea muy similar al descrito, por lo que el equipo seguramente tomará la decisión de usarlo como “plantilla base”. Por tanto, si el sistema comprende 50 catálogos, se generarán 49 clones donde lo único que difiere es el nombre del “elemento X”. Esto se repetirá para consulta, modificación y eliminación, por lo que se tendrán 196 narrativas creadas a partir de las 4 base, para un total de 200 elementos.</p><p>Más que cuestionar la validez del tratamiento anterior, la pregunta es ¿realmente será útil para el equipo lidiar con 200 documentos que dicen prácticamente lo mismo? ¿Y para el cliente? ¿Ese tipo de documentación realmente le sirve?</p><p>Aunque para los diagramas basta con manejar relaciones de generalización, para las narrativas la estrategia es crear un documento base y aislar en un anexo o documento separado las peculiaridades de cada elemento. De esta manera terminará teniéndose una sola narrativa.</p><h4>Perdidos en el espacio</h4><p>En un proyecto en el que participé algunos años, nos encontramos con que a pesar de que los desarrolladores eran buenos, estaban teniendo problemas para implementar correctamente el sistema. El problema era que los desarrolladores desconocían la operación del negocio, así que no entendían cómo los casos de uso soportaban el proceso de negocio y por lo tanto no les era obvio el orden en el que se debían realizar las interacciones indicadas en los casos de uso. A pesar de que los casos de uso manejan relaciones de inclusión y extensión, así como el manejo de precondiciones en las narrativas, éstas no son suficientes para establecer el orden de ejecución de escenarios para la consecución de flujos completos. Por ende, cuando un desarrollador trabajaba con un caso de uso, tenía que “descubrir” como funcionaba el proceso completo haciendo ingeniería inversa. Esto, además de ser propenso a errores, consumía demasiado tiempo.</p><p>Para corregir esta situación realizamos las siguientes acciones:</p><ul><li>Brindar inducción a los nuevos integrantes del equipo en aspectos de negocio.</li><li>Documentar los flujos a través de diagramas de proceso de negocio, y registrar la rastreabilidad procesos - casos de uso.</li><li>Asignar a recursos experimentados como “coaches” de negocio.</li><li>Manejar matrices de rastreabilidad que documenten qué partes del código corresponden a qué caso de uso, para detectar elementos compartidos.</li><li>Diseñar baterías reutilizables de datos de prueba para consumo de todo el equipo.</li><li>Implementar esquemas de integración continua para detectar impactos laterales lo más rápido posible.</li></ul><h4>Rompiendo el principio de impenetrabilidad</h4><p>Extrapolando el principio de impenetrabilidad de física a los casos de uso, se tendría que un caso de uso no puede establecer al mismo tiempo la funcionalidad establecida por otro. Aunque suena lógico, en mantenimiento evolutivo una situación común es que, en lugar de modificar los casos de uso preexistentes, los levantadores de requerimientos prefieren crear nuevos sin avisar que reemplazan o “complementan” otros. Esto típicamente sucede bajo dos modalidades:</p><ul><li><strong>Reemplazo total</strong>: Se bosqueja la funcionalidad actual y solo se describe de manera detallada lo que cambia.</li><li><strong>Reemplazo parcial</strong>: El caso de uso solo trata de los cambios a la funcionalidad actual.</li></ul><p>En el primer caso, los desarrolladores pueden terminar creando duplicados de funcionalidades en lugar de actualizar las existentes. En el segundo caso, el resultado es un Frankenstein de modelo donde para conocer la funcionalidad del sistema es necesario realizar un tour entre entre los casos de originales y los n casos de uso “complementarios”. Adicionalmente, se pueden dar situaciones de choque entre fragmentos de funcionalidad. Esto se vuelve verdaderamente inmanejable.</p><p>Las razones más comunes por lo que sucede lo anterior son: partir de un modelo desactualizado, desconocimiento del modelo, o simplemente pereza. Es necesario promover la actualización del modelo, capacitar a los levantadores de requerimientos en el mismo, y establecer un responsable que supervise que las actualizaciones sean congruentes y no rompan la estructura.</p><h4>Conclusiones</h4><p>Los casos de uso son y seguirán siendo una muy buena herramienta para documentar y comunicar requerimientos. Sin embargo, es fácil dejarse llevar por la idea de que su uso es trivial y que son adecuados para capturar todo tipo de requerimientos. Una adecuada comprensión de sus limitaciones junto al conocimiento de otras herramientas de levantamiento de requerimientos, aunado a la aplicación de estrategias simples de organización y distribución, traerá como consecuencia requerimientos mejor plasmados, más completos y más sencillos, en beneficio tanto de los equipos de desarrollo como de los usuarios finales y el resto de las áreas involucradas.</p><h5>Referencias</h5><ul><li>[1] S. Ferg. “What's Wrong with Use Cases?” <a href="http://swgu.ru/sg39r2">http://swgu.ru/sg39r2</a></li><li>[2] E. Gottesdiener. “Top Ten Ways Project Teams Misuse Use Cases - and How to Correct Them.” <a href="http://swgu.ru/sg39r3">http://swgu.ru/sg39r3</a></li><li>[3] I. Jacobson et al, Object-Oriented Software Engineering - A Use Case Driven Approach. Addison-Wesley, 1992.</li></ul></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Efraín Cordero López es responsable técnico y líder de proyecto en grupo CARSO. Es licenciado en computación por la Universidad Autónoma Metropolitana y cuenta con acreditaciones como SCJP, SCWCD y Oracle SOA Implementation Champion. Es autor de cursos de diseño, pruebas unitarias y mejores prácticas de ingeniería de software.</p> </div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 20 Mar 2013 23:40:23 +0000 lasr21 3699 at https://sg.com.mx https://sg.com.mx/revista/39/casos-y-cosas-los-casos-uso#comments Obtención de Requerimientos. Técnicas y Estrategia https://sg.com.mx/revista/17/obtencion-requerimientos-tecnicas-y-estrategia <span class="field field--name-title field--type-string field--label-hidden">Obtención de Requerimientos. Técnicas y Estrategia</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" typeof="schema:Person" property="schema:name" datatype="">Anonymous</span></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 11/28/2007 - 13:58</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/17" hreflang="und">SG #17</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/revista/secciones/requerimientos" hreflang="und">Requerimientos</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/autores-sg/cesar-arturo-guerra" hreflang="und">César Arturo Guerra</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Como sabemos, un área de conocimiento de gran importancia en el desarrollo de software, es la ingeniería de requerimientos. Esta comprende las actividades de obtención (captura, descubrimiento y adquisición), análisis (y negociación), especificación, y validación de requisitos. Además, establece una actividad de gestión de requerimientos para manejar los cambios, mantenimiento y rastreabilidad de los requerimientos.</p><!--break--><p>El proceso de obtención de requisitos, cuya finalidad es llevar a la luz los requisitos, no solo es un proceso técnico, sino también un proceso social que envuelve a diferentes personas, lo que conlleva dificultades añadidas a su realización.</p><h2>Técnicas Para la Obtención de Requerimientos</h2><p>Existe un gran número de técnicas para obtener requerimientos. A continuación describo las más utilizadas. Hay que aclarar que ninguna de estas técnicas es suficiente por sí sola y que es recomendable combinarlas para obtener requerimientos completos.</p><h3>Entrevistas</h3><p>La entrevista es de gran utilidad para obtener información cualitativa como opiniones, o descripciones subjetivas de actividades. Es una técnica muy utilizada, y requiere una mayor preparación y experiencia por parte del analista. La entrevista se puede definir como un “intento sistemático de recoger información de otra persona” a través de una comunicación interpersonal que se lleva a cabo por medio de una conversación estructurada. Debe quedar claro que no basta con hacer preguntas para obtener toda la información necesaria. Es muy importante la forma en que se plantea la conversación y la relación que se establece en la entrevista.</p><p>Estos son algunos de los aspectos más importantes a tener en cuenta al realizar entrevistas:</p><ul><li>Preparación. Es necesario documentarse e investigar la situación de la organización analizando los documentos disponibles, de tal forma que la entrevista se enfoque en aquellos aspectos que están solamente en la mente del entrevistado y que no son accesibles por otros medios como la observación o el análisis de documentos.</li><li>Entrevistar al personal adecuado. La mayoría de los analistas adoptan un enfoque top-down, comenzando a entrevistar a directivos para que brinden un panorama general de hacia donde deberían ir las cosas, y terminando por hablar con los empleados que aportan detalles importantes de la operación.</li><li>Duración. Una entrevista debería durar a lo sumo un par de horas.</li><li>Formato. Se recomienda utilizar preguntas abiertas, donde los entrevistados puedan elaborar y dar detalles, más allá de simplemente responder “si” o “no”.</li></ul><h3>Desarrollo Conjunto de Aplicaciones ( JAD )</h3><p>Es una técnica que se utiliza para promover la cooperación y el trabajo en equipo entre usuarios y analistas. Consiste en realizar sesiones en las que participan usuarios expertos del dominio junto a analistas de software. La idea es aprovechar la dinámica de grupos aplicando un proceso de trabajo sistemático y organizado, apoyado por elementos visuales de comunicación y comprensión de soluciones.</p><p>Las razones que sirven de base a JAD son las siguientes:</p><ul><li>Las entrevistas requieren mucho tiempo, no solo en prepararlas y hacerlas sino también en redactar un conjunto de requisitos coherente a partir de opiniones diferentes de los distintos entrevistados.</li><li>Es más difícil apreciar posibles errores en la especificación de requisitos, ya que sólo el analista revisa el documento. En el JAD todo el grupo puede actuar como revisor y detectar defectos.</li><li>El JAD propugna una participación más profunda de los usuarios en el proyecto, hasta tal punto que los usuarios que participan adquieren un cierto sentido de propiedad en el sistema que se construye.</li></ul><p>El JAD no se utiliza demasiado, debido a que requiere una mayor organización que las entrevistas y porque el ambiente o los métodos de trabajo convencionales en las empresas no facilitan este tipo de actividades (falta de tiempo, dificultad de coordinación de tanta gente, dificultad para convencer a la dirección, etc.). No obstante las empresas que han implantado este método han informado de importantes ahorros de tiempo en el desarrollo de software, así como de una mayor satisfacción de los usuarios con los sistemas construidos.</p><h3><span class="subtitulo2">Desarrollo de Prototipos </span></h3><p>Los prototipos suelen consistir en versiones reducidas, demos o conjuntos de pantallas (que no son totalmente operativos) de la aplicación pedida. Esta técnica es particularmente útil cuando:</p><ul><li>El área de la aplicación no está bien definida (posiblemente por ser algo muy novedoso).</li><li>El costo del rechazo de la aplicación por los usuarios es muy alto.</li><li>Es necesario evaluar previamente el impacto del sistema en los usuarios y en la organización.</li></ul><p>Los prototipos de sistema permiten a los usuarios experimentar para ver cómo éste ayuda a su trabajo. Fomentan el desarrollo de ideas que desembocan en requerimientos. Además de permitir a los usuarios mejorar las especificaciones de requerimientos, el desarrollo de un prototipo tiene otras ventajas:</p><ol><li>Al demostrar las funciones del sistema se identifican las discrepancias entre los desarrolladores y los usuarios.</li><li>Durante el desarrollo del prototipo, el personal del desarrollo de software puede darse cuenta de que los requerimientos son inconsistentes y/o están incompletos.</li><li>Aunque limitado, se dispone rápidamente de un sistema que funciona y demuestra la factibilidad y usabilidad de la aplicación a administrar.</li><li>El prototipo se utiliza como base para escribir la especificación para la producción.</li></ol><p>En general, el uso de esta técnica es un medio que permite solventar objeciones del usuario del tipo: “No sé exactamente lo que quiero, pero lo sabré cuando lo vea”. Por lo general, la construcción de prototipos incrementa los costos en las etapas iniciales de un proyecto, pero esto se recupera en etapas posteriores gracias al mejor entendimiento de los requerimientos por parte de los desarrolladores. En algunos casos también se utiliza como un medio para formalizar la aceptación previa del cliente de los requisitos del proyecto.</p><h3><span class="subtitulo2">Observación </span></h3><p>Por medio de esta técnica el analista obtiene información de primera mano sobre la forma en que se efectúan las actividades. Este método permite observar la forma en que se llevan a cabo los procesos y, por otro, verificar que realmente se sigan todos los pasos especificados. Como sabemos, en muchos casos los procesos son una cosa en papel y otra muy diferente en la práctica. Los observadores experimentados saben qué buscar y cómo evaluar la relevancia de lo que observan.</p><h3><span class="subtitulo2">Estudio de documentación </span></h3><p>Varios tipos de documentación, como manuales y reportes, pueden proporcionar al analista información valiosa con respecto a las organizaciones y a sus operaciones. La documentación difícilmente refleja la forma en que realmente se desarrollan las actividades, o donde se encuentra el poder de la toma de decisiones. Sin embargo, puede ser de gran impotancia para introducir al analista al dominio de operación y el vocabulario que utiliza.</p><h3><span class="subtitulo2">Cuestionarios </span></h3><p>El uso de cuestionarios permite a los analistas reunir información proveniente de un grupo grande de personas. El empleo de formatos estandarizados para las preguntas puede proporcionar datos más confiables que otras técnicas; por otra parte, su amplia distribución asegura el anonimato de los encuestados, situación que puede conducir a respuestas más honestas.</p><p>El inconveniente es que la respuesta puede ser limitada, ya que es posible que no tenga mucha importancia para los encuestados llenar el cuestionario. Es recomendable conseguir apoyo de la alta dirección para solicitar a las personas de la organización que contesten el cuestionario.</p><p>Al igual que con las entrevistas, se debe seleccionar a los encuestados. El analista debe asegurar que el conocimiento y experiencia de éstos califiquen para dar respuestas a las preguntas.</p><h3><span class="subtitulo2">Tormenta de ideas ( Brainstorming ) </span></h3><p>Consiste en reuniones con cuatro a diez personas donde como primer paso sugieren toda clase de ideas sin juzgar su validez –por muy disparatadas que parezcan–, y después de recopilar todas las ideas se realiza un análisis detallado de cada propuesta. Esta técnica se puede utilizar para identificar un primer conjunto de requisitos en aquellos casos donde no están muy claras las necesidades que hay que cubrir, o cuando se esta creando un sistema que habilitará un servicio nuevo para la organización.</p><h3><span class="subtitulo2">ETHICS ( Implementación Efectiva de Sistemas Informáticos desde los puntos de vista Humano y Técnico ) </span></h3><p>Constituye un método bastante evolucionado para fomentar la participación de los usuarios en los proyectos. Creado por E. Mumford en 1979, coordina la perspectiva social de los sistemas con su implementación técnica. Un sistema no tiene éxito si no se ajusta a los factores sociales y organizacionales que rigen a la empresa. Se busca la satisfacción de los empleados en el trabajo a través de estudios integrales. Los requisitos técnicos del sistema serán los necesarios para mejorar la situación de los empleados (y, por lo tanto, su productividad) en función de dichos análisis.</p><h3><span class="subtitulo2">Puntos de Vista</span></h3><p>Cualquier sistema de software no trivial debe satisfacer las necesidades de un grupo diverso de interesados (stakeholders). Cada uno de estos puede tener intereses diferentes en el sistema de software, y por lo tanto sus necesidades pueden generar requerimientos que tengan conflicto entre sí, o incluso se contradigan.</p><p>Los métodos orientados a puntos de vista (viewpoints) toman en consideración estas perspectivas diferentes y las utilizan para estructurar y organizar tanto el proceso de obtención, como los requerimientos mismos. Uno de estos métodos es el método VORD (Definición de Requerimientos Orientado a Puntos de Vista), el cual provee un marco de trabajo orientado para la obtención y documentación de requerimientos. Las etapas principales de este método son:</p><ol><li>Identificación de puntos de vista, que implica descubrir los que reciben los servicios del sistema e identificar los servicios específicos que se suministran a cada punto de vista.</li><li>Estructuración de puntos de vista, que comprende agrupar los relacionados en una jerarquía. Los servicios comunes se ubican en los niveles altos de la jerarquía y se heredan los puntos de vista de bajo nivel.</li><li>Documentación de puntos de vista, que comprende refinar la descripción de éstos y los servicios identificados.</li><li>Trazado del punto de vista del sistema, que comprende identificar los objetos en un diseño orientado a objetos utilizando la información del servicio encapsulado en los puntos de vista.</li></ol><h3><span class="subtitulo2">Escenarios </span></h3><p>Estos se utilizan para documentar el comportamiento del sistema cuando se le presentan eventos específicos. Cada evento de interacción distinto, o la selección de un servicio del sistema, se documentan como un escenario de eventos distinto. Los escenarios de eventos incluyen una descripción del flujo de datos y las acciones del sistema, y documenta las excepciones que puedan surgir.</p><p>Las convenciones para los diagramas utilizados en los escenarios de eventos son:</p><ol><li>Los datos proporcionados desde un punto de vista o proporcionados a éste se representan como elipses.</li><li>Las entradas y salidas de la información de control se ubican en la parte superior de cada recuadro.</li><li>Las salidas de datos se ubican a la derecha de cada recuadro. Si no están encerradas, significa que pertenecen al sistema.</li><li>Las excepciones se muestran en la parte inferior del recuadro. Si existen varias excepciones posibles, éstas se encierran en un recuadro.</li><li>El nombre del siguiente evento esperado después de completar el escenario se muestra en un recuadro sombreado.</li></ol><p>Los Casos de Uso son una técnica que se basa en escenarios para la obtención de requerimientos. Actualmente se han convertido en una técnica fundamental que se utiliza para analizar y describir modelos de sistemas orientados a objetos. En su forma más simple, un caso de uso identifica a los actores involucrados en una interacción y nombra al tipo de ésta.</p><h3><span class="subtitulo2">Etnografía </span></h3><p>Los sistemas de software no existen de forma aislada; se utilizan en un contexto social y organizacional, y los requerimientos de sistemas de software se derivan y se restringen acorde a ese contexto. Satisfacer esos requerimientos sociales y organizacionales es crítico para el éxito del sistema. Una razón de por qué muchos sistemas de software se entregan pero nunca se utilizan es porque no se toma en cuenta la importancia de este tipo de requerimientos.</p><p>La etnografía es una técnica de observación que se puede utilizar para entender los requerimientos sociales y organizacionales. Un analista se sumerge por sí solo en el entorno laboral donde el sistema se utilizará. El trabajo diario se observa y se hacen notas de las tareas reales en las que los participantes están involucrados. La etnografía es especialmente efectiva para descubrir dos tipos de requerimientos:</p><ol><li>Los requerimientos que se derivan de la forma en la que la gente trabaja realmente más que de la forma en la que las definiciones de los procesos establecen que debería trabajar.</li><li>Los requerimientos que se derivan de la cooperación y conocimiento de las actividades de la gente.</li></ol><p>Los estudios etnográficos pueden revelar los detalles de los procesos críticos que otras técnicas de obtención de requerimientos a menudo olvidan. Sin embargo, puesto que se centran en el usuario final, este enfoque no es apropiado para descubrir los requerimientos organizacionales o del dominio. La etnografía tampoco está diseñada para identificar nuevas propiedades a agregar al sistema. Por lo tanto, la etnografía no es un enfoque completo para la obtención de requerimientos y debe utilizarse en conjunto con otras técnicas, como el análisis de casos de uso.</p><h2><span class="subtitulo2">Estrategia para la obtención de requerimientos </span></h2><p>Hemos descrito un número considerable de técnicas para la obtención de requerimientos. A continuación sugiero una estrategia de cómo aplicar estas técnicas dentro de un proceso ordenado y que aproveche al máximo cada técnica. Esto evitará que los analistas con poca experiencia caigamos en un error muy común, que es el de pasar demasiado pronto a las entrevistas, lo cual es un desperdicio de tiempo.</p><p>Los pasos de la estrategia sugerida son:</p><ol><li>Aprender todo lo que se pueda de los documentos, formularios, informes y archivos existentes. Es sorprendente lo que se puede aprender de un sistema sin necesidad de quitarle tiempo a la gente.</li><li>De ser posible, se observará el sistema en acción. No se plantearán preguntas. Tan sólo se observará y se tomarán notas o dibujos. Conviene asegurarse de que las personas observadas saben que no se les está evaluando. En caso contrario, harán su trabajo de manera más eficaz que lo normal.</li><li>Diseñar y distribuir cuestionarios para aclarar cuestiones que no se comprenden bien. Será también buen momento para solicitar opiniones sobre los problemas y las limitaciones. Los cuestionarios requieren que los usuarios inviertan una parte de su tiempo. Pero son ellos los que pueden elegir cuándo les viene mejor hacerlo.</li><li>Realizar entrevistas (o sesiones de trabajo en grupo, como JAD). Como ya se ha recogido una base de requerimientos iniciales en los pasos anteriores, se pueden utilizar las entrevistas para verificar y aclarar las cuestiones y los problemas de mayor dificultad. En este punto se pueden llegar a aplicar algunas de las otras técnicas cómo Escenarios, Tormenta de ideas, Puntos de Vista, ETHICS y Desarrollo de Prototipos.</li><li>Se verifican los requerimientos a través del uso de técnicas como Entrevistas, Observación y orientados a Puntos de Vista.</li></ol><p>Esta estrategia no es intocable. Aunque habría que desarrollar una estrategia de investigación de hechos para todas las fases pertinentes del desarrollo de sistemas, cada proyecto tiene sus propias particularidades. A veces, la observación o los cuestionarios pueden no ser apropiados. Pero debería mantenerse la idea de recabar siempre todos los hechos que sea posible antes de concertar entrevistas. <br /> <br /><strong> Referencias</strong></p><ol><li>Flaaten, P. O., McCubbrey, D.J., O´Riordan, P.D., Burgués, K., “Foundations of Business Systems”. Chicago (EE.UU.), The Dryden Pres, 1989.</li><li>Raghavan, S., Zelesnik, G., Ford, G., “Lecture Notes on Requirements Elicitation”. CMU/SEI-94-EM-10, Pittsburgh (E.E.U.U.), Software Engineering Institute (Carnegie Mellon University), 1994.</li><li>Kontonya, G. &amp; Sommerville I., “Requirements Engineering: Processes and Techniques”. John Wiley and Sons, 2002.</li><li>Kotonya, G. y Sommerville, I. (1996). “Requirements Engineering with viewpoints”. BCS/IEE Software Engineering J.</li></ol></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Cesar Arturo Guerra García es profesor-investigador en el área de Tecnologías de Información de la Universidad Politécnica de San Luis Potosí. Sus áreas de interés son Ingeniería de Software, Ingeniería de Requerimientos, Modelado de sistemas y Administración de Proyectos. Ha trabajado como desarrollador y líder de proyectos en IBM y Softtek. Egresado de la Maestría en Ciencias de la Computación del Centro de Investigación Científica y de Educación Superior de Ensenada, CICESE. <a href="mailto:guerra@upslp.edu.mx">guerra@upslp.edu.mx</a></p> </div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 28 Nov 2007 19:58:22 +0000 Anonymous 544 at https://sg.com.mx https://sg.com.mx/revista/17/obtencion-requerimientos-tecnicas-y-estrategia#comments Patrones de Casos de Uso. https://sg.com.mx/revista/6/patrones-casos-uso <span class="field field--name-title field--type-string field--label-hidden">Patrones de Casos de Uso. </span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/cu.png" width="374" height="244" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" typeof="schema:Person" property="schema:name" datatype="">Anonymous</span></span> <span class="field field--name-created field--type-created field--label-hidden">Fri, 11/23/2007 - 13:30</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/06" hreflang="und">SG #06</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/revista/secciones/requerimientos" hreflang="und">Requerimientos</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores-sg/saul-cuesta" hreflang="und">Saúl Cuesta</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Al desarrollar o construir algo, como por ejemplo una casa o una máquina, es muy útil apoyarse en la experiencia anterior, ya sea de uno mismo o de otros. De esta manera sabremos que la solución va a funcionar, y tendremos identificados los problemas potenciales, así como soluciones para éstos. Estas soluciones a problemas comunes se conocen como patrones, y se utilizan en diversos aspectos del desarrollo de software. Ya en un artículo anterior de SG se habló sobre patrones de diseño, específicamente del patrón Modelo-Vista-Controlador. En esta ocasión, estudiaremos la aplicación de patrones al modelado de casos de uso, y en específico abordaremos el patrón CRUD.</p><!--break--><p>Contrario a lo que se pudiera pensar, un patrón de casos de uso no describe un uso particular de un sistema. Más bien, captura técnicas para que el modelo sea mantenible, reusable, y entendible. Entonces, podemos decir que los patrones de casos de uso capturan mejores prácticas para modelar casos de uso.</p><p>La aplicación de patrones de casos de uso nos trae los siguientes beneficios: <br /> • Aumentar la productividad.<br /> • Reutilizar elementos existentes (en este caso fragmentos de modelos).<br /> • Evitar el retrabajo por errores. <br /> • No invertir tiempo en resolver problemas ya resueltos.<br /> • Aplicar la teoría al trabajo práctico. <br /> • Habilitar las herramientas de soporte para modelar el desarrollo.</p><h3>Captura y Organización de Patrones</h3><p>Para capturar y organizar los patrones de caso de uso, recomiendo ampliamente generar un repositorio de patrones donde capturen al menos la siguiente información para cada patrón:</p><p>• Nombre: el nombre descriptivo del patrón.<br /> • Intento: captura cuál es el objetivo de aplicar el patrón.<br /> • Características: estados de los patrones, si son simples o complejos, comunes o infrecuentes. <br /> •Palabras claves: palabras clave que caractericen al patrón para facilitar su búsqueda.<br /> • Tipo: si el patrón afecta la estructura del modelo o la descripción de un caso de uso.<br /> •Modelo: un modelo de caso de uso a aplicar.<br /> •Descripción: la descripción del modelo. <br /> •Aplicabilidad: cuándo y cómo aplicar el patrón.<br /> •Discusión: completa discusión sobre el patrón.<br /> •Ejemplo: un ejemplo donde uno o más de los patrones se aplica.<br /> •Modelo de análisis: diagrama con clases de análisis que proporciona una realización de los casos de uso.</p><p>Una vez que hemos hablado sobre lo que es un patrón de caso de uso, y la forma de documentarlos, estudiemos el patrón conocido como CRUD, en sus variantes completa y parcial.</p><p>Nombre: CRUD<br /> Intento: este patrón se utiliza en los casos donde se quiere realizar altas, bajas, cambios y consultas a alguna entidad del sistema. Su nombre es un acrónimo de las palabras en inglés Create, Read, Update, Delete. Palabras clave: Creación, altas, bajas, cambios, catálogo</p><p>Modelo 1: CRUD Completo<br /> <img src="http://www.sg.com.mx/images/stories/200506/requerimientos_1.gif" alt="" /><br /> Descripción: el patrón CRUD Completo consiste en un caso de uso para administrar la información (CRUD Información), nos permite modelar las diferentes operaciones para administrar una entidad de información, tales como crear, leer, cambiar y dar de baja.</p><p>Aplicabilidad: este patrón deberá ser usado cuando todas las operaciones contribuyen al mismo valor de negocio y todas son cortas y simples.</p><p>Modelo 2: CRUD parcial<br /> <img src="http://www.sg.com.mx/images/stories/200506/requerimientos_2.gif" alt="" /><br /> Descripción: alguna de las alternativas del caso de uso puede ser modelada como caso de uso independiente.<br /> Aplicabilidad: este patrón es preferible cuando uno de los flujos alternativos del caso del uso es más significativo, muy largo, o mucho más complejo que el patrón completo. <br /> Discusión: muy a menudo los sistemas manejan información que, del punto de vista del sistema, se crea muy fácilmente. Después de un chequeo de sintaxis, o quizás un cierto chequeo sin importancia de un cálculo o regla de negocio, la información se almacena simplemente en el sistema. No es necesario realizar cálculos, verificaciones complejas, o recuperación avanzada de datos. La descripción del flujo es pequeña, y probablemente sólo haya una o dos trayectorias alternativas de menor importancia en el flujo. Las consultas, cambios, o bajas son operaciones igualmente simples.</p><p>¿Deben tales operaciones ser modeladas como un caso de uso? ¿Y deben incluirse en el modelo del sistema completo? La respuesta a ambas preguntas es sí. Son casos de uso porque son funciones que debe ser capaz de realizar el sistema. Alguien utilizará el sistema para administrar esa información. Por otra parte, deben ser incluidos en el modelo, ya que de otra manera estará incompleto. Y esto puede provocar que el proyecto no se lleve a cabo adecuadamente.</p><p>Afortunadamente, esto no significa que necesariamente cada operación se debe expresar como casos de usos separados. Según el patrón CRUD, los podemos agrupar. Este procedimiento tiene algunas ventajas obvias. Primero, el tamaño del modelo será reducido, hará más fácil de entender el modelo porque tiene menos casos. En segundo lugar, nadie estará interesado en un sistema que contiene solamente un subconjunto de estos casos de uso, ya que no generan el valor completo (por ejemplo, leer y dar de baja, pero no crear y cambiar). Agrupar estos flujos juntos en un caso como Administrar X se asegura de que las cuatro operaciones estarán incluidas en el modelo, y lo hace claro para el lector del modelo. Tercero, el valor de cada uno de los flujos por separado es muy pequeño, y podríamos estar cayendo en descomposición funcional; es la colección entera de estas operaciones la que da valor a los interesados.</p><p><img src="http://www.sg.com.mx/images/stories/200506/requerimientos_3.gif" alt="" /><br /> Las cuatros operaciones no deben ser modeladas como caso de uso independientes.</p><p>La variación denominada CRUD: Parcial, indica que en caso de que solo algunas de las cuatro operaciones sean simples mientras que otras son complejas, se puede agrupar las operaciones simples en un caso de uso y dejar las otras modeladas como un caso de uso separado.</p><p>Observar también que esto es una situación típica donde un caso de uso no tiene solamente un flujo “básico”. Ninguno de los flujos se puede decir que es más “básico” o “normal” que los otros. Por lo tanto, un caso de uso CRUD tendrá típicamente cuatro flujos básicos, y posiblemente algunos flujos alternativos, como se demuestra en el ejemplo 1.</p><p>Una instancia de un caso de uso podrá realizar una de las siguientes operaciones (crear, leer, cambiar y dar de baja), y después dejar de existir. Esta misma instancia del caso de uso no continuará viviendo y esperando la operación siguiente que se realizará. Esta operación debe ser realizada por otra instancia del mismo caso de uso.</p><p>Como regla general, cuando no estamos seguros si combinar los diversos casos de usos en uno o crearlos como separados, la recomendación es mantenerlos como uno solo y después cuando se vea el tamaño y complejidad del caso de uso, se deberá tomar la decisión de separarlos si es necesario.</p><p>A continuación mostramos un ejemplo de un boceto de caso de uso utilizando el patrón CRUD. Por razones de espacio, no está completo. El objetivo es ejemplificar la aplicación del patrón.</p><h3>Caso de Uso: Administrar Tarea</h3><p>Este caso de uso permite registrar, listar, modificar, o eliminar la información de tareas realizadas.</p><p>Flujo Básico<br /> El caso de uso tiene cuatro diversos flujos básicos:<br /> Registrar tarea nueva <br /> Modificar una tarea existente <br /> Cancelar tarea <br /> Consultar tarea fallida</p><p>Registrar tarea nueva<br /> El caso de uso comienza cuando el usuario elige registrar una nueva tarea.<br /> El sistema presenta una lista de posibles clases de tareas, y pregunta qué clase de tarea debe ser registrada, con qué nombre, y cuando se debe realizar. <br /> El usuario provee la información requerida. <br /> El sistema comprueba que el tiempo especificado es en el futuro y que el nombre de la tarea es único. <br /> El sistema registra la nueva tarea y la marca como activa. <br /> El caso de uso termina.</p><p>Modificar tarea<br /> El caso de uso comienza cuando el usuario elige modificar una tarea ya registrada. <br /> El sistema recupera los nombres de todas las tareas no marcadas como activo y las presenta al usuario. El usuario selecciona una de las tareas. <br /> El sistema recupera la información sobre la tarea y la presenta al usuario.<br /> El usuario modifica cualquiera de la información actual excepto el nombre de la tarea. <br /> El usuario acepta la información. <br /> El sistema comprueba si el tiempo especificado es en el futuro y almacena la información modificada. <br /> El caso de caso de uso termina.</p><p>Cancelar tarea<br /> El caso de uso comienza cuando el usuario elige cancelar una tarea. <br /> El sistema recupera y despliega todas las tareas futuras. <br /> El usuario selecciona una de las tareas. <br /> El sistema recupera la información sobre la tarea y la presenta al usuario. <br /> El usuario confirma la cancelación, el sistema elimina la tarea; si no se puede, no se hace ninguna modificación. <br /> El caso de uso termina.</p><p>Consultar tarea fallida<br /> El caso de uso comienza cuando el usuario elige vista de la lista de todas las tareas que han fallado. <br /> El sistema recoge todas las tareas con el estado fallado y presenta sus nombres al usuario. <br /> El caso de uso termina.</p><p>Flujos alternativos <br /> Cancelar la operación<br /> Nombre o Tiempo incorrecto</p><h3>Otros Patrones de Caso de Uso</h3><p>Existen varios patrones adicionales al CRUD que son utilizados para modelar sistemas. Esta es una lista de los más importantes:</p><ul><ul>• Reglas de negocio</ul></ul><ul><ul>• CRUD</ul></ul><ul><ul>• Login</ul></ul><ul><ul>• Reportes y Explotación de información</ul></ul><ul><ul>• Inclusión y Extensión</ul></ul><h3>Conclusión</h3><p>La técnica de casos de uso nos permite modelar y especificar los requerimientos de nuestro sistema. Tiene muchos beneficios, entre los más importantes: primero nos permite planear nuestro proyecto y segundo ayuda a llegar a acuerdos con los usuarios, para que los casos de uso sean mas claros y mantenibles es importante encontrar patrones y documentarlos, de esta manera cuando nos encontremos con un problema igual o parecido podamos resolverlos en menor tiempo. El concepto de patrones no es algo que solo es aplicable a la práctica de requerimientos. De hecho, la disciplina de requerimientos copia este concepto de la de análisis y diseño. Lo que se busca con los patrones es reutilizar lo aprendido en los nuevos proyectos y usarlos en la organización como estándares.</p><p>Referencias<br /> • Pan-Wei Ng, Understanding types of use cases and artifacts. IBM Developerworks. <br /> www-128.ibm.com/developerworks/rational/library/1809.html</p><p>&nbsp;</p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Saúl Cuesta Rodríguez es consultor de ITERA especializado en las prácticas de requerimientos y modelado de negocios. Es graduado de la Universidad Tecnológica de Panamá como Ing. en Sistemas.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Fri, 23 Nov 2007 19:30:00 +0000 Anonymous 510 at https://sg.com.mx https://sg.com.mx/revista/6/patrones-casos-uso#comments