sábado, 20 de octubre de 2012

Enfoque de desarrollo de software apoyado en etapas y procesos de reingeniería.

RESUMEN
Este trabajo tiene como objetivo proponer un enfoque para el desarrollo de software en el que se incluyan atributos, etapas y herramientas del proceso de reingeniería en la mayoría de las fases del desarrollo de software. Mediante esta propuesta, se  espera que al incorporar métodos de reingeniería y refactoring como paso previo a la finalización de cada fase de desarrollo, permita prever y disminuir el impacto que genera en las organizaciones en términos de costos de tiempo, recurso humano y dinero las múltiples correcciones, adaptaciones o mejoras no planificadas que puedan surgir a lo largo del tiempo.
Este enfoque pretende ser aplicable durante el diseño de nuevos sistemas de software y no para adaptación y rediseño de aplicaciones existentes, en la cual el uso de las técnicas de re-ingeniería es indispensable. Se espera que la aplicación de este enfoque permita la creación de  sistemas  de software más fiables, eficientes, y con poca necesidad de mantenimiento.

INTRODUCCIÓN
Ciertas aplicaciones de software pueden haber sido desarrolladas con un diseño particular, pero las diferentes modificaciones (debido a nuevos requerimientos) y actividades de mantenimiento (debido a cambios en los procesos y/o errores) terminan afectando el diseño original. Estas aplicaciones son difíciles y costosas de mantener. Es posible rediseñar estos sistemas de software y desarrollarlos de nuevo, pudiendo partir de la versión actual del software y aplicando las lecciones aprendidas. Esto se llama reingeniería de la aplicación de software [1].
Las organizaciones que usan los sistemas de información tienen que lidiar con el problema de que el software se vuelve antiguo y redundante. Aunque mantener programas de software antiguos es costoso la mayoría de las organizaciones dudan en hacerles una reingeniería, ya que piensan que la reingeniería será más costosa que mantener los programas de software antiguos. Pero la reingeniería de software es usualmente una opción de bajo costo en comparación al mantenimiento de software. Las compañías de software deben escoger programas que se van a usar por 5 años o una década.
La reingeniería de software presenta una serie de dificultades, como:  falta de planificación exhaustiva para la reutilización del software, no utilización por parte de los desarrolladores de software de herramientas o componentes diseñados específicamente para  ayudar e impulsar la reutilización, falta de entrenamiento para ayudar a ingenieros de software y administradores a comprender y explicar la reutilización, resistencia del personal especializado  contra el concepto de reutilización, propugnar metodologías que no facilitan la reutilización, como puede ser la descomposición funcional  en detrimento de enfoques orientados a objetos,  falta de incentivos en las compañías para producir  componentes reutilizables[2].
Se pueden definir diez elementos del software que pueden reutilizarse: planes de proyecto, estimaciones de coste, arquitectura, especificaciones y modelos de requisitos, diseños, código fuente, documentación de usuario y técnica, interfaces de usuario, datos, y casos de prueba [3].
Regularmente la utilización de la reingeniería se efectúa tiempo después de la terminación del software, cuando nuevos requerimientos son solicitados, así como también, cuando características de calidad como rendimiento, eficiencia y usabilidad tienden afectar el desempeño del software y el cumplimiento de los requerimientos de los usuarios. Con la finalidad de disminuir los costos que se generan durante el proceso de reingeniería, se plantea el uso de ciertas fases, procesos y técnicas para que sean aplicadas durante el desarrollo de un sistema de software.

FASES DE LA REINGENIERÍA DE SOFTWARE
A pesar de que no hay una definición de proceso de reingeniería, sí que hay trabajos importantes en esta área, como el de Rugaber y Wills [4], en el que proponen una serie de pasos para fomentar y avanzar en la investigación en el área de la reingeniería.
En el proceso de reingeniería se podrían distinguir las siguientes fases:
Traducción del código fuente. El programa se convierte a una versión más moderna del lenguaje en que estaba codificado o a un lenguaje diferente. Los motivos que llevan  a una traducción pueden ser muy diversos: falta de conocimientos del personal en ese lenguaje, falta de soporte en los compiladores, actualización de la plataforma de hardware o de software, políticas de empresa, necesidad de cambio en las interfaces de usuario, etc.
Ingeniería inversa. Se analiza el programa y se extrae información de él, la cual ayuda a documentar su organización y funcionalidad. Es el proceso de analizar el software con el objetivo de recuperar su diseño y especificación. Lo normal es que la entrada a este proceso sea el código fuente si se dispone de él. 
Mejora de la estructura del programa. Se analiza y modifica la estructura de control  del programa para hacerlo más fácil de  leer y comprender. Los programas pueden presentar lógica de control no intuitiva  lo que puede hacer que no se entiendan fácilmente.
Modularización del programa. Es el proceso de reorganizar un programa de forma que partes relacionadas se integren de forma conjunta. Esto facilita eliminar componentes y mejorar la comprensión. Se  pueden considerar diferentes tipos de módulos: abstracciones de datos, módulos de hardware, módulos funcionales, módulos de apoyo al proceso, etc.
Reingeniería de datos. Se trata de analizar y reorganizar las estructuras, e incluso a  veces, los valores de los datos de un sistema para hacerlos más comprensibles. Si la funcionalidad del sistema no cambia, la reingeniería de datos no es necesaria.
No son fases que tengan que desarrollarse todas necesariamente, sino que dependiendo de los casos podrán figurar unas u otras.
Otros autores [5] desarrollan un modelo de reingeniería del Software que sitúa al usuario como colaborador principal en la tarea de especificar los requisitos del sistema. Las fases, en este caso serían:
Definición del problema. Se identifican objetivos, límites, beneficios, riesgos, estimaciones de tiempos, etc., estableciendo una imagen real de lo que existe realmente ahora y lo que se quiere obtener en el futuro.
Estudio del código antiguo. Partiendo del código fuente en un lenguaje de tercera generación, se obtiene un conjunto de documentos que ayudan a posteriores fases de la metodología.
Viabilidad del proyecto. Consiste en detectar posibles errores en las especificaciones.
Rediseño de especificaciones. Se busca conseguir, que las especificaciones representen de forma real la visión futura deseada del sistema. 
Creación de prototipos. De aquellas partes que puedan dar problemas, o solamente de aquellas que vayan a cambiar sustancialmente de la original.
Planificación de la implementación. Consiste en diseñar la forma y modo en que se va a migrar de una herramienta a otra.
Perfeccionamiento. Realizar cambios en la nueva aplicación que aumenten la calidad del sistema.

ENFOQUE.
Para el enfoque planteado se propone utilizar algunas de las fases anteriormente descritas de la reingeniería integradas estrechamente como pasos previos a la finalización de cada etapa de desarrollo de un software. A pesar de utilizar fases o procesos adicionales durante el desarrollo de software se desea mantener un modelo de desarrollo lo más ágil posible, siempre teniendo como objetivo el aseguramiento de la calidad y garantizando |que las etapas de desarrollo tengan un nivel importante de refinamiento y pruebas que permita poder prescindir de futuros procesos de reingeniería y de refactoring que pudiesen generar altos costos a las organizaciones.
Pese a que uno de los objetivos principales planteados con la utilización de este enfoque es poder prescindir de futuros procesos de reingeniería, existe la posibilidad de que este proceso de reingeniería sea inevitable, esto debido al constante crecimiento y evolución de los requerimientos y necesidades de las organizaciones. En este escenario, el desarrollo de software apoyado en este enfoque permitiría que el proceso de reingeniería sea más ligero y genere menores costos de tiempo, dinero y recursos que los que normalmente se requerirían.
En este sentido, se pretende aplicar el enfoque de reingeniería como apoyo a los procesos de desarrollo, específicamente como un modelo de cascada con fases iterativas, que agrega al modelo originalmente propuesto por Winston Royce en 1970, una etapa de creación de prototipo que permita validar con los usuarios el software el cumplimiento de los requerimientos específicamente durante la etapa de diseño y de esta manera aplicar las etapas de reingeniería correspondientes.

MODELO DE DESARROLLO APOYADO EN LA REINGENIERÍA.
Se propone a continuación un modelo basado en un estilo de desarrollo en cascada integrado con técnicas como la creación de prototipos, procesos de revisión, validación y refinamiento constante junto a los usuarios/clientes, y el uso de métodos propios de la reingeniería de software. Con este modelo se pretende aprovechar las características y fortalezas del estilo de desarrollo en cascada; estilo que ha probado a través de los años tener gran efectividad promoviendo una máxima organización en el proceso de implementación. Sin embargo, como cualquier estilo de desarrollo tiene sus desventajas y con la integración con técnicas de reingeniería se espera entre otras cosas eliminar los puntos débiles y desventajas del uso de este estilo de desarrollo.
Las primeras 5 etapas del modelo pasarán por un proceso de refinamiento, en el cual se definirán que método(s) de reingeniería específico(s) se utilizará(n) para garantizar que los requerimientos de los usuarios y los requerimientos de calidad sean cumplidos. Un punto clave en el proceso de refinamiento lo establecería el uso de la ingeniería inversa permitiendo analizar y extraer información, de cada fase de desarrollo.
Como primer paso, durante la fase de análisis de requerimientos se analizan y entienden los requerimientos buscando evitar ambigüedades, luego de definir y especificar los requerimientos se validan junto a los usuarios/clientes, si los requerimientos son aprobados y validados por los usuarios se continua con las próxima fase, en caso contrario se activa un proceso refinamiento en el cual se establece que técnica(s) de reingeniería se utilizara(n), entre las cuales se proponen redefinición del problema o redefinición de especificaciones para garantizar futuros errores y ambigüedades en los requerimientos del sistema de software.

Durante la fase de diseño se planifica una solución para el problema especificado en la fase previa. Este es el primer paso para moverse del dominio del problema al dominio de la solución [1]. Antes de continuar a la fase siguiente, se validan junto a los usuarios/clientes los puntos que se consideren prioritarios, con especial atención a las características arquitecturales y necesidades de recursos de software y hardware. Dependiendo de la respuesta de los usuarios/clientes se refinará mediante la reingeniería de datos y/o modularización del problema, o pasará a la fase de codificación.
La creación de prototipos es una etapa que se agrega en esta propuesta en búsqueda de mantener una comunicación constante con los usuarios y que la versión de lo que será el sistema de software no pueda solo verse en la etapa final, atacando una de las más importantes desventaja del estilo de cascada. Esta fase se apoya en el proceso de perfeccionamiento en búsqueda de asegurar cualidades como usabilidad y facilidad de uso para los usuarios del software. Posteriormente cuando los prototipos son validados por los usuarios se comienza la fase de codificación.
La fase de codificación se plantea la revisión y el uso de pruebas unitarias de las funciones y módulos que conforman el software. En esta fase se recomienda una considerable inversión de tiempo. El rendimiento del software depende en gran medida de la búsqueda de la optimización de las unidades de software, es por ello que se plantea la revisión y prueba constante usando el perfeccionamiento, la mejora de la estructura y el estudio del código antiguo. La utilización de este modelo pretende disminuir el impacto que genera el estudio del código antiguo en cuanto al tiempo invertido, debido a que la constante revisión y optimización de las unidades de software hacen que la antigüedad del código no sea muy alta.
Fase de prueba, la principal medida de control de calidad empleada durante el desarrollo de software. Es el paso final de verificación y validación del proceso de desarrollo. Se realiza contrastando los requerimientos originales. Con la ayuda de este enfoque se prevé evitar que haya grandes cantidades de errores en las fases previas, especialmente la de codificación. Esto debido al mejoramiento continuo y la ejecución pequeños procesos de refinación, reingeniería y refactoring en todas fases anteiores.
Por último, la fase de mantenimiento incluye todas las actividades realizadas para mantener el sistema operacional después de la instalación de software [1]. Mediante este enfoque se propone mantener una fase de mantenimiento que resulte mucho más liger-a que las tradicionales, pues de cierta manera muchas de las actividades de mantenimiento correctivo, adaptativo, mejorativo y preventivo se han desarrollado en las fases anteriores.

CONCLUSIÓN
Este trabajo presentó un enfoque que puede ser desarrollado a profundidad, creando documentos de control específicos para cada técnica de reingeniería utilizada durante las fases que componen el estilo planteado. Bajo este enfoque, se hace necesario que desarrolladores, arquitectos,  líderes y miembros que integran el proceso de desarrollo de software apliquen y perfeccionen las técnicas de reingeniería durante el análisis, diseño, implementación, prueba y mantenimiento de los sistemas de software, en busca de disminuir el alto impacto generado por entre otros, los altos costos de los procesos de reingeniería durante la búsqueda de la adaptación de las organizaciones a un mundo en constante evolución.

Por último se recomienda a los miembros que forman parte del desarrollo de software realizar una planificación exhaustiva para la verificación y validación del software, el uso de herramientas o componentes diseñados específicamente para  ayudar e impulsar la reutilización y el aseguramiento de la calidad del software.

REFERENCIAS.
 [1] IBM. “Ingeniería de Software”. IBM Learning Services. Versión 4.2. Pp 89-91. Julio 2006.
[2] Pressman, R.S.: Software Engineering: A Practitioner’s Approach. Fifth Edition. McGraw-Hill. 2001.
[3] Jones, C.: The economics of Object-Oriented Software, American Programmer, vol. 7, nº 10, October 1994, 28–35
[4] Rugaber, S. and Will L.M.: Creating a research infrastructure for reengineering. In 3 Rd Working Conference on Reverse Engineering.  IEEE Computer Society Press, September  1996, 120-130.
[5] SICUMA, Grupo. Leiva, J.: Construcción de especificaciones de interfaces en un proceso de reingeniería, en: 2da. Conferencia Iberoamericana en Sistemas, Cibernética e  Informática CISCI 2003, Orlando (Florida)-EEUU.

martes, 17 de julio de 2012

Arquitectura de la Información para móviles: Hazlo simple y concreto.


La cantidad de dispositivos móviles en especial de smartphones ha crecido y seguirá creciendo cada vez más, debido a esto las organizaciones deben ofrecer sus productos y servicios bien sea por medio de paginas para móviles o aplicaciones que se adapten a la diversidad de Sistemas Operativos que hay en el mercado.

El diseño de aplicaciones y webs para móviles enfrentan una gran cantidad de dificultades con respecto a un computador, como pantallas más pequeñas, operaciones que requieren el uso de una sola mano, menor poder de procesamiento. Para enfrentar todas las dificultades nos vamos a apoyar en el Diseño centrado en usuario y la arquitectura de la información.

Primero, olvidemos que estamos haciendo una aplicación web como la que generalmente hacemos...ahora diseñamos para móviles!!!

Hagamos todo más simple posible, como?...limitemos las opciones y creemos una arquitectura de información jerárquica, simple y bien etiquetada. Recordemos que nuestros usuarios están navegando con un dispositivo que tiene una pantalla muy pequeña, no es sencillo introducir datos, tiene muchas cosas que le pueden distraer mientras navega, etc. Los usuarios buscan algo concreto y rápido. De lo contrario abandonarán de nuestra web en un pestañeo.

Limitar las opciones, tomemos sólo el contenido que va a ser relevante para un usuario móvil y descartemos el resto. Si lo más interesante de nuestra web es la sección de noticias, localización y contacto, entonces nos debemos enfocar en ello!

Crear una arquitectura de información jerarquica, simple y bien etiquetada. Sugerencias para esto:

  • 5 Categorías como máximo.
  • 10 enlaces por página como máximo.
  • No más de 5 niveles de profundidad.
  • Priorizar enlaces por actividad y popularidad.
  • Evitar formularios.
  • Eliminar obstaculos.
  • Usar menos clics.
  • Lo más importante es el contenido no el nombre o el logo de la empresa.
  • No usar extensas cantidades de textos.

Al diseñar para móviles más que nunca debemos establecer y tener bien claro qué necesita el usuario en su móvil, ¿quiere ofertas? ¿noticias? ¿conocer sus estados de cuentas? ¿comprar? ¿chatear?...Si por ejemplo el usuario quiere comprar algún producto..que debe ser lo primero que el usuario vea?...Exacto, la opción de comprar...y eso le daremos!!

Una gran recomendación para el diseño para móviles, es que imaginemos a nuestros usuarios en una situación de máximo estrés, apurado, que camina por la calle, sin la mejor conexión a Internet y con múltiples distracciones en su entorno...y diseñemos para él!

Luego que sepamos que quieren nuestros usuarios hagamos un prototipo de nuestra aplicación, que algunos usuarios y escuchemos que tienen que decir...si estos se sienten cómodos con las funcionalidades, pues manos a la obra...a desarrollar!

lunes, 25 de junio de 2012

Diseño Centrado en Usuario: Arquitectura de la Información.


En este post hablaré un poco sobre la Arquitectura de la Información (AI) para aplicaciones web...espero les guste..

La Arquitectura de la Información (AI) es la ciencia que se centra de la organización y estructuración de sitios web, intranets, comunidades en línea, y software, para promover la usabilidad y facilidad de encontrar información.

Si un software tiene una gran usabilidad la AI es “invisible” porque es relativamente intangible y podría ser subvalorado, pero sí un software es poco compresible se pedirá a gritos un estudio de AI o se lamentará el hecho de nunca haber pensado en ella al diseñar dicho software.

La AI de un sitio web, de igual manera trabaja en organización y estructuración de los contenidos, los sistemas de rotulado o etiquetado de dichos contenidos, además de trabajar en los sistemas de recuperación de información y navegación que provea el sitio web.

Al comenzar el diseño de un sitio web, debemos responder y analizar los siguientes puntos:

¿A quién nos dirigimos realmente? ¿Qué quieren? ¿Qué buscan? 

Además, no podemos perder nunca de vista que el cliente que va a hacer sus operaciones a la empresa, banco, etc…es el mismo que el cliente de nuestra web, y que por estar en internet no tenemos que cambiar nuestros objetivos, forma de comunicar, vender y las necesidades de los clientes no tienen por qué ser nuevas o diferentes al canal offline

Ahora...saben que será clave para diseñar un sitio web con la AI?

Cambiar la mentalidad que desde hace mucho se tenemos de que el usuario de la web son los "usuarios avanzados" y que por tanto el contenido a poner en internet debía dirigirse a este usuario. Ahora los usuarios de internet son tantos que se puede decir que representan a la sociedad "offline" de forma fiel y por tanto no debemos pensar que la audiencia en internet va a ser muy diferente a la audiencia offline.

Destacaré como los puntos claves de la AI para sitios web el Diseño de la información y Diseño de la navegación.

Diseño de la información, un buen diseño de la información será aquel que ayude al usuario a encontrar la información que busca de la forma más fácil, rápida y cómoda.

Como hacer esto?

Evitar la sobrecarga informativa: demasiada información (textual, visual...) confunde y agota al usuario. Asimismo, la legibilidad del texto (tipo y tamaño de fuente, contraste entre el color de la fuente y el fondo...) es un factor muy importante al que prestarle especial atención.

La redacción de los contenidos debe realizarse en un lenguaje entendible fácilmente por los potenciales usuarios del sistema, evitando tecnicismos complejos, abreviaturas innecesarias o acrónimos poco comunes.

Para facilitar la exploración de la información por parte del usuario debemos jerarquizarla:

Aumentando el tamaño de los textos de mayor importancia (títulos, subtítulos...)

Agrupando la información que esté relacionada

Utilizando efectos tipográficos (negrita, cursiva...) para enfatizar contenidos

Posicionando la información más relevante en zonas visuales superiores. Si el usuario no se ve obligado a utilizar la barra de desplazamiento para encontrar la información que busca, ahorrará tiempo en su búsqueda y tendrá más probabilidades de encontrarla.

Diseño de la Navegación, consiste en definir la arquitectura de nuestro sitio web: elementos de interacción entre el usuario y el sistema, enlaces y tipos de enlaces entre los módulos, agrupación de los módulos por categorías o propiedades, y respuestas del sistema ante peticiones del usuario.
La interacción usuario con nuestro sitio web debe poder realizarse con la menor carga cognitiva para el usuario, por lo que se recomienda:

Evitar la sobrecarga memorística: Los menús o barras de navegación deben contener un máximo de 7 opciones diferentes.

El usuario debe poder predecir la respuesta del sistema ante su acción, para ello el nombre de los enlaces y componentes de interacción debe ser significativo y preciso. Los tooltips pueden ser de mucha utilidad en este sentido.

Se debe ofrecer asistencia al usuario en procesos de interacción complejos (formularios, etc...).

Los mensajes de error deben ser explicados de forma clara y no alarmista, indicando al usuario vías alternativas para resolver el problema.

En la actualidad el tema AI es cada vez más usado y es este un campo que podemos explotar cada vez más teniendo siempre en cuenta la naturaleza del sitio web el tipo de usuario al que va dedicado…y no olvidemos que la meta es tener usuarios felices!!

En un próximo  post hablaré sobre la AI para ambientes móviles..los espero..

Hasta la próxima,

Referencias:

Enlaces relacionados: