Google

jueves, 14 de agosto de 2008

El efecto mariposa

Si agita hoy, con su aleteo, el aire de Pekín, una mariposa puede modificar los sistemas climáticos de Nueva York el mes que viene

J. Gleick

El efecto mariposa es un concepto el cual indica que dadas unas condiciones iniciales, pequeñas variaciones sobre estas puede hacer que el sistema evolucione en formas totalmente diferentes. Es un concepto muy relacionado con la teoría del caos y aplicados a sistemas naturales de alta complejidad, como por ejemplo la meteorología. De hecho, fue el meteorologo Edward Lorenz quien en 1963 fue el primero en analizar este concepto en un trabajo de 1963. En dicho trabajo, Lorenz se percató que pequeñas diferencias en los datos de partida resultaban en grandes diferencias en los resultados.

Ahora bien, se puede hacer una simplificación o modificación de este concepto y aplicarlo a la informática. Los sistemas de información se definen como un conjunto de elementos que interactúan entre si con el fin de apoyar las actividades de una empresa o negocio. A pesar de que la definición parece ser simple, los sistemas informaticos son de alta complejidad, variando dicha complejidad de acuerdo con las caracteristicas de las actividaded que dicho sistema apoya.

Si se toma en cuenta tambien los requerimientos no funcionales, se debe hacer uso de librerias, APIs, servicios web, programación de diversas interfaces con otros sistemas (locales o remotos), interactuacción con la web, etc. se puede concluir que la complejidad de los sistemas de informacion aumenta significativamente, y por lo general, programar una aplicación de este tipo requiere de un equipo de programadores, analistas y arquitectos que puedan llevar a cabo el desarrollo de dicho sistema de la mejor forma posible.

Una de las caracteristicas del proceso de desarrollo de sistemas es lo cambiante de los requerimientos. Los requerimientos del sistema van cambiando a lo largo del proceso de desarrollo, bien sea porque se agregan, modifican o eliminan requerimientos. Pues bien, una modificación en los requerimientos implican cambios en los codigos ya funcionales (y probados). Estos cambios puede implicar la aparición de errores, haciendo que el sistema tenga comportamientos muchas veces inesperados. Como se puede ver, el concepto del efecto mariposa aplica perfectamente en el desarrollo de software.

La alta complejidad de los componentes de software y la necesidad de interacción entre estos (acoplamiento entre componentes) hace que sea muchas veces dificil cuantificar el impacto que un cambio puede tener en el comportamiento del sistema como tal. De alli es que cobra vital importancia la realización de pruebas sobre el codigo para garantizar que el software esta lo suficientemente estable para ser distribuido.

Se deben tomar precauciones al momento de efectuar cambios sobre un codigo funcional, un buen análisis del impacto de los cambios a realizar puede ayudar a reducir la cantidad de errores que puedan surgir por dicho cambio. Si a esto se le agrega la realización de pruebas exhaustivas (de regresión) para garantizar que el error ha sido corregido y no se hayan introducido nuevos errores.

Una buena práctica es programar una prueba que reproduzca el error en cuestión antes de corregirlo. Una vez programado y ejecutada la prueba se procede a corregir el error. Posteriormente se vuelve a ejecutar la prueba para verificar que el error ha sido corregido. Esta prueba entonces se agrega a un batch de pruebas que deben ejecutarse despues de cada cambio para garantizar que el error no vuelva a aparecer.

Una buena gerencia de sistemas debe entonces tener un mecanismo que permita identificar los errores que aparecen en el codigo, y un equipo de testers que se encargen del desarrollo de los casos de prueba y la ejecución de los mismos de forma tal que se pueda garantizar la calidad del sistema. En caso de no existir un equipo de testers esta labor recae sobre los programadores y estos van a enfocarse mas en la funcionalidad del sistema, dejando de lado la labor de escribir casos de prueba.

Si el equipo de desarrollo no posee un equipo de testers, entonces es altamente recomendable que cada cierto tiempo se detenga la labor de desarrollo para hacer testing, escribir los casos de prueba y ejecutarlos. Esto puede hacer que el desarrollo sea un poco mas lento pero a la larga resultará en un producto de mayor calidad, con menos errores y por lo tanto con un cliente satisfecho.