Descargar

Reconstrucción de la arquitectura: Una actividad de la reingeniería de software


    1. Capítulo 1. Reingeniería de procesos en la Administración
    2. Capítulo 2. Sistemas heredados y reingeniería de software
    3. Capítulo 3. Métodos y modelos de la reingeniería de software
    4. Capítulo 4. Reconstrucción de la arquitectura
    5. Conclusiones
    6. Glosario
    7. Bibliografía

    INTRODUCCIÓN

    La evolución del software esta dividida en varias etapas, una de ellas es la llamada "crisis del software". Esta crisis fue el resultado de la introducción de la tercera generación del hardware. El hardware dejo de ser un impedimento para el desarrollo de la informática; redujo los costos y mejoro la calidad y eficiencia en el software producido. La crisis se caracterizo por los siguientes problemas:

    • Imprecisión en la planificación del proyecto y estimación de los costos.
    • Baja calidad del software.
    • Dificultad de mantenimiento de programas con un diseño poco estructurado, etc.

    A raíz de esta crisis se vio la necesidad de crear estándares de desarrollo del software, esto dio lugar a lo que hoy llamamos "Ingeniería de software" el cual es el establecimiento y uso de principios de la ingeniería a fin de obtener económicamente software que sea fiable y que funcione eficientemente.

    A pesar de la creación de estos estándares, muchos sistemas siguieron siendo desarrollados y mantenidos sin aplicar ninguna practica de ingeniería de software por lo que hoy en día, muchas organizaciones se ven obligadas a seguir viviendo en esta crisis dado que sus sistemas son vitales para el funcionamiento de dichas organizaciones.

    La reingeniería de software es la actividad con el cual se pretende dar solución a estas organizaciones. La reingeniería de software pretende dejar morir esos sistemas imposibles de mantener, no sin antes extraer de ellos conocimientos que permitan crear un nuevo sistema fiable, eficiente y de fácil mantenimiento.

    Dado que en muchos de los casos, la reingeniería de software se convierte en la única solución a estos sistemas de baja calidad, esta monografía pretenden dar una breve introducción a dicha solución para mostrarle al lector que a pesar de que el esfuerzo de aplicar reingeniería es un proceso difícil, trae grandes beneficios si se emplea de manera adecuada.

    ¿Cómo está organizada esta monografía?

    Esta monografía esta organizada en cuatro capítulos:

    Capítulo 1: Reingeniería de procesos

    Esta primera parte de la monografía proporciona una breve visión general de lo que es reingeniería desde un punto de vista administrativo. Se comienza por narrar el primer caso de reingeniería de procesos, el cual se aplicó en el proceso de disparar proyectiles por parte de la Marina de los Estados Unidos. En el subtema 2 se da y explica la definición de reingeniería de procesos y se hace mención a la esencia de la reingeniería. Por último, este Capítulo hace una comparación de la reingeniería contra los programas de mejora incremental.

    Capítulo 2: Sistemas de información heredados y reingeniería de software

    Ya que se definió el concepto de reingeniería desde el ámbito administrativo en el Capítulo anterior, se podrá abordar el tema de reingeniería de software. En este Capítulo se detalla las características de los sistemas de información heredados, que son aquellos a los que es necesario aplicarles reingeniería para después abordar por completo el concepto de reingeniería de software y sus objetivos. También se menciona la importancia de aplicar reingeniería de software en los sistemas de información heredados. Antes de finalizar este Capítulo, se explica el modelo que propone Sneed para calcular los costes de un proyecto de reingeniería.

    Capítulo 3: Métodos y modelos de la reingeniería de software

    Este Capítulo explica de una forma muy breve los métodos y modelos que son utilizados para llevar a cabo de manera satisfactoria la actividad de reingeniería. Al comienzo del Capítulo se alude al método de análisis de opciones para reingeniería (OAR por sus siglas en ingles de Options Analysis for Reingeneering" dando su definición y explicando la necesidad de aplicarlo, se menciona de forma breve las actividades principales y especializadas de este método así como la estructura de ellas. En los siguientes dos subtemas se trata a dos modelos utilizados para la reingeniería: El modelo herradura y el modelo cíclico, explicando brevemente los niveles o actividades de cada uno.

    Capítulo 4: Reconstrucción de la arquitectura

    El último Capítulo de esta monografía trata el tema de reconstrucción de la arquitectura de un sistema candidato al proceso de reingeniería. La reconstrucción de la arquitectura es una de las principales actividades que se deben realizar al iniciar un proyecto de reingeniería ya que esta nos permite entender al programa que sufrirá la transformación mediante la creación de abstractas del sistema. En el primer subtema se intenta definir cual es el rol de la reconstrucción de la arquitectura en el proceso de reingeniería para después mencionar algunas recomendaciones para un proyecto de reconstrucción de la arquitectura. Este Capítulo finaliza explicando a detalle las fases que conforman la actividad de reconstrucción de la arquitectura dando en algunos casos, ejemplos que ayuden a entender dichas fases.

    CAPÍTULO 1

    REINGENIERIA DE PROCESOS

    Para poder hablar de la reingeniería de software, es necesario conocer el origen de esta actividad, el cual se dio en el ámbito de la administración. En este capítulo se aborda el concepto de reingeniería desde un punto de vista administrativo, ya que fue en este enfoque donde la reingeniería hace su aparición. En el primer subtema de este capítulo se narra el primer caso de reingeniería de procesos, el cual se aplicó en el proceso de disparar proyectiles por parte de la Marina de los Estados Unidos. En el subtema 2 se da y explica la definición de reingeniería de procesos y se hace mención a la esencia de la reingeniería. Por último, este capítulo hace una comparación de la reingeniería contra los programas de mejora incremental.

    1.1 PRINCIPIOS DE LA REINGENIERÍA

    Para explicar el origen de la reingeniería de procesos es necesario retroceder al año 1898 durante la guerra de los Estados Unidos con España. Durante esta guerra, la Marina de los Estados Unidos disparó un total de 9500 proyectiles, de los cuales sólo 121 (1.3%) hicieron impacto sobre el objetivo. Durante este año, ese porcentaje representaba la máxima eficiencia mundial aunque en tiempos actuales ese porcentaje sería desastroso.

    En 1899, haciendo una nueva demostración del liderazgo que entonces ejercía en cañoneo naval de precisión, la Marina de los Estados Unidos realizó una exhibición de práctica de tiro para referenciar su rendimiento. En un total de veinticinco minutos de fuego contra un blanco que era un buque situado a una distancia aproximada de una milla (1.6 Km.), se registraron exactamente dos impactos, y éstos en las velas del buque que servía de blanco.

    Pero en 1902, las Marina de los Estados Unidos podía dar en un blanco parecido cuantas veces disparará un cañón; la mitad de las balas podían hacer impacto dentro de un cuadrado de 50 pulgadas por lado (1.7 m). Este espectacular rendimiento fue logrado gracias a un oficial de artillería naval llamado William Sonden Sims, el cual se puede decir que fue el primero en utilizar el proceso que hoy llamamos reingeniería. [Mang 95]

    Hace un siglo, apuntar un cañón hacia un blanco en alta mar era una actividad muy aleatoria. El cañón, el blanco y los mares que los rodeaban se hallaban en movimiento continuo. Los héroes tradicionales de los combates navales eran los navegantes que maniobraban para colocar el buque en una u otra posición y dar a los cabos de cañón la oportunidad de cumplir su difícil tarea. Pero en unas maniobras que se hicieron en el Mar de la China, Sims observó los avances decisivos que los artilleros ingleses habían empezado a lograr en la manera de apuntar y disparar.

    Los elementos del proceso para la artillería naval eran bastante sencillos hace un siglo: un cañón, una manivela para levantarlo al ángulo de la trayectoria deseada para un alcance normal de una milla, y un anteojo de larga vista montado sobre el cañón mismo a fin de mantener el blanco en la mira hasta un instante después del disparo y el retroceso de la pieza. Sims descubrió una manera muy sencilla de mejorar espectacularmente la puntería compensando la elevación y el tiempo del balanceo del barco.

    Lo primero que sugirió fue reglamentar la relación de los engranajes de tal manera que el artillero pudiera elevar o bajar fácilmente el cañón siguiendo el blanco en los balanceos del buque. En segundo lugar propuso cambiar de sitio la mira del cañón para que el artillero no fuera afectado por el retroceso al disparar. Esta innovación le permitiría conservar el blanco en la mira durante todo el acto del disparo. El resultado sería fuego de puntería continua.

    Basándose en los cálculos que hizo en sus notas, Sims predijo que sus modificaciones al proceso tenían el potencial de aumentar la precisión de tiro en más del 3000 por ciento, sin costos adicionales, sin usar tecnología adicional, y sin necesidad de aumentar el personal de maniobra. Los consiguientes avances decisivos en productividad fueron enormes, ¡y llegaron al 3000 por ciento que había predicho Sims!

    Después de haber revisado el primer caso de reingeniería podríamos dar una vaga idea sobre el proceso llamado Reingeniería; el cual tiene como resultado un cambio radical en los procesos obsoletos para obtener un mejor aprovechamiento y rendimiento de la productividad. Este es considerado como el primer caso documentado en el que se aplica reingeniería ya que cumple con la definición que se da en el siguiente tema, el cual a grandes rasgos, es realizar un cambio radical a todo un proceso para lograr la productividad de una organización.

    1.2 REINGENIERÍA DE PROCESOS

    Una definición de Reingeniería basada en [Mang 95] y [Hamm 94] sería: es la actividad en el que los procesos son objeto de una revisión fundamental y rediseño radical, para lograr así la optimización de los flujos del trabajo y la productividad de una organización.

    Para poder analizar esta definición es necesario también definir lo que es un proceso. "Definimos un proceso de negocios como un conjunto de actividades que recibe uno o más insumos y crea un producto de valor para el cliente." [Hamm 94]

    Se dice que durante una reingeniería, los procesos son objeto de una revisión fundamental ya que es necesario realizarse las preguntas básicas sobre su compañía y como funciona sin dar nada por sentado. La reingeniería determina primero qué debe hacer una compañía para después determinar cómo debe hacerlo. Se olvida por completo de lo que es y se concentra en lo que debe ser.

    La revisión fundamental de un proceso nos permitirá aplicarle un rediseño radical lo cual no es simplemente realizar cambios superficiales o correcciones a lo que ya esta instalado. Se trata de desechar por completo los viejos procedimientos e inventar nuevas formas de realizar el trabajo. Rediseñar es reinventar el negocio, no mejorarlo o modificarlo.

    Al aplicar la reingeniería a un proceso lograremos optimizar los flujos de trabajo y la productividad dando resultados que deben ser notables y hasta sorprendentes, esto debido a que el programa de reingeniería es difícil y nunca se conseguirá un apoyo ejecutivo sin promesas de resultados más que simplemente incrementales.

    La Esencia de la Reingeniería

    "En el corazón de la reingeniería esta la noción del pensamiento discontinuo – de reconocer y romper desde afuera las viejas reglas y suposiciones con respecto a las operaciones. Una vez que cambiemos las reglas, nosotros simplemente reacomodaremos las sillas en el Titanic." [Hamm 90]

    Todos los negocios están llenos de reglas que se tienen desde las primeras décadas. Esas reglas de diseño de trabajo están basadas en vejas suposiciones acerca de los objetivos de la tecnología, gente y organizaciones. El repertorio actual de información tecnológica disponible es grande y se distribuye rápidamente. Calidad, innovación y servicios son más importantes que el costo, crecimiento y control.

    Para las empresas deberá ser una sorpresa que sus procesos de negocios y estructuras están fuera de moda y obsoletos: las estructuras de trabajo y procesos no tienen lugar con los cambios en tecnología, demografía y objetivos de negocios.

    En reingeniería, los administradores rompen con los procesos pasados de moda y principios fundamentales de diseño y crean nuevos; para ello, la reingeniería requiere de la observación de los procesos fundamentales de los negocios desde una perspectiva funcional para formar un equipo que represente las unidades funcionales involucrados en el proceso que sufrirá reingeniería y todos las unidades que dependen de él.

    El equipo deber analizar y encuestar los procesos existentes hasta que realmente entiendan que los procesos están tratando de terminar. En lugar de que el equipo busque oportunidades de mejorar el proceso, deberá determinar cuales de esos pasos realmente agregan valor y buscar nuevas formas de registrar los resultados.

    1.3 LA REINGENIERÍA VS LOS PROGRAMAS DE MEJORA INCREMENTAL

    Como ya hemos visto, la reingeniería consiste en un cambio radical y si hay algo que las empresas quieren evitar es el cambio radical. La mejora continua incremental – en contraposición a la Reingeniería de Procesos – está más de acuerdo con la manera como las organizaciones se entienden naturalmente con el cambio. La mejora continua hace hincapié en cambios pequeños, incrementales; el objeto es mejorar lo que una organización ya está haciendo.

    Estos cambios incrementales para mejorar el rendimiento de los negocios revisten formas distintas, por ejemplo, calidad, automatización, reorganización, reducción o rectificación del tamaño. Pero ¿qué ocurre cuando uno aplica técnicas de mejora continua en un mundo de negocios en que el ritmo del cambio ya no es continuo? Termina viéndose un panorama sembrado de programas fallidos de mejora, y el fracaso de las personas bienintencionadas que han tratado de sacarlos adelante. La falla reside más bien en un mundo que súbitamente exige avances decisivos en lugar de cambios incrementales.

    La Reingeniería de Procesos se diferencia de los programas de mejora incremental continua en varias formas importantes (figura 1.1). Reingeniería de Procesos según Manganelli [Mang 95] es:

    • No sólo automatización, aún cuando con frecuencia utiliza tecnología en formas creativas e innovadoras.
    • No sólo reorganización, aun cuando casi siempre requiere cambios organizacionales.
    • No sólo reducción del tamaño, aun cuando esto generalmente mejora la productividad.
    • No sólo calidad, aún cuando casi siempre se enfoca en la satisfacción del cliente y en los procesos que la apoyan.

    Para ver el gráfico seleccione la opción "Descargar" del menú superior 

    La Reingeniería de Procesos es un enfoque equilibrado que puede contener elementos de los programas más tradicionales de mejoramiento con los cuales a veces se confunde. Pero la Reingeniería de Procesos es mucho más.

    En primer lugar, la Reingeniería de Procesos busca avances decisivos en medidas importantes del rendimiento, más que mejoras incrementales. En segundo lugar, busca metas multifacéticos de mejoramiento, incluyendo calidad, costos, flexibilidad, rapidez, precisión y satisfacción de los clientes, todo simultáneamente, mientras que los demás programas se concentran en unas pocas metas o relaciones entre ellas.

    Para lograr estos resultados, la reingeniería de procesos adopta una perspectiva de procesos sobre los negocios, mientras que otros programas conservan una perspectiva funcional u organizacional. La gestión de calidad total si examina los procesos, pero para mejorarlos incrementalmente, no para rediseñarlos.

    También comprende la voluntad de pensar cómo debe hacerse el trabajo, y hasta de descartar totalmente las prácticas corrientes si se ve que es necesario. Finalmente, la reingeniería de procesos adopta para la mejora de los negocios un enfoque integral que abarca tanto los aspectos técnicos de los procesos (tecnología, normas, procedimientos, sistemas y controles) como los aspectos sociales (organización, dotación de personal, políticas, cargos, planes de carreras e incentivos). En otras palabras, la reingeniería de procesos multiplica el poder de la tecnología y faculta a las personas.

    CAPÍTULO 2

    SISTEMAS DE INFORMACIÓN HEREDADOS Y REINGENIERIA DE SOFTWARE

    Ya que se definió el concepto de reingeniería desde el ámbito administrativo en el Capítulo anterior, se podrá abordar el tema de reingeniería de software. En el subtema 2.1 se detalla las características de los sistemas de información heredados, que son aquellos a los que es necesario aplicarles reingeniería. En el segundo subtema se emprende por completo el concepto de reingeniería de software y sus objetivos. En el siguiente subtema se menciona la importancia de aplicar reingeniería de software en los sistemas de información heredados. Al final de este Capítulo, se explica el modelo que propone Sneed para calcular los costes de un proyecto de reingeniería.

    2.1 SISTEMAS DE INFORMACIÓN HEREDADOS

    Los sistemas de información heredados generalmente son la columna vertebral del flujo de información de las empresas y la principal forma de agruparla. Un Sistema de Información Heredado (LIS por sus siglas en ingles Legacy Information System) puede ser definido como "cualquier sistema de información que significativamente se resiste a la modificación y evolución" [Brod 94]. Tales LISs pueden causar serios problemas a la organización:

    • Los LISs casi siempre son ejecutados sobre hardware obsoleto que son lentos y caros de mantener.
    • El mantenimiento del software puede ser caro, porque carecen de la documentación necesaria para el entendimiento de los detalles del sistema y su seguimiento es costoso y consume mucho tiempo.
    • Una falta de interfaces limpias hace que la integración de los LISs con otros sistemas sea difícil.
    • Los LISs son también difíciles mas no imposibles ampliarlos.

    La solución a estos problemas según Weiderman [Weid 97] caen en las siguientes categorías:

    • Mantenimiento: es un proceso incremental e iterativo en el cual se hacen pequeñas modificaciones al sistema.
    • Modernización: implica cambios más extensos que el mantenimiento pero conserva partes considerables del sistema existente.
    • Remplazarlo: el cual consiste en reconstruir desde los inicios al sistema. Esta solución consiste en aplicarle al sistema actividades de Reingeniería.

    2.2 REINGENIERÍA DE SOFTWARE

    Reingeniería de Software es una forma de modernización para mejorar las capacidades y/o mantenibilidad de los sistemas de información heredados mediante la aplicación de tecnologías y practicas modernas. La Reingeniería de Software ofrece una disciplina de preparación para migrar un sistema de información heredado hacia un sistema evolucionable. El proceso aplica principios de ingeniería para un sistema existente para encontrar nuevos requerimientos.

    "El Instituto de Ingeniería de software (SEI) desarrollo una definición de Reingeniería como: Reingeniería es la transformación sistemática de un sistema existente dentro de una nueva forma de realizar mejoramientos de calidad en unas operaciones, capacidad del sistema, funcionabilidad, rendimiento o evolucionabilidad a bajo costo, agendas o riesgos para el cliente." [Till 95]

    El propósito de la reingeniería es que los sistemas existentes tomen ventajas de las nuevas tecnologías y habilitar el nuevo esfuerzo de desarrollo para que aproveche las ventajas de reutilizar sistemas existentes. La reingeniería tiene el potencial de mejorar la productividad y calidad del software a través de todo el ciclo de vida.

    La reingeniería casi siempre implica cambiar la forma de un programa y mejorar su documentación. En este caso, la funcionabilidad del programa no es cambiada; sólo su forma es modificada. En otros casos, la reingeniería va más allá de la forma e incluye rediseñar para cambiar la funcionabilidad del programa para buscar mejores requerimientos de usuario.

    Los objetivos de la reingeniería son: [McCl 92]

    • Proporcionar asistencia automatizada para el mantenimiento.
    • Reducir los errores y costos del mantenimiento.
    • Incrementar la intercambiabilidad del grupo de mantenimiento.
    • Hacer sistemas fáciles de entender, cambiar y probar.
    • Habilitar la conversión y migración de sistemas.
    • Reforzar el apego a estándares.
    • Mejorar la respuesta a peticiones de mantenimiento.
    • Mejorar el estado de ánimo del grupo de mantenimiento.
    • Proteger y extender la vida del sistema.
    • Usar CASE para apoyar sistemas existentes
    • Re-usar componentes de sistema existentes.

    La reingeniería puede ayudar a entender sistemas existentes y descubrir los componentes de software que son comunes en todo el sistema. Estos componentes comunes pueden ser re-usados en el desarrollo (o redesarrollo) de sistemas y así reducir el tiempo y riesgos del desarrollo de sistemas.

    La reingeniería requiere tiempo; implica un coste de dinero enorme y absorbe recursos que de otro modo se podrían emplear en preocupaciones más inmediatas. Por todo esto, la reingeniería no se lleva a cabo en unos pocos meses, ni siquiera en unos pocos años. La reingeniería de sistemas de información es una actividad que absorberá recursos de las tecnologías de la información durante muchos años.

    2.3 LA IMPORTANCIA DE APLICAR REINGENIERÍA DE SOFTWARE

    Las Viejas Aplicaciones

    Mucha gente al ver las grandes y viejas mansiones queda asombrado de su belleza, pero no se preguntan que tan bien se puede vivir en ellas. Las personas que lo hacen dicen que es una pesadilla mantenerlas. Todas ellas fueron construidas con viejas tecnología estándar. Sus paredes externas no tienen aislamiento. El alambrado eléctrico tiene limitaciones y claramente es inadecuada para las necesidades de energía de hoy y su cableado decadente crea un severo peligro eléctrico.

    Los viejos sistemas son muy similares a los grandes y viejos edificios. Ellos tienen los mismos problemas de mantenimiento, un hecho en gran parte irreconocible por parte de la comunidad corporativa. Muchos de esos edificios son demolidos por que no son mantenibles y ya no sirven para las necesidades de sus ocupantes.

    Las viejas computadoras tal vez se puedan ver solamente en museos. Pero en muchos casos, software escrito para viejos modelos de computadora están ejecutándose hoy en día. Un caso extremo es el de un software escrito para una IBM 1401 Autocoder. Cuando la compañía remplazó la 1401 con una IBM 360/40, compraron un emulador de la 1401 para poder ejecutar el software. Esa aplicación hoy día corre en una PC – la compañía compro otro emulador.

    Los clientes demandan que las nuevas capacidades sean agregadas al código escrito en sus viejos sistemas. Casi siempre, las empresas encuentran que no pueden modificar su código – el programador que lo mantenía murió recientemente o nadie sabe programar en el lenguaje en el que fue escrito. Por lo que la funcionalidad de ese programa quedará así para siempre.

    La siguiente lista son las razones por las que es aplicable la reingeniería a los sistemas de información heredados:

    • Frecuentes fallas de producción (fiabilidad cuestionable).
    • Problemas de rendimiento.
    • Tecnología obsoleta.
    • Problemas de integración del sistema.
    • Código de calida pobre.
    • Dificultad (peligroso) al cambio.
    • Dificultad para probar.
    • Mantenimiento caro.
    • Incremento de problemas del sistema.

    Estas razones pueden ser solucionadas al aplicar un proceso de mantenimiento de software, pero cuando dicho mantenimiento deja de ser viable, entonces se toma la decisión de aplicar reingeniería.

    Nuevas Ideas, Nuevo Software

    Aunque la reingeniería se usa principalmente durante el mantenimiento del software, va mas allá de una simple ayuda para el mantenimiento. La reingeniería es el puente desde viejas tecnologías hacía nuevas tecnologías que las organizaciones deben usar en la actualidad para responder al cambio de requerimientos del negocio.

    Los viejos programas representan la tecnología del ayer. Ahora sabemos que los años tienen cuatro dígitos y no dos, que los datos pueden ser manejados mejor en bases de datos y que tenemos nuevos diseños de construcción y lenguajes de programación que permiten diseñar programas notablemente mantenibles.

    Cuando el costo de mantener viejos edificios es altamente excesivo, se remplazan estos edificios. Nosotros deberíamos hacer lo mismo con los programas. Los programas no se hacen obsoletos al paso del tiempo ya que fueron escritos para hardware y sistemas operativos que ya no existen, muchos están llenos de características y parches no documentados.

    Sólo cuando hayamos aprendido a que es mejor invertir en nuevo hardware y nuevos edificios podremos reconocer el valor de remplazar los viejos sistemas raquíticos.

    2.4 COSTES Y BENEFICIOS DE LA REINGENIERÍA.

    Antes de reconstruir un sistema en uso, es altamente recomendable analizar las diversas alternativas disponibles:

    • Dejar el producto como está.
    • Adquirir uno en el mercado que realice la misma función.
    • Reconstruirlo.

    Evidentemente, elegiremos la opción que mejor relación coste/beneficio nos ofrezca. Para calcular los costes de un proyecto de reingeniería, Harry Sneed [Snee 95] propone un modelo basado en cuatro etapas:

    • Justificación del proyecto de reingeniería.
    • Análisis de la cartera de aplicaciones.
    • Estimación de costes.
    • Análisis de costes / beneficios.

    2.4.1 Justificación Del Proyecto De Reingeniería.

    Para justificar un proyecto de reingeniería se requiere de un análisis del software existente, de los procesos de mantenimiento actuales y del valor de negocio que tienen las aplicaciones; todo esto con el objeto de hacer una evaluación en posibles aumentos de valores sobre estos tres factores.

    La mayoría de las organizaciones sólo toman en consideración los procesos de reingeniería cuando el coste de un nuevo desarrollo es demasiado alto. En cualquier caso, y aunque a primera vista parezca la única o la mejor alternativa, es necesario confirmar la necesidad de reconstruir el sistema.

    Existen cuatro operaciones que nos pueden dar una idea de los costes del proyecto y del valor del software actual dentro del negocio:

    • Introducción de un sistema de evaluación de los costes del mantenimiento. Es recomendable que esta tarea la lleve a cabo la organización anticipándose con suficiente anticipación al momento en que se percibe la necesidad de aplicar reingeniería.
    • Análisis de la calidad del software actual, para lo cual pueden utilizarse auditores de código automáticos que proporcionan datos del tamaño, complejidad y métricas de calidad del código fuente. Estos valores son incorporados a una base de datos que es utilizada por otra herramienta para realizar comparaciones y obtener resultados.
    • Análisis de los costes de mantenimiento: Se proponen tres métricas para medir los procesos de mantenimiento: "Dominio del impacto" o proporción de instrucciones y elementos de datos afectados por una tarea de mantenimiento con respecto al total de instrucciones y elementos de datos del sistema; "Esfuerzo empleado", que es el número de horas dedicadas a tareas de mantenimiento, con lo que se puede obtener una media del número de horas por tarea de mantenimiento; y "Tasa de errores de segundo nivel", que es el número de errores causados por acciones de mantenimiento. Si se observa que estas tres medidas se incrementan, es muy probable que los costes de mantenimiento se incrementen con el tiempo.
    • Evaluación del valor de negocio del sistema actual, que es realizado por la dirección de la organización.

    2.4.2 Análisis De La Cartera De Aplicaciones.

    En esta etapa se cotejan la calidad técnica y el valor de negocio de cada aplicación, con el objetivo de construir una lista de aplicaciones, ordenada según sus prioridades en el proceso de reingeniería.

    La calidad técnica de un producto es una medida relativa, dependiente de cada organización, que se calcula en función de diversas características (complejidad ciclomática o errores/KLDC, por ejemplo).

    Para cada variable que interviene en la calidad técnica e fijan unos límites inferior y superior (que representan los valores máximos y mínimo de calidad). Para hallar el nivel de calidad de la variable considerada se puede utilizar la siguiente formula:

     Por ejemplo, si establecemos los valores mínimo y máximo de calidad en 0 y 7 errores por KLDC, y actualmente hay 3, Ci = 0.571.

    Asociando un punto de un plano para cada aplicación, e interpretando el valor de negocio y la calidad técnica como coordenadas de estos puntos, se puede representar como en el diagrama de la siguiente figura [Piat 00]:

    Las aplicaciones situadas en el cuadrante superior izquierdo tienen alta calidad y bajo valor de negocio, por lo que no requieren reingeniería; las situadas en el cuadrante inferior izquierdo tienen poco valor en ambos parámetros, por lo que pueden ser desarrolladas de nuevo o remplazadas por productos comerciales; las del superior derecho tienen un gran valor de negocio y alta calidad: se les puede aplicar reingeniería, pero sin excesiva prioridad; las del inferior derecho tienen alto valor de negocio y baja calidad técnica, por lo que serán las primeras candidatas a la reingeniería.

    2.4.3 Estimación De Costes.

    Se realiza identificando y ponderando, mediante métricas adecuadas, todos los componentes del software que se van a modificar.

    Se deben considerar los costes de cada proyecto de reingeniería: si éstos son superiores a los beneficios, la reingeniería no será una alternativa viable y la aplicación deberá ser desarrollada de nuevo o bien adquirirse en el mercado.

    Para estimar los costes de la reingeniería, se tienen ciertas ventajas respecto a la misma estimación en proyectos de ingeniería directa: no se debe calcular factores influyentes como el número de líneas de código, sentencias ejecutables, elementos de datos, accesos a archivos, etc., ya que son medidas que se pueden tomar directamente de la aplicación.

    Se aconseja utilizar como variables para calcular los costes las que se ofrecen a continuación, y que deben ser debidamente ponderadas en función de su influencia en el coste total:

    • Número de líneas de código no comentadas.
    • Coste de los casos de prueba, que se calcula multiplicando el coste medio de cada caso de prueba por el número de éstos, que es función de la complejidad ciclomática del problema.
    • Número de accesos a archivos, bases de datos y campos. En la ponderación de estas entradas/salidas consideramos la complejidad de las estructuras de información y el grado de independencia de la aplicación respecto de los datos.
    • Número de operaciones que realizan los usuarios de la aplicación, número de ventanas, número de informes, etc., para el caso de las interfaces de usuario.

    2.4.4 Análisis De Costes/Beneficios.

    Una vez que se ha calculado el coste de la reingeniería, la última etapa es comparar los costes con los beneficios esperados (no es suficiente con examinar los beneficios que aporte la reingeniería).

    El beneficio proporcionado por continuar manteniendo el producto sin reingeniería es el siguiente:

    BM = [P3 – (P1 + P2)] * P16

    Deberá retocarse la fórmula cuando los diversos costes varíen de un año para otro.

    Si se desarrolla de nuevo el sistema, se obtiene este beneficio:

    BD = [(P12 – (P10 + P11)) * (P16 – P14) – (P13 * P15)] – BM

    El beneficio producido por la reingeniería es:

    BR = [(P6 – (P4 + P5)) * (P16 – P8) – (P7 * P9)] – BM

    Donde:

    P1 = Coste de mantenimiento actual para una aplicación (anual).

    P2 = Coste de operación de una aplicación (anual).

    P3 = Valor del negocio actual (anual).

    P4 = Coste previsto de mantenimiento tras la reingeniería (anual).

    P5 = Coste previsto de operaciones tras la reingeniería (anual).

    P6 = Valor de negocio previsto tras la reingeniería (anual).

    P7 = Coste estimado de la reingeniería.

    P8 = Duración estimada de la reingeniería.

    P9 = Factor de riesgo de la reingeniería.

    P10 = Coste previsto de mantenimiento tras el redesarrollo (anual).

    P11 = Coste previsto de operaciones tras el redesarrollo (anual).

    P12 = Valor de negocio previsto el nuevo sistema (anual).

    P13 = Coste estimado del redesarrollo.

    P14 = Duración estimada del redesarrollo.

    P15 = Factor de riesgo del redesarrollo.

    P16 = Vida esperada del sistema.

    CAPÍTULO 3

    METODOS Y MODELOS DE LA REINGENIERÍA DE SOFTWARE

    Este Capítulo explica de una forma muy breve los métodos y modelos que son utilizados para llevar a cabo de manera satisfactoria la actividad de reingeniería. Al comienzo del Capítulo se alude al método de análisis de opciones para reingeniería (OAR por sus siglas en ingles de Options Analysis for Reingeneering) dando su definición y explicando la necesidad de aplicarlo, se menciona de forma breve las actividades principales y especializadas de este método así como la estructura de ellas. En los siguientes dos subtemas se trata a dos modelos utilizados para la reingeniería: El modelo herradura y el modelo cíclico, explicando brevemente los niveles o actividades de cada uno.

    3.1 EL METODO ANÁLISIS DE OPCIONES PARA REINGENIERÍA ("OPTIONS ANALYSIS FOR REINGENEERING" (OAR))

    3.1.1 Definición y Necesidad Del Análisis De Opciones Para Reingeniería

    El Análisis de Opciones para Reingeniería (OAR por sus siglas en ingles de Options Analysis for Reengineering) es un método sistemático, de arquitectura central y de toma de decisiones para la identificación y extracción de componentes dentro de grandes y complejos sistemas de software. La extracción envuelve rehabilitación de partes de un sistema viejo para su re-uso. OAR identifica componentes de arquitectura potencialmente relevantes y analiza los cambios requeridos para usarlos en una línea de producción de software o nuevas arquitecturas de software. En esencia, OAR proporciona un conjunto de opciones de extracción junto con estimación de costos, esfuerzo y riesgos asociados con estas opciones.

    Muchas organizaciones se comprometen a esfuerzos para actualizar sus sistemas de software intensivos y para establecer más formas eficientes de desarrollo de software. Una tendencia emergente había sido la implementación de líneas de producción de software para realizar medidas de economías y grandes eficiencias en el desarrollo de de software [Clem 01].

    Desde entonces muchas organizaciones tienen una substancial base de software heredado activo, algunas líneas de producción de desarrollo o esfuerzos de migración. Sin embargo, hasta ahora, estas habían sido formas no sistemáticas para identificar componentes para re-uso y para entender los tipos de cambios requeridos para insertar componentes de sistemas heredados dentro de una línea de producción de software o una nueva arquitectura [Mull 00]. En la mayoría de los casos, las opciones habían sido para cualquiera experimentar el costoso y alto riesgoso proceso de reingeniería de un sistema completo o para simplemente crear los componentes requeridos o sistemas desde cero.

    La extracción de componentes casi siempre había sido discutido como una alternativa, pero requería el entendimiento de que tipos de componentes valían la pena extraer y como se debería extraer. Los siguientes puntos son motivos para el cambio:

    • Componentes existentes casi siempre eran pobremente estructurados y documentados.
    • Componentes existentes diferían en niveles de granuralidad.
    • No había una guía clara sobre como salvar componentes.

    OAR proporciona un acercamiento sistemático para direccionar esos puntos y tomar decisiones requeridas para el costo efectivo y eficiente de extraer componentes de sistemas heredados.

    El método OAR consiste de cinco actividades principales con tareas escalables. Esas tareas son representadas en la figura 3.1 y resumen las siguientes secciones.

    Para ver el gráfico seleccione la opción "Descargar" del menú superior 

    Estas actividades serán abordadas brevemente en las siguientes secciones.

    3.1.2 ACTIVIDADES PRINCIPALES DEL METODO OAR

    Establecimiento del contexto de extracción (ECE).

    Es importante para el equipo de OAR entender el contexto para la extracción. Cómo un resultado, la primer actividad de OAR consiste en entrevistar a los accionistas y estudiar la línea de producción de la organización o nuevos requerimientos de sistema, base heredada y expectativas para la extracción de componentes heredados. Estos esfuerzos establecen una línea base de un conjunto de metas, expectaciones y necesidades de componentes. Esto también descubre los controladores de programa y técnicos para la toma de decisiones.

    Inventario De Componentes (IC).

    Después del ECE, el equipo OAR identifica los componentes del sistema heredado que potencialmente pueden ser extraídos para usarlos en una línea de producción o en una nueva arquitectura de software.

    Durante esta actividad, los miembros del equipo identifican componentes de líneas de producción necesarios y evalúan los componentes heredados basados en esos criterios. Aquellos que no descubran los criterios están incapacitados para continuar con el proceso de reingeiería. Esta actividad resulta en un inventario de los componentes heredados candidatos. La actividad de IC tiene seis tareas:

    1. Identificar características de los componentes necesarios:
    • Determina las características requeridas de los potenciales componentes heredados.
    1. Identifica las características satisfactorias de los componentes:
    • Crea una tabla de componentes heredados con detalles de sus características.
    • Filtra los componentes que no satisfacen las características requeridas.
    1. Compara las necesidades de componentes:
    • Compara los componentes heredados en contraste con la línea de producción de componentes necesarios.
    1. Inventario de componentes candidatos:
    • Actualiza la tabla de componentes con mas detalles acerca de los componentes candidatos seleccionados.
    1. Produce tópicos de extracción
    • Revisa cualquier tópico de extracción e inquietudes que fueron identificados durante la actividad.
    1. Revisión del calendario OAR:
    • Actualiza el calendario de OAR si fuera necesario.

    Análisis de componentes candidatos (ACC).

    El siguiente paso de los miembros del equipo es analizar el conjunto de candidatos de componentes heredados para extraer los tipos de cambios que son requeridos. Esta actividad tiene seis tareas:

    1. Selección de componentes deseables.
    • Determinar criterios deseables para cada componente heredado.
    • Deja fuere aquellos que no satisfacen esos criterios.
    1. Identifica los componentes "Tal como están y de caja negra"
    • Determina aquellos componentes que pueden ser tapados o usados "tal como están".
    1. Identifica componentes de caja blanca.
    • Determina aquellos componentes que necesitarán ser modificados.
    1. Determina cambios requeridos:
    • Determina los tipos de cambio que cada componente necesitará, el costo y esfuerzo involucrados, el nivel de dificultad y riesgo, el costo y esfuerzo comparativo para el desarrollo de componentes desde cero.
    1. Producción de tópicos de extracción:
    • Revisa cualquier tópico de extracción e inquietudes que fueron identificados durante la actividad.
    1. Revisa el calendario OAR:
    • Actualiza el calendario OAR si fuera necesario.

    Plan de opciones de extracción (POE).

    Dado el conjunto de componentes candidatos analizados, el equipo desarrollar alternativas para la extracción basada en consideraciones de calendario, costo, esfuerzo, riesgo y recursos. El equipo OAR también filtra una vez más los componentes candidatos y analiza el impacto de agregación de diferentes componentes.

    El POE tiene siete tareas:

    1. Selecciona componentes favorables:
    • Desarrolla criterios, tales como costo o niveles de esfuerzo requeridos.
    1. Ejecución de intercambio de componentes:
    • Identifica un componente (o combinación) por linea de producción de componentes necesarios.
    1. Forma opciones de componentes:
    • Desarrolla criterios para agregar componentes.
    1. Determina costos comparativos y esfuerzos:
    • Compara el costo por cada agregación con el costo de desarrollar desde cero.
    1. Analiza dificultad o riesgo:
    • Determina el nivel de dificultada y el riesgo involucrados por cada agregación.

    6. Producción de tópicos de extracción:

    • Revisa cualquier tópico de extracción e inquietudes que fueron identificados durante la actividad.
    1. Revisa el calendario OAR:
    • Actualiza el calendario OAR si fuera necesario.

    Selección de opciones de extracción (SOE).

    Finalmente, los miembros del equipo seleccionan la mejor opción de extracción o combinación de opciones para programas y consideraciones técnicas. Después de evaluar cada opción de extracción, ellos preparan un resumen que presenta y justifica sus elecciones.

    La actividad SOE tiene cinco tareas:

    1. Elegir la mejor opción:
    • Determina los controladores para seleccionar entre las opciones.
    • Selecciona una opción o combinación de ellas.
    1. Verificación de opción:
    • Guarda todos los detalles acerca de cada una de las opciones escogidas.
    1. Identifica componentes necesarios satisfechos.
    • Completa la lista final de componentes necesarios satisfechos y no satisfechos a través de las opciones seleccionadas.
    1. Presentación de descubrimientos.
    • Prepara la presentación de descubrimientos que proporciona detalles acerca de las opciones seleccionadas.
    1. Producción de resumen.
    • Producción de un reporte final detallando las opciones seleccionadas y las razones para esas elecciones.

    3.1.3 Tareas Especializadas.

    Cada actividad también tiene un potencial conjunto de actividades especializadas para direccionar circunstancias que pueden de otro modo imposibilitar la cumplimiento de la actividad. Estas tareas pueden aplicarse bajo las siguientes condiciones:

    • El criterio existente para las actividades prescritas no han sido satisfechas.
    • Mas trabajo puede ser requerido para que la actividad sea razonablemente completada en la actividad de las tareas involucradas.
    • Se requieren datos adicionales para completar una tarea particular o para direccionar necesidades especiales del cliente.
    • Existe una necesidad de complementar tareas estándares OAR para afinar la toma de decisiones y reducir riesgos.

    La siguiente sección incluye ejemplos de tareas especializadas.

    3.1.4 Estructura De Actividades

    Cada actividad esta compuesta de tareas y sub-tareas diseñadas para contestar un conjunto de preguntas de actividades especificas. Esas preguntas definirán la actividad y también servirán como una lista de comprobación para ser incluidas en los criterios de cada actividad.

    Las actividades están estructuradas de acuerdo a un formato "EITVOX (Entry Criteria, Inputs, Task, Validation, Outputs, Exit Criteria)" [Berg 01] que se muestra a continuación:

    Para ver el gráfico seleccione la opción "Descargar" del menú superior 

    Las siguientes secciones muestran cómo la actividad ECE es estructurada de acuerdo al el formato EITVOX. Cada una de las otras actividades siguen este formato. Bergey et al., proporciona este nivel de detalle. [Berg 01]

    3.1.4.1 Ejemplo De Actividad: Establecimiento Del Contexto De Extracción.

    Preguntas fundamentales.

    Las tareas de ECE fueron desarrolladas para direccionar un conjunto de cuestiones que incluyen:

    • ¿Qué esperan los administradores del esfuerzo de extracción?
    • ¿Cuáles son los requerimientos (ej. Calidad de atributos) y controladores primarios (ej. Prioridades y restricciones) para la extracción de componentes?
    • ¿Qué restricciones explicitas (e implícitas), reglas y suposiciones aplican?
    • ¿Cuál línea de producción de componentes específicos necesitarán ser direccionados?
    • ¿Cuáles sistemas heredados son relevantes y que documentos están disponibles?
    • ¿Qué documentos disponibles describen los componentes heredados (ej. Funcionalidad, granuralidad e interfaces)?
    • ¿Cuál es el nivel del estado de preparación de las organizaciones en los términos de experiencia, habilidades, recursos disponibles y margen de tiempo de OAR?

    El conjunto completo de estas cuestiones fundamentales se revisan durante la validación para asegurar que fueron respondidas satisfactoriamente.

    Criterios de entrada.

    Los siguientes criterios de entrada se analizan para determinar si hay suficientes datos y tecnológica disponible para ejecutar la actividad exitosamente. Los criterios de entrada para esta actividad son:

    • La organización ha decidido mover una línea de producción y quiere calcular rápidamente la viabilidad de la extracción de componentes.
    • La arquitectura de línea de producción ha sido definida y necesita componentes que han sido identificados.
    • Un conjunto de metas de extracción y objetivos han sido establecidos.
    • Uno de tres sistemas heredados ha sido identificado como la fuente de componentes para la extracción.
    • Un "equipo de extracción" ha sido establecido y esta disponible para la duración de actividades de OAR.

    Si el criterio de entrada no es satisfecho, una tarea especializada debe ser desarrollada.

    Artefactos de entrada.

    Cada actividad se basa en un conjunto de artefactos de soporte. Los siguientes artefactos se requieren para el establecimiento del contexto de extracción:

    • Metas y objetivos para el esfuerzo de extracción.
    • Requerimientos de la línea de producción y componentes necesarios.
    • Documentación que describe el alcance de la línea de producción, arquitectura y especificaciones de componentes.
    • Visión general del sistema heredado y documentación de componentes.
    • Reportes de experiencia de otros esfuerzos de extracción/reingeniería.
    • Perfil de calendario OAR típico.*

    La actividad ECE se divide en diez tareas. Esas tareas son ejecutadas en orden. Varias de estas tareas son subdivididas. Para ayudar al equipo OAR a ejecutar las tareas y sub-tareas, el SEI (Software Engeneering Institute) desarrollo plantillas de ejecución y datos. Estas plantillas de ejecución muestran los pasos, fundamentos y suposiciones para las tareas y sub-tareas. Las plantillas de datos proporcionan ejemplos típicos y ofrecen varios puntos de inicio para producir información de los clientes.

    Las tareas logran lo siguiente:

    1. Revisión de metas y objetivos:
    • Determina las metas y objetivos de los accionistas para el esfuerzo de extracción.
    1. Revisión de Línea de producción / Nuevos requerimientos de sistema:
    • Identificar línea de producción o nuevos requerimientos de sistema.
    1. Revisión y selección de componentes necesarios:
    • Identificar componentes necesarios que deberán ser direccionados para la extracción.

    _________________

    * El "Perfil de calendario OAR" es una plantilla proporcionada por el SEI

    Estructura de tareas.

    1. Revisión de sistemas heredados y documentación:
    • Revisión de sistemas heredados y documentación de componentes disponibles.
    1. Determinar controladores de extracción:
    • Identificar controladores programáticos y técnicos.
    1. Validar metas y objetivos:
    • Determinar la compatibilidad de los controladores de extracción con las metas y objetivos.
    1. Identificar componentes candidatos:
    • Determinar criterios para componentes heredados de gran valor.
    • Selección del conjunto de componentes candidatos.
    1. Producción de tópicos de extracción:
    • Revisión de cualquier tópico de extracción e inquietudes que fueron identificados durante la actividad.
    1. Evaluar el estado de preparación:
    • Determinar los niveles de estado de preparación de la organización.
    1. Revisión del calendario OAR:
    • Actualizar el calendario OAR si fuera necesario.

    Algunas tareas tienen sub-tareas. La tarea cuatro por ejemplo es subdividida en:

    • Revisión de sistemas heredados.
    • Revisión de documentación de componentes.

    Ejemplo de ejecución y plantillas de datos.

    La plantilla de ejecución (tabla 3), especifica como ejecutar la revisión de documentación de componentes (sub-tarea 4.2).

    La plantilla de datos "EMC-4.2-DT" (tabla 3) sugiere que los siguientes tipos de datos deben ser recolectados:

    • Lista de componentes heredados.
    • Documentación de componentes (ej. Funcionalidad y descripción de interfaces).
    • Código fuente de componentes heredados.
    • Historia de mantenimiento para componentes heredados (ej. Costo, modificación, margen de tiempo, recursos de utilización).

    Para ver el gráfico seleccione la opción "Descargar" del menú superior 

    Validación.

    Después de que las tareas fueron completadas, las preguntas fundamentales para la actividad son revisadas. Algunos de los criterios de validación para el ECE son los siguientes:

    • Las expectaciones son esquematizadas y entendidas.
    • Todos los sistemas de información heredados son identificados.
    • Un conjunto de 10 a 20 componentes de línea de producción necesarios con alto potencial han sido seleccionadas para ser satisfechas a través de la extracción.
    • Controladores y prioridades son identificados y entendidos.
    • Un conjunto de 15 a 30 componentes heredados han sido seleccionados como candidatos para la extracción.
    • El nivel de preparación de extracción ha sido evaluado.

    Artefactos de salida.

    Establecer contextos de extracción produce los siguientes artefactos de salida:

    • Un conjunto de relevantes sistemas de información heredados y documentación.
    • Un conjunto de componentes de línea de producción necesarios.
    • Programas principales y controladores técnicos.
    • Una conjunto de componentes heredados y documentación de componentes asociados.
    • Evaluación del estado de preparación.
    • Lista de tópicos de extracción e inquietudes.
    • Revisión del perfil del calendario OAR.

    Criterios de salida.

    Antes de completar el establecimiento del contexto de extracción, es necesario cubrir los siguientes criterios de salida:

    • El equipo de extracción ha identificado un conjunto razonable de líneas de producción necesarias y componentes candidatos.
    • La expectación de la organización es consistente con los niveles del estado de preparación.
    • El perfil del calendario OAR ha sido revisado y cualquier cambio necesario ha sido aceptado.
    • Todos los artefactos de salida de esta actividad han sido producidos.
    • Todas las preguntas fundamentales para esta actividad han sido contestadas satisfactoriamente.

    Ejemplos de tareas especializadas.

    Si los criterios de salida no son cumplidos, puede ser apropiado una tarea especializada. Los siguientes son ejemplos de tareas especializadas para la actividad de establecer del contexto de extracción:

    • Impulsar los esfuerzos para identificar los controladores de extracción y resolver los problemas programáticos y tópicos técnicos.
    • Impulsar la definición de los requerimientos de línea de producción y componentes necesarios en términos de funcionalidad e interfaces.
    • Aislando e identificando la funcionalidad e interfaces de los componentes heredados.
    • Desarrollando los niveles requeridos de documentación para los componentes heredados.

    3.2 El MODELO HERRADURA

    Los tres procesos básicos – análisis de un sistema existente, transformación lógica y desarrollo de un nuevo sistema – forman la base del modelo de herradura. El primer proceso sube el extremo izquierdo de la herradura, el segundo cruza la parte superior y el tercero baja por el extremo derecho de la herradura. La riqueza del modelo de herradura son los tres niveles de abstracción que pueden ser adoptados para las descripciones lógicas. Conceptualmente, este puede ser a través de un conjunto de herraduras anidadas. Las descripciones lógicas pueden ser artefactos tan concretos y simples como el código fuente del sistema o tan complejos y abstractos como la arquitectura del sistema. El propósito de la metáfora visual es para integrar las vistas de reingeniería a nivel de código y arquitectónico del mundo. [Berg 99]

    Para ver el gráfico seleccione la opción "Descargar" del menú superior 

    En su más pura y completa forma, el primer proceso recupera la arquitectura por medio de la extracción de artefactos desde el código fuente. Esta estructura recuperada es analizada para determinar si esta se adapta a la arquitectura antes diseñada. La arquitectura descubierta también es evaluada con respecto a un número de calidad de atributos tales como rendimiento, modificabilidad, seguridad o confiabilidad.

    El segundo proceso es la transformación de arquitectura. En este caso, la arquitectura antes construida es recuperada y es reingenierada para hacerla una nueva arquitectura deseable. Esta es reevaluada contra las metas de calidad del sistema y sujetas a otras restricciones organizacionales y económicas.

    El tercer proceso del modelo de herradura usa el "Architecture-Based Development (ABD)" [Bass99] para ejemplificar la arquitectura deseable. En este proceso, ya empaquetados los tópicos son decididas e interconectadas las estrategias elegidas. Los artefactos a nivel de código del sistema de información heredado son normalmente tapados o reescritos para adaptarlos dentro de la nueva arquitectura.

    3.2.1 Los Tres Niveles Del Modelo Herradura

    En el modelo herradura existen tres niveles:

    • "Representación de la estructura de código", el cual incluye código fuente y artefactos tales como árboles de sintaxis abstractos (Abstract syntax tree; ASTs) y diagramas de flujo obtenidos a través del análisis gramatical y operaciones analíticas de rutina.
    • "Representación del nivel funcional", el cual describe la relación entre las funciones del programa (llamadas), datos (funciones y relaciones de datos), y archivos (agrupamiento de funciones y datos).
    • "Nivel conceptual", el cual representa grupo tanto de funciones y artefactos del nivel de código que son ensamblados dentro de subsistemas de componentes relacionados o conceptos.

    El modelo completo no solo hace transformaciones en el nivel de arquitectura, también lo hace en los niveles subsidiarios. A continuación se proporcionan algunos ejemplos simples de transformaciones en cada nivel.

    Nivel de código.

    En el nivel de código existen dos sub-niveles, transformación textual (o basado en cadena) y transformación basado en el árbol de sintaxis. Mientras algunos métodos hacen distinciones entre transformaciones "1A" textual (sintáctico) y "1B" AST-based (semántico), el modelo herradura los considera a ambos dentro del contexto de estructura de código.

    Transformación Textual:

    En el nivel 1A, las transformaciones textuales son realizadas a través de varias comparaciones de cadenas simples y remplaza métodos. Por ejemplo, el mayor de los esfuerzos de solución al "Year 2000" (Y2K) fueron enfocadas en el código fuente, el cual representaba los años como manipulaciones de dos dígitos (por ejemplo: 99 para 1999), la solución entonces fue remplazarlos con codigo que manipulara cuatro dígitos. Otros ejemplos incluyen transformaciones textuales de nombres o palabras claves cuando portaban un sistema desde una plataforma o sistema operativo a otro. Las transformaciones del nivel 1A son relativamente simples, directas y relativamente baratas. Estas transformaciones son elegidas por las organizaciones cuando el problema es suficientemente simple o cuando se requiere un resultado rápido y sucio (quick and dirty).

    Transformación al árbol de sintaxis:

    En el nivel 1B, las transformaciones a la estructura de código basada en árboles de sintaxis (ASTs) soportan cambios que son inmunes a las variaciones superficiales de sintaxis. Así, la representación del código fuente es independiente de las expresiones o la forma en que los lenguajes de programación representan números. Transformaciones a la estructura de código basado en árboles de sintaxis son normalmente usadas para implementar nuevos lenguajes (por ejemplo de COBOL a C++) o para hacer cambios al código automáticamente (por ejemplo, métodos más sofisticados para el problema Y2K).

    Transformaciones a nivel funcional.

    Transformaciones a nivel funcional (nivel "2") tiene que ver con el re-empaquetado de funcionalidad (por ejemplo, migrar desde un diseño funcional a un diseño orientado a objeto o migrar desde un modelo de base de datos relacional a un modelo orientado objeto). La encapsulación de un modulo de funcionalidad por un diferente ambiente, es un ejemplo de transformación a nivel funcional. Transformaciones a nivel funcional va más allá de simples transformaciones a la estructura del código, pero no va más allá que una transformación de arquitectura. Ellos son elegidos cuando grandes unidades de funcionalidad pueden ser salvados poniéndolos dentro de un nuevo contexto.

    Transformaciones a nivel de arquitectura.

    Las transformaciones a nivel de arquitectura (nivel "3") involucran cambios a los bloques básicos de la arquitectura. Estos incluyen los modelos básicos de interacción incluyendo los tipos de componentes, los conectores usados, la asignación de funcionalidad y el modelo en tiempo de ejecución de control y datos. El nivel de arquitectura es el más abstracto y lejos del alcance de las transformaciones. Las transformaciones a nivel de arquitectura son hechas cuando es necesario un cambio a la estructura principal debido a las principales modificaciones o deficiencias en los sistemas de información heredados. Las transformaciones generalmente traen mayores compromisos de tiempo y recursos, pero también trae consigo grandes beneficios.

    Interacción entre niveles.

    Las transformaciones a la estructura del código se pueden dar sin hacer cambios de nivel funcional o cambios a la arquitectura. Las transformaciones del nivel más bajo soportan las transformaciones de niveles más altos. Con esta vista multi-nivel de transformaciones, las transformaciones a la arquitectura son normalmente el contexto en los cuales toman parte niveles mas bajos. Sin embargo, las transformaciones de nivel superior no soportan transformaciones de nivel bajos porque esas transformaciones se pueden dar independientemente de las transformaciones de niveles superiores. De echo, uno de los principales propósitos del modelo herradura es elevar el nivel de abstracción y brindar noticiones de la arquitectura para las tareas de reingeniería.

    3.3 EL MODELO CÍCLICO

    Este modelo define [Pres 02] seis actividades las cuales se muestran en la figura 3.3. En algunas ocasiones, estas actividades se producen de forma secuencial y lineal, pero esto no siempre es así. Por ejemplo, puede ser que la ingeniería inversa (la comprensión del funcionamiento interno de un programa) tenga que producirse antes de que pueda comenzar la reestructuración de documentos.

    Para ver el gráfico seleccione la opción "Descargar" del menú superior 

    El paradigma de la reingeniería mostrado en la figura es un modelo cíclico. Esto significa que cada una de las actividades presentadas como parte del paradigma pueden repetirse en otras ocasiones. Para un ciclo en particular, el proceso puede terminar después de cualquier de estas actividades.

    3.3.1 Actividades Del Modelo Cíclico.

    En esta sección se dará una breve explicación de las actividades que se definen en el modelo cíclico: Análisis de inventario, Reestructuración de documentos, Ingeniería inversa, Reestructuración de código, Reestructuración de datos e Ingeniería directa.

    Análisis de inventario.

    Todas las organizaciones de software deberán disponer de un inventario de todas sus aplicaciones. El inventario puede que no sea más que una hoja de calculo con la información que proporciona una descripción detallada (por ejemplo: tamaño, edad, importancia para el negocio) de todas las aplicaciones activas.

    Los candidatos a la reingeniería aparecen cuando se ordena esta información en función de su importancia para el negocio, longevidad, mantenibilidad actual y otros criterios localmente importantes. Es entonces cuando es posible asignar recursos a las aplicaciones candidatas para el trabajo de reingeniería.

    Es importante destacar que el inventario deberá revisarse con regularidad. El estado de las aplicaciones (por ejemplo, la importancia con respecto al negocio) puede cambiar en función del tiempo y, como resultado, cambiarán también las prioridades para la reingeniería.

    Reestructuración de documentos.

    Una documentación escasa es la marca de muchos sistemas de información heredados. ¿Qué se puede hacer al respecto?

    • Opción 1: La creación de documentación consume muchísimo tiempo. El sistema funciona, y ya nos ajustaremos con lo que se tiene. En algunos casos, éste es el enfoque correcto. No es posible volver a crear la documentación para cientos de programas de computadoras. Si un programa es relativamente estático está llegando al final de vida útil, y no es probable que experimente muchos cambios: ¡dejémoslo así!.
    • Opción 2: Es preciso actualizar la documentación, pero se dispone de recursos limitados. Se utilizará un enfoque "del tipo documentar si se modifica". Quizá no es necesario volver a documentar por completo la aplicación. Más bien se documentarán por completo aquellas partes del sistema que estén experimentando cambios en ese momento. La colección de documentos útil y relevante irá evolucionando con el tiempo.
    • Opción 3: El sistema es fundamental para el negocio, y es preciso volver a documentarlo por completo. En este caso, un enfoque inteligente consiste en reducir la documentación al mínimo necesario.

    Todas y cada una de estas opciones son viables. Las organizaciones del software deberán seleccionar aquella que resulte más adecuada para cada caso.

    Ingeniería inversa.

    El término "ingeniería inversa" tiene sus orígines en el mundo del hardware. Una cierta compañía desensambla un producto de hardware competitivo en un esfuerzo por comprender los "secretos" del diseño y fabricación de su competidor. Estos secretos se podrán comprender más fácilmente si se obtuvieran las especificaciones de diseño y fabricación del mismo. Pero estos documentos son privados, y no están disponibles para la compañía que efectúa la ingeniería inversa. En esencia, una ingeniería inversa con éxito precede de una o más especificaciones de diseño y fabricación para el producto, mediante el examen de ejemplos reales de ese producto.

    La ingeniería inversa del software es algo bastante similar. Sin embargo, en la mayoría de los casos, el programa del cual hay que hacer una ingeniería inversa no es el de un rival, sino, más bien, el propio trabajo de la compañía (con frecuencia efectuado hace muchos años). Los "secretos" que hay que comprender resultan incomprensibles porque nunca se llegó a desarrollar una especificación. Consiguientemente, la ingeniería inversa del software es el proceso de análisis de un programa con el fin de crear una representación de programa con un nivel de abstracción más elevado que el código fuente. La ingeniería inversa se extraerá del programa existente información del diseño arquitectónico y de proceso, e información de los datos.

    Reestructuración del código.

    El tipo más común de reingeniería es la reestructuración del código. Algunos sistemas heredados tienen una arquitectura de programa relativamente sólida, pero los módulos individuales han sido codificados de una forma que hace difícil comprenderlos, comprobarlos y mantenerlos. En estos casos, se puede reestructurar el código ubicado dentro de los módulos sospechosos.

    Para llevar a cabo esta actividad, se analiza el código fuente mediante una herramienta de reestructuración, se indican las violaciones de las estructuras de programación estructurada, y entonces se reestructura el código (esto se puede hacer automáticamente). El código reestructurado resultante se revisa y se comprueba para asegurar que no se hayan introducido anomalías. Se actualiza la documentación interna del código.

    Reestructuración de datos.

    Un programa que posea una estructura de datos débil será difícil de adaptar y de mejorar. De hecho, para muchas aplicaciones, la arquitectura de datos tiene más que ver con la viabilidad a largo plazo del programa que el propio código fuente.

    A diferencia de la reestructuración de código, que se produce en un nivel relativamente bajo de abstracción, la estructuración de datos es una actividad de reingeniería a gran escala. En la mayoria de los casos, la reestructuración de datos comienza por una actividad de ingeniería inversa. La arquitectura de datos actual se analiza minuciosamente y se definen los modelos de datos necesarios. Se identifican los objetos de datos y atributos y, a continuación, se revisan las estructuras de datos a efectos de calidad.

    Cuando la estructura de datos es débil (por ejemplo, actualmente se implementan archivos planos, cuando un enfoque relacional simplificaría muchísimo el procesamiento), se aplica una reingeniería a los datos.

    Dado que la arquitectura de datos tiene una gran influencia sobre la arquitectura del programa, y también sobre los algoritmos que los pueblan, los cambios en datos darán lugar invariablemente a cambios o bien de arquitectura o bien de código.

    Ingeniería directa (foward engineering).

    En un mundo ideal, las aplicaciones se reconstruyen utilizando un "motor de reingeniería" automatizado. En el motor se insertaría el programa viejo, que lo analizaría, reestructuraría y después regeneraría la forma de exhibir los mejores aspectos de la calidad del software. Después de un espacio de tiempo corto, es probable que llegue a aparecer este "motor", pero los fabricantes de CASE han presentado herramientas que proporcionan un subconjunto limitado de estas capacidades y que se enfrentan con dominios de aplicaciones específicos (por ejemplo, aplicaciones que han sido implementadas empleando un sistema de bases de datos específico). Lo que es más importante, estas herramientas de reingeniería cada vez son más sofisticadas.

    La ingeniería directa, que se denomina también renovación o reclamación [Chi 90], no solamente recupera la información de diseño de un software ya existente, sino que, además, utiliza esta información en un esfuerzo por mejorar su calidad global. En la mayoría de los casos, el software procedente de una reingeniería vuelve a implementar la funcionalidad del sistema existente, y añade además nuevas funciones y/o mejora el rendimiento global.

    CAPÍTULO 4

    RECONSTRUCCIÓN DE LA ARQUITECTURA

    En este último capítulo se trata el tema de reconstrucción de la arquitectura de un sistema candidato al proceso de reingeniería. La reconstrucción de la arquitectura es una de las principales actividades que se deben realizar al iniciar un proyecto de reingeniería ya que esta nos permite entender al programa que sufrirá la transformación mediante la creación de abstractas del sistema. En el primer subtema se intenta definir cual es el rol de la reconstrucción de la arquitectura en el proceso de reingeniería para después mencionar algunas recomendaciones para un proyecto de reconstrucción de la arquitectura. Este capítulo finaliza explicando a detalle las fases que conforman la actividad de reconstrucción de la arquitectura dando en algunos casos, ejemplos que ayuden a entender dichas fases.

    4.1 EL ROL DE LA RECONSTRUCCIÓN DE LA ARQUITECTURA.

    La reconstrucción de la arquitectura según Bergey [Berg 00a] resulta en una representación arquitectural que puede:

    • Ser usada para documentar la arquitectura existente.
    • Ser usada para checar la conformidad de la ya implementada arquitectura a la arquitectura diseñada.
    • Servir como un punto de partida para aplicar reingeniería al sistema para diseñar una nueva arquitectura a través de la estrategia de transformación de la arquitectura.
    • Ser usada para identificar componentes para establecer un método de línea de aplicación.

    Si una organización no tiene documentación actualizada para un sistema existente, este es a menudo una posibilidad para reconstruir la arquitectura del sistema para proporcionar documentación actual. Usando apoyo automatizado, las unidades fuentes que construyen componentes arquitectónicos y las ligas entre ellos sirven como las base para la construcción de la documentación.

    En muchos casos, la ya implementada arquitectura de un sistema tendrá que derivarse en la arquitectura diseñada. En algunos casos, reconstruyendo la arquitectura del software ayuda en el chequeo de conformidad de la ya implementada arquitectura contra la arquitectura diseñada.

    En otros casos, una organización deseará actualizar y agregar funcionalidad al sistema. La arquitectura ya implementada es entonces reconstruida y usada como la base para la transformación para la nueva arquitectura diseñada.

    Cuando se introduce un método a la línea de producción, este normalmente se beneficia al usar los componentes de la arquitectura existente en la línea de producción. En estos casos, la reconstrucción de la arquitectura puede ayudar a identificar componentes comunes que pueden ser el centro activo en la nueva línea de producción de la arquitectura.

    4.2 RECOMENDACIONES Y FASES PARA LA RECONSTRUCCIÓN DE LA ARQUITECTURA

    4.2.1 Recomendaciones Para La Reconstrucción De Arquitectura

    Los siguientes, según Kazman [Kazm 97] son recomendaciones generales para el proyecto de reconstrucción de la arquitectura:

    • Tener una meta y un conjunto de objetivos o preguntas en mente antes de emprender un proyecto de reconstrucción de datos. Por ejemplo, re-usar partes del sistema en una nueva aplicación puede ser una meta. Sin estas metas u objetivos, gran parte del esfuerzo puede ser gastado en la extracción de la información y generar vistas arquitectónicas que pueden no ser útiles.
    • Obtener una visión de alto nivel de la arquitectura del sistema antes de comenzar el detallado proceso de reconstrucción. Esta visión guía la:
      • Procesos de extracción para ayudar a identificar la información que se necesita ser extraída del sistema.
      • Procesos de reconstrucción para ayudar a determinar que se ve en la arquitectura y que vistas se generarán.
    • Usar la documentación existente para generar solo vistas de alto nivel de los sistemas. En muchos casos, la documentación existente para un sistema puede no reflejar exactamente el sistema como esta implementado, pero este puede dar una indicación de conceptos de alto nivel.
    • Involucrar a la gente que esta familiarizado con el sistema en el proyecto para obtener un mejor entendimiento del sistema que será reconstruido. Herramientas pueden ayudar al esfuerzo y acorta los procesos de reconstrucción, pero ellos no pueden ejecutar una reconstrucción completa automáticamente. La reconstrucción de arquitectura requiere que se involucre la gente (arquitectos, desarrolladores y gente de mantenimiento del software) quienes están familiarizados con el sistema.
    • Asignar a alguien de tiempo completo para trabajar sobre el proyecto de reconstrucción de arquitectura. La reconstrucción de arquitectura involucra un extenso y detallada análisis de un sistema y requiere un significante esfuerzo.

    4.2.2 Fases Para La Reconstrucción De La Arquitectura.

    La reconstrucción de datos requiere una serie de actividades y técnicas. Con la gran cantidad de software en la mayoría de sistemas, es casi imposible ejecutar todas las actividades de reconstrucción manualmente. En lugar de eso, un conjunto de herramientas (conocidas como workbench) es necesario para apoyar a las actividades de reconstrucción de la arquitectura.

    Un workbench para la reconstrucción de arquitectura debe ser abierto (acoplar fácilmente nuevas herramientas) y proporcionar una fácil integración de un marco de trabajo (conocido como framework) para que las nuevas herramientas agregadas al conjunto no afecten a las herramientas existentes o datos. Un workbench es "ARMIN", el cual remplaza al workbench "Dali architecture Reconstruction" [Kazm 97]. ARMIN se utiliza para extraer información desde el código fuente y otros artefactos del sistema, ARMIN habilita la carga de esta información para que pueda ser usada en el proceso de reconstrucción.

    Usando las herramientas proporcionadas por ARMIN, la reconstrucción de la arquitectura según Kazman [Kazm 03] comprende las siguientes fases:

    • Extracción de la información.
    • Construcción de la base de datos.
    • Fusión de vistas.
    • Composición de las vistas arquitectónicas.

    4.2.2.1 Extracción de la Información

    La extracción de la información involucra el análisis del diseño existente y artefactos de implementación de un sistema para construir un modelo basado en las vistas de las múltiples fuentes. Desde los artefactos fuente (código, archivos cabecera, archivos construidos) y otros artefactos (ejecución del programa renglón por renglón) de los sistemas, los elementos interesantes y las relaciones entre ellos pueden ser identificados y capturados para producir varias vistas fundamentales del sistema. La siguiente tabla muestra una lista de elementos típicos y varias relaciones entre los elementos que pueden ser extraídos de un sistema.

    Para ver el gráfico seleccione la opción "Descargar" del menú superior 

    Cada una de las relaciones entre los elementos constituye una vista diferente del sistema. Las relaciones "calls" entre funciones muestran como interactúan varias funciones en el sistema. Las relaciones "includes" entre archivos muestra las dependencias entre los archivos del sistema. Las relaciones "access_read" y "access_write" entre funciones y variables muestra como son usados los datos en el sistema. Ciertas funciones pueden escribir en un conjunto de datos y otros pueden leerlos. Esta información de relaciones es usada para determinar como son pasados los datos entre varias partes del sistema.

    Si el sistema analizado es grande y dividido dentro de una estructura de directorio, capturar la estructura del directorio puede ser importante para el proceso de reconstrucción. Ciertos componentes o subsistemas pueden ser almacenados en directorios, y capturar las relaciones tales como "dir_contains_dir" y "dir_contains_dir" puede ayudar a identificar componentes en el proceso de reconstrucción.

    El conjunto de elementos y relaciones extraídos dependerá del tipo de sistema analizado y las herramientas de extracción disponibles. Si el sistema a reconstruir es orientado a objetos, clases y métodos deben ser agregados a la lista de elementos extraídos, y relaciones tales como "Class is_subclass Class" y "Class contains Method" deben ser extraídas y usadas en el proceso de reconstrucción.

    Las vistas extraídas pueden ser catalogadas en estáticas o dinámicas. Las vistas estáticas son aquellas obtenidas por observación de los artefactos del sistema, mientras que las vistas dinámicas son las obtenidas por la observación del sistema durante su ejecución. En muchos casos, las vistas estáticas y dinámicas pueden ser combinadas para crear una representación más completa y exacta del sistema. Si la arquitectura del sistema cambia en tiempo de ejecución, por ejemplo, un archivo de configuración es leído por el sistema, y ciertos componentes son cargados en tiempo de ejecución, la configuración en tiempo de ejecución deber ser capturado y usado cuando se lleve a cabo la reconstrucción.

    Una vista fuente puede ser extraída aplicando cualquiera de las herramientas disponibles, apropiadas o necesarias para un sistema objetivo dado. El tipo de herramientas que se usan regularmente en la extracción de información son las siguientes [Kazm 03]:

    • Parsers (por ejemplo, "Understand for C/C++/java", "Imagix", "SNiFF+", "C++ Information Abstractor [CIA]", "Rigiparse").
    • Analizadores basado en árboles de sintaxis abstractos (AST) (ejemplo, "Gen++", "Refine").
    • Analizadores léxicos (por ejemplo, "Lightweight Source Model Extractor [LSME]").
    • Perfiladores.
    • Instrumentación de código.
    • Ad Hoc (por ejemplo, "Grez", "Perl")

    Estas herramientas son aplicadas a las líneas del código fuente. Parsers analizan el código y generan representaciones internas del código. Típicamente, es posible salvar esta representación interna para obtener una vista fuente. Los analizadores basados en AST hacen un trabajo similar, pero ellos construyen una representación del árbol explicito de la información analizada.

    Analizadores léxicos examinan los artefactos fuentes como cadenas de elementos léxicos o señales. El usuario del analizador léxico puede especificar un conjunto de patrones léxicos que coincidan y los elementos que regresará. Similarmente se usan una colección de herramientas ad hoc tales como Grez y Perl para llevar a cabo comparaciones y búsqueda de patrones léxicos dentro del código en orden de alguna información de salida requerida.

    Todas estas herramientas – parsers, analizadores basados en AST, analizadores léxicos y ad Hoc – son usadas para extraer información estática.

    Las herramientas perfiladoras y de código son usadas para extraer información acerca del código que esta siendo ejecutado. Usar estas herramientas generalmente no requiere la agregación de cualquier código nuevo al sistema. Por otro lado, instrumentación de código – tales como los aplicados en el campo del testeo – involucra agregar código al sistema para hacer resaltar alguna información especifica (por ejemplo, que procesos se conectan con otros) mientras el sistema se ejecuta [McCa 02]. Estas herramientas y técnicas generan vistas dinámicas del sistema.

    4.2.2.2 Construcción de la base de datos.

    El conjunto de vistas extraídas son convertidas al formato "Rigi Standard Format" (RSF) o al "Graph eXchange Language" (GXL) y cargadas en ARMIN durante la fase de construcción de bases de datos. Esta conversión es hecha usando Perl scripts que leen los datos y los convierten en un archivo RSF. Las vistas extraídas pueden estar en diferentes formatos dependiendo de las herramientas usadas para extraerlas. Por ejemplo, una herramientas de extracción tal como "Understand for C/C++/Java" o "Imagix-4D", pueden ser usadas para cargar el código fuente dentro de una representación interna, y esta información puede entonces ser descargada a un conjunto de archivos bandera indexados por archivos o función. Estos archivos tienen una estructura uniforme, y los scripts pueden ser desarrollados en Perl para leer esos archivos y extraer información acerca de los elementos y relaciones. La siguiente figura describe este proceso.

    Una vez que los elementos y relaciones de archivos (la vista extraída) es convertida a RSF o a GXL, estos pueden ser cargados en ARMIN. La figura 4.2 muestra un extracto de un archivo RSF ejemplo. El archivo completo puede ser cargado dentro de una base de datos en ARMIN.

    Para ver el gráfico seleccione la opción "Descargar" del menú superior 

    4.2.2.3 Fusión de vistas.

    En la fase Fusión de vistas, las vistas extraídas son manipuladas para crear vistas fusionadas. Por ejemplo, una vista estática puede ser fusionada con una vista dinámica. Como se puede notar, una vista estática no puede proporcionar toda la información relevante de la arquitectura. En algunos casos, algunas funciones solo pueden ser identificables en tiempo de ejecución, entonces se necesitará generar una vista dinámica. Estas dos vistas necesitan ser compaginadas y fusionadas para producir la gráfica completa del sistema.

    La fase de fusión de vistas compagina y establece conexiones entre las vistas que proporcionan información complementaria. La fusión es ilustrada usando los ejemplos de las siguientes sub-secciones. El primer ejemplo muestra el mejoramiento de una vista estática de un sistema orientado a objetos agregándole información dinámica. El segundo muestra la fusión de varias vistas para identificar funciones llamadas en un sistema.

    Mejorando una vista.

    Consideramos las dos vistas de código de la figura 4.3, las cuales son del conjunto de métodos extraídos desde un sistema implementado en C++.

    Para ver el gráfico seleccione la opción "Descargar" del menú superior 

    Las diferencias entre estas vistas se muestran en la siguiente figura:

    Para ver el gráfico seleccione la opción "Descargar" del menú superior 

    La vista dinámica muestra que List::getnth es llamada. Sin embargo, este método no esta incluido en el análisis de la vista estática porque este no fue identificado por la herramienta de extracción estática. Esto muestra que la herramienta de extracción estática no es perfecta, haciendo necesario validar los resultados de la información extraída. También, las llamadas a los métodos constructores y destructores de InputValue y List no están incluidas en la vista estática. Esa ausencia de métodos debe ser agregada a la vista de arquitectura compaginada.

    En adición, la extracción estática muestra que la clase PrimitiveOp tiene una llamada al método Compute. La extracción dinámica no muestra tal clase, pero muestra clases tales como ArithmeticOp, AttachOp y StringOp, cada una de las cuales tiene un método Compute y es de echo una subclase de PrimitiveOp, PrimitiveOp es una superclase; este nunca es llamada en la ejecución del programa. Pero este es la llamada a PrimitiveOp que se muestra cuando se ejecuta el extractor estático. Para tener una vista exacta de la arquitectura, las vistas estáticas y dinámicas de PrimitiveOp deben ser compaginadas.

    La siguiente figura muestra los ítems que deben ser agregados a la vista fusionada y aquellos que deben ser removidos desde la vista fusionada.

      Despejando la ambigüedad de las funciones llamadas.

    En una aplicación multi procesos, es muy probable que ocurra choque de nombres. Por ejemplo, varios de los procesos pueden tener un procedimiento llamada main al cual pueden llamar. Es importante identificar y eliminar la ambigüedad de esas colisiones de nombres dentro de las vistas extraídas. Otra vez, por medio de la fusión de información que puede ser extraída fácilmente, podremos remover las ambigüedades potenciales. En este caso, necesitamos fusionar las vistas estáticas con una vista que contenga archivos/funciones (para determinar cuales funciones están definidos en cuales archivos) y con una vista de dependencias (para determinar que archivos están compilados junto a los ejecutables producidos). La fusión de estas tres fuentes de información hace a los nombres de procedimientos, métodos y otros elementos nombrados, permitiendo entonces ser referidos sin ambigüedad en el proceso de reconstrucción de la arquitectura. Sin la fusión de vistas, la colisión de nombres puede persistir, y los resultados de la reconstrucción pueden ser ambiguos.

    4.2.2.4 Composición de vistas arquitectónicas.

    La fase de composición de vistas arquitectónicas consiste en dos áreas de actividad principales:

    • Visualización e interacción.
    • Definición de scripts de comandos e interpretación.

    Las áreas de visualización e interacción proporcionan un mecanismo que permite al usuario visualizar, explorar y manipular vistas interactivamente. El componente "Aggregator" de ARMIN es usado para presentar vistas al usuario como una gráfica de descomposición jerárquica [Wong 94]. Una presentación ejemplo de una vista arquitectónica es mostrada en la figura 4.6. Usando el Aggregator, el usuario puede ver vistas en una variedad de estilos de diseños incluyendo jerárquicos, espiral y ortogonal.

    Para ver el gráfico seleccione la opción "Descargar" del menú superior 

    La definición de scripts de comandos y la interpretación proporcionan facilidades para la abstracción de información de bajo nivel para generar vistas arquitectónicas. Los scripts de comandos facilitan al usuario para escribir scripts para construir mejores vistas abstractas desde vistas más detalladas por medio de la identificación de agregación de elementos. Los scripts ARMIN son escritos usando el ARL y cualquier editor, y son cargados dentro de ARMIN.

    La reconstrucción arquitectónica no es un proceso directo. La construcción arquitectónica no es representada explícitamente en el código fuente, lo que hace que la reconstrucción sea especialmente difícil. Adicionalmente, la construcción arquitectónica es realizada por una diversidad de mecanismos en una implementación. Usualmente estos son colecciones de funciones, clases, archivos, objetos y demás. Cuando un sistema es inicialmente desarrollado, los elementos de la arquitectura/diseño de alto nivel son mapeados para la implementación de elementos. Por consiguiente, cuando los elementos arquitectónicos son "reconstruidos", se aplica un mapeo a la inversa.

    La reconstrucción arquitectónica es un proceso interpretativo, interactivo e iterativo, no un proceso automático. Este requiere la habilidad y atención tanto de expertos en ingeniería inversa y arquitectos (o algunos de los que tienen un conocimiento substancial de la arquitectura). Basándose en los parámetros arquitectónicos que los expertos en la arquitectura pueden encontrar en el sistema, la ingeniería inversa puede construir varios scripts de comandos usando ARMIN. Estos scripts resultan en una nueva agregación que muestra varias abstracciones o agrupamientos de elementos de bajo nivel (los cuales pueden ser artefactos fuentes o abstracciones). Por la interpretación de estas vistas y el análisis de estos, es posible refinar los scripts y agregaciones para producir varias hipótesis de vistas arquitectónicas del sistema. Estas vistas pueden ser interpretadas, refinadas o rechazadas. No existe un criterio universal para este proceso; este está completo cuando la representación arquitectónica es suficiente para apoyar el análisis necesario para los usuarios, entonces las metas de la reconstrucción pueden ser logradas.

    Consideremos el subconjunto de elementos y relaciones mostradas en la siguiente tabla:

    Para ver el gráfico seleccione la opción "Descargar" del menú superior 

    En este ejemplo, las variables "a" y "b" están definidas en la función "f"; esto es, ellas son locales a "f". Esta información la podemos representar gráficamente como se muestra en la figura 4.7.

    Para ver el gráfico seleccione la opción "Descargar" del menú superior 

    Las variables locales no importan durante una reconstrucción de arquitectura porque ellas proporcionan poca comprensión de la arquitectura del sistema. Por consiguiente, instancias de variables locales pueden ser agregadas a la función en la cual ocurren. Un script tal como el que se muestra a continuación se puede escribir para ese propósito.

    La primer línea es un comentario el cual comienza con el signo de libra #. La segunda línea obtiene los descendientes de una función (usando el comando desc) – en este caso, variables locales. El comando desc regresa un arreglo tridimensional de la función y sus variables locales. La tercer línea asocia el nombre de la función con las variables locales para cada función y agrega un signo más (+) al final del nombre. Usando el comando collapse, la cuarta línea borrar de la gráfica todos los nombres de variables locales y deja solo el nombre de la función con el +. Esta nueva gráfica es llamada FUNCTION+. La última línea despliega la gráfica en la ventana de Aggregator usando el comando show.

    El resultado de aplicar el script es representado gráficamente en la siguiente figura. La mayoría de los scripts de comandos en ARMIN están desarrollados de una manera similar.

    Para ver el gráfico seleccione la opción "Descargar" del menú superior 

    El principal mecanismo para manipular las vistas es la aplicación de scripts de comandos. La siguiente lista muestra algunos ejemplos de scripts:

    • Identificar tipos.
    • Agregar variables locales con funciones.
    • Agregar miembros a las clases.
    • Crear elementos del nivel de arquitectura.

    Un ejemplo de un script que identifica un componente del nivel de arquitectura, Logical_Interaction, es mostrada en la siguiente figura. Este script dice que si el nombre de la clase es Presentation, Bspline, o Color, o si la clase es una subclase de Presentation, este pertenece al componente Logical_Interaction.

    El script esta escrito de esta forma para abstraer información desde la información de bajo nivel para generar vistas a nivel de arquitectura. El reconstructor crea este script para probar la hipótesis acerca del sistema. Si un script no produce los resultados esperados, este puede ser descartado. El reconstructor iteractúa a través de este proceso hasta que obtiene las vistas arquitectónicas útiles.

    CONCLUSIONES

    El software siempre ha sido y será lo que le puede dar vida y plusvalía a la computación; sin el software, las computadoras serían inservibles y no podrían ser utilizadas para ningún beneficio. Es el software el que realiza los procesos necesarios a los datos introducidos para así obtener nuevos datos con los que se pueden tomar decisiones, en muchos de los casos, decisiones críticas. Conforme pasa el tiempo, hemos visto que las computadoras son utilizadas en casi todos los aspectos de la vida del ser humano, hoy en día se ven computadoras en los bancos, tiendas, automóviles, oficinas gubernamentales, empresas privadas, el hogar y en un futuro cercano hasta en el propio cuerpo humano. Esta simbiosis que el ser humano ha realizado con la computadora es debida en gran parte a que el software, aprovechando la velocidad con que las computadoras pueden procesar datos y arrojar resultados, facilita y agiliza las tareas del hombre.

    En la actualidad se puede observar que una falla en el software, en el mejor de los casos puede dar como resultados la pérdida de tiempo pero en algunos otros casos también puede resultar en perdidas de vidas humanas. Conforme pase el tiempo, el hombre es más y más dependiente de las computadoras y sus beneficios, pero siempre existirá la incertidumbre y la intranquilidad de que el software puede fallar y causar serios problemas ya que el software es desarrollado por seres humanos que por naturaleza cometen errores.

    El desarrollo de software siempre ha estado en un proceso continuo de evolución, y como en cualquier actividad evolutiva, los primeros años siempre van acompañados de grandes dificultades debidas en gran parte a que no se cuenta con las herramientas ni los conocimientos para realizar bien las tareas que involucra esta actividad. Esto es muy palpable en el ser humano, nadie va a llegar a este mundo sabiendo caminar, este es un proceso en el que se tienen que sufrir tropiezos y caídas, pero que al paso de los años se logra dominar. En los primeros años del desarrollo del software, este fue hecho sin tener absolutamente ningún tipo de conocimiento ni estrategia que permitiera el buen desarrollo, estos años son conocidos como la "crisis de software". Los sistemas que fueron desarrollados en estos años se fueron convirtiendo en parte vital de muchas organizaciones, por lo que se veía la constante necesidad de corregirlos, estas correcciones seguían ejecutándose de una manera no muy convenientes, generando así nuevos errores o poco a poco haciendo imposible la corrección de los sistemas; estos sistemas han recibido el nombre de "sistemas de información heredados".

    Al hablar de sistemas de información heredados puede hacerse una analogía con la obra de uno de los más grandes autores de la literatura latinoamericana, Gabriel García Márquez y su obra "Cien años de soledad". El relato adopta una apariencia virtualmente lineal pero en realidad el tiempo de la novela no es sucesivo o cronológico, sino cerrado. El presente, el pasado y el futuro pueden ser narrados en un tiempo a cualquier tiempo por el narrador. Por eso, el tiempo en Cien años de soledad es circular. La novela tiene una declaración que se desarrolla y explica de una manera lógica, que ninguna otra explicación puede ser posible.

    El pasado se repite en el presente y el futuro es previsible porque, de alguna manera, ya ocurrió. El tiempo no existe en Macondo (lugar donde se desarrolla la mayor parte de la obra), está congelado. Ursula (uno de los personajes principales) es el que tiene la mas clara conciencia de vivir en una dimensión intemporal, propia de los sueños: cuando José Arcadio Segundo concibe el loco proyecto de establecer un sistema de navegación, el comentario de Ursula es " ya esto me lo se de memoria". Es como si el tiempo diera vueltas en redondo y hubiéramos vuelto al principio (como la historia de la humanidad, quien comete los mismos errores una y otra vez). La acción concentra la espesa historia de Macondo en un tiempo inmóvil, donde mil cosas pasan y mil cosas vuelven, y sostiene la presencia de varios protagonistas, que se alternan en el primer plano y el trasfondo temporal, sin perder en ningún momento la tensión narrativa.

    Así como en Cien años de Soledad, el mantenimiento de algunos sistemas ha seguido una línea en el tiempo circular, en la cual se siguen cometiendo los mismos errores que se cometieron al crear el sistema, heredando así año con años los errores cometidos. Es en este momento, en el cual el mantenimiento de un sistema se hace imposible donde la "Reingeniería de software" se vislumbra como única solución a los sistemas de información heredados. La reingeniería de software pretende terminar de una vez por todas con la vida útil del sistema, no sin antes extraer de el la mayor parte del conocimiento que pueda brindar, conocimientos que serán utilizados para crear un nuevo sistema aplicando las buenas practicas que nos brinda la ingeniería de software.

    La reingeniería no es una actividad que se lleva a cabo de la noche a la mañana, además implica una gran inversión de esfuerzo, tiempo y recursos. Es por ello que es necesario planear de una manera muy cuidadosa todo el proceso. Este proceso se inicia con la justificación del proyecto de reingeniería, en el cual se tiene que analizar cada sistema candidato para así obtener una lista de aplicaciones ordenada según sus prioridades. Una vez obtenida la lista, se hace la estimación de costes que serán necesarios para modificar todos los componentes. Por último se comparan los costes con los beneficios esperados.

    En la reingeniería de software existen métodos y modelos que permiten que esta actividad se pueda desarrollar de una manera bien direccionada para poder crear una nueva aplicación con un alto nivel de calidad, fiabilidad y plusvalía. En estos métodos y modelos se puede observar varios puntos en común siendo uno de los más importantes la "reconstrucción de la arquitectura", ya que esta es la que nos va a brindar la compresión del sistema al que se le va aplicar reingeniería para poder crear una clara imagen de lo que se va a rediseñar y así poder planificar las actividades que se llevaran a cabo durante toda la actividad de reingeniería.

    Ninguna de las actividades llevadas a cabo durante la reingeniería de un sistema es fácil, es por ellos que cada una debe de estar muy bien planeadas antes de emprenderse y la reconstrucción de la arquitectura no es la excepción. Es por ello que para realizar la reconstrucción de la arquitectura de un sistema de información heredado se recomienda tener bien definidas las metas y objetivos, obtener una visión general de la arquitectura, identificar y usar la documentación existente, e involucrar a personas familiarizadas con el sistema.

    La reconstrucción de la arquitectura genera una representación de la arquitectura del sistema que puede ser usado de diversas formas. El principal uso de esta representación es para documentar la arquitectura de un sistema. Si la documentación existente o disponible es obsoleta, la recuperación de la arquitectura puede ser utilizada como base para la redocumentación de la arquitectura. La representación de la arquitectura también puede ser usada como punto de partida para la reingeniería del sistema. Por último, esta representación puede ser útil para identificar la funcionalidad de los componentes para reutilizarlos o establecerlos como la arquitectura base.

    GLOSARIO

    Abstract Syntax Tree (AST): Vea "Árbol de Sintaxis Abstracto".

    Análisis de Opciones para Reingeniería: Método sistemático, de arquitectura central y de toma de decisiones para la identificación y extracción de componentes dentro de grandes y complejos sistemas de software.

    Árbol de Sintaxis Abstracto: es una estructura de datos que representa algo que se ha analizado, utilizado a menudo como un recopilador o representación interna de interpretes de un programa de computadora mientras que se está optimizando y qué realiza generación del código.

    CASE: Ingeniería de software asistida por computadora. CASE proporciona al ingeniero la posibilidad de automatizar actividades manuales y de mejorar su visión general de la ingeniería.

    Formato Estándar Rigi: Es el formato usado por la herramienta Rigi.

    Graph eXchange Language (GXL): Vease "Lenguaje de Intercambio Gráfico".

    KLDC: Miles de líneas de código, KiloLDC.

    LDC: Líneas de código.

    Legacy Information System (LIS): Vea "Sistema de Información Heredado".

    Lenguaje de Intercambio Gráfico: es un formato de intercambio estándar basado en XML para compartir datos entre herramientas. Este lenguaje representa los gráficos escritos, atribuidos, dirigidos y ordenados los cuales se extienden para representar hipergrafos y gráficos jerárquicos. Para mayor información puede visitar la página http://www.gupro.de/GXL/

    Rigi: Es una herramienta interactiva y visual diseñada para ayudar a entender y re-documentar software. Para mayor información puede visitar la página http://www.rigi.csc.uvic.ca/

    Rigi Standard Format (RSF): Vea "Formato Estándar Rigi".

    Sistema de Información Heredado: Cualquier sistema de información que significativamente se resiste a la modificación y evolución.

    Options Analysis for Reingeneering (OAR): Vea "Análisis de Opciones para Reingeniería".

    BIBLIOGRAFÍA

    Para ver el texto seleccione la opción "Descargar" del menú superior 

    FLORES CARMONA NICOLÁS JOHNATAN

    PARA OBTENER EL TITULO DE

    INGENIERIO EN SISTEMAS COMPUTACIONALES

    Con la asesoría de:

    M.C.C. MARTHA ALICIA ROCHA SÁNCHEZ

    Instituto Tecnológico de León

    León, Guanajuato Septiembre del 2004