El arquitecto toma decisiones arquitectónicamente significativas, que afectan la estructura, RNFs, dependencias, interfaces o técnicas de construcción.
Capacidad de hablar y reconocer problemas de forma general en un campo de conocimiento específico. Implica conocer también el campo del negocio.
La cohesión mide que tan relacionados están los elementos en un conjunto.
["manzana", "pera", "naranja"] # Buena cohesion (frutas)
["manzana", "gato", "matemáticas"] # Nada que ver entre sí
Librería Numpy tiene buena cohesión
Librería String tiene poca cohesión (funciones relacionadas con strings, pero realizan operaciones muy diversas)
Mide la interdependencia de dos o mas componentes de software. Se puede reducir con refactoring y patrones de diseño.
Dos componentes están en cierto grado de connascence si el cambio en uno requiere modificar el otro.
| Connascence | Ejemplo | Fix |
|---|---|---|
| Name | suma(a,b) =! sum(a,b) |
CTR + F y cambiar nombre |
| Position | divide(a,b) != divide(b,a) |
Usar KeyWordList en vez de argumentos posicionales. |
| Execution |
|
Requiere orden de pasos concreto |
| Timing | El tiempo de ejecuición puede cambiar funcionamiento del programa. | Timeouts? Awaits? |
| Identity | if user_id == 1 # Admin |
Depende como se defina. |
Encapsula un subconjunto de funcionalidad.}
Expone contratos/interfaces explícitas.
Altamente cohesionado
Librerías, Módulos, Sistemas, etc…
Es una medida, no la descripción de un componente.
Architectural quantum is an independently deployable component with high functional cohesion.
foto de tabla
Las propiedades no funcionales son resultado de las decisiones arquitectónicas.
Los NFR son los valores que se esperan de esas propiedades.
Estos atributos se deciden según:
Tiempo: cuánto tengo para implementarlo?
Costo
Mercado
Pasado, Presente y Futuro
La Ley de Conway es una teoría propuesta por Melvin Conway en 1967 que establece que las organizaciones diseñan sistemas que inevitablemente reflejan su propia estructura de comunicación.
En términos sencillos, la forma en que los equipos se organizan y se comunican influye directamente en la arquitectura del producto o sistema que desarrollan.
Un ejemplo es que si los equipos de desarrollo están divididos, el producto resultante probablemente tendrá componentes que también estén divididos.
Capacidad de poder solventar y reparar la operación de un sistema.
Implica que el código sea operable, simple y evolucionable.
Ejemplo: Sistema APT de Linux. Los paquetes instalados se corrigen casi solos cuando hay errores en las versiones de las dependencias.
Capacidad de extender un sistema y agregar funcionalidad
Útil para anticiparse al crecimiento del sistema futuro.
Alta cohesión y bajo acoplamiento facilitan la extensibilidad.
Ejemplo: VsCode porque:
Se basa en una arquitectura de extensiones
Bajo acoplamiento (plugins no dependen entre si)
Alta cohesión (cada plugin tiene su función específica)
Puntos de extensión bien definidos
Capacidad de funcionar en variedad de sistemas y plataformas con modificaciones mínimas
Una buena portabilidad asegura que la app corra en distintos servidores.
Ejemplo: Docker, porque replica la aplicación en distintos entornos.
Capacidad de interactuar con otros sistemas de componentes e intercambiar información.
Deben lograr entenderse a nivel sintáctico y semántico.
Interfaces/Contratos
APIs
Plugins
Se manifiestan con la operación del negocio, basado en el comportamiento frente a situaciones.
Carga de trabajo que una aplicación debe ejecutar en una unidad de tiempo, y/o deadlines que debe cumplir para una correcta operación.
Métricas:
Throughput: Carga de trabajo por unidad de tiempo (tps - transacciones por segundo)
Tiempo de respuesta: Latencia que una aplicacion exhibe al procesar carga de trabajo (ping - ms)
Deadline: Ventana de tiempo para completar una carga de trabajo.
No siempre es critico mejorar la performance, priorizarla puede perjudicar otros atributos. Se debe considerar el contexto, quizás 10 segundos son aceptables, por ejemplo una transferencia bancaria, con tal que sea segura.
Enfrentar aumento de demanda de forma funcional
Pasar de 1 a 100, 1M de usuarios en el tiempo.
Load Balancers, Brokers, Asincronía, Patrones, etc.
Una aplicación confiable protege su funcionamiento y datos y mantiene la operación.
Previsiones y estrategia ante fallos.
Promete SLAs (Acuerdo de Nivel de Servicio) como durabilidad, resistencia a caídas, etc.
Se enfoca en el funcionamiento correcto, cumplir en todo momento.
Puede mantener la operación el mayor tiempo posible (más 99.99x%)
SLA con tiempo asociado.
Asociado a confiabilidad, derivado.
Puede levantarse ante caída de componentes.
Watermelon Effect ???
Involucran varias partes de un sistema a varios niveles. Son más difícil de categorizar.
Capacidad de soportar aumentos “instantáneos” de demanda operacional, obteniendo recursos en función de las necesidades.
Requiere estructura, capacidad operacional, entorno compatible. Usualmente se dispone en entornos cloud.
Grado en que el software protege la información y acceso de los datos.
Completamente transversal, cualquier pedazo de codigo puede ser vulnerable.
Nivel de entrenamiento requerido por los usuarios para lograr sus metas con la aplicación/solución.
Capacidad de cumplir las metas de negocio con el menor uso de recursos posible
Depende mucho de otros NFR
Muy medible, muchas métricas (RAM, CPU)
Capacidad de un sistema o componente de volver a ocuparse en otros sistemas más grandes
Funcionalidad compartida.
Capacidad de responder a requerimientos de modificación, mantención y extensión puntual del sistema.