Diseño Arquitectónico de Software de Alto Desempeño

Diseño Arquitectónico de Software para Sistemas Computacionales de Alto Rendimiento

Los sistemas computacionales de alto rendimiento suelen resolver problemas complejos relacionados con fenómenos físicos representables en modelos matemáticos. Sin embargo, en pocas ocasiones los códigos tienen una arquitectura de software que facilite la mantenibilidad o la modificación del mismo. El desarrollo de software debe respetar el proceso ingenieril sin importar que el código sea para alguna área del conocimiento ajena al desarrollo del software. 

Incluso, los sistemas computacionales de alto rendimiento deben considerar criterios de calidad de software como: Disponibilidad, Re-usabilidad, Performance, Robustez, Flexibilidad, Testeabilidad, Interoperabilidad, Usabilidad, Mantenibilidad, Integridad, Portabilidad, Confiabilidad. Sin embargo, la mayoría de los sistemas computacionales actuales son desarrollados de manera artesanal buscando solo la validez del modelo comparando los resultados esperados con los resultados arrojados por el software. Esto sin considerar otros criterios de calidad del sistema. 

El tener diseños arquitectónicos de software, estilos de desarrollo, diseño de capas, módulos, servicios, microservicios u otra técnicas de desarrollo de software formal permitirá tener sistemas computacionales complejos con mejores criterios de calidad operativa.

Objetivo del proyecto

Dar a conocer y poner a disposición de desarrolladores de software de alto desempeño los diseños arquitectónicos de software que resuelven problemas comunes en el área.

Patrones de diseño

En ingeniería de software los ‘patrones de diseño’ son diseños arquitectónicos de software estandarizados, probados y que pueden ser utilizados de manera repetitiva. Suelen ser vistos como una descripción o plantilla sobre la forma de resolver un problema que se puede utilizar en muchas situaciones diferentes.

Los diseños arquitectónicos de software permiten acelerar el proceso de desarrollo ya que se utilizan soluciones ya probadas en varios casos y han demostrado ser de utilidad. También, permite la mantenibilidad del sistema al facilitar la comunicación entre el desarrollador y el encargado del mantenimiento del software ya que los patrones de diseño son ampliamente conocidos en la ingeniería del software. 

Los diseños arquitectónicos de software son soluciones ya analizadas a problemas comunes en los sistemas computacionales de alto rendimiento. Estos diseños funcionan como planos de un tipo de casa que pueden ser utilizados en varios proyectos de desarrollo haciendo pequeñas adaptaciones. 

El concepto de diseño arquitectónico no se refiere al uso de código funcional sino a una estrategia de organización del software que facilita el funcionamiento, mantenimiento o desempeño de un programa. En otras palabras, debe existir un proceso de adaptación del diseño arquitectónico al sistema computacional para que el diseño sea acoplado al funcionamiento.

Es importante aclarar que el concepto de diseño arquitectónico de software no se refiere a algoritmos sino a una manera de describir el acomodo de los módulos del software. Esto significa que son soluciones a problemáticas conocidas donde se ha encontrado utilidad. Los diseños arquitectónicos no representan el flujo de los datos a lo largo del código sino describen cómo es posible acomodar los módulos o porciones de código para tener una funcionalidad deseada. 

Por ejemplo, el procedimiento de mantenimiento de un motor describe un algoritmo o secuencia de pasos para alcanzar el objetivo mientras que el blueprint o diseño del motor describe la manera en que está construido el motor y sus funciones no describe alguna operación que se pueda realizar él. El diseño del motor no es el motor sino solo una representación conceptual la cual puede tener muchas implementaciones. 

Existen diseños arquitectónicos muy conocidos como los siguientes:

Método de la fábrica. Este diseño simula como una fábrica produce un producto, en este caso, produce objetos. Además, produce un objeto sin especificar la clase de objeto que va a crear. 
Singleton. Este diseño limita la creación de objetos de una clase a una sola instancia. Este diseño se requiere en situaciones donde se necesita un y solo un objeto para coordinar un conjunto de acciones del sistema computacional. Por ejemplo, las memorias caché, los registros, etc. 
Observador. Este diseño consiste de dos tipos de actores: el observador y el actualizador (productor-consumidor). En este diseño el observador está interesado en obtener las actualizaciones a atributos de un objeto mientras que el actualizador hace los cambios respectivos en los atributos. 
Estrategia. Este diseño permite cambiar un algoritmo por otro sin modificar el software cliente. Esto es, en lugar de implementar un solo algoritmo para todos los casos del sistema computacional, el código receptor recibe códigos que permiten que el código receptor interprete y ejecute el algoritmo correspondiente. 
Adaptador. Este diseño permite que clases que no son compatibles puedan trabajar de manera colaborativa al convertir una interfaz en otra interfaz diferente. Este diseño se comporta como un traductor donde se traduce un mensaje en un formato pueda ser utilizado por otra clase que requiere otro formato de entrada. 
Constructor. Este diseño permite producir distintos tipos y representaciones de un objeto empleando el mismo código de construcción. En lugar de tener constructores complejos o extensiones de la clase, se tiene una clase que recibe de entrada cada característica del objeto que se construye por separado. 
Estado. Este diseño agrupa los estados en los que puede estar un objeto. Estos estados permiten que el objeto altere su comportamiento. Este diseño se deduce necesario cuando el código está lleno de condicionales if-else.

Ventajas de usar patrones de diseño

Los patrones de diseño no son indispensables en el desarrollo del software, incluso, es probable que pases muchos años como programador sin tener necesidad de utilizarlos. De igual forma, es probable que ya hayas implementado algún patrón de diseño sin que te lo hayas propuesto. Estos diseños arquitectónicos surgen de la experiencia, de enfrentar problemas de diseño de sistemas y encontrar estrategias de implementación que demuestran ser de utilidad en varios casos o problemas. 

Los patrones siguen siendo de utilidad hoy en día porque enseñan soluciones a problemas comunes manteniendo los principios de orientación a objetos.

Además, usar los patrones de diseño facilita el desarrollo del software al tener una solución establecida y conocida que ya se conoce que funciona para determinados casos. Adicionalmente, los patrones de diseño facilitan el intercambio de código, la estandarización del desarrollo del software y permite entender con facilidad como otros desarrolladores solucionaron un problema en común.

 

Estandarización de los patrones de diseño.

Aunque no existe un formato formal para la descripción de diseños arquitectónicos si se tienen algunos campos necesarios para comprender este tipo de soluciones de software como los que se listan a continuación:

  1. El propósito del diseño donde se explica el problema que intenta solucionar el patrón de diseño y la solución esperada. 
  2. El diseño de clases para cada parte del patrón y la forma que se relacionan
  3. El código ejemplo en alguno de los lenguajes de programación 
  4. La relación que puede existir entre patrones de diseño o sugerencias de implementación.

Categorías


patrones_portada