Universidad Nacional Autónoma de México
Dirección General de Servicios de Cómputo Académico
Año 7 Núm. 74, Publicación Mensual, 27 de Noviembre de 2008

ARTÍCULOS

 

Año 5, Número 46, Febrero de 2006

Arquitectura de software:
importancia de su ciclo de vida

José de Jesús Hernández Suárez

 

Las necesidades actuales que tiene toda organización para el logro de sus objetivos, demandan la construcción de grandes y complejos sistemas de software que requieren de la combinación de diferentes tecnologías y plataformas de hardware y software para alcanzar un funcionamiento acorde con dichas necesidades. Lo anterior, exige de los profesionales dedicados al desarrollo de software poner especial atención y cuidado al diseño de la arquitectura, bajo la cual estará soportado el funcionamiento de sus sistemas.

Si una arquitectura de software se encuentra deficiente en su concepto o diseño, o en el peor de lo casos, no contamos con la del sistema que desarrollamos, tendremos grandes posibilidades de construir un sistema que no alcanzará el total de los requerimientos establecidos. Esto, indudablemente, nos generará un re-trabajo complicado o, peor aún, nos podrá llevar al fracaso del sistema de software cuando se encuentre en operación.

De esta manera, es necesario conocer y comprender los elementos que deben atacarse al diseñar una arquitectura de software, entendida como un término que se ha venido perfilando en los últimos años por los profesionales de la industria, a pesar de que es un tópico que ha sido desarrollado por los expertos del campo de la ingeniería de software desde hace muchos años atrás. Son pocos los profesionales que conocen lo que en realidad abarca este tema y cómo debe diseñarse la arquitectura de un sistema de software, lo cual se debe al desconocimiento generalizado de esta importante etapa del ciclo de vida de un sistema. Regularmente, se pasa de la especificación de requerimientos a un diseño somero y a la codificación del sistema.

El diseño de software se divide en dos partes importantes: diseño arquitectónico (también conocido como diseño de alto nivel) y diseño detallado. El diseño de la arquitectura de software ocurre inmediatamente después de la especificación de los requerimientos de software y considera como elementos principales los siguientes: componentes de software, propiedades de dichos componentes y la comunicación entre ellos. El diseño detallado se lleva a cabo justo antes de la codificación, y forma parte de las primeras tareas del desarrollador; describe la lógica, el control jerárquico, estructura de datos, empacado de componentes, etcétera.(1)

El desarrollo de la arquitectura de software es una de las etapas fundamentales y, en muchos casos, la más importante en el desarrollo de software, pues es aquí donde los profesionales aportan todos sus conocimientos, creatividad y experiencia para crear la mejor propuesta de solución que se dará al cliente que cumpla con los requerimientos funcionales y no funcionales establecidos para el sistema en desarrollo, así como sus preocupaciones principales de lo que esperan del sistema.

Desarrollar una arquitectura de software es como llevar a cabo el diseño arquitectónico de un edificio que será construido. Para construir, los ingenieros, albañiles, plomeros, electricistas, etc. requieren estudiar y comprender los planos de los cimientos, la estructura, y de toda la infraestructura necesaria para que cuente con servicios tales como: luz, agua, teléfono, red de datos, etc. Cuando no existen estos planos que nos guíen, estaremos construyendo algo que se nos viene a la imaginación justo en el momento de realizarlo. Por ello, también es importante que los diferentes interesados en el sistema se involucren en el diseño de la arquitectura pues, con ello, se podrá acordar y consensuar de una mejor manera la solución a la que se llegue después de conocer los requerimientos.

Como definición formal tomaremos la siguiente: “la arquitectura de software de un sistema es la estructura o estructuras del sistema, lo cual abarca componentes de software, las propiedades visibles externamente de esos componentes, y las relaciones entre ellas”(2). De esta manera, la arquitectura de software permite representar de forma concreta la estructura y funcionamiento interno de un sistema.

Para comenzar el desarrollo de la arquitectura de software es necesario partir de un documento de especificación de requerimientos, en caso contrario, deberemos trabajar de manera formal en una etapa de requerimientos para definir de manera detallada lo que se espera del sistema. El documento debe contener requerimientos funcionales (del negocio, de usuario, de sistema, entre otros) y requerimientos no funcionales (reglas de negocio, atributos de calidad del sistema, interfaces externas y políticas, por mencionar algunas).

Un elemento crítico y muy importante que se debe considerar en una arquitectura de software, y en lo que precisamente está basado el diseño, son los requerimientos no funcionales del sistema, específicamente los atributos de calidad establecidos para el mismo, es decir, atributos como: de-sempeño, confiabilidad, seguridad, facilidad de modificación, facilidad de uso, robustez, portabilidad, escalabilidad, reutilización, disponibilidad, etcétera.

Ahora bien, resulta imposible aceptar todos los atributos de calidad para un sistema; cada interesado en dicho sistema (usuario, cliente, desarrollador, arquitecto, patrocinador, etc.) estará preocupado por alguno en específico, pero es imposible alcanzar todos, pues es sabido que alcanzar ciertos atributos de calidad impide que se logren otros, y es cuando se dice que entran en conflicto. El secreto está en priorizarlos y en determinar cuáles son los verdaderamente importantes para el cliente y cuáles está dispuesto a sacrificar para alcanzar su objetivo.

De no considerar lo anterior cometeremos un error grave, pues ningún sistema puede cumplir con todos los atributos de calidad al 100%, resultaría incoherente por el conflicto que puede existir entre ellos. Es por esto que, en muchas ocasiones, los usuarios y clientes quedan insatisfechos con un sistema, pues esperaban todos los atributos de calidad que acordaron con el proveedor. Muy probablemente el analista y arquitecto, por desconocimiento, aceptaron y se comprometieron a cumplir con todos ellos sin analizarlos.

En ese sentido, podemos determinar que la arquitectura de software se encuentra influenciada por los involucrados o interesados en el desarrollo del sistema de software, la organización para la que está siendo desarrollado, los requerimientos no funcionales, el ambiente técnico y la experiencia del arquitecto.

De manera concreta, al diseñar una arquitectura de software debemos crear y representar componentes que interactúen entre ellos y tengan asignadas tareas específicas, además de organizarlos de forma tal que se logren los requerimientos establecidos. Podemos partir con patrones de soluciones ya probados, con la intención de no comenzar de cero las propuestas y utilizar modelos que han funcionado. Estas soluciones probadas se conocen como estilos arquitectónicos, patrones arquitectónicos y patrones de diseño, que van de lo general a lo particular. Un estilo arquitectónico consiste de una colección de tipos de componentes con una descripción del patrón o interacción a través de ellos (3).

El estilo afecta a toda la arquitectura de software y puede combinarse en la propuesta de solución. Un patrón arquitectónico se enfoca a dar solución a un problema en específico, de un atributo de calidad, y abarca solo parte de la arquitectura (4). Un patrón de diseño ayuda a diseñar la estructura interna de un componente específico, es decir, su detalle. Aunque estos estilos y patrones se pueden adoptar, también pueden adaptarse con objeto de lograr alguna funcionalidad concreta esperada.

Un aspecto importante en el diseño de la arquitectura es que los atributos de calidad establecidos, determinan los estilos arquitectónicos que pueden ser utilizados o adoptados, en tanto pueden contribuir o afectar el logro de dichos atributos de calidad (fig. 1).

Otro elemento importante dentro de la arquitectura de software es que debe definirse a través de vistas, que representan las diferentes perspectivas de nuestro diseño, como mostrar el diseño de la estructura general de un edificio, junto con el plano de la instalación hidráulica, el plano de la instalación eléctrica, o de la instalación de la red de voz y datos.

Las vistas arquitectónicas pueden representarse mediante lenguajes de modelado, como UML, aunque también existen lenguajes especializados de descripción arquitectónica (ADLs) como ACME, para especificar de manera sintáctica y gráfica los componentes de una arquitectura de software.

La definición de las vistas de la arquitectura de software debe documentarse de manera completa, incluyendo toda la explicación de su diseño, es decir, lo que se ha representado gráficamente, así como las justificaciones de porqué se llegó, fue mejor o se omitieron partes de la propuesta de solución. De la misma manera que existe un documento de especificación de requerimientos de software, se debe crear un documento de la arquitectura de software del sistema deseado, que servirá para generar el diseño detallado de dicho sistema.

Un vez generada y documentada la arquitectura de software, ésta debe evaluarse para verificar que cumpla con todos los requerimientos; específicamente con los atributos de calidad establecidos. Dicha evaluación puede realizarse mediante técnicas cualitativas, como cuestionarios o escenarios, o a través de técnicas cuantitativas, como simulaciones o modelos matemáticos. En la literatura existen diferentes métodos de evaluación para verificar desde múltiples atributos de calidad hasta algunos en específico. Ejemplos de estos métodos de evaluación son ATAM, ABAS, SAAM, SNA, ALMA, RMA, teoría de colas, teoría de confiabilidad, entre otras.

De manera general, podemos decir que las tareas realizadas para el desarrollo de una arquitectura de software son: identificación de los requerimientos arquitectónicos, diseño de la arquitectura, documentación de la arquitectura, evaluación de la arquitectura, y validación de la arquitectura con los diferentes interesados en el sistema que se encuentre en desarrollo.

Considerando lo anterior, podemos observar que el rol del arquitecto de software es crítico y sumamente importante, puesto que requiere de una gran variedad de conocimientos, tales como: ingeniería de requerimientos, teoría de arquitecturas de software, codificación, tecnologías de desarrollo, plataformas de hardware y software.

De igual manera, requiere de saber negociar intereses encontrados de múltiples involucrados en el desarrollo de un sistema de software; promover la colaboración entre el equipo; entender la relación entre atributos de calidad y estructuras; ser capaz de transmitir claramente la arquitectura a los equipos; escuchar, y entender múltiples puntos de vista. El arquitecto de software debe interaccionar con todos los involucrados en el desarrollo de un sistema de software, y ser capaz de dialogar con el analista para obtener los requerimientos significativos, diseñarlos y transmitirlos al programador para su codificación.

Podemos concluir que el diseño de una arquitectura de software debe considerarse una parte fundamental, crítica e imprescindible en el desarrollo de un sistema de software, ya que es precisamente en esta fase en donde recae toda la creatividad, experiencia y creación de la propuesta de solución que más se adecue a las necesidades de nuestro cliente y le permita lograr sus objetivos.

Se trata de un concepto que nació hace ya varios años, no obstante, emerge recientemente como concepto formal, como un proceso de ingeniería. En general, la mayoría no tiene un proceso formal definido para desarrollar la industria de software y, aunque no es una tarea sencilla el adoptar la creación de una arquitectura de software, se requiere romper paradigmas en la forma de trabajo de las personas. Los profesionales de la industria de software y, específicamente, quienes están dedicados al diseño de sistemas, deben capacitarse ampliamente en el campo de la arquitectura de software para cumplir con esta importante etapa del ciclo de vida de un sistema. .

 

NOTAS

  1. Traducido y modificado de White, Sharon A.; Lemus-Olalde, Cuauhtémoc. The Software Architecture Process, 1997.
  2. Traducido de Clements, P.; Bass, L.; Kazman, R. Software Architecture in Practice. Edited by SEI Series, first edition, SEI Series in Software Engineering: Addison Wesley, 2003.
  3. Traducido de Clements, P.; Bass, L.; Kazman, R. Software Architecture in Practice. Edited by SEI Series, first edition, SEI Series in Software Engineering: Addison Wesley, 2003.
  4. Modificado de Bosh, Jan. Design and Use of Software Architectures, Adopting and Evolving a Product-Line Approach, first edition, London: Addison Wesley, 2000.

 

Inicio | Contacto |