Saltar al contenido principal

Principios arquitectónicos del sistema

Objetivo​

Este documento define los principios arquitectónicos que guían el diseño, evolución y toma de decisiones en un sistema de software. Los principios funcionan como restricciones conscientes, no como recetas ni soluciones concretas.

Su propósito es:

  • Reducir ambigüedad técnica
  • Alinear decisiones a lo largo del tiempo
  • Mantener coherencia incluso cuando el sistema crece o cambian las personas

Un principio arquitectónico no dice qué construir, sino cómo pensar cuando se construye.

Qué es un principio arquitectónico​

Un principio arquitectónico es una regla de alto nivel que influye en múltiples decisiones técnicas.

Características clave:

  • Es estable en el tiempo
  • Aplica a todo el sistema
  • Prioriza criterios sobre implementaciones
  • Ayuda a decir “no” con argumentos técnicos

Ejemplo conceptual:

“Preferimos simplicidad explícita sobre abstracción prematura”

Esto no define una tecnología, pero sí orienta cientos de decisiones pequeñas.

Qué NO es un principio arquitectónico​

No es:

  • Un framework específico
  • Un patrón impuesto sin contexto
  • Una optimización local
  • Una moda tecnológica

Si un “principio” deja de tener sentido cuando cambias de lenguaje o stack, probablemente no era un principio.

Por qué los principios importan​

En sistemas reales:

  • Las decisiones se toman de forma distribuida
  • El contexto nunca es completo
  • El tiempo presiona más que la perfección

Los principios actúan como campo gravitacional: no dictan el camino exacto, pero evitan desviaciones peligrosas.

Sin principios:

  • Cada decisión se debate desde cero
  • El criterio depende de la persona
  • El sistema pierde identidad técnica

Principios arquitectónicos fundamentales​

Los siguientes principios aparecen, explícita o implícitamente, en la mayoría de sistemas sostenibles.

1. Simplicidad consciente​

La simplicidad no es falta de capacidad técnica; es una decisión deliberada.

Principio:

Preferir la solución más simple que funcione hoy y no limite mañana.

Implicaciones:

  • Evitar abstracciones genéricas sin necesidad real
  • Resolver el problema actual, no todos los futuros imaginados
  • Entender que complejidad innecesaria es deuda técnica anticipada

La complejidad siempre aparece; la pregunta es si aparece por necesidad o por diseño.

2. Separación clara de responsabilidades​

Cada parte del sistema debe tener un propósito claro y limitado.

Principio:

Una responsabilidad clara reduce el acoplamiento y facilita el cambio.

Implicaciones:

  • UI no decide reglas de negocio
  • Persistencia no define flujos
  • Infraestructura no contamina dominio

Cuando una pieza “hace de todo”, el sistema se vuelve frágil, no flexible.

3. Modularidad como herramienta de cambio​

La modularidad no existe para organizar carpetas, sino para permitir evolución.

Principio:

Los cambios deben afectar al menor número de módulos posible.

Implicaciones:

  • Interfaces explícitas
  • Dependencias controladas
  • Módulos reemplazables sin reescritura global

Un módulo que no puede cambiarse de forma aislada no es realmente un módulo.

4. Tolerancia al cambio (no al caos)​

El cambio es constante; la arquitectura debe asumirlo.

Principio:

Diseñar para cambiar decisiones, no para defenderlas eternamente.

Implicaciones:

  • Preferir configuraciones sobre código rígido
  • Evitar decisiones irreversibles tempranas
  • Aislar lo volátil de lo estable

La arquitectura no debe congelar el sistema en el tiempo, sino permitir que aprenda.

5. Decisiones explícitas sobre implícitas​

Lo implícito se olvida. Lo explícito se discute, se documenta y se mejora.

Principio:

Las decisiones importantes deben ser visibles y trazables.

Implicaciones:

  • Uso de ADRs
  • Convenciones documentadas
  • Suposiciones declaradas

Un sistema lleno de decisiones implícitas es difícil de entender y peligroso de modificar.

6. Observabilidad como principio, no como extra​

No se puede operar lo que no se puede observar.

Principio:

Todo componente relevante debe poder explicar su comportamiento.

Implicaciones:

  • Logs con intención, no ruido
  • Métricas alineadas a objetivos
  • Errores comprensibles, no crípticos

La observabilidad no arregla problemas, pero permite reaccionar antes de que escalen.

7. Optimizar para el mantenimiento, no solo para la entrega​

El software vive más tiempo del que se desarrolla.

Principio:

El costo dominante del software es su evolución, no su creación inicial.

Implicaciones:

  • Código legible sobre código “ingenioso”
  • Decisiones comprensibles por terceros
  • Menor dependencia de conocimiento tribal

Un sistema que solo entiende quien lo escribió ya empezó a fallar.

Cómo usar estos principios en la práctica​

Los principios arquitectónicos se usan cuando:

  • Hay varias soluciones posibles
  • El costo de decisión es alto
  • La incertidumbre es significativa

No reemplazan:

  • Análisis técnico
  • Experimentos
  • Prototipos

Los principios orientan, no sustituyen el pensamiento crítico.

Antipatrones comunes​

  • Convertir principios en dogmas
  • Usarlos para bloquear discusión
  • Invocarlos sin entender el contexto
  • Contradecirlos sin reconocerlo

Un principio mal aplicado puede ser tan dañino como no tener ninguno.

Cierre conceptual​

La arquitectura no es un diagrama ni un stack tecnológico. Es un conjunto de decisiones sostenidas en el tiempo.

Los principios arquitectónicos son la brújula que mantiene coherencia cuando:

  • El sistema crece
  • El equipo cambia
  • El contexto evoluciona

Sin principios, la arquitectura deriva. Con principios claros, el sistema puede cambiar sin perder su forma.