Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Resumen
La reingenierı́a de software es importante para tener bajo control software que requie-
re un alto coste de mantenimiento, para recuperar aspectos y propiedades del software
existente y, en especial, para establecer la base para una futura evolución del software.
El crecimiento que está experimentando esta rama de la se fundamenta en distintos
aspectos que van a ser tratados a lo largo de las próximas secciones:
! Reusabilidad,
! Reestructuración,
! Ingenierı́a inversa,
! Nuevas herramientas .
0
1 INTRODUCCION 1
1 Introducción
Teniendo en cuenta que el gasto en actividades de mantenimiento puede llegar a alcan-
zar cifras de entre el 50-80 % ([11]) del presupuesto de las empresas, no es extraño que
se busquen dı́a a dı́a nuevas técnicas que reduzcan dichos costes, aumenten la producti-
vidad y mejoren los servicios. Una de las tecnologı́as que desde hace tiempo se ha venido
defendiendo para reducir costes es la reestructuración. Dicha tecnologı́a consiste en la
transformación de código antiguo no estructurado, en código estructurado funcional-
mente equivalente. En la actualidad al menos un 10 % de las compañı́as dedicadas al
desarrollo de software están adoptando esta tecnologı́a con vistas a mejorar la calidad
de los productos que han de mantener. Frente a esta aproximación consistente en mejo-
rar el código (documentación y estructuración), muchas compañias prefieren la adopción
de técnicas de reingenierı́a, sobre todo mediante la utilización de herramientas semiau-
tomáticas, como una ayuda inestimable para sus técnicos de mantenimiento, a los que
les facilita enormemente la comprensión del código “alienı́gena ” realizado por equipos
de trabajo distintos y realizados en base a conceptos de desarrollo muy distintos. En los
últimos años, lo que se ha dado a denominar “Ingenierı́a inversa ”, está presentando un
considerable auge. La idea en este caso es intentar reconstruir los modelos, tanto de es-
pecificación como de diseño, sobre los que se sustentan las implementaciones que son
objeto de revisión.
1.1 Objetivos.-
El principal objetivo que perseguimos con la elaboración de este informe, es la familiari-
zación del lector con un nuevo vocabulario emanado de los conceptos relativos al man-
tenimiento y soporte de sistemas evolutivos. Entre estos destacan conceptos como los
de “Reingenierı́a ” e “Ingenierı́a Inversa ”. Muchas de las ideas expuestas a lo largo del te-
ma hacen referencia a prácticas actuales y pueden encontrarse incluso implementadas
dentro de numerosas herramientas de nueva generación.
Pretendemos que las próximas secciones sirvan como toma de contacto con facetas nue-
vas e interesantes de la y motiven la discusión y el debate sobre la relevancia de
adoptar nuevos enfoques para poder dar soluciones a las nuevas problemáticas.
2 SIGNIFICADO Y PAR TES DE LA REINGENIERIA 2
1.2 Contenido.-
Presentamos un contenido basado no sólo en los conceptos que rodean esta nueva dis-
ciplina, sino también en el desarrollo de algunos casos prácticos. Dividimos la presen-
tación de este nuevo “paradigma ” en las siguientes secciones:
Sin embargo, esta no es una definición estándar, de hecho diversos autores proponen
diversas definiciones ası́ por ejemplo GUIDE ([10]) la define cómo:
Con respecto a las definiciones anteriores, observemos que la primera centra su aten-
ción en las actividades de la reingenierı́a en vez de en su significado o en su proceso. Por
otra parte las dos ‘ultimas definiciones no permiten que algunas actividades, que si lo
hacen según la otra definición, caigan dentro del campo de la reingenierı́a; mientras que
la primera subsume todas las actividades permitidas en las otras dos.
Por otra parte, existen un gran número de sinónimos que son empleados para referir-
se a la anteriormente definida reingenierı́a (re-ingenierı́a, o Reingenierı́a ), entre los más
importantes destaquemos:
! Perfeccionamiento.
! Prolongación.
! Renovación.
! Modernización.
2 SIGNIFICADO Y PAR TES DE LA REINGENIERIA 3
! Ingenierı́a de redesarrollo.
! Ingenierı́a de reutilización.
Con objeto de facilitar la comprensión de lo que vamos a entender como una actividad
de reingenierı́a observemos la figura 1 tomada de [2].
Reingenieria,
Vista de clase 3: reestructurar Vista de clase A3:
Procedural
Analisis
Ej: Codigo fuente
$ D e s c o m p osi c i ó n.- Es el proceso por el que transformamos una vista en objetos y al-
macenamos las relaciones en la base. Por ejemplo, los copiladores frecuentemente
descomponen los programas en en árboles sintácticos abstractos.
2 SIGNIFICADO Y PAR TES DE LA REINGENIERIA 4
% C o m p osi c i ó n.- En este caso, generamos una nueva vista (o información), a partir
de la información existente en la base. La herramienta o la persona encargada de
realizar esta actividad, construye la nueva vista a partir del descubrimiento de ob-
jetos relevantes y relaciones entre los mismos existentes en la base de información.
Por ejemplo, los compiladores, a menudo generan código mediante un recorrido a
través del grafo semántico que representa el programa.
& Tr a nsf or m a c i ó n.- La noción de transformación es central dentro del proceso de rein-
genierı́a. En todo el proceso, constantemente se está transformando una informa-
ción (o vista del software) en otra equivalente. Por ejemplo código fuente en código
fuente estructurado, actualizaciones en el diseño, correcciones en la especificación,
cómputos estáticos de medidas,
Como hemos podido apreciar, distintos autores enfatizan en distintos aspectos de man-
tenimiento de sistemas para definir lo que ellos consideran que es la labor de la rein-
genierı́a. Dependiendo del enfoque que queramos abordar podremos considerar como
válida cualquiera de las definiciones anteriores, aunque un estudio más detallado y mi-
nucioso nos permite observar que quizás sea la primera la que conlleva una visión más
general y menos comprometida de lo que debe ser la tarea de reingenierı́a. Haciendo
nuestras las palabras del doctor Arnold ([2]), podemos decir que la labor de reingenierı́a,
es importante por diferentes motivos :
Producto de
Trabajo Descomponer
Software Analizadores
Base informativa
Informacion representada
en un formato intermedio
Componer
Visualizaciones
Nuevas vistas del producto:
* Formato
* Graficos
* Documentaciones
* Metricas
* Logica
* Informes
Otros productos de trabajo
! Riesgo en el proceso:
Elevado coste en la realización de una reingenierı́a manual.
No alcanzar los beneficios en el plazo requerido.
Falta de justificación económica del esfuerzo de la ingenirı́a.
Falta de criterios administrativos que justifiquen la utilización de reingenierı́a.
! Riesgo personal:
Inhibición de los programadores al comienzo del proceso.
Los programadores con un bajo rendimiento pueden contribuir a que un pro-
yecto de reingenierı́a poco popular se vea como improductivo.
! Riesgo en la aplicación:
Realizar reingenierı́a sin la colaboración de expertos de la aplicación.
Pérdida del conocimiento industrial que se encuentra incorporado en el código
fuente.
Falta de adecuación de los procesos de reingenierı́a.
! Riesgo tecnológico:
La información recuperada no es útil o simplemente no es utilizada.
Producción masiva de documentación (costosa).
No pueden compartirse representaciones obtenidas mediante ingenierı́a inver-
sa.
Falta de adecuación entre la tecnologı́a y el objetivo.
Usar un proceso de reingenierı́a con medios insuficientes.
! Riesgo en las herramientas:
Desaprovechamiento de las herramientas instaladas.
3 REESTRUCTURACION 9
3 Reestructuración
La reestructuración de software consiste en “la modificación de software con objeto de
hacerlo más fácil de comprobar y cambiar, o menos susceptible de tener errores cuando se
realicen cambios en un futuro” ([1]). Al hablar de “Software” incluimos la documentación
interna y externa concerniente al código fuente, junto con el propio código fuente.
Esta definición excluye los cambios de software que buscan otros propósitos, tales como
optimización de código. Aunque la optimización de código implica “reestructuración ” en
cierto sentido, no suele ser el punto clave en el mantenimiento de una aplicación.
000100 EDIT-COST-INDICATORS.
000110 IF C NOT EQUAL TO ‘‘A’’ OR ‘‘B’’ MOVE ‘‘X’’ TO COST-INDICATOR
000120 GO TO EDIT-COST-INDICATORS-EXIT.
000130 IF C EQUAL TO ‘‘A’’ AND CS EQUAL TO 1 MOVE 0 TO
000140 PGNT ADD 1 TO PGNT MOVE ‘‘007’’ TO SPAG.
000150 MOVE ALL NINES TO ZCOD ADD 1 TO NLCNT
000160 ADD SPC TO CUM-SPC PERFORM OK-RECD-PRINT THROUGH
000170 OK-RECD-SUB-PRINT GO TO EDIT-COST-INDICATORS-EXIT.
000180 IF C EQUAL TO ‘‘B’’ AND CS EQUAL TO 1 MOVE 0 TO PGNT ADD 1
000190 TO PGNT MOVE ‘‘007’’ TO SPAG MOVE ‘‘99999’’ TO ZCOD.
000200 ADD 1 TO NLCNT ADD SPC TO CUM-SPC
000210 PERFORM OK-RECD-PRINT THROUGH OK-RECD-SUB-PRINT
000220 GO TO EDIT-COST-INDICATORS-EXIT.
000230 IF C EQUAL TO ‘‘A’’ OR ‘‘B’’ AND AND CS NOT EQUAL TO 1 ADD 1
000240 TO PGNT MOVE ‘‘010’’ TO SPAG ADD 2 TO NLCNT
000250 ADD SPC TO CUM-SPC PERFORM OK-RECD-PRINT.
000260 EDIT-COST-INDICATORS-EXIT.
000270 EXIT.
000100 EDIT-COST-INDICATORS-1080.
000110 IF COST-INDICATOR = ‘‘A’’ OR ‘‘B’’ ,
000120 IF SUB-COST-INDICATOR = 1,
000130 MOVE 0 TO PAGE-COUNT,
000140 ADD 1 TO PAGE-COUNT,
000150 MOVE ‘‘007’’ TO SPECIAL-AGENT,
000160 MOVE ‘‘99999’’ TO ZIP-CODE,
000170 ADD 1 TO NEW-LINE-COUNT,
000180 ADD SPECIAL-COST TO CUMULATIVE-COST,
000190 PERFORM OK-RECD-PRINT-1470 THROUGH
000200 OK-RECD-PRINT-1580
000210 ELSE
000220 ADD 1 TO PAGE-COUNT,
000230 MOVE ‘‘010’’ TO SPECIAL-AGENT,
000240 ADD 2 TO NEW-LINE-COUNT,
000250 ADD SPECIAL-COST TO CUMULATIVE-COST,
000260 PERFORM NOT-OK-RECD-PRINT-1780,
000270 ELSE
000280 MOVE ‘‘X’’ TO COST-INDICATOR,
000290 EDIT-COST-INDICATORS-EXIT-1260.
000300 EXIT.
En este caso, una rápida inspección del código nos indica que el propósito de este es
llevar a cabo la edición de costes acumulados de agentes especiales. Las instrucciones
aparecen ordenadas una por lı́nea, el seguimiento del flujo de control se realiza de una
manera mucho más simplificada, en la que la identación es homogénea y contribuye a
dicho seguimiento. Las variables tienen nombres con significado, y aunque siguen exis-
tiendo constantes literales, estas se encuentran asociadas a identificadores, facilitando
su posible modificación posterior con nuevos valores.
Es un hecho que con cambios continuados, el software tiende a volverse menos estruc-
turado [9], lo cual se manifiesa con documentación pasada de fecha, códificaciones que
no se ajustan a los estándares, incremento del tiempo que necesitan los programadores
para entender el código existente, incremento en de errores no existentes con los nuevos
cambios, . En este marco la reestructuración es una opción muy importante que
permite mantener controlados los elevados gastos asociados al mantenimiento de una
aplicación. La idea principal es “modificar el software (o la percepción que los programa-
dores tienen de la estructura de software) con objeto de volver a comprenderlo y controlar-
lo”.
En este contexto cabe preguntarse por la existencia de técnicas y metodologı́as que faci-
liten el proceso de reestructuración. La contestación es muy simple y afirmativa, consi-
deremos la siguiente clasificación realizada en base a la estructura de la figura 3:
3.1 Técnicas
( Código:
Estilo del código.- Facilita la comprensión sin necesidad de modificar la estruc-
tua de control o de datos.
! Formateo de código e impresión adecuada.
3 REESTRUCTURACION 11
Contexto
Administración: Políiticas
Ingenieros de Software
Entorno de programación:
Herramientas
Documentación
Código
3.2 Metodologı́as
Una metodologı́a es tipicamente un conjunto de pasos para mejorar el software en cual-
quiera de los niveles vistos en la figura 3. Una metodologı́a ayuda en manejo y control
de otras técnicas de reestructuración más especı́ficas. Distinguimos las siguientes me-
todologı́as:
3 REESTRUCTURACION 13
( Hablar con el personal de mantenimiento sobre sus opiniones sobre los problemas
que encuentran en su trabajo.
3 REESTRUCTURACION 14
# Identificar las tareas actuales en las que una polı́tica de reestrucutración puede
ahorrar tiempo, reducir los problemas de mantenimiento, o permitir cualquier otro
beneficio significativo.
$ Ajustar una aproximación de reestrucutración adecuada a los problemas de man-
tenimiento más apremiantes. Una reestructuración adecuada, es aquella que pre-
senta un mayor impacto sobre las tareas del punto anterior.
% Realizar análisis de viabilidad y de transferencia tecnológica de la aproximación se-
leccionada. Un análisis de transferencia tecnológica examina las componentes tan-
to sociales como psicológicas que afectan a la aceptación y utilización de la aproxi-
mación elegida.
& Seleccionar una técnica de reestructuración, planificar su utilización, y emplearla.
' Realizar un seguimiento del esfuerzo de reestructuración, preferentemente median-
te la recolección de datos y aplicación de medidas sobre la estructura. También
realizar el seguimiento de la mejora en el mantenimiento y evaluar los resultados.
La figura 4 muestra una posible planifiación para estudiar la eficacia de una herramienta
de reestructuración.
Programa
elegido
Recodificador
Mediciones
Cambios en el Cambios en el
programa original programa recodificado
Mediciones y
Resultados
comentarios
4 Reingenierı́a de reciclaje
En un gran número de aplicaciones, la construcción se ha venido llevando a cabo sin
tener en cuenta la posibilidad de reutilizar las componentes del sistema. Hoy en dı́a,
una vez que dichas aplicaciones se han comprobado de utilidad y su uso se ha exten-
dido, ha aparecido la necesidad de crear nuevas aplicaciones a partir de aquellas; sin
emabargo, por falta de previsión no es posible reutilizar mucho de lo ya desarrollado, di-
señado o especificado. Un apartado muy importante dentro de la reingenierı́a tiene por
misión la búsqueda e identificación de componentes reusables dentro de las aplicacio-
nes existentes, con vistas a su incorporación en depósitos y su posterior utilización en
la construcción de nuevas aplicaciones.
Reingeniería
Buscar y
(Salvage) Clasificar Comprender
Reusar
Adquirir
Certificar
Almacén
Diseñar
Sistema 1
Sistema 2
Vuelta
Ver y
atrás Medir Sistema n
5 Ingenierı́a inversa
La ingenierı́a inversa, es la actividad de definir una representación del sistema más abs-
tracta y fácil de comprender que la actualmente existente ([6]). La aplicación de inge-
nierı́a inversa nos hace retroceder desde el código hasta las etapas de diseño e incluso
de análisis, en un proceso en el que se puede recuperar información perdida e incluso
generar nueva información sobre la aplicación estudiada.
6 Recuperación de objetos
En la actualidad la fase de mantenimiento de software ha dejado de ser la cenicienta del
proceso de desarrollo, para convertirse sin lugar a dudas en el gran protagonista dentro
de la Ingenieria de Software, en especial mediante la utilización de tecnologı́as . La
formulación de las siguientes preguntas se ha vuelto un tema común en un gran número
de empresas dedicadas al desarrollo de aplicaciones o simplemente a la utilización de
software:
" ¿Cómo podemos construir un modelo de un sistema que nos permita razonar sobre
las modificaciones futuras?
" ¿Cómo podemos reemplazar gradualmente diversas partes de un sistema?
" ¿Cómo podemos integrar las técnicas modernas de orientación a objetos en un sis-
tema existente?
Estas preguntas son “contestadas” mediante la aplicación de tecnologı́as orientadas a
objetos en las que, las entidades reales del dominio de aplicación se modelan mediante
objetos y asociaciones entre estos. El modelo del sistema obtenido puede utilizarse como
una “aplicación ” entre las entidades reales del dominio de aplicación y los elementos de
programación del sistema existente.
Cambio
Mantener Mejorar
Descartar Reingeniería
En la que consideramos que la actividad que define la Ingenierı́a inversa es aquella que
“está encaminada a definir de una manera más abstracta, y fácil de comprender, la repre-
sentación del sistema. ”. Y dónde representa un “Cambio de funcionalidad o de técnica
de implementación del sistema.”
Con objeto de poder llevar a cabo dicha misión de una manera satisfactoria es preciso
que contemos con:
" Un cambio de funcionalidad.- En este caso hay que tener en cuenta que:
1. Identificar las relaciones entre las distintas componentes del sistema y crear una
representación más abstracta del mismo. (Por ejemplo mediante la construcción
de un diagrama de flujo de datos para representar las funciones C y un modelo de
entidad relación para la base de datos).
2. Razonar sobre los cambios de funcionalidad a un nivel más abstracto.
3. Rediseñar el sistema, pasando de la representación más abstracta a la representa-
ción más concreta (ingenierı́a normal). Se deben tener en cuenta los cambios en la
técnica de implementación.
Para poder llevar a cabo dichas actividades es preciso que contemos con:
Un punto importante a tener en cuenta son los posibles escenarios de aplicación de esta
tecnologı́a. Entre estos podemos destacar los siguientes:
6 RECUPERACION DE OBJETOS 19
Los pasos que hay que seguir en la aplicación de esta tecnologı́a a las situaciones ante-
riores son:
Sistema real
Modelo analítico
Implementación
Sistema antiguo
Modelo analítico
Primitivas
6.1 Conclusiones
Por último, y como conclusión de esta sección hacemos las siguientes reflexiones:
Referencias
[1] R. S. Arnold. Software reestructuring. Proc. IEEE, 77(4):607–617, April 1989.
[2] R. S. Arnold. Software Reengineering. IEEE Computer Society, 1994.
[3] G. Booch. Obeject-Oriented analysis and Design. With applications. The Benja-
min/Cummings, 2 edition, 1994.
[4] G. Booch. Diseño orientado a objetos, con aplicaciones. Addison-Wesley. Iberoame-
rica. Diaz de Santos. Madrid, 2 edition, 1995.
[5] Chikofsky, E. and Cross, J.H. Reverse engineering and design recovery: A taxo-
nomy. IEEE Software, 7(1):13–17, January 1990.
[6] I. Jacobson and F. Lindström. Re-engineering of old systems to an object-oriented
architecture. Proc. OOSPLA, pages 340–350, 1991.
[7] J. Rumbaugh and et al. Object-Oriented Modeling and Design. Prentice Hall, 1991.
[8] I. Jacobson. Object-Oriented Software Engineering,A Use Case Driven Approach.
Addison-Wesley, 1992.
[9] M.M. Lehman. Programs, life cycles, and laws of software evolution. Proc. IEEE,
68(9):1060–1076, September 1980.
[10] Guide Pub. Application reengineering. Technical Report GPP-208, Guide Int’l Corp.,
Chicago, 1989.
[11] E. Yourdon. Object-Oriented Systems Design: An Integrated Approach. Prentice-Hall,
1994.