Arquitectura – Conceptos de diseño de software

Conceptos de diseño de software
Conceptos de diseño de software

Introducción

El diseño es la parte más creativa del desarrollo de software, esta etapa se encuentra en todas partes desde artefactos de fabricación compleja, como una estación espacial, hasta en elementos sencillos, como un simple lápiz.

Diseño de software

Es el proceso de construir un programa que cumpla con los requerimientos funcionales (1) y no viole ninguno de sus requerimientos no funcionales (2).

(1). Un requerimiento funcional especifica una funcionalidad que el sistema debe ser capaz de ejecutar.
(2).Un requerimiento no funcional no describe lo que el software hará sino cómo el software lo hará, también son conocidos como atributos de calidad. Estos son: rendimiento, seguridad, mantenimiento, escalabilidad, etc.

Normalmente el diseño de software se divide en dos fases:

  1. Diseño arquitectural
  2. Diseño detallado
Diseño arquitectural

Es el proceso en el cual se define una colección de componentes de software y hardware con sus interfaces, se asigna responsabilidades especificas a cada componente, se define como van a interactuar entre ellos y se especifica donde se desplegarán. En esta fase nos podemos apoyar de los siguientes artefactos:

  • Diagrama de clases
  • Diagrama de componentes
  • Diagrama de paquetes
  • Diagrama de despliegue
  • Patrones o estilos arquitecturales

NOTA: A todos este conjunto de diagramas también se les conoce como diagramas estructurales.

Diagramas estructurales
Diagramas estructurales
Diseño detallado

Se encarga de refinar y expandir el diseño preliminar de un sistema, trata con cada uno de los componentes que resultaron del diseño arquitectural para definir sus estructuras de datos y algoritmos, con la finalidad de especificar el comportamiento de cada uno de ellos usando algún tipo de notación:

  • Pseudo código: es como escribir un algoritmo sin usar algún lenguaje de programación.
  • Programación estructurada: permite organizar los algoritmos en secuencias, condiciones y repeticiones
  • Flowcharts y graph charts: son representaciones gráficas del programa, ayudan a entender cómo va caminando el programa.
  • Tablas de decisión: son una listas de reglas y condiciones bajo las cuales estas reglas se van a aplicar.

En esta fase nos podemos apoyar de los siguientes artefactos:

  • Patrones de diseño
  • Diagrama de casos de uso
  • Diagrama de secuencias
  • Diagrama de estados
  • Diagrama de actividades
  • Diseño de algoritmos
  • Modelo entidad relación
  • Diccionario de datos
  • Diseño de interfaces de usuario

NOTA: A todos este conjunto de diagramas también se les conoce como diagramas de comportamiento.

Diagramas de comportamiento
Diagramas de comportamiento

Enfoques del diseño de software

Actualmente existen muchos enfoques de diseño, algunos exponen un punto de vista en particular acerca de la mejor manera de estructurar un sistema, como un diseño orientado a objetos. Otros están destinados a un particular tipo de aplicación, como el diseño de sistemas en tiempo real. Y algunos son estructurados para lidiar con solo una parte de la aplicación, como el diseño de interfaces de usuario. Sin embargo todos estos enfoques tienen 3 aspectos con los que pueden ser comparados:

  1. El método de diseño
  2. La validación del diseño
  3. La documentación del diseño
Método de diseño

Es una secuencia de pasos que un equipo de diseño usa para resolver un problema. Particularmente sugiere una forma de ver un problema, por ejemplo usando el diseño orientado a objetos vemos el problema en forma de objetos que cooperan entre sí. El método de diseño seleccionado actúa como una guía para los participantes, diseñadores y lo implementadores forzándolos a organizar sus ideas y actividades bajo ciertas normas. Sin embargo, hay algunos problemas que pueden surgir con los métodos de diseño, por este motivo el arquitecto o diseñador debe tomar algunas decisiones:

  • ¿Las cosas se harán top-down, botton-up, inside-out?
  • ¿Se pensara en procedimientos y funciones o en términos de sustantivos y objetos?
  • ¿Se debe hacer un diseño que tome un poco más de esfuerzo apoyándonos en estructuras mantenibles y generales? o ¿Hacer un diseño rápido?
  • ¿Qué herramientas se deben usar?
Validación del diseño

Significa algún tipo de revisión que se realiza sobre el diseño por un equipo o alguna herramienta que se esté usando con la finalidad de encontrar errores para mejorar el diseño. Así como existen algunos problemas al momento del diseño acá también pueden surgir algunos problemas:

  • Independencia de los validadores: El problema se da cuando el mismo equipo que diseña se encarga de validar el diseño. Esto puede causar que se se pasen por alto algunos errores ya que si (ellos) no vieron un error al momento del diseño es muy complicado que lo vean al momento de la validación. Usando a una persona externa al equipo de diseño le dará mucho valor a este proceso.
  • Dependencia del método de diseño: Al usar un diseño estructurado este viene con un conjunto de reglas con métricas asociadas para cada uno de sus artefactos y ocurre lo mismo si usamos un diseño orientado a objetos.
  • ¿Cuándo se debe hacer? ¿En marcha o después de los hechos?: Una estrategia es realizar la validación en medida de que se avanza el diseño. Esto se puede realizar diariamente o semanalmente, se debe revisar lo que se tenga hasta el momento y hacer los ajustes necesarios. Otra alternativa es esperar hasta que se llegue a una fecha programada para hacer la revisión y los ajustes necesarios.
Documentación del diseño

Cuando hablamos del diseño de sistemas grandes por lo general estos tienden a ser complejos por lo que se necesita tener una buena documentación del mismo. Cuando un sistema entra en  mantenimiento lo más probable es que lo realicen personas ajenas al equipo que lo diseñó y/o desarrolló. En ese momento tener algo de documentación puede ser de gran ayuda. Debemos tener en cuenta que para diferentes tipos de aplicaciones se requieren diferentes tipos de documentación, estos van desde documentos formales de varios volúmenes hasta notas o presentaciones en power point. Para la documentación del diseño se puede tomar de base alguno de estos formatos:

Conclusiones:

El diseño de software se encuentra en todos lados y debe cumplir con los requerimientos funcionales  y no debe romper ninguno de los requerimientos no funcionales que necesita un sistema. El diseño de software se divide en dos fases: elaboración del diseño arquitectural y detallado. El diseño arquitectural se define como van a interactuar los componentes entre si y como se agruparan. El diseño detallado define el comportamiento de cada uno de los componentes definidos en el diseño arquitectural.

Referencias:
Metal Tip:

Este artículo lo escribí escuchando la canción Rain of a thousand flames de la banda Rhapsody of fire de Italia, les comparto el enlace.

Happy coding and Stay Heavy lml

4 comentarios en “Arquitectura – Conceptos de diseño de software

  1. Hola Luis, veo que eres un experto en el tema, tu sitio es muy bueno y hace aportes muy interesantes…me considero un simple programador C# que ha hecho algunos proyectos medianos empleando capas, ahora estoy viendo algo de MVC y EF, y me gustaria que me recomiendes en que orden puedo aprender y reforzar estos temas que tratas en tu sitio, por ejemplo refactoring, patrones gof, solid y demas…es decir, suponte que deseas dar un curso de arquitectura del SW, cuales y en que orden son los temas que tocarias, y si me recomiendas algunos textos (pref en español) tambien te agradeceria…

    Saludos cordiales!

    Le gusta a 1 persona

    1. Hola Matias,

      Este blog es para compartir experiencias y es agradable escuchar que mis aportes sirven a la comunidad, a la final todos aprendemos en este camino, cada vez que aprendo algo me doy cuenta que me falta mucho más :). Te recomiendo lo siguiente, la verdad no he encontrado mucho material en español asi que es un deber que mejores tu ingles si quieres tener acceso a recursos que no todos leen por el idioma.
      Clean code: A Handbook of Agile Software Craftsmanship (Robert C. Martin): http://goo.gl/i0rA96
      Head First Design Patterns: http://goo.gl/ktWU3P
      The Principles of OOD: http://goo.gl/gx64zD
      Object Oriented Design: https://goo.gl/UEUNG7
      Software Development Process: https://goo.gl/ONSDlp
      Software Architecture & Design: https://goo.gl/l02BxN

      Además, te recomiendo que pruebes pluralsight es un sitio excelente para aprender. Espero que te sirvan esos enlaces.

      Saludos

      Me gusta

  2. Hola,
    Yo recomendaría que le des una ojeada al SWEBOK Guide v3.0, el cual es una guía que describe el conocimiento que existe de la disciplina de la ingeniería del software. En el capítulo 2 verás a vista de pájaro los distintos aspectos relacionados con el diseño de software. Me parece útil como para ponerse en contexto y trazar la ruta de aprendizaje.

    Saludos!

    Me gusta

Deja un comentario