Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 1

Arquitectura vs. Diseño de Software

Recommended resources

¡Hola! Bienvenido a tu primera lección para repasar las bases de la arquitectura de software. Dado tu objetivo de formalizar tu comprensión de los fundamentos, comenzaremos por el principio: estableciendo una definición clara de qué es la arquitectura y, crucialmente, cómo se diferencia del diseño.

Como desarrollador experimentado, ya tomas decisiones arquitectónicas y de diseño a diario. El objetivo de esta lección es darte un marco teórico sólido para articular y justificar esas decisiones. Exploraremos las definiciones formales, el contexto histórico de estas ideas y un conjunto de criterios prácticos para distinguir entre una decisión arquitectónica y una de diseño. Esto sentará las bases para todos los temas que veremos en el curso.

¿Qué es la Arquitectura de Software?

Para empezar, a menudo se dice que la arquitectura se ocupa del "qué" mientras que el diseño se ocupa del "cómo". La arquitectura define la estructura de alto nivel del sistema, mientras que el diseño detalla la implementación dentro de esa estructura.

Una excelente manera de visualizar esta diferencia es mediante una analogía. Te invito a ver una breve explicación en el siguiente video, que utiliza el ejemplo de un centro comercial para ilustrar esta distinción.

ARQUITECTURA de SOFTWARE vs DISEÑO de SOFTWARE

El video, del canal hdeleon.net, introduce de manera muy intuitiva la diferencia conceptual entre arquitectura y diseño.

Concéntrate en la analogía del centro comercial que se presenta entre el minuto 1:22 y el 2:06. Observa cómo la arquitectura se refiere a la disposición de las grandes áreas (estacionamiento, zona de comidas, cines), mientras que el diseño aborda el funcionamiento interno de los sistemas que las soportan (aire acondicionado, salidas de emergencia).

Esta analogía nos da un buen punto de partida. Ahora, formalicemos este concepto.

La definición más aceptada en la industria proviene de la norma IEEE 1471-2000. Para profundizar en esta y otras definiciones, te propongo leer un fragmento del documento "Introducción a la Arquitectura de Software" de Carlos Billy Reynoso.

(Microsoft Word - Introducci\363n a la Arquitectura de Software.doc)

Este texto ofrece una recopilación y análisis de varias definiciones formales de la arquitectura de software, proporcionando un contexto académico robusto.

En la sección "Definiciones", lee el párrafo que comienza con la definición de la IEEE. Luego, continúa leyendo el contraste que se hace con la ingeniería de software. Finalmente, revisa la sistematización de Shaw y Garlan, que agrupa las definiciones en diferentes perspectivas (estructural, de framework, dinámica, etc.). Esto te ayudará a entender que no hay una única verdad, sino diferentes énfasis.

Como has leído, la arquitectura es la organización fundamental de un sistema. Se trata de las decisiones estructurales más importantes, aquellas que son difíciles y costosas de cambiar más adelante. Estas decisiones definen los componentes principales y cómo interactúan entre sí. Por ejemplo, una arquitectura en capas, como la que se muestra a continuación, es una decisión arquitectónica fundamental.

Diagrama de una arquitectura en capas simple, mostrando cómo la Presentación (UI) depende de la capa de Aplicación, esta de la de Dominio, y finalmente esta de la de Persistencia. Esta estructura define las reglas de comunicación y dependencia en todo el sistema.

Estas ideas no son nuevas. Tienen una rica historia que se remonta a los pioneros de la computación. Conceptos como los "niveles de abstracción" de Edsger Dijkstra y el "ocultamiento de la información" (information hiding) de David Parnas en los años 70 sentaron las bases para pensar en los sistemas en términos de componentes modulares con interfaces bien definidas. La arquitectura de software, como disciplina, formaliza y se construye sobre estos principios, enfocándose en esas "decisiones tempranas" que Parnas consideraba cruciales y que definen la estructura perdurable del sistema.


La Frontera entre Arquitectura y Diseño

Aunque la distinción "qué vs. cómo" es útil, la realidad es más matizada. La diferencia entre arquitectura y diseño no es una línea nítida, sino un espectro. Muchas decisiones caen en una zona gris.

Para navegar este espectro, es útil tener un conjunto de criterios. Mark Richards, un reconocido arquitecto de software, propone cuatro factores para determinar si una decisión es más arquitectónica o más de diseño.

Lesson 167 - Architecture vs Design

Este video del canal Software Architecture Monday ofrece un marco de trabajo pragmático y muy claro para diferenciar arquitectura y diseño, basado en cuatro criterios clave y ejemplos concretos.

Te recomiendo ver el video completo (aproximadamente 12 minutos). Presta especial atención a los cuatro criterios que presenta: Aspecto estructural vs. Código fuente: ¿La decisión afecta la organización de los componentes o solo cómo se escribe el código dentro de uno de ellos? Estratégica vs. Táctica: ¿Requiere la participación de muchas personas y tiempo para decidir, o puede ser tomada rápidamente por el equipo de desarrollo? Nivel de esfuerzo: ¿Implementar la decisión es un esfuerzo considerable que impacta a todo el sistema o es relativamente local y de bajo esfuerzo? Significancia de los trade-offs: ¿Los pros y contras de la decisión tienen un impacto amplio y significativo en el sistema? Luego, observa cómo aplica estos criterios a tres ejemplos: la elección de microservicios (arquitectura), el uso del patrón Strategy (diseño) y la decisión de dividir un servicio (zona gris).

Estos criterios te dan un lenguaje para justificar por qué una decisión corresponde al arquitecto o al equipo de desarrollo.

Para complementar esta visión pragmática con una perspectiva teórica, vamos a analizar cómo se define formalmente el diseño y cómo se relaciona con la arquitectura en un nivel más abstracto.

intro-diseno.pdf

Este documento de Maximiliano Cristiá profundiza en la teoría del diseño y establece una diferencia clave basada en el nivel de abstracción de los componentes y, sobre todo, de los conectores.

Primero, lee la definición formal de diseño al inicio del documento. Establece que diseñar es descomponer, asignar funciones y establecer relaciones. A continuación, salta a la sección 6, "La diferencia entre arquitectura y diseño". Lee con atención la definición de Nivel Arquitectónico. El punto clave aquí es que la arquitectura introduce elementos más abstractos, como conectores que no son una simple "llamada a procedimiento" (por ejemplo, un bus de eventos o una cola de mensajes), mientras que el diseño opera con las primitivas del lenguaje de programación. Presta atención al análisis que sigue, donde se explica que los conectores son elementos de primer nivel en la arquitectura.

Este último punto es fundamental. En tu trabajo con colas FIFO y Serverless Workers, estabas operando a un nivel arquitectónico. La cola no es solo una llamada a una función; es un conector con una semántica rica (FIFO, asincronía) que media la comunicación entre componentes (los workers). El diseño, en cambio, se ocuparía de cómo se implementa la lógica dentro de cada worker o cómo se estructura el código que publica mensajes en la cola.

Para cerrar el círculo, volvamos al video de hdeleon.net y veamos cómo ilustra el nivel de detalle del diseño.

ARQUITECTURA de SOFTWARE vs DISEÑO de SOFTWARE

Ahora nos centraremos en la parte del video que "hace zoom" en un componente arquitectónico para mostrar el diseño interno.

Mira la sección que comienza en el minuto 4:12. Observa cómo, dentro de la capa de "Servicio" que se definió en la arquitectura, el diseño se ocupa de detalles como el uso de DTOs, Mappers y patrones de diseño específicos como el patrón Strategy. Estos son los detalles del "cómo" que viven dentro de la estructura definida por el "qué" de la arquitectura.


Conclusión

En esta primera lección, hemos establecido las bases para nuestro estudio de la arquitectura de software. Hemos desglosado dos conceptos que, aunque íntimamente relacionados, representan diferentes niveles de abstracción y responsabilidad.

Puntos clave:

  • Arquitectura de Software es la organización fundamental de un sistema: las decisiones estructurales de alto nivel sobre sus componentes, las relaciones entre ellos y los principios que guían su evolución. Es el "qué".
  • Diseño de Software se enfoca en la implementación interna de esos componentes, definiendo la estructura de clases, algoritmos y patrones a menor escala. Es el "cómo".
  • La diferencia no es una línea dura, sino un espectro. Podemos usar criterios como la estrategia, el impacto estructural, el esfuerzo y la significancia de los trade-offs para ubicar una decisión en este espectro.
  • Una distinción teórica clave es que la arquitectura trabaja con abstracciones de más alto nivel, tratando a los conectores (mecanismos de comunicación) como ciudadanos de primer nivel.

En la próxima lección, profundizaremos en los atributos de calidad (como mantenibilidad, rendimiento y escalabilidad). Veremos que son estos atributos los que impulsan las decisiones arquitectónicas y nos obligan a analizar y gestionar los trade-offs que hemos mencionado hoy.

End of Module,Exit lesson