ANÁLISIS DE INVENTARIO: Todas las organizaciones de software deberían tener un inventario de todas sus aplicaciones. El inventario tal vez no sea más que un modelo en una hoja de cálculo que contenga información que proporcione una descripción detallada (tamaño, edad, importancia para el negocio) de 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. Para posteriormente asignar recursos a las aplicaciones candidatas para el trabajo de reingeniería.
Es importante señalar que el inventario deberá visitarse con regularidad, el estado de las aplicaciones puede cambiar en función del tiempo y, como resultado, cambiará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.
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: Es un Proceso de recuperación de diseño. Se extrae información acerca de los datos, arquitectura y diseño de procedimientos de un programa existente. Lo normal es que la entrada a este proceso sea el código fuente si se dispone de él. Se alterna el análisis utilizando herramientas automatizadas con el trabajo manual en el código fuente para obtener el diseño del sistema.
La información obtenida suele almacenarse como grafo dirigido, que se va modificando y completando. A partir del grafo se generarán otros documentos como diagramas de estructura de programas, diagramas de estructura de datos y matrices de trazabilidad.
Las herramientas que se utilizan para comprender el programa suelen ser de tipo navegadores, que permiten moverse por el código, definir unos datos y rastrearlos por el programa. Suelen ser necesarias anotaciones manuales. Algunas de estas herramientas son (cflow, CIA, field, mkfuncmap, rigiparse).
Diagrama de una Ingeniería Inversa
OBJETIVOS: Detectar efectos laterales: los cambios sobre un sistema pueden generar efectos laterales no deseados. Facilitar la reutilización: mediante las técnicas de ingeniería inversa podemos detectar los componentes candidatos a reutilizar de sistemas existentes
¿CUANDO UTILIZAR LA INGENIERÍA INVERSA?
Dado que es una labor estratégica, es conveniente conocer cuando conviene realizar la tarea de reingeniería para una aplicación y cuando es mas rentable sustituirla e implementar una nueva. Las aplicaciones para el primer paso, son aquellas en las que se producen las siguientes situaciones: Fallos frecuentes que son difíciles de localizar. Son pocos eficientes, pero realizan la función esperada. Dificultades en la integración con otros sistemas. Calidad pobre del software final.
Resistencia a introducir cambios. Pocas personas capacitadas para realizar modificaciones. Dificultad para realizar pruebas. El mantenimiento consume muchos recursos. Es necesario incluir nuevos requisitos, pero los básicos se mantienen.
REESTRUCTURACIÓN DE 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. Debido a la complejidad del software y a la capacidad de las herramientas de software actuales se está generando muchas aplicaciones mal diseñadas que son ineficientes y difíciles de mantener. El 80% del desarrollo de software es el mantenimiento (evolución) a sistemas existentes.
El término se creó como analogía con la factorización de números y polinomios. Lo cual revela una estructura interna que no era visible previamente.
Ejemplo: Problema: Hay un atributo público en una clase.
Solución: hacer el atributo privado y proporcionar métodos de acceso público
Ejemplo en Código (Problema):
public class Persona{ public int edad; … }
(Solución)
public class Persona{ private int edad; public void setEdad(int val){ edad = val } public int getEdad(){ return edad; } }
La reestructuración de códigos está basada en técnicas probadas por otras personas que en muchas ocasiones se dan como leyes pero que es necesario entender para mejorar nuestra práctica de programación. Por definición, los objetos tienen propiedades/carácterísticas/atributos (variables) que son propias y que no deben de ser modificables por otros, incluso objetos del mismo tipo. Si una persona tiene un atributo peso este no puede ser modificado al azar (una persona tiene 60 kilos y de repente ya 65) sólo a través de un comportamiento/hablidad (método) como hacerEjercicio() o comerGolosinas().
¿Esto implica que cada atributo de la clase debe tener métodos get/set? No, sólo aquellos elementos que deban ser modificados en el exterior. Es como el caso de los métodos privados. ¿En que ocasiones se recomienda que los atributos de una clase sean públicos? Cuando son constantes numéricas.
REESTRUCTURA DE DATOS:
Se evaluan todas las sentencias del lenguaje de programación con definiciones de datos, descripciones de archivos de E/S y descripciones de interfaz. Esta actividad a veces se denomina análisis de datos. Extraen elementos y objetos de datos para obtener información del flujo de datos y comprender la estructura Una vez finalizado el análisis de datos, comienza el rediseño 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 mayoría 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.
INGENIERIA PROGRESIVA: Reconstruye el programa empleando prácticas de ingeniería moderna de software y también la información obtenida durante la ingeniería inversa La ingeniería progresiva que se denomina también renovación o reclamación, no solamente recupera la información de diseño de un Software ya existente, si no que además, utiliza esta información para alterar o reconstituir el sistema existente en un esfuerzo para mejorar su calidad global
Puede decirse que es el conjunto de todas las actividades anteriores. Su aplicación se realiza sobre todo sobre sistemas cuya funcionalidad es adecuada, pero que tienen una estructura, código, interfaz y/o estructura de datos obsoletas. Son sistemas críticos para el funcionamiento de la empresa, pero necesitan un lavado de cara al mismo tiempo que una mejora en el rendimiento. Esta renovación se puede aprovechar para añadir nuevas funciones y pensando en perspectivas futuras de crecimiento. Existen herramientas automatizadas para llevar a cabo este proceso (siempre con bastante interacción humana), en base a herramientas de ingeniería inversa y regeneradores de código.
La reingeniería debe ser entendida como un proceso mediante el cual se mejora un software existente haciendo uso de técnicas de ingeniería inversa y reestructuración de código. Para llevar a cabo la reingeniería del Software se puede realizar a través del modelo Cíclico. Este modelo define seis actividades las cuales se muestran en la figura de abajo. 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.
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.