- ES Español

- EN English

5.50. Ingeniería de Software III (Electivo)
- Semestre: 8vo Sem. Créditos: 3
- Horas del curso: Teoría: 2 horas; Práctica: 2 horas;
- Sílabo:
- htmlonly

Español

English - Prerrequisitos:
- CS292 Ingeniería de Software II (7mo Sem) itemize
5.50.1. Justificación ↑ Volver arriba
Ingeniería de Software III se enfoca en temas avanzados del ciclo de vida del software, haciendo énfasis en la calidad del software, seguridad por diseño y despliegue en arquitecturas modernas. Este curso prepara a los estudiantes para manejar las complejidades del desarrollo nativo de la nube y la integración de prácticas de seguridad dentro de la canalización DevOps (DevSecOps), asegurando que los productos de software no solo sean funcionales, sino también resilientes y mantenibles.
5.50.2. Objetivos Generales ↑ Volver arriba
- Implementar métricas avanzadas de aseguramiento de calidad y confiabilidad.
- Integrar prácticas de seguridad a lo largo del ciclo de vida del desarrollo de software.
- Comprender y aplicar principios de DevOps y Despliegue Continuo.
- Diseñar y desplegar aplicaciones nativas de la nube usando microservicios.
- Analizar el impacto de la deuda técnica y las estrategias de rejuvenecimiento de software.
5.50.3. Contribución a los resultados (Outcomes) ↑ Volver arriba
- AG-C09) Diseño y Desarrollo de Soluciones: Diseña, implementa y evalúa soluciones para problemas complejos de computación. (Usage)
- AG-C03) Trabajo Individual y en Equipo: Se desempeña efectivamente como individuo y como miembro o líder en equipos diversos. (Usage)
5.50.4. Contenido ↑ Volver arriba
5.50.4.1. Conceptos de verificación y validación (12 horas) [Habilidades AG-C03,AG-C09] ↑ Volver arriba
Referencias Bibliográficas: (Sommerville, 2015; Pressman and Maxim, 2019)
Temas
- Conceptos de verificación y validación
- Verificación: ?`Estamos construyendo la cosa correctamente?
- Validación: ?`Construimos la cosa correcta? enumerate
- Por qué importan las pruebas: ¿El componente sigue siendo funcional a medida que el código evoluciona?
- Objetivos de las pruebas
- Usabilidad
- Confiabilidad
- Conformidad con la especificación
- Rendimiento
- Seguridad enumerate
Aprendizaje esperado (Learning Outcomes)
- Explicar por qué las pruebas son importantes [Explicar]
- Distinguir entre validación y verificación de programas [Distinguir]
- Describir diferentes objetivos de las pruebas [Describir]
5.50.4.2. Herramientas y Análisis de Pruebas (3 horas) [Habilidades AG-C03,AG-C09] ↑ Volver arriba
Referencias Bibliográficas: (Pressman and Maxim, 2019)
Temas
- Herramientas y automatización de verificación y validación
- Análisis estático
- Cobertura de código
- Fuzzing
- Análisis dinámico y contención de fallos (sanitizadores, etc.)
- Registro y seguimiento de fallos enumerate
- Planificación y generación de pruebas
- Estimación de fallos y terminación de pruebas, incluyendo siembra de defectos
- Uso de números aleatorios y pseudoaleatorios en las pruebas enumerate
- Pruebas de sistemas asíncronos, paralelos y concurrentes
- Verificación y validación de artefactos que no son código (documentación, materiales de capacitación)
Aprendizaje esperado (Learning Outcomes)
- Describir y comparar diferentes herramientas para verificación y validación [Describir]
- Automatizar el uso de diferentes herramientas en un proyecto de software pequeño [Diseñar]
- Explicar cómo y cuándo se deben usar números aleatorios en las pruebas [Explicar]
- Describir enfoques para la estimación de fallos [Describir]
- Estimar el número de fallos en una aplicación de software pequeña basándose en la densidad de fallos y la siembra de fallos [Estimar]
- Describir técnicas y problemas con las pruebas de software asíncrono, concurrente y paralelo [Describir]
- Crear un plan de pruebas para un segmento de código de tamaño mediano que contenga código asíncrono, concurrente y/o paralelo, incluyendo una matriz de pruebas y generación de datos y entradas de prueba [Crear]
- Describir técnicas para la verificación y validación de artefactos que no son código [Describir]
5.50.4.3. Pruebas de Rendimiento y Evaluación Comparativa (3 horas) [Habilidades AG-C03,AG-C09] ↑ Volver arriba
Referencias Bibliográficas: (Bondi, 2015; Gregg, 2020)
Temas
- Pruebas de rendimiento y evaluación comparativa
- Rendimiento (throughput) y latencia
- Degradación bajo carga (pruebas de estrés, manejo FIFO vs LIFO de solicitudes)
- Aceleración (speedup) y escalado (scaling)
- Ley de Amdahl
- Ley de Gustafson
- Escalado suave (soft) y débil (weak) enumerate
- Identificar y medir figuras de mérito (figures of merit)
- Cuellos de botella de rendimiento comunes
- Limitado por cómputo (compute-bound)
- Limitado por ancho de banda de memoria
- Limitado por latencia enumerate
- Métodos estadísticos y mejores prácticas para la evaluación comparativa (benchmarking)
- Estimación de la incertidumbre
- Intervalos de confianza enumerate
- Análisis y presentación (gráficos, etc.)
- Técnicas de medición de tiempo (timing) enumerate
Aprendizaje esperado (Learning Outcomes)
- Describir el rendimiento (throughput) y la latencia y proporcionar ejemplos de cada uno [Describir]
- Explicar la aceleración (speedup) y las diferentes formas de escalado (scaling) y cómo se calculan [Explicar]
- Describir cuellos de botella de rendimiento comunes [Describir]
- Describir métodos estadísticos y mejores prácticas para la evaluación comparativa (benchmarking) de software [Describir]
- Explicar técnicas y desafíos para medir el tiempo al construir una evaluación comparativa (benchmark) [Explicar]
- Identificar las figuras de mérito, construir y ejecutar una evaluación comparativa (benchmark) y analizar estadísticamente y visualizar los resultados para un proyecto de software pequeño [Analizar]
5.50.4.4. Compatibilidad y Versionado de API (12 horas) [Habilidades AG-C03,AG-C09] ↑ Volver arriba
Referencias Bibliográficas: (Sommerville, 2015)
Temas
- Ley de Hyrum / Ley de las Interfaces Implícitas
- Compatibilidad con versiones anteriores
- La compatibilidad no es una propiedad de una sola entidad, es una propiedad de una relación.
- La compatibilidad con versiones anteriores debe evaluarse en términos de proveedor + consumidor(es) o con un modelo bien especificado de qué formas de compatibilidad aspira/promete un proveedor. enumerate
- Control de versiones (versioning)
- Versionado Semántico (SemVer)
- Desarrollo basado en tronco (trunk-based development) enumerate
Aprendizaje esperado (Learning Outcomes)
- Identificar tanto el comportamiento explícito como el implícito de una interfaz e identificar riesgos potenciales de la Ley de Hyrum [Analizar]
- Identificar cambios que pueden considerarse ampliamente "compatibles con versiones anteriores", potencialmente con declaraciones explícitas sobre qué uso está o no soportado [Analizar]
- Evaluar si un cambio propuesto es lo suficientemente seguro dada la metodología de control de versiones en uso para un proyecto dado [Evaluar]
5.50.4.5. Control de Versiones y CI/CD (12 horas) [Habilidades AG-C03,AG-C09] ↑ Volver arriba
Referencias Bibliográficas: (Kim et al., 2016)
Temas
- Gestión de configuración de software y control de versiones: Prácticas de Desarrollo de Software
- Configuración en control de versiones, builds/configuración reproducibles.
- Estrategias de ramificación en control de versiones. Ramas de desarrollo vs ramas de lanzamiento. Desarrollo basado en tronco (trunk-based development).
- Estrategias de fusión/rebase, cuando sean relevantes. enumerate
- Gestión de lanzamientos (release management).
- Herramientas de prueba, incluyendo herramientas de análisis estático y dinámico. Prácticas de Desarrollo de Software , Flujo de Información y No Interferencia , Inyección y Validación de Entrada , Seguridad de Memoria y Tipos , Análisis de Malware y Seguridad Avanzada
- Automatización de procesos de software:
- Sistemas de construcción (build systems): el valor de builds rápidos, herméticos y reproducibles, comparar/contrastar enfoques para construir un proyecto.
- 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).
- 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.
- Gestión de dependencias: actualización de dependencias externas/aguas arriba, gestión de paquetes, SemVer. enumerate
Aprendizaje esperado (Learning Outcomes)
- Describir la diferencia entre la gestión de configuración de software centralizada y distribuida [Describir]
- Describir cómo el control de versiones puede usarse para ayudar en la gestión de lanzamientos de software [Describir]
- Identificar elementos de configuración y usar una herramienta de control de código fuente en un proyecto pequeño basado en equipo [Analizar]
- Describir cómo las herramientas de prueba estáticas y dinámicas disponibles pueden integrarse en el entorno de desarrollo de software [Describir]
- 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]
5.50.4.6. Principios y Arquitectura de Software (12 horas) [Habilidades AG-C03,AG-C09] ↑ Volver arriba
Referencias Bibliográficas: (Fowler, 2017)
Temas
- Principios de diseño de sistemas. Confiabilidad del Sistema
- Niveles de abstracción (por ejemplo, diseño arquitectónico y diseño detallado)
- Separación de preocupaciones (separation of concerns)
- Ocultación de información (information hiding)
- Acoplamiento y cohesión (coupling and cohesion) enumerate
- Arquitectura de software. Confiabilidad del Sistema
- Paradigmas de diseño
- Descomposición funcional de arriba hacia abajo/diseño por capas
- Arquitectura orientada a datos
- Análisis y diseño orientado a objetos
- Diseño dirigido por eventos enumerate
- Arquitecturas estándar (por ejemplo, cliente-servidor y arquitecturas de microservicios incluyendo discusiones sobre REST, n-capas, tuberías y filtros, Modelo Vista Controlador)
- Identificar límites y dependencias de componentes enumerate
- Programación a gran escala vs programación a pequeña escala (programming in the large vs programming in the small). Confiabilidad del Sistema
- Malos olores del código (code smells) y otras indicaciones de la calidad del código, distintas de la corrección. Diseño e Ingeniería de Controles de Seguridad , Análisis de Amenazas e Ingeniería de Seguridad , Computación Confiable e Ingeniería de Privacidad
Aprendizaje esperado (Learning Outcomes)
- Identificar la arquitectura de software estándar de un diseño de alto nivel dado [Analizar]
- 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]
- 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]
- Identificar las dependencias entre un conjunto de componentes de software en un diseño arquitectónico [Analizar]
5.50.5. Referencias Bibliográficas ↑ Volver arriba
Sommerville, I. (2015). Software Engineering. Pearson, 10th edition.
Pressman, R. S. and Maxim, B. (2019). Software Engineering: A Practitioner's Approach. McGraw-Hill Education, 9th edition.
Bondi, A. B. (2015). Foundations of Software and System Performance Engineering: Process, Performance Modeling, Requirements, Testing, Scalability, and Practice. Addison-Wesley, Upper Saddle River, NJ.
Gregg, B. (2020). Systems Performance: Enterprise and the Cloud. Addison-Wesley Professional, Boston, MA, 2nd edition.
Kim, G., Humble, J., Debois, P., and Willis, J. (2016). The DevOps Handbook. IT Revolution Press.
Fowler, M. (2017). Refactoring: Improving the Design of Existing Code. Addison-Wesley, 2nd edition.