Skip to main content

¿Qué es arquitectura de software?

La arquitectura de software es la estructura fundamental de un sistema de software, definida por sus componentes, relaciones y propiedades. Incluye tanto las decisiones estructurales como las no estructurales (rendimiento, escalabilidad, seguridad, etc.).

Es como el plano de un edificio: no especifica todos los detalles, pero define los pilares, entradas, salidas y distribución general.

¿Por qué es importante?

Una buena arquitectura permite que el software sea:

  • Escalable: crecer sin romperse.
  • Mantenible: fácil de modificar y entender.
  • Reutilizable: módulos independientes y adaptables.
  • Probable y confiable: se pueden aislar y probar sus partes.
  • Segura y eficiente.

Elementos clave de la arquitectura de software

ElementoDescripción
Módulos o capasPartes independientes con funciones específicas (ej: UI, lógica, datos).
ComponentesUnidades funcionales reutilizables que interactúan entre sí.
ConectoresRelaciones o mecanismos de comunicación entre módulos.
Decisiones arquitectónicasPatrones, lenguajes, frameworks, estilos seleccionados.

Estilos arquitectónicos comunes

EstiloCaracterísticas clave
MonolíticoTodo en una sola unidad. Simple, pero poco flexible.
Cliente–ServidorSeparación entre UI y lógica/datos del servidor.
Capas (Layered)Separación en UI, lógica, servicios, datos. Muy usado.
MicroserviciosComponentes independientes comunicados por API.
Clean ArchitectureLógica de negocio separada de frameworks y delivery.
Hexagonal (Ports & Adapters)Aísla el núcleo de cualquier infraestructura externa.

Monolítica

Características:

  • Todo el sistema en un solo bloque desplegable.
  • Fácil de desarrollar inicialmente, pero difícil de escalar o mantener en el tiempo.
  • Usado en prototipos rápidos o MVPs sencillos.

Cliente-Servidor

Características:

  • Separación clara entre frontend y backend.
  • Modelo ideal para apps web tradicionales.
  • Base de casi todas las arquitecturas modernas.

En Capas (Layered)

Características:

  • Cada capa tiene una responsabilidad clara.
  • Muy usado en contextos académicos y empresariales.
  • Fácil de implementar en Angular (frontend) y NestJS (backend).

Microservicios

Características:

  • Cada microservicio tiene su propia base de datos y se despliega por separado.
  • Independencia tecnológica y de equipos.
  • Alta complejidad en la gestión e infraestructura.

Clean Architecture

Características:

  • El dominio no depende de frameworks externos.
  • Alta mantenibilidad y testabilidad.
  • Ideal para proyectos grandes y educativos que requieren buenas prácticas.

Hexagonal (Ports & Adapters)

Características:

  • Core aislado de toda tecnología externa.
  • Las dependencias apuntan hacia el dominio.
  • Muy utilizada en sistemas donde hay múltiples interfaces (web, móvil, APIs externas).

Ejemplo técnico

Supongamos una aplicación para registrar asistencia a clases. Podríamos diseñarla con Clean Architecture:

frontend/ (Angular)
└── app/
├── core/ → lógica de negocio
├── features/ → módulos funcionales (asistencia, usuarios)
└── shared/ → componentes reutilizables

backend/ (NestJS)
└── src/
├── domain/ → entidades y reglas
├── application/ → casos de uso (services)
├── infrastructure/ → controladores y persistencia
└── interfaces/ → adaptadores de entrada y salida

En esta arquitectura se separa el dominio puro de la infraestructura, por ejemplo al momento de crear un caso de uso en el backend:

src/application/use-cases/register-attendance.use-case.ts
@Injectable()
export class RegisterAttendanceUseCase {
constructor(private readonly repository: AttendanceRepository) {}

async execute(dto: RegisterAttendanceDto): Promise<void> {
const record = new Attendance(dto.userId, dto.date);
await this.repository.save(record);
}
}

Aplicaciones prácticas

ContextoAplicación de arquitectura de software
EducaciónProyectos estudiantiles organizados por capas
StartupsMicroservicios para escalar módulos independientes
Backend gubernamentalArquitectura hexagonal para integrar sistemas externos
Apps móviles y webClean Architecture para compartir lógica entre front y back

Referencias