Blog de notas sobre Software, Ingeniería y Tecnología

José Enrique Calderón Sanz Lead Software Engineer @ J.P Morgan & Chase
Linkedin: https://www.linkedin.com/in/josecalderonsanz

“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.

El negocio siempre quiere cambios y los quiere ahora y baratos. => “decisiones”.
Las grandes preguntas de la ingeniería de software:
Como responder a éstas preguntas?
Del Libro: The software architecture elevator. Gregor Hohpe.
–> Poner foco en decisiones pertinentes
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.

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 |
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.
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.
–> C4 model.
web -> The C4 model for visualising software architecture





–> ADR or SAD -> lo más sencillo son ADR.
web: adr.github.io
Example: monorepo-vs-multirepo


