domingo, 23 de febrero de 2014

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 prácticas modernas.El proceso aplica principios de ingeniería para un sistema existente para encontrar nuevos requerimientos. 
Para Roger Pressman una definición completa de reingeniería implica: 
“La reingeniería del software abarca una serie de actividades  entre las que se incluye el análisis de inventario, la reestructuración de documentos, la ingeniería inversa, la reestructuración de programas y datos, y la ingeniería directa. El objetivo de esas actividades consiste en crear versiones de los programas existentes que  muestren una mayor calidad, y una mejor mantenibilidad.”

Los objetivos de la Reingeniería de Software son:

  • 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. 
  • Re-usar componentes de sistema existentes.

Ventajas y Desventajas

Hacer reingeniería de un sistema software, según Ian Sommerville, tiene dos ventajas 
clave sobre aproximaciones más radicales a la evolución del sistema: 
 
  1. Riesgo reducido. Existe un alto riesgo en volver a desarrollar software crítico para los negocios. Pueden cometerse errores en la especificación, o puede haber problemas en el desarrollo. Los retrasos en la introducción del nuevo software pueden significar pérdidas en el negocio e incurrir en costes adicionales. 
  2. Coste reducido. El coste de hacer reingeniería es significativamente menor que el coste de desarrollar nuevo software.
La principal desventaja de la reingeniería del software es que existen límites prácticos a la 
extensión del sistema que puede ser mejorada mediante reingeniería.

EL MODELO CÍCLICO 

Este modelo define [Pressman] seis actividades las cuales se muestran en la figura. En 
algunas ocasiones, estas actividades se producen de forma secuencial y lineal, pero esto no 
siempre es así.


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. 

Reestructuración de documentos. 
La documentación débil es la marca de muchos sistemas heredados. ¿Pero que se hace acerca de ellos? ¿Cuáles son las opciones? Crear documentación consume mucho tiempo, si el sistema funciona vivirá con lo que tenga. La documentación debe actualizarse pero se tiene recursos limitados. Se utiliza un enfoque de “documentar cuando se toque”. El sistema es crucial para el negocio y debe volver a documentarse por completo incluso en este caso un enfoque inteligente es recortar la documentación a un mínimo esencial. Cada una de estas opciones es viable. Una organización de software debe elegir la más apropiada 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.
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.
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.

Reestructuración del código. 
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. 
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. 

Ingeniería directa (foward engineering). 
La ingeniería directa, que se denomina también renovación o reclamación, 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. 

___________________________________
Bibliografía
  • INGENIERÍA DEL SOFTWARE. Séptima edición, lan Sommerville. PEARSON EDUCACIÓN, S.A., Madrid, 2005. 
  • INGENIERÍA DEL SOFTWARE. Séptima edición, lan Sommerville. PEARSON EDUCACIÓN, S.A., Madrid, 2005. 




domingo, 16 de febrero de 2014

Leyes de Lehman

La dinámica de la evolución de los programas fue muy estudiado desde los años 70, este trabajo continuó en los 90's cuando Lehman y otros investigaron la importancia de la realimentación en los procesos de evolución.
Gracias a esto propusieron un conjunto de leyes concernientes a los cambios que sufren los sistemas. Señalan que son invariantes y ampliamente aplicables. 

1. Cambio continuado
Un programa que se usa en un entorno real necesariamente debe de cambiar o se volverá progresivamente menos útil en ese entorno. El mantenimiento es un proceso inevitable, a medida que el entorno del proceso cambia los requerimientos también, por lo que se entra en un momento donde el proceso de evolución se recicla. 
2. Complejidad creciente
A medida que el programa cambia va perdiendo su estructura original, ésta se va degradando y tiende a ser más compleja. La única forma de que esto no suceda es que se invierta en el mantenimiento preventivo. Obviamente esto implica más tiempo y más recursos de los que se habían contemplado en el presupuesto inicial. 
3. Evolución prolongada del programa
Los grandes sistemas tienen su propia dinámica que se establece en una etapa temprana del desarrollo. Esto determina las tendencias generales del proceso de mantenimiento y limita el número de cambios posibles en el sistema. 
4. Estabilidad organizacional 
El tiempo de vida de un programa, su velocidad de desarrollo es aproximadamente constante e independiente de los recurso que se le dediquen. A esto se le denomina estado saturado que significa que si existe un cambio en el personal o en los recursos asignados al sistema, éste tiene modificaciones imperceptibles en su evolución a largo plazo. 
5. Conservación de la familiaridad
Durante el tiempo de vida del sistema, el cambio incrementar es constante. Al añadir una nueva funcionalidad se le encontrarán nuevos defectos por lo que se sugiere que a los cambios que se la hagan se tengan contemplados los arreglos para los defectos que se podrían encontrar. 
6. Crecimiento continuado
La funcionalidad ofrecida por el sistema cambia constantemente (tiene que crecer) para mantener la satisfacción de los usuarios. 
7. Decremento de calidad
La calidad de los sistemas comenzará a disminuir a menos que dichos sistemas se adapten a los cambios que sufre su entorno. 
8. Realimentación del sistema
Los procesos de evolución incorporan sistemas de realimentación multiagente y multibucle y éstos deben de ser tratados como sistemas de realimentación para lograr una mejora significativa del producto. 

Las primeras cinco leyes fueron propuestas inicialmente, y la demás de agregaron con trabajos posteriores en donde se llega a la conclusión de que llegará un momento en que los usuarios estarán descontentos con el sistema que se analice si este no se adapta a las necesidades que vayan surgiendo en el entorno. 
______________________
  • Somerville I. (2005). Ingeniería de Software. Madrid, España: Pearson Educación S.A. 

lunes, 3 de febrero de 2014

Mantenimiento de Software


El mantenimiento del Software forma parte del ciclo de vida del desarrollo de un proyecto de Software siendo una de las partes más importantes y en las que se invierte un mayor tiempo y esfuerzo. 
Existen diferentes tipos de mantenimiento: Preventivo, Correctivo, Adaptativo y Perfectivo. 

Mantenimiento Preventivo
El mantenimiento preventivo es el proceso por el cual se mejora y optimiza el sistema que se ha instalado, este mantenimiento se realiza para la prevención de posibles problemas que puedan llegar a surgir a medida que se utiliza el sistema.

Mantenimiento Correctivo
El mantenimiento correctivo de un Sistema se realiza para solucionar fallas que se puedan encontrar al momento de su uso.

Mantenimiento Adaptativo
El mantenimiento Adaptativo de un Sistema es la modificación del mismo que se realiza después de la entrega para permitir que éste pueda seguirse utilizando al adaptarse a los nuevos sistemas operativos o nuevo hadware disponible. 

Mantenimiento Perfectivo
Es la modificación del Sistema luego de su entrega para mejorar sus prestaciones o facilitar futuras actividades de mantenimiento. Puede perfeccionarse un sistema de software incorporando nuevas funcionalidades, o mejorando sus tiempos de ejecución.
Todos los Sistemas de Software tendrán su mantenimiento preventivo pero dependerá de su desarrollo para saber si podrán perfeccionarse, adaptarse o corregirse dependiendo del tiempo que se tome y del dinero que se necesite.