Introducción

Arquitecto

El arquitecto toma decisiones arquitectónicamente significativas, que afectan la estructura, RNFs, dependencias, interfaces o técnicas de construcción.

  • Toma decisiones de grano grueso
  • Piensa en trade-offs.
  • Liga requerimientos a propuestas arquitectónicas

Claves

Conocimiento del dominio

Capacidad de hablar y reconocer problemas de forma general en un campo de conocimiento específico. Implica conocer también el campo del negocio.

Cohesión

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)

Acoplamiento

Mide la interdependencia de dos o mas componentes de software. Se puede reducir con refactoring y patrones de diseño.

Connascence

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

send_email(to, body):

  • paso1

  • paso2

  • paso3

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.

Representación

Componente

  • Encapsula un subconjunto de funcionalidad.}

  • Expone contratos/interfaces explícitas.

  • Altamente cohesionado

  • Librerías, Módulos, Sistemas, etc…

Quanta arquitectónica

Es una medida, no la descripción de un componente.

Architectural quantum is an independently deployable component with high functional cohesion.

Stakeholders

foto de tabla

Atributos de Calidad (NFR)

  • 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

Ley de Conway

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. 

Estructurales

Mantenibilidad

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.

Extensibilidad

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

Portabilidad

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.

Interoperabilidad

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

Operacionales

Se manifiestan con la operación del negocio, basado en el comportamiento frente a situaciones.

Performance

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.

Escalabilidad

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.

Confiabilidad

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.

Disponibilidad

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 ???

Otros

Transversales

Involucran varias partes de un sistema a varios niveles. Son más difícil de categorizar.

Elasticidad

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.

Seguridad

Grado en que el software protege la información y acceso de los datos.

Completamente transversal, cualquier pedazo de codigo puede ser vulnerable.

Auth

Usabilidad

Nivel de entrenamiento requerido por los usuarios para lograr sus metas con la aplicación/solución.

Eficiencia

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)

Reusabilidad

Capacidad de un sistema o componente de volver a ocuparse en otros sistemas más grandes

Funcionalidad compartida.

Soporte

Capacidad de responder a requerimientos de modificación, mantención y extensión puntual del sistema.

Tipos de Arquitectura

Capas

Estilos Arquitectónicos