22. Introducción a la arquitectura de software

22.1 Introducción

La arquitectura de software se ocupa de las decisiones estructurales más importantes de un sistema. Define sus componentes principales, cómo se relacionan, cómo se despliegan, qué tecnologías relevantes se usan y cómo se satisfacen atributos de calidad como seguridad, rendimiento, escalabilidad y mantenibilidad.

Mientras el diseño de bajo nivel puede enfocarse en clases, funciones o módulos concretos, la arquitectura mira el sistema con una perspectiva más amplia. Se pregunta cómo organizar la solución para que pueda cumplir sus objetivos actuales y evolucionar razonablemente.

En este tema veremos una introducción a la arquitectura de software y a las decisiones que suelen formar parte de ella.

22.2 ¿Qué es la arquitectura de software?

La arquitectura de software es la organización fundamental de un sistema: sus componentes principales, sus responsabilidades, sus relaciones, sus principios de diseño y las decisiones que condicionan su evolución.

Puede incluir:

  • Componentes principales del sistema.
  • Relaciones y dependencias entre componentes.
  • Distribución entre cliente, servidor, base de datos y servicios externos.
  • Decisiones sobre comunicación e integración.
  • Elección de tecnologías importantes.
  • Restricciones de seguridad, rendimiento y operación.
  • Estilo arquitectónico general.
  • Decisiones difíciles o costosas de cambiar.
Idea clave: la arquitectura define las decisiones estructurales que tienen mayor impacto en calidad, costo y evolución del sistema.

22.3 Diferencia entre diseño y arquitectura

Diseño y arquitectura están relacionados. La diferencia no siempre es rígida, pero puede entenderse por nivel de impacto y alcance.

Diseño Arquitectura
Organiza responsabilidades en partes concretas. Define la estructura general del sistema.
Puede enfocarse en clases, módulos, funciones o pantallas. Se enfoca en componentes principales, tecnologías, integración y despliegue.
Algunas decisiones son más fáciles de cambiar. Muchas decisiones son costosas de revertir.
Ejemplo: cómo validar una reserva dentro de un módulo. Ejemplo: si el sistema será monolítico, distribuido o basado en servicios.

Una forma simple de pensarlo: la arquitectura contiene las decisiones de diseño más importantes y de mayor alcance.

22.4 Componentes principales

Un componente arquitectónico es una parte importante del sistema con una responsabilidad clara. Puede ser una aplicación web, una API, una base de datos, un servicio de autenticación, un módulo de pagos o un sistema externo.

Ejemplo de componentes en una tienda en línea:

  • Frontend web para clientes.
  • Panel administrativo.
  • API backend.
  • Base de datos de productos y pedidos.
  • Servicio de pagos.
  • Servicio de notificaciones.
  • Sistema de facturación externo.
  • Servicio de monitoreo.

La arquitectura debe aclarar qué hace cada componente y cómo se comunica con los demás.

22.5 Relaciones y comunicación

Además de definir componentes, la arquitectura debe mostrar cómo se relacionan. La comunicación puede ser directa, mediante APIs, eventos, colas de mensajes, archivos, bases compartidas u otros mecanismos.

Al diseñar comunicación entre componentes conviene preguntar:

  • ¿Quién llama a quién?
  • ¿Qué datos se intercambian?
  • ¿La comunicación es sincrónica o asincrónica?
  • ¿Qué ocurre si un componente no responde?
  • ¿Cómo se autentican las llamadas?
  • ¿Cómo se registran errores e incidentes?
  • ¿Cómo se versionan las interfaces?

Las relaciones mal definidas pueden generar alto acoplamiento y fallas difíciles de diagnosticar.

22.6 Atributos de calidad

La arquitectura está muy influida por los atributos de calidad. No alcanza con que el sistema tenga funcionalidades; debe cumplir condiciones de rendimiento, seguridad, disponibilidad, escalabilidad, mantenibilidad y operación.

Atributo Impacto arquitectónico posible
Rendimiento Uso de caché, optimización de consultas, procesamiento asincrónico.
Seguridad Autenticación, autorización, cifrado, auditoría y separación de permisos.
Disponibilidad Redundancia, monitoreo, recuperación ante fallas y despliegues controlados.
Escalabilidad Separación de componentes, balanceo de carga, colas y crecimiento horizontal.
Mantenibilidad Modularidad, bajo acoplamiento, límites claros y documentación de decisiones.
Portabilidad Independencia de plataforma, contenedores o configuración externa.

22.7 Estilos arquitectónicos

Un estilo arquitectónico es una forma general de organizar un sistema. No es una receta exacta, pero ofrece ideas y restricciones comunes.

Algunos estilos conocidos son:

  • Cliente-servidor: clientes solicitan servicios a un servidor central.
  • Capas: el sistema se organiza por niveles de responsabilidad, como presentación, aplicación, dominio e infraestructura.
  • Monolito: una aplicación principal contiene varias funcionalidades dentro de una unidad de despliegue.
  • Microservicios: el sistema se divide en servicios independientes que se comunican entre sí.
  • Arquitectura orientada a eventos: los componentes reaccionan a eventos publicados por otros.
  • Arquitectura hexagonal: separa el dominio de detalles externos mediante puertos y adaptadores.

Elegir un estilo debe responder al contexto, no a una moda.

22.8 Monolito y servicios

Una decisión común es si construir una aplicación monolítica o dividir el sistema en servicios. Ambas opciones pueden ser correctas según el caso.

Enfoque Ventajas Riesgos
Monolito Más simple de desarrollar, probar y desplegar al inicio. Puede volverse difícil de modificar si crece sin modularidad interna.
Servicios separados Permiten independencia de despliegue y escalado por componente. Agregan complejidad de comunicación, operación, monitoreo y consistencia.

Un error común es dividir en servicios demasiado temprano sin tener una necesidad clara. Otro error es mantener un monolito sin límites internos hasta que se vuelve inmanejable.

22.9 Arquitectura en capas

La arquitectura en capas organiza el sistema según niveles de responsabilidad. Un esquema habitual separa presentación, aplicación, dominio e infraestructura.

  • Presentación: interacción con usuarios o clientes externos.
  • Aplicación: coordinación de casos de uso.
  • Dominio: reglas y conceptos del negocio.
  • Infraestructura: base de datos, correo, archivos, APIs externas y detalles técnicos.

Este estilo ayuda a separar responsabilidades, aunque debe aplicarse con criterio. Crear capas que solo pasan datos sin aportar claridad puede agregar complejidad innecesaria.

22.10 Decisiones arquitectónicas

Una decisión arquitectónica es una elección importante que condiciona el sistema. Conviene registrarla porque explica por qué el sistema se organizó de cierta manera.

Ejemplos:

  • Usar una arquitectura cliente-servidor.
  • Separar frontend y backend.
  • Elegir una base de datos relacional.
  • Procesar notificaciones de forma asincrónica.
  • Usar autenticación centralizada.
  • Exponer integración mediante API REST.
  • Desplegar en contenedores.

Estas decisiones deben relacionarse con requisitos, restricciones y atributos de calidad.

22.11 Compromisos y trade-offs

En arquitectura casi siempre hay compromisos. Mejorar un atributo puede afectar otro. Por eso, las decisiones arquitectónicas deben discutirse en función del contexto.

Decisión Beneficio posible Costo o riesgo posible
Dividir en microservicios Escalado y despliegue independiente. Mayor complejidad operativa y de comunicación.
Agregar caché Mejor rendimiento. Riesgo de datos desactualizados.
Centralizar autenticación Control uniforme de acceso. Dependencia crítica de un componente central.
Usar colas de mensajes Mayor tolerancia a picos y desacoplamiento. Más complejidad para monitorear y depurar.

22.12 Arquitectura y requisitos

La arquitectura debe responder a requisitos funcionales y no funcionales. Muchas decisiones técnicas solo tienen sentido si se relacionan con una necesidad concreta.

Ejemplos:

  • Si el sistema debe soportar muchos usuarios simultáneos, la arquitectura debe considerar escalabilidad.
  • Si maneja datos sensibles, debe incluir controles de seguridad y auditoría.
  • Si se integra con sistemas externos inestables, puede necesitar mecanismos de reintento o colas.
  • Si se espera mucho cambio en reglas de negocio, conviene separar dominio de infraestructura.
  • Si debe operar sin interrupciones, se deben considerar despliegues controlados y monitoreo.

Una arquitectura sin relación con requisitos puede ser técnicamente interesante, pero innecesaria o inadecuada.

22.13 Documentación arquitectónica

La arquitectura debe comunicarse. No siempre hace falta un documento extenso, pero sí conviene registrar decisiones importantes, diagramas principales y razones.

Una documentación arquitectónica básica puede incluir:

  • Objetivos y contexto del sistema.
  • Componentes principales.
  • Relaciones e integraciones.
  • Estilo arquitectónico elegido.
  • Atributos de calidad relevantes.
  • Decisiones importantes y justificación.
  • Riesgos conocidos.
  • Diagramas de contexto, componentes o despliegue.

La documentación debe mantenerse útil. Un diagrama desactualizado puede perjudicar más de lo que ayuda.

22.14 Ejemplo: arquitectura de una plataforma educativa

Una plataforma educativa en línea podría tener estos componentes:

  • Aplicación web para alumnos.
  • Panel para docentes y administradores.
  • API backend.
  • Base de datos de cursos, alumnos e inscripciones.
  • Servicio de almacenamiento de videos o materiales.
  • Servicio de pagos.
  • Servicio de notificaciones.
  • Sistema de autenticación.

Algunas decisiones arquitectónicas podrían ser:

  • Separar frontend y backend para permitir evolución independiente.
  • Usar almacenamiento externo para archivos grandes.
  • Enviar notificaciones de forma asincrónica.
  • Registrar auditoría de cambios en cursos e inscripciones.
  • Usar roles para controlar acceso de alumnos, docentes y administradores.

22.15 Arquitectura evolutiva

La arquitectura no siempre se define completamente al inicio. En muchos proyectos evoluciona a medida que se aprende más sobre requisitos, usuarios, volumen, riesgos y restricciones.

Sin embargo, esto no significa ignorar la arquitectura. Algunas decisiones tempranas pueden facilitar o dificultar el crecimiento futuro.

Una arquitectura evolutiva busca:

  • Tomar decisiones importantes cuando hay suficiente información.
  • Evitar compromisos técnicos innecesarios demasiado temprano.
  • Mantener modularidad interna.
  • Revisar decisiones cuando cambian condiciones.
  • Registrar motivos de decisiones relevantes.
  • Reducir deuda técnica cuando amenaza la evolución.

22.16 Errores comunes

Al trabajar con arquitectura suelen aparecer errores como:

  • Elegir una arquitectura por moda y no por necesidades del proyecto.
  • Dividir en muchos servicios sin capacidad operativa para mantenerlos.
  • No considerar atributos de calidad desde el inicio.
  • Confundir arquitectura con elección de framework.
  • No documentar decisiones importantes.
  • Diseñar una arquitectura demasiado compleja para un sistema simple.
  • Dejar que el sistema crezca sin límites internos claros.
  • No revisar la arquitectura cuando cambian requisitos o volumen de uso.

22.17 Buenas prácticas iniciales

Algunas buenas prácticas son:

  • Partir de requisitos y atributos de calidad reales.
  • Definir componentes principales y responsabilidades.
  • Establecer límites claros entre partes del sistema.
  • Documentar decisiones importantes y sus motivos.
  • Elegir tecnologías por adecuación, no por moda.
  • Considerar operación, monitoreo, seguridad y despliegue.
  • Mantener modularidad incluso dentro de un monolito.
  • Revisar la arquitectura cuando cambian riesgos o necesidades.

22.18 Qué debes recordar de este tema

  • La arquitectura de software define la organización fundamental del sistema.
  • Incluye componentes principales, relaciones, estilos, tecnologías y decisiones de alto impacto.
  • La arquitectura está fuertemente influida por atributos de calidad.
  • No existe una arquitectura ideal para todos los proyectos.
  • Las decisiones arquitectónicas tienen compromisos y costos.
  • La arquitectura debe relacionarse con requisitos, restricciones y riesgos.
  • Documentar decisiones arquitectónicas ayuda al mantenimiento y la evolución.

22.19 Conclusión

La arquitectura de software organiza las decisiones estructurales más importantes de un sistema. Permite conectar necesidades funcionales y atributos de calidad con una estructura técnica capaz de sostener el producto en el tiempo.

Para quien comienza, la idea principal es esta: la arquitectura no es solo elegir tecnologías; es decidir cómo se organizará el sistema para cumplir sus objetivos y soportar su evolución.

En el próximo tema veremos construcción del software: código, estándares y revisión, pasando de decisiones de diseño y arquitectura a prácticas concretas de implementación.