Evolutionary Architecture: the art of making decisions
Autor
José Enrique Calderón Sanz Lead Software Engineer @ J.P Morgan & Chase
Linkedin: https://www.linkedin.com/in/josecalderonsanz
Introducción
“Sagrada familia”. la originalidad consiste en regresar a los orígenes. Gaudi Quote.
Que aprender de la arquitectura clásica? Tenemos más de 11.000 años de historia construyendo estructuras físicas.
Analogía con el juego de Legos => sirven para crear representaciones físicas de “ideas”, el software es similar a los legos pero sin el aspecto físico.
Arquitectura evolutiva
El negocio siempre quiere cambios y los quiere ahora y baratos. => “decisiones”.
Las grandes preguntas de la ingeniería de software:
- Como hacer planes a mediano/largo plazo, cuando las cosas cambian en el transcurso del tiempo.
- Como puedo prevenir que el producto se degrade, con el transcurso del tiempo.
Como responder a éstas preguntas?
Framework para toma de decisiones
Del Libro: The software architecture elevator. Gregor Hohpe.
–> Poner foco en decisiones pertinentes
- Decisiones no triviales.
Estas son decisiones que no tienen una respuesta obvia o estándar. Implican un análisis cuidadoso y una comprensión profunda del problema, ya que afectan significativamente el diseño y el comportamiento del sistema. Estas decisiones suelen requerir la evaluación de múltiples alternativas y sus respectivas consecuencias.
Ejemplo: Decidir entre una arquitectura de microservicios y una monolítica para una nueva aplicación empresarial.
- Deben tener un downside
Se refiere a que las decisiones de arquitectura de software suelen tener desventajas o "costos" asociados. No existe una solución perfecta; por lo tanto, es crucial identificar y considerar los posibles inconvenientes o compromisos que una decisión puede acarrear. Reconocer estos “downsides” ayuda a mitigar riesgos y a preparar estrategias de contingencia.
Ejemplo: Elegir utilizar una base de datos NoSQL en lugar de una base de datos relacional tradicional.
Aspecto | Base de Datos Relacional | Base de Datos NoSQL |
---|---|---|
Escalabilidad | Limitada horizontal | Complejidad horizontal |
Modelo de Datos | Esquemas rígidos | Esquemas flexibles |
Transacciones | ACID garantizado | Consistencia eventual |
Consultas Complejas | Soporte robusto | Limitaciones |
Mantenimiento | Mayor mantenimiento | Menor mantenimiento |
Consistencia | Consistencia fuerte | Consistencia eventual |
Rendimiento | Potencialmente lento | Alto rendimiento |
Costo | Costoso | Económico, pero variable |
- Decisiones significativas: Meaningful.
Estas decisiones tienen un impacto considerable en el sistema y su desarrollo. No se centran en detalles menores o decisiones que pueden ser revertidas fácilmente, sino en aquellas que afectan aspectos críticos del sistema, como su escalabilidad, rendimiento, seguridad o mantenibilidad. Las decisiones significativas tienen un efecto duradero y son difíciles de cambiar una vez implementadas, por lo que deben tomarse con cuidado y reflexión.
Ejemplo: Adoptar un marco de autenticación y autorización (como OAuth) para la gestión de acceso en una aplicación de alto riesgo.
Alternativa | Características | Impacto en el Sistema |
---|---|---|
OAuth 2.0 | Protocolos estándar, amplia adopción | Seguridad robusta, implementación compleja |
SAML (Security Assertion Markup Language) | Federado, basado en XML | Integración con empresas, alto overhead |
JWT (JSON Web Tokens) | Simple, ligero, sin estado | Fácil de usar, menos seguro sin SSL |
–> SIMPLICIDAD como el verdadero NORTE. –> Hacer cosas complejas no siempre es la mejor opción. –> Necesito ver la solución claramente. Entendiendo las restricciones del contexto. –> Incertidumbre genera perdida de confianza, como eliminarla: EXPERIMENTANDO.
Experimentar para eliminar la Complejidad
Ejemplo: Experimento de Gaudi con los pesos dados vueltas para modelar la física y pesos de la iglesia. Proof-of-concepts de las estatuas.
–> Necesitamos validar algo, y si falla, que falle rápidamente. Usar modelos, referencias, ejemplos. –> POC hacerlo fuera de tu dominio de negocio. –> Evitar creatividad innecesaria, usar los elementos más básicos disponibles. –> como hacer cosas complejas => DOCUMENTACIÓN. –> Como documentar: DIAGRAMAS.
Cómo Documentar? Diagramas
–> C4 model.
web -> The C4 model for visualising software architecture
C1 - System Context
C2 - Contenedor
C3 - Componente
C4 - Código
Cómo Documentar? ADR’s
–> ADR or SAD -> lo más sencillo son ADR.
web: adr.github.io
Example: monorepo-vs-multirepo
Decisiones Anti-Patrones
- No mandarlas por e-mails.
- Hacer decisiones que sean fáciles de volver-atrás.
- Hacer algo, una parte y dejarla de base para el resto. Que esa decisión quede aislada en una parte.
AI para acceder a la documentación
- Juntar todos los ADR en un mismo lugar.
- Documentar usando formatos sencillos (markdown)
- Proveer un mecanismo de búsqueda / gestión ==> Modelo de AI para acceder a la información y poder hacer preguntas.