Curricula CS-UNI
5.52. CS394. Arquitectura de Software y DevOps para Software en la Nube (Electivo)

5.52. CS394. Arquitectura de Software y DevOps para Software en la Nube (Electivo)

  • Semestre: 8vo Sem. Créditos: 3
  • Horas del curso: Teoría: 2 horas; Práctica: 2 horas;
  • Prerrequisitos:

    • CS292. Ingeniería de Software II (7mo Sem)

Figura 5.52: Mapa de Conexión. CS394 Arquitectura de Software y DevOps para Software en la Nube

5.52.1. Justificación

El diseño de software moderno exige combinar principios sólidos de arquitectura con prácticas ágiles de entrega continua y operación en la nube. Este curso integra tres áreas que en la industria actual son inseparables: arquitectura de software, DevOps y computación en la nube.

El estudiante aprenderá a diseñar sistemas a escala usando patrones arquitectónicos reconocidos, a automatizar los ciclos de construcción, prueba y despliegue mediante pipelines de CI/CD, y a provisionar y operar infraestructura en plataformas de nube pública mediante contenedores, orquestación y herramientas de infraestructura como código.

El curso pone especial énfasis en la confiabilidad y observabilidad de sistemas distribuidos, cubriendo métricas, trazas distribuidas, presupuestos de error y prácticas de ingeniería de confiabilidad del sitio (SRE), tal como se aplican en organizaciones de tecnología de alto rendimiento.

5.52.2. Objetivos Generales

1.
Diseñar sistemas de software escalables y mantenibles aplicando patrones arquitectónicos modernos.
2.
Implementar pipelines de integración y entrega continua (CI/CD) para acelerar y asegurar el ciclo de vida del software.
3.
Desplegar y gestionar aplicaciones en contenedores sobre plataformas de nube pública usando herramientas estándar de la industria.
4.
Provisionar infraestructura de nube de forma reproducible y versionada mediante infraestructura como código (IaC).
5.
Aplicar prácticas de observabilidad y SRE para garantizar la confiabilidad de sistemas en producción.

5.52.3. Contribución a los resultados (Outcomes)

AG-C09) Diseño y Desarrollo de Soluciones: Diseña, implementa y evalúa soluciones para problemas complejos de computación. (Assessment)

AG-C11) Uso de Herramientas: Aplica herramientas modernas de computación en la resolución de problemas. (Assessment)

AG-C12) Aplica la teoría de la ciencia de la computación y los fundamentos de desarrollo de software para producir soluciones basadas en computadora. (Usage)

5.52.4. Contenido

5.52.4.1. Principios y Arquitectura de Software (8 horas) [Habilidades AG-C09,AG-C12]

Referencias Bibliográficas: [Bass et al., 2021Richards and Ford, 2020]

Temas

1.
Principios de diseño de sistemas. Fundamentos de Sistemas (SF) -Reliability
a)
Niveles de abstracción (por ejemplo, diseño arquitectónico y diseño detallado)
b)
Separación de preocupaciones (separation of concerns)
c)
Ocultación de información (information hiding)
d)
Acoplamiento y cohesión (coupling and cohesion)
2.
Arquitectura de software. Fundamentos de Sistemas (SF) -Reliability
a)
Paradigmas de diseño
1)
Descomposición funcional de arriba hacia abajo/diseño por capas
2)
Arquitectura orientada a datos
3)
Análisis y diseño orientado a objetos
4)
Diseño dirigido por eventos
b)
Arquitecturas estándar (por ejemplo, cliente-servidor y arquitecturas de microservicios incluyendo discusiones sobre REST, n-capas, tuberías y filtros, Modelo Vista Controlador)
c)
Identificar límites y dependencias de componentes
3.
Programación a gran escala vs programación a pequeña escala (programming in the large vs programming in the small). Fundamentos de Sistemas (SF) -Reliability
4.
Modelos estructurales y de comportamiento de diseños de software
5.
Modelado de diseño, por ejemplo con diagramas de clases, diagramas de entidad-relación o diagramas de secuencia
6.
Principios de diseño de API
a)
Consistencia
1)
Las API consistentes son más fáciles de aprender y menos propensas a errores
2)
La consistencia es tanto interna (entre diferentes partes de la API) como externa (siguiendo patrones comunes de API)
b)
Capacidad de composición (composability)
c)
Documentación de contratos
1)
Las operaciones de la API deben describir su efecto en el sistema, pero generalmente no su implementación
2)
Precondiciones, postcondiciones e invariantes
d)
Capacidad de expansión (expandability)
e)
Reporte de errores
1)
Los errores deben ser claros, predecibles y accionables
2)
La entrada que no coincida con el contrato debe producir un error
3)
Los errores que pueden gestionarse de manera confiable sin reportarse deben gestionarse

Aprendizaje esperado (Learning Outcomes)

1.
Identificar la arquitectura de software estándar de un diseño de alto nivel dado [Analizar]
2.
Identificar las dependencias entre un conjunto de componentes de software en un diseño arquitectónico [Analizar]
3.
Seleccionar y usar un paradigma de diseño apropiado para diseñar un sistema de software simple y explicar cómo se han aplicado los principios de diseño de sistemas en este diseño [Evaluar]
4.
Traducir un diseño de software en lenguaje natural a diagramas de clases [Traducir]
5.52.4.2. Calidad y Evaluación del Diseño (8 horas) [Habilidades AG-C09,AG-C12]

Referencias Bibliográficas: [Richards and Ford, 2020]

Temas

1.
Evaluar compensaciones de diseño (tradeoffs) (por ejemplo, eficiencia vs confiabilidad, seguridad vs usabilidad)
2.
Estilos arquitectónicos: en capas, orientado a eventos, microkernel, orientado a servicios, pipeline.
3.
Atributos de calidad: disponibilidad, escalabilidad, rendimiento, seguridad, mantenibilidad.
4.
Trazabilidad de requisitos
a)
Comprender qué requisitos son satisfechos por un diseño
5.
Medición y análisis de la calidad del diseño

Aprendizaje esperado (Learning Outcomes)

1.
Contrastar dos diseños de software a través de diferentes cualidades, como eficiencia o usabilidad [Contrastar]
2.
Identificar qué requisitos son satisfechos por un diseño de software proporcionado [Analizar]
3.
Adaptar un diseño de sistema defectuoso para que siga mejor principios como la separación de preocupaciones o la ocultación de información [Crear]
4.
Seleccionar el estilo arquitectónico más adecuado dados los atributos de calidad requeridos por un sistema. [Evaluar]
5.52.4.3. Diseño de API y Modelado (6 horas) [Habilidades AG-C09,AG-C11]

Referencias Bibliográficas: [Newman, 2021]

Temas

1.
Principios de microservicios: cohesión, acoplamiento débil y fronteras de servicio.
2.
Descomposición de monolitos: diseño orientado al dominio (DDD).
3.
Principios de diseño de API
a)
Consistencia
1)
Las API consistentes son más fáciles de aprender y menos propensas a errores
2)
La consistencia es tanto interna (entre diferentes partes de la API) como externa (siguiendo patrones comunes de API)
b)
Capacidad de composición (composability)
c)
Documentación de contratos
1)
Las operaciones de la API deben describir su efecto en el sistema, pero generalmente no su implementación
2)
Precondiciones, postcondiciones e invariantes
d)
Capacidad de expansión (expandability)
e)
Reporte de errores
1)
Los errores deben ser claros, predecibles y accionables
2)
La entrada que no coincida con el contrato debe producir un error
3)
Los errores que pueden gestionarse de manera confiable sin reportarse deben gestionarse
4.
API Gateway y malla de servicios (service mesh).
5.
Patrones de resiliencia: Circuit Breaker, Retry, Bulkhead, Timeout.
6.
Almacenes de Datos
a)
Estructuras de datos mantenidas cooperativamente que implementan mapas y TADs relacionados.
b)
Variedades: Propiedad exclusiva, compartida, fragmentada, replicada, inmutable, versionada.

Aprendizaje esperado (Learning Outcomes)

1.
Diseñar una API para un solo componente de un sistema de software grande, incluyendo la identificación y documentación de las invariantes, el contrato y las condiciones de error de cada operación [Diseñar]
2.
Evaluar una descripción de API en términos de consistencia, capacidad de composición y capacidad de expansión [Evaluar]
3.
Diseñar un sistema basado en microservicios descomponiendo una aplicación monolítica en servicios independientes. [Usar]
4.
Aplicar patrones de resiliencia para tolerar fallos en sistemas distribuidos. [Usar]
5.52.4.4. Virtualización (6 horas) [Habilidades AG-C11,AG-C12]

Referencias Bibliográficas: [Burns et al., 2022]

Temas

1.
Contenedores y su comparación con máquinas virtuales.
2.
Tipos de virtualización (incluyendo hardware/software, SO, servidor, servicio, red). Ver también: Fundamentos de Sistemas (SF) -Performance
3.
Virtualización portátil; emulación vs aislamiento. Ver también: Fundamentos de Sistemas (SF) -Performance
4.
Máquinas virtuales y escapes de contenedores, peligros desde una perspectiva de seguridad. Ver también: Seguridad (SEC) -Engineering
5.
Dockerfile: buenas prácticas para construir imágenes eficientes y seguras.
6.
Composición de aplicaciones multi-contenedor con docker-compose.

Aprendizaje esperado (Learning Outcomes)

1.
Explicar la diferencia entre emulación y aislamiento [Explicar]
2.
Evaluar las compensaciones de la virtualización [Evaluar]
3.
Construir y desplegar aplicaciones en contenedores usando Docker. [Usar]
4.
Aplicar buenas prácticas de seguridad en la construcción de imágenes Docker. [Usar]

5.52.4.5. Coordinación (6 horas) [Habilidades AG-C09,AG-C11]

Referencias Bibliográficas: [Burns et al., 2022]

Temas

1.
Arquitectura de Kubernetes: plano de control y nodos trabajadores.
2.
Objetos fundamentales: Pods, Deployments, Services, ConfigMaps, Secrets.
3.
Escalado horizontal automático (HPA) y autocuración.
4.
Dependencias
a)
La iniciación o progreso de una actividad puede depender de otras actividades, para evitar condiciones de carrera, garantizar la terminación o cumplir otros requisitos.
b)
Garantizar el progreso evitando ciclos de dependencia, usando condiciones monótonas, eliminando dependencias no esenciales.
5.
Gestión de paquetes con Helm.

Aprendizaje esperado (Learning Outcomes)

1.
Desplegar y gestionar aplicaciones en contenedores sobre un clúster de Kubernetes. [Usar]
2.
Configurar el escalado automático y la autocuración para cargas de trabajo nativas de la nube. [Usar]
3.
Modificar un sistema concurrente para usar un almacén de datos más escalable, confiable o disponible [Crear]
5.52.4.6. Control de Versiones y CI/CD (6 horas) [Habilidades AG-C11,AG-C12]

Referencias Bibliográficas: [Kim et al., 2021]

Temas

1.
Gestión de configuración de software y control de versiones: Fundamentos de Desarrollo de Software (SDF) -Practices
a)
Configuración en control de versiones, builds/configuración reproducibles.
b)
Estrategias de ramificación en control de versiones. Ramas de desarrollo vs ramas de lanzamiento. Desarrollo basado en tronco (trunk-based development).
c)
Estrategias de fusión/rebase, cuando sean relevantes.
2.
Gestión de lanzamientos (release management).
3.
Automatización de procesos de software:
a)
Sistemas de construcción (build systems): el valor de builds rápidos, herméticos y reproducibles, comparar/contrastar enfoques para construir un proyecto.
b)
Integración Continua (CI): el uso de automatización y pruebas automatizadas para hacer una validación preliminar de que la revisión actual del tronco se construye y pasa las pruebas (básicas).
c)
Despliegue Continuo (CD): el uso de automatización para liberar de forma automática cada cambio que supera las pruebas hacia el entorno de producción, garantizando entregas frecuentes y confiables.
d)
Gestión de dependencias: actualización de dependencias externas/aguas arriba, gestión de paquetes, SemVer.
4.
Herramientas de prueba, incluyendo herramientas de análisis estático y dinámico. Fundamentos de Desarrollo de Software (SDF) -Practices,SEC-Coding
5.
Conceptos y mecanismos de integración de herramientas. Fundamentos de Desarrollo de Software (SDF) -Practices
6.
Cultura DevOps: flujo, retroalimentación y aprendizaje continuo.

Aprendizaje esperado (Learning Outcomes)

1.
Describir la diferencia entre la gestión de configuración de software centralizada y distribuida [Describir]
2.
Describir cómo el control de versiones puede usarse para ayudar en la gestión de lanzamientos de software [Describir]
3.
Comprender el uso de sistemas de CI/CD como una fuente de verdad para el estado del código compartido del equipo (éxito en la construcción y pruebas) [Explicar]
4.
Demostrar la capacidad de usar herramientas de software para apoyar el desarrollo de un producto de software de tamaño mediano [Demostrar]
5.52.4.7. Control de Versiones y CI/CD (6 horas) [Habilidades AG-C11,AG-C12]

Referencias Bibliográficas: [Morris, 2021Kim et al., 2021]

Temas

1.
Principios de IaC: reproducibilidad, idempotencia y versionamiento de infraestructura.
2.
Enfoques declarativo vs. imperativo.
3.
Terraform: proveedores, recursos, módulos y gestión de estado.
4.
Herramientas nativas de nube: AWS CloudFormation, Azure ARM Templates, GCP Deployment Manager.
5.
Gestión de configuración de software y control de versiones: Fundamentos de Desarrollo de Software (SDF) -Practices
a)
Configuración en control de versiones, builds/configuración reproducibles.
b)
Estrategias de ramificación en control de versiones. Ramas de desarrollo vs ramas de lanzamiento. Desarrollo basado en tronco (trunk-based development).
c)
Estrategias de fusión/rebase, cuando sean relevantes.

Aprendizaje esperado (Learning Outcomes)

1.
Escribir y aplicar configuraciones de Terraform para aprovisionar infraestructura en la nube. [Usar]
2.
Identificar elementos de configuración y usar una herramienta de control de código fuente en un proyecto pequeño basado en equipo [Analizar]
3.
Comparar herramientas de IaC según sus capacidades de gestión de estado y modularidad. [Evaluar]
5.52.4.8. Aplicaciones en Red (6 horas) [Habilidades AG-C09,AG-C11]

Referencias Bibliográficas: [Kim et al., 2021Burns et al., 2022]

Temas

1.
Modelos de servicio en la nube: IaaS, PaaS, SaaS, FaaS.
2.
Paradigmas de aplicaciones distribuidas (por ejemplo, cliente/servidor, peer-to-peer, nube, edge y fog). Ver también: Computación Paralela y Distribuida (PDC) -Communication, Computación Paralela y Distribuida (PDC) -Coordination
3.
Principales proveedores: AWS, Google Cloud, Azure — servicios clave.
4.
Servicios de cómputo: máquinas virtuales, funciones serverless, contenedores administrados.
5.
Servicios de almacenamiento: objetos, bloque y bases de datos administradas.
6.
Redes en la nube: VPCs, balanceadores de carga, CDN.

Aprendizaje esperado (Learning Outcomes)

1.
Analizar las necesidades de demandas específicas de aplicaciones en red [Analizar]
2.
Comparar los modelos IaaS, PaaS, SaaS y FaaS para seleccionar el más adecuado a una arquitectura dada. [Evaluar]
3.
Diseñar una aplicación nativa de la nube usando servicios administrados de un proveedor principal. [Usar]
5.52.4.9. Ingeniería de Confiabilidad (6 horas) [Habilidades AG-C11,AG-C12]

Referencias Bibliográficas: [Kim et al., 2021]

Temas

1.
Análisis basado en mediciones de la confiabilidad del software - telemetría, monitorización y alertas, paneles de control, métricas de calificación de lanzamientos, etc.
2.
Los tres pilares de la observabilidad: métricas, logs y trazas distribuidas.
3.
Trazas distribuidas e identificadores de correlación.
4.
Prácticas de ingeniería de confiabilidad de software - incluyendo revisiones, pruebas, verificación de modelos práctica (practical model checking)
5.
Estrategias de alertas y prácticas de guardia (on-call).

Aprendizaje esperado (Learning Outcomes)

1.
Describir cómo determinar el nivel de confiabilidad requerido por un sistema de software [Describir]
2.
Identificar métodos que conducirán a la realización de una arquitectura de software que logre un nivel especificado de confiabilidad [Analizar]
3.
Implementar observabilidad en una aplicación de nube usando métricas, logs y trazas distribuidas. [Usar]
5.52.4.10. Confiabilidad del Sistema (6 horas) [Habilidades AG-C09,AG-C12]

Referencias Bibliográficas: [Kim et al., 2021]

Temas

1.
Concepto de confiabilidad como probabilidad de fallo o tiempo medio entre fallos, y fallas (faults) como causa de fallos (failures)
2.
Comparar el enfoque de "presupuesto de error"(error budget) para la confiabilidad con el enfoque "libre de errores"(error-free) e identificar dominios donde cada uno es relevante.
3.
Técnicas y modelos de tolerancia a fallos de software
a)
Diferencias contextuales en la tolerancia a fallos (por ejemplo, hacer fallar un sistema crítico para la aviación se evita firmemente, hacer fallar un sistema de procesamiento de datos antes de que se escriban datos corruptos en el almacenamiento es muy valioso)
4.
Confiabilidad mediante redundancia:
a)
verificación y reintento (check and retry) Sistemas Operativos (OS) -Faults,NC-Reliability
b)
codificación redundante (códigos de corrección de errores, CRC, FEC, RAID) Arquitectura y Organización (AR) -MemoryHierarchy,NC-Reliability,DM-DistributedDatabasesCloudComputing
c)
duplicación/reflejo (mirroring)/réplicas Gestión de Datos (DM) -DistributedDatabasesCloudComputing
5.
Confiabilidad del software, confiabilidad del sistema y comportamiento de fallos
6.
Indicadores de nivel de servicio (SLI), objetivos (SLO) y acuerdos (SLA).

Aprendizaje esperado (Learning Outcomes)

1.
Identificar formas de aplicar redundancia para lograr tolerancia a fallos [Analizar]
2.
Identificar dependencias de punto único de fallo (single-point-of-failure, SPF) en un diseño de sistema [Analizar]
3.
Explicar los problemas que existen para lograr niveles muy altos de confiabilidad [Explicar]
4.
Definir SLIs, SLOs y presupuestos de error para un servicio en producción. [Usar]

5.52.5. Referencias Bibliográficas

[Bass et al., 2021]

[Richards and Ford, 2020]

[Newman, 2021]

[Burns et al., 2022]

[Kim et al., 2021]

[Morris, 2021]

¿Encontraste una errata, un curso desactualizado, un enlace roto, o tienes una sugerencia? Cuéntanos.

Escanea para abrir en tu teléfono