Introducción La demanda por parte de todos los sectores empresariales para adaptar la información de sus sistemas a la Web ha creado una enorme necesidad de métodos, herramientas e infraestructuras para evolucionar y explotar aplicaciones existentes de manera eficiente y rentable. La Ingeniería Inversa ha sido anunciada como una de las tecnologías más prometedoras para combatir el problema que deriva de los sistemas heredados. Chikofsky y Cruz definieron la ingeniería inversa como "el análisis de un sistema de sujeción a identificación de sus componentes actuales y sus dependencias, para extraer y crear abstracciones del sistema y la información de su diseño." En los últimos diez años, los investigadores han desarrollado un gran número de capacidades para explorar, manipular, analizar, resumir, vincular, sintetizar, componentizar, y visualizar los elementos del software. Estas capacidades incluyen la documentación en muchas formas y la representación de código intermedio, los datos y la arquitectura. Muchas herramientas de ingeniería inversa se centran en extraer la estructura de un sistema legado con el objetivo de transferir esta información en las mentes de los ingenieros de software tratando de rediseñar o reutilizar. En entornos corporativos, invertir en herramientas de ingeniería aún tiene un largo camino que recorrer antes de convertirse en una parte efectiva e integral del conjunto de herramientas estándar que un ingeniero de software típico utiliza día a día. Ingeniería Inversa de Código En la investigación y la práctica actual, el enfoque de ambos, la ingeniería inversa a nivel de código e ingeniería directa, son procesos orientados a producir código de calidad. La importancia del nivel de código de sistemas legados radica en que las reglas de negocio importantes están realmente implícitas en el código. Durante la evolución del software, se aplican cambios en el código fuente, para agregar funciones, corregir los defectos y mejorar calidad. En sistemas con escasa documentación, el código es la única fuente confiable de información sobre el sistema. Como resultado, el proceso de ingeniería inversa se ha centrado en la comprensión del mismo. En los últimos diez años, la investigación de ingeniería inversa ha producido una serie de capacidades para el análisis de código, incluyendo descomposición “subsistema”, la síntesis de concepto, diseño, patrón del programa y sus cambios, el análisis de dependencias dinámicas y estáticas, las métricas orientadas a objetos y exploración y visualización de software. En general, estos análisis han tenido éxito en el tratamiento del software en el nivel sintáctico para atender las necesidades específicas de información y para abarcar los vacíos de información relativamente estrechos. Sin embargo, el código no contiene todos los datos que se necesitan. Por lo general, el conocimiento de la arquitectura y el diseño, ventajas y desventajas, limitaciones de ingeniería y la aplicación de dominio sólo existe en las mentes de los ingenieros de software creadores. Con el tiempo, los recuerdos se desvanecen, la gente se va, los documentos se desechan, y aumenta la complejidad. En consecuencia, surge una brecha entre la información útil y la información requerida necesaria para permitir el cambio de software. Programa de Entendimiento Continuo Para evitar una crisis por la falta de datos, es importante hacer frente a las necesidades de información con mayor eficacia en todo el ciclo de vida del software. Es necesario apoyarse en elementos de trazabilidad hacia adelante y hacia atrás en sistemas de software. Por ejemplo, en la dirección de avance, dado un módulo de diseño, es importante ser capaz de obtener los elementos de código que lo implementan. En la dirección hacia atrás, de una determinada fuente o archivo de objeto, tenemos que ser capaces de obtener la regla de negocio a la que contribuye. Además es importante para determinar cuándo es más apropiado para enfocar el análisis en diferentes niveles de abstracción. Para efectos de comprensión, la trazabilidad es especialmente importante. Tenemos que ser capaces de tomar un patrón de cambio, tales como la actualización de una ley de impuestos, y el mapa de esta ley de forma explícita en las estructuras de software. Para llevar acabo un programa de entendimiento continuo es necesario resolver cuestiones como las siguientes: ¿Cuáles son las necesidades de información a largo plazo de la programación del sistema? ¿A qué patrones de cambio se someten a los sistemas de software? ¿Qué asignaciones deben ser registradas de forma explícita? ¿Qué tipo de repositorio de software podría presentar la información requerida? ¿Cuáles son los requisitos de herramientas de soporte para producir y manipular las asignaciones? ¿Cómo puede este apoyo coexistir con las herramientas tradicionales, los usuarios y los procesos? Proceso de Ingeniería Inversa Además del énfasis en el "programa de entendimiento continuo" es importante centrar los esfuerzos en una mejor definición del proceso de ingeniería inversa. La ingeniería inversa típicamente se ha llevado a cabo para hacer frente a la cuestiones técnicas de manera eficaz, el proceso debe ser maduro y repetible, y la mayoría de sus elementos necesitan estar con el apoyo de herramientas automatizadas. El aumento de la madurez del proceso permitiría una mejor evaluación de los riesgos, los costos y los aspectos económicos de las actividades de reingeniería. Con procesos poco conocidos, el éxito de un proyecto de reingeniería se basa únicamente en la ingenuidad de la gente. Ingenio involucrado que desaparece cuando el proyecto termine. Dirección de la Investigación En resumen, la investigación futura en la ingeniería inversa, es importante para entender el software en los diferentes niveles de abstracción y mantener asignaciones entre estos niveles. Se necesitan catálogos de la información, como requisitos de las herramientas, y de procesos como paso previo a permitir la comprensión continua del programa. Procesos útiles de ingeniería inversa deben ser identificados y más apoyados, como un paso importante para hacer la disciplina de reingeniería más racional. Las herramientas de ingeniería inversa y procesos deben evolucionar con el entorno de desarrollo que hace hincapié en los componentes, la Web y sistemas distribuidos. Ingeniería Inversa de Datos Mientras que el foco principal de la ingeniería inversa de código está en mejorar el entendimiento humano acerca de cómo se procesa la información, la ingeniería inversa de datos forza a la pregunta de qué información se almacena y cómo esta información se puede utilizar en un contexto diferente. En la actualidad, los investigadores reconocen que la calidad de un legado documentación de los datos recuperados de un sistema puede hacer o deshacer objetivos estratégicos de las tecnologías de la información. Por ejemplo el análisis de datos es fundamental en la identificación de los objetos centrales de negocio, es necesaria para la migración de sistemas de software orientado a objetos a otras plataformas. El mayor uso de los almacenes de datos y técnicas de minería de datos para los sistemas de apoyo a la toma de decisiones estratégicas tienen también motivado un interés en los datos de la tecnología de ingeniería inversa. La incorporación de los datos de varios sistemas heredados en los almacenes de datos requiere de un plan coherente de estructuras de datos heredados en un modelo común de objetos de negocio. Retos similares también se producen con la integración basada en la web de ex sistemas de información heredados e infraestructuras de red centralizada. Técnicas de ingeniería inversa de datos también se pueden utilizar para evaluar la calidad general de los sistemas de software. Una implementación de estructura de datos persistente con defectos de diseño significativos indica un sistema de software mal implementada. Un análisis de las estructuras de datos puede ayudar a las empresas a tomar decisiones sobre la conveniencia de comprar (y mantener) paquetes comerciales de software. La ingeniería inversa de datos también puede ser utilizados para evaluar la calidad del catálogo de esquema DBMS de proveedor de software, y por lo tanto puede representar un criterio de evaluación para un producto de software potencial. Proceso de Ingeniería Inversa de Datos y el papel de las Herramientas En la mayoría de los casos, la información importante acerca del modelo de datos no se encuentra en el catálogo de esquema físico extraída desde el DBMS. En general, análisis de los datos es una actividad exploratoria y humano – intensiva que requiere una gran cantidad de experiencia y habilidades. Las herramientas actuales proporcionan sólo un apoyo mínimo en esta actividad más allá de la visualización de la estructura de un catálogo de esquema extraído. A pesar de que es poco probable que la tarea cognitiva de análisis de datos pueda ser que nunca se logre totalmente automatizado, la ingeniería inversa asistida por herramientas de ordenador, tienen el potencial de reducir drásticamente el esfuerzo dedicado en esta fase. Podrían ser una ayuda importante en la búsqueda, recolección, y la combinación de indicadores para la estructura y restricciones del esquema semántico y guiar la reingeniería de un modelo de datos inicialmente incompleta a una completa y un resultado consistente. Sin embargo, para lograr este tipo de apoyo, la corriente de herramientas de ingeniería de datos inversa necesitan superar los siguientes dos problemas importantes: • El conocimiento imperfecto. El análisis de datos se hace inherentemente con supuestos inciertos y heurísticas sobre el modelo de datos legado. Combinando indicadores semánticos detectados que a menudo lleva los resultados del análisis a incertidumbre y/o contradicciones. Herramientas de ingeniería inversa de datos tienen que tolerar conocimiento imperfecto para apoyar en este proceso interactivo y para guiar de forma incremental la reingeniería a un constante modelo de datos. • Personalización. Sistemas de información heredados son sobre la base de muchas diferentes plataformas de hardware y software y lenguajes de programación. Sus modelos de datos se han desarrollado utilizando diversas convenciones de diseño y patrones de optimización idiosincrásica; las herramientas existentes no proporcionan la personalización necesaria para ser aplicable a esta variedad de contextos de aplicación. Abstracción Conceptual La abstracción conceptual tiene como objetivo mapear el modelo de datos lógicos derivado del análisis de los datos a un diseño conceptual equivalente. Este diseño se suele representar por un modelo entidad relación y orientado a objetos proporciona el nivel necesario de abstracción requerido por la mayoría de las actividades posteriores de reingeniería. En la actualidad, existen varias herramientas de apoyo abstracción de datos, sin embargo, en la práctica, la mayoría de ellas son uso de limitado porque no logran cumplir al menos uno de los siguientes dos requisitos: La iteración. El proceso de ingeniería inversa de datos implica una secuencia de actividades de análisis y de abstracción con varios ciclos de iteración. Después de un primer análisis, la reingeniería produce un diseño abstracto inicial que sirve de base para el debate con los expertos de dominio y nuevas investigaciones. El proceso de mapeo bidireccional. Las herramientas actuales de ingeniería Inversa de datos siguen un resumen de los datos estrictamente bottom-up, es decir, se produce la abstracción a través de una transformación de la lógica de los datos analizados. Este enfoque es menos adecuado si existente un pre-diseño parcial para la estructura de datos. El uso de tal información de manera eficiente a la ingeniería inversa en sistemas de información heredados requerirán un proceso de abstracción bottom-up/top-down híbrido. Dirección de Investigación Sobre la base de este debate, la comunidad de ingeniería inversa necesita desarrollar herramientas que proporcionan un apoyo más adecuado para razonamiento humano en un retroceso gradual y evolutivo del proceso de ingeniería que se pueden personalizar para diferentes contextos de aplicación Herramientas de Ingeniería Inversa Las técnicas de ingeniería inversa utilizadas para ayudar a la comprensión del programa pueden ser agrupados en tres categorías: la navegación sin ayuda, apalancamiento de conocimiento y experiencia empresarial, y asistido por ordenador. Navegación sin ayuda es esencialmente "humanware": el ingeniero de software navega manualmente a través del código fuente en forma impresa o busca en línea, tal vez utilizando el sistema de archivos como la navegación ayuda. Este enfoque tiene limitaciones inherentes basados en la cantidad de información que un ingeniero de software puede ser capaz de realizar un seguimiento en su cabeza. Utilizar el conocimiento empresarial y la experiencia se puede lograr por parte del tutor o realizando entrevistas informales con personal experto en el tema. Este enfoque puede ser muy valioso si hay gente disponible que se ha asociado con el sistema, ya que ha evolucionado con el tiempo. Ellos tienen información importante en sus cabezas sobre las decisiones de diseño, los principales cambios en el tiempo, y subsistemas problemáticos. Sin embargo, el aprovechamiento de los conocimientos y la experiencia empresarial no siempre es posible. Los diseñadores originales pueden haber dejado la empresa. El sistema de software puede haber sido adquirido de otra compañía. O el sistema puede haber tenido su mantenimiento procedente de fuera. En estas situaciones, la ingeniería inversa se ha asistido por ordenador. Un entorno de ingeniería inversa puede manejar las complejidades de la comprensión del programa ayudando al ingeniero de software a extraer un alto nivel información de los artefactos de bajo nivel, como el código fuente. Esto libera a los ingenieros de software de lo tedioso, manual, y de tareas propensas a errores como la lectura de código, la búsqueda, y el patrón coincidente con la inspección. Efectividad de las Herramientas Actuales Dado que las herramientas de ingeniería inversa parecen ser la clave para ayudar a la comprensión del programa, ¿cuán eficaces son las ofertas de hoy en el cumplimiento de este objetivo? En tanto a nivel académico y configuración empresarial, las herramientas de ingeniería inversa tienen un largo camino por recorrer antes de convertirse en una parte efectiva e integral del conjunto de herramientas de un típico ingeniero de software en el uso del día a día. Tal vez el mayor desafío para una mayor eficacia de las herramientas de ingeniería inversa es una adopción más amplia: las herramientas no pueden ser eficaces si no se utilizan, y la mayoría de los ingenieros de software tienen poco conocimiento de las herramientas actuales y sus capacidades. Si bien no existe un mercado relativamente saludable donde obtenga herramientas de pruebas de unidades, servicios públicos de depuración de código, y entornos de desarrollo integrados, el mercado de herramientas de la ingeniería inversa sigue siendo bastante limitado. Además de conocimiento, la adopción representa una barrera crítica. La mayoría de las personas carecen de las habilidades necesarias para hacer el uso correcto de las herramientas de ingeniería inversa. La raíz del problema de la adopción es realmente doble: la falta de análisis de habilidades de software por parte de los ingenieros de software de hoy en día , y la falta de integración entre las herramientas avanzadas de ingeniería inversa y las utilidades más comunes de software, tales como los mencionados anteriormente.