1 Febrero 2023 🎱
- Registro de decisiones arquitectónicas: anotación de las ventajas e inconvenientes de una arquitectura de software
- Todas las arquitecturas son diseños, pero no todas las decisiones de diseño son arquitecturas
- Cualquier solucion en AS es un trade-off (compromiso)
Leyes de la arquitectura del software
-
Todas las soluciones tienen desventajas
-
El porqué codificar algo es más importante que el cómo codificarlo
-
Las restricciones te evitan tomar decisiones de diseño, pues te vienen impuestas
Tipos de sistemas
-
greenfield en dominios nuevos: algo nuevo
-
greenfield en dominios maduros: algo nuevo en una empresa ya existente
-
brownfield: software ya existente que se ha de modificar
-
Objetivo de la arquitectura del software: comentar la solución de diseño al equipo
-
El código no explica el software
-
La documentación ha de:
- reflejar la realidad
- ser comprensible por las distintas personas interesadas (stakeholders)
- adaptarse a cambios
-
Stakeholder: personas interesadas en el software
8 Febrero 2023 🛣️
- Arquitecto de software es un rol, no un rango
- Expectativas de un arquitecto:
- Tomar decisiones arquitectónicas
- Analizar continuamente la arquitectura
- Estar al día de las tendencias actuales
- Asegurar cumplimiento decisiones existentes
- Experiencia diversa
- Conocimiento del dominio de negocio
- Poseer habilidades interpersonales
- Comprender y navegar en política empresarial
Maniobra inversa de Conway
Ley de Brook
- Añadir más personas a un equipo que va retrasado hace que se retrase más todavía
Identificando stakeholders
Atributos de calidad
-
Son las características de la arquitectura junto con los requisitos no-funcionales
-
Tipos de requisitos:
-
Los funcionales se suelen cumplir.
-
Los no funcionales (velocidad, accesibilidad, disponibilidad) es lo difícil.
-
Los atributos de calidad han de comprobarse en los escenarios de calidad.
-
Árbol de atributos de calidad: usar mindmap
4 métricas clave (métricas DORA)
Origen: Informe State of DevOps de DORA (equipo DevOps Research and Assessment Miden rendimiento de la entrega de software
- Lead time to change (tiempo de espera para cambios) Tiempo desde que se hace commit hasta que código va a producción
- Frecuencia de despliegue Frecuencia con la que se despliega código en producción
- Tiempo medio de restauración (MTTR) Cuánto tiempo se tarda en restaurar un servicio tras un incidente
- Tasa de fallos tras cambios Porcentaje de cambios en producción que resultan en fallos https://www.devops-research.com/quickcheck.html
22 Febrero 2023 🍐
ADD: Attribute-driven design
-
No se usa en las empresas porque es difícil de seguir
-
Es importante hacer un registro de decisiones arquitectónicas
-
Riesgo: algo malo que puede o no ocurrir
-
Se suelen crear tablas de riesgo (tablas de matriz de riesgo)
-
Los problemas que no se arreglan pueden generar una deuda técnica (technical debt)
Técnicas de arquitectura del software
Herramientas de un arquitecto del software
- Tácticas: estrategia a seguir para resolver un atributo de calidad
- Estilos arquitectónicos: definen la forma general del sistema
- Patrón arquitectónico: solución general y reutilizable a algún problema recurrente que aparece en un contexto. Hay 3 tipos:
- Estructurales
- Runtime (comportamiento)
- Despliegue
- Patrón vs Estilo:
- Los estilos, en general, son independientes entre sí
- Un patrón puede relacionarse con otros patrones
- Arquitecturas de referencia
- Componentes desarrollados externamente (stack tecnológico): tecnologías que suelen ir muy bien de la mano
Taxonomía del software, patrones, estilos y tácticas
- Cada vez más el software se está volviendo un servicio en lugar de ser un producto.
- Tenemos que afrontar que el software va a cambiar
- Tenemos que ser capaces de atomatizar la contrucción
- Modelo en V
- Big Design Up Front: dedicarse únicamente a diseñar es una mala práctica
- Hay que intentar que las pruebas sean automáticas
- Principios FIRST:
- Fast
- Independent
- RepeatableSelf-checking
- Timely
1 Marzo 2023 🗳️
-
Módulo: algo que identificamos a la hora de construír
-
Componente: algo que se puede identificar en tiempo de ejecución
-
Principio de Responsabilidad Única: un módulo debe tener una única responsabilidad
-
Un módulo debería ser abierto para extender pero cerrado para modiicar su propio código
8 Marzo 2023 🌹
Flujos de datos
Tipo | Ventajas | Inconvenientes |
---|---|---|
Secuencial - Batch | Poco acoplamiento entre componentes, reconfigurabilidad y depuración | Sin interfaz, requiere intervención externa, sin concurrencia y alta latencia |
Pipes & Filters | Comprensión global, reconfiguración, evolución y extensibilidad, testabilidad y rendimiento | Posibles retardos, difícil pasar estructuras de datos complejas, sin interactividad, backpressure(se reciben más datos de los que se pueden procesar) |
Pipes & Filters-Interfaz uniforme | Facilita el desarrollo independiente de filtros, más fácil de comprender, fácil reconfiguración | Emperora el rendimiento si los datos deben transformarse |
Master-slave | Computacuón paralela, tolerancia a fallos | Dificultad de coordinación entre los nodos slaves, dependencia del Master, dependencia de configuración física |
MVC | Múltiples vistas del mismo modelo, sincronización de vistas, separación de incumbencias, facilidad para crear nuevas vistas y controladores, potencial para creación de marcos genéricos | Mayor complejidad en desarrollos de GUIS, Acoplación entre Modelos y Vistas, Controlador/Vista depende de la nterfaz del modelo, Dificultades con herramientas GUI |
PAC | Separación de responsabilidades, soporte para cambios y extensiones, multitarea | Complejidad del sistema, del componente de control y rendimiento |
Datos compartidos | Componentes independientes, facilita comunicación entre componentes, consistencia de datos | Punto de fallo único, posible cuello de botella, Sincronización en acceso a memoria compartida |
Blackboard | Experimentación, reusabilidad, tolerancia a fallos | Depuración, rendimiento, alto coste de desarrollo |
Sistemas basados en reglas | Mantenibilidad, separación de responsabilidades, reutilización | Depuración, rendimiento, creación y mantenimiento de las reglas |
Call-return | Sencillo de implementar | Ejecución concurrente, entornos distribuidos |
Cliente-Servidor | Servidores pueden estar distribuidos, separación de funcionalidad cliente/sevidor, funcionalidad general disponible para todos los clientes | Cada servidor puede ser un punto de fallo, rendimiento impredecible, seguridad |
Servidor replicado | Mejora tiempos de respuesta, menor latencia, tolerancia a fallos | mantenimiento de consistencia, sincronización |
Cliente-Servidor con caché | Menor carga en la red, menor tiempo de respuesta | Complejidad de configuración, no apropiado en ciertos dominios |
Basado en eventos | desacoplamiento, atemporalidad, asincronicidad | Solución no secuencial, consistencia del sistema, dificultad de depuración |
Publish-subscribe | calidad de comunicación, bajo acoplamiento, escalabilidad | se añade nivel de indirección, implementación compleja |
Modelos de actores | paralelismo, transparencia y escalabilidad, modelos de actores no locales | envío de mensajes, coordinación entre actores, sistemas no consistentes por definición |
CQRS | escalabilidad, facilita descomposición de equipos | operaciones híbridas(consulta/comando), complejidad, sincronización |
Event-Sourcing | tolerancia a fallos, trazabilidad, reconstrucción, escalabilidad | novedad desarrollo, consistencia de datos, actualización software, gestión de recursos |
Plugins | extensibilidad, personalización | consistencia, rendimiento, seguridad, gestión de plugins y dependencias |
Microkernel | portabilidad, flexibilidad y extensibilidad, seguridad y fiabilidad | rendimiento, complejidad del diseño, punto de fallo único |
Reflection | flexibilidad | implementación, rendimiento, seguridad |
Intérpretes y DSLs | flexiilidad, usabilidad, adaptabilidad | diseño del lenguaje, complejidad de implementación, rendimiento, seguridad |
Código móvil | flexibilidad y adaptación a diferentes entornos | complejidad de la implementación, seguridad |
Código bajo demanda | mejora experiencia de usuario, extensibilidad, adaptación a entorno del cliente | seguridad, coherencia |
Evaluación remota | Aprovechar capacidades de terceras partes | seguridad, configuración |
Agentes móviles | reducción del tráfico en la red, paralelismo implícito, tolerancia a fallos de red, conceptualmente sencillos, adaptación a cambios en el entorno | complejidad de la configuración, seguridad |