Curricula CS-UNI
5.50. CS391. Ingeniería de Software III (Electivo)

5.50. CS391. Ingeniería de Software III (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.50: Mapa de Conexión. CS391 Ingeniería de Software III

5.50.1. Justificación

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

1.
Implementar métricas avanzadas de aseguramiento de calidad y confiabilidad.
2.
Integrar prácticas de seguridad a lo largo del ciclo de vida del desarrollo de software.
3.
Comprender y aplicar principios de DevOps y Despliegue Continuo.
4.
Diseñar y desplegar aplicaciones nativas de la nube usando microservicios.
5.
Analizar el impacto de la deuda técnica y las estrategias de rejuvenecimiento de software.

5.50.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. (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

5.50.4.1. Conceptos de verificación y validación (12 horas) [Habilidades AG-C03,AG-C09]

Referencias Bibliográficas: [Sommerville, 2015Pressman and Maxim, 2019]

Temas

1.
Conceptos de verificación y validación
a)
Verificación: ¿Estamos construyendo la cosa correctamente?
b)
Validación: ¿Construimos la cosa correcta?
2.
Por qué importan las pruebas: ¿El componente sigue siendo funcional a medida que el código evoluciona?
3.
Objetivos de las pruebas
a)
Usabilidad
b)
Confiabilidad
c)
Conformidad con la especificación
d)
Rendimiento
e)
Seguridad

Aprendizaje esperado (Learning Outcomes)

1.
Explicar por qué las pruebas son importantes [Explicar]
2.
Distinguir entre validación y verificación de programas [Distinguir]
3.
Describir diferentes objetivos de las pruebas [Describir]
5.50.4.2. Herramientas y Análisis de Pruebas (3 horas) [Habilidades AG-C03,AG-C09]

Referencias Bibliográficas: [Pressman and Maxim, 2019]

Temas

1.
Herramientas y automatización de verificación y validación
a)
Análisis estático
b)
Cobertura de código
c)
Fuzzing
d)
Análisis dinámico y contención de fallos (sanitizadores, etc.)
e)
Registro y seguimiento de fallos
2.
Planificación y generación de pruebas
a)
Estimación de fallos y terminación de pruebas, incluyendo siembra de defectos
b)
Uso de números aleatorios y pseudoaleatorios en las pruebas
3.
Pruebas de sistemas asíncronos, paralelos y concurrentes
4.
Verificación y validación de artefactos que no son código (documentación, materiales de capacitación)

Aprendizaje esperado (Learning Outcomes)

1.
Describir y comparar diferentes herramientas para verificación y validación [Describir]
2.
Automatizar el uso de diferentes herramientas en un proyecto de software pequeño [Diseñar]
3.
Explicar cómo y cuándo se deben usar números aleatorios en las pruebas [Explicar]
4.
Describir enfoques para la estimación de fallos [Describir]
5.
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]
6.
Describir técnicas y problemas con las pruebas de software asíncrono, concurrente y paralelo [Describir]
7.
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]
8.
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]

Referencias Bibliográficas: [Bondi, 2015Gregg, 2020]

Temas

1.
Pruebas de rendimiento y evaluación comparativa
a)
Rendimiento (throughput) y latencia
b)
Degradación bajo carga (pruebas de estrés, manejo FIFO vs LIFO de solicitudes)
c)
Aceleración (speedup) y escalado (scaling)
1)
Ley de Amdahl
2)
Ley de Gustafson
3)
Escalado suave (soft) y débil (weak)
d)
Identificar y medir figuras de mérito (figures of merit)
e)
Cuellos de botella de rendimiento comunes
1)
Limitado por cómputo (compute-bound)
2)
Limitado por ancho de banda de memoria
3)
Limitado por latencia
f )
Métodos estadísticos y mejores prácticas para la evaluación comparativa (benchmarking)
1)
Estimación de la incertidumbre
2)
Intervalos de confianza
g)
Análisis y presentación (gráficos, etc.)
h)
Técnicas de medición de tiempo (timing)

Aprendizaje esperado (Learning Outcomes)

1.
Describir el rendimiento (throughput) y la latencia y proporcionar ejemplos de cada uno [Describir]
2.
Explicar la aceleración (speedup) y las diferentes formas de escalado (scaling) y cómo se calculan [Explicar]
3.
Describir cuellos de botella de rendimiento comunes [Describir]
4.
Describir métodos estadísticos y mejores prácticas para la evaluación comparativa (benchmarking) de software [Describir]
5.
Explicar técnicas y desafíos para medir el tiempo al construir una evaluación comparativa (benchmark) [Explicar]
6.
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]

Referencias Bibliográficas: [Sommerville, 2015]

Temas

1.
Ley de Hyrum / Ley de las Interfaces Implícitas
2.
Compatibilidad con versiones anteriores
a)
La compatibilidad no es una propiedad de una sola entidad, es una propiedad de una relación.
b)
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.
3.
Control de versiones (versioning)
a)
Versionado Semántico (SemVer)
b)
Desarrollo basado en tronco (trunk-based development)

Aprendizaje esperado (Learning Outcomes)

1.
Identificar tanto el comportamiento explícito como el implícito de una interfaz e identificar riesgos potenciales de la Ley de Hyrum [Analizar]
2.
Identificar cambios que pueden considerarse ampliamente çompatibles con versiones anteriores", potencialmente con declaraciones explícitas sobre qué uso está o no soportado [Analizar]
3.
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]

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

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.
Herramientas de prueba, incluyendo herramientas de análisis estático y dinámico. Fundamentos de Desarrollo de Software (SDF) -Practices,SEC-Coding
4.
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.

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.
Identificar elementos de configuración y usar una herramienta de control de código fuente en un proyecto pequeño basado en equipo [Analizar]
4.
Describir cómo las herramientas de prueba estáticas y dinámicas disponibles pueden integrarse en el entorno de desarrollo de software [Describir]
5.
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]

Referencias Bibliográficas: [Fowler, 2017]

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.
Malos olores del código (code smells) y otras indicaciones de la calidad del código, distintas de la corrección. Seguridad (SEC) -Engineering

Aprendizaje esperado (Learning Outcomes)

1.
Identificar la arquitectura de software estándar de un diseño de alto nivel dado [Analizar]
2.
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]
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.
Identificar las dependencias entre un conjunto de componentes de software en un diseño arquitectónico [Analizar]

5.50.5. Referencias Bibliográficas

[Sommerville, 2015]

[Pressman and Maxim, 2019]

[Bondi, 2015]

[Gregg, 2020]

[Kim et al., 2016]

[Fowler, 2017]

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

Escanea para abrir en tu teléfono