5.29. Ingeniería de Software I (Obligatorio)

5.29. Ingeniería de Software I (Obligatorio)

Figura 5.29: Mapa de Conexión. CS291 Ingeniería de Software I

5.29.1. Justificación ↑ Volver arriba

La ingeniería de software es una disciplina colaborativa que aplica procesos estructurados para construir sistemas de alta calidad. Este primer curso se enfoca en los aspectos fundamentales del ciclo de vida del software, desde los requisitos iniciales y el diseño centrado en el usuario hasta las pruebas sistemáticas. Al integrar principios de HCI y fundamentos de desarrollo rigurosos, los estudiantes aprenderán a crear software que sea técnicamente sólido y orientado al usuario.

5.29.2. Objetivos Generales ↑ Volver arriba

  1. Comprender y aplicar varios modelos de proceso de software y gestión de configuración.
  2. Dominar la elicitación y modelado de requisitos usando notaciones estandarizadas.
  3. Diseñar interfaces de usuario intuitivas basadas en principios de evaluación y diseño de HCI.
  4. Implementar estrategias sistemáticas de prueba y comprender la calidad del software.
  5. Desarrollar habilidades profesionales para el desarrollo colaborativo de software.

5.29.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.29.4. Contenido ↑ Volver arriba

5.29.4.1. Control de Versiones y CI/CD (12 horas) [Habilidades AG-C03,AG-C09] ↑ Volver arriba

Referencias Bibliográficas: (Sommerville, 2015; Pressman and Maxim, 2019)

Temas

  1. Gestión de configuración de software y control de versiones: Prácticas de Desarrollo de Software
    1. Configuración en control de versiones, builds/configuración reproducibles.
    2. Estrategias de ramificación en control de versiones. Ramas de desarrollo vs ramas de lanzamiento. Desarrollo basado en tronco (trunk-based development).
    3. Estrategias de fusión/rebase, cuando sean relevantes. enumerate
    4. Gestión de lanzamientos (release management).
    5. 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
    6. Automatización de procesos de software:
      1. Sistemas de construcción (build systems): el valor de builds rápidos, herméticos y reproducibles, comparar/contrastar enfoques para construir un proyecto.
      2. 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).
      3. 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.
      4. Gestión de dependencias: actualización de dependencias externas/aguas arriba, gestión de paquetes, SemVer. enumerate

      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.29.4.2. Ingeniería de Requisitos (14 horas) [Habilidades AG-C03,AG-C09] ↑ Volver arriba

      Referencias Bibliográficas: (Sommerville, 2015; Wiegers and Beatty, 2013)

      Temas

      1. Describir requisitos funcionales usando, por ejemplo, casos de uso o historias de usuario.
        1. Usar al menos un método para documentar y estructurar requisitos funcionales.
        2. Comprender cómo el método apoya el diseño y la implementación.
        3. Fortalezas y debilidades de usar un enfoque específico. enumerate
        4. Propiedades de los requisitos, incluyendo consistencia, validez, completitud y viabilidad.
        5. Obtención (elicitation) de requisitos.
          1. Fuentes de requisitos, por ejemplo, usuarios, administradores o personal de soporte.
          2. Métodos de recopilación de requisitos, por ejemplo, encuestas, entrevistas o análisis de comportamiento. enumerate
          3. Requisitos no funcionales, por ejemplo, seguridad, usabilidad o rendimiento, también llamados Atributos de Calidad. Diseño Sostenible y Computación Ubicua , Huella Ambiental de los Sistemas Informáticos , Efectos Sistémicos y Contexto Social
          4. Identificación y gestión de riesgos, incluyendo consideraciones éticas en torno al producto propuesto. Códigos de Ética y Responsabilidad Legal , Responsabilidad Profesional y Política Pública , Valores, Naturaleza y Actualización Profesional , Disidencia Ética y Contexto Cultural , Ética en el Lugar de Trabajo
          5. Comunicar y/o formalizar especificaciones de requisitos.

          Aprendizaje esperado (Learning Outcomes)

          1. Comparar diferentes métodos de obtención de requisitos a lo largo de múltiples ejes [Comparar]
          2. Identificar diferencias entre dos métodos de describir requisitos funcionales (por ejemplo, entrevistas con clientes, estudios de usuarios) y las situaciones donde se preferiría cada uno [Analizar]
          3. Identificar qué comportamientos son requeridos, permitidos o prohibidos a partir de un conjunto dado de requisitos y una lista de comportamientos candidatos [Analizar]
          4. Recopilar un conjunto de requisitos para un sistema de software simple [Analizar]
          5. Identificar áreas de un sistema de software que deben cambiarse, dada una descripción del sistema y un conjunto de nuevos requisitos a implementar [Analizar]
          6. Identificar los requisitos funcionales y no funcionales en un conjunto de requisitos [Analizar]
          5.29.4.3. Colaboración y Dinámica de Equipo (14 horas) [Habilidades AG-C03,AG-C09] ↑ Volver arriba

          Referencias Bibliográficas: (Wigdor and Wixon, 2011; Johnson, 2013)

          Temas

          1. Comunicación efectiva, incluida la oral y escrita, así como formal (correo electrónico, documentos, comentarios, presentaciones) e informal (chat de equipo, reuniones). Comunicación Técnica y Profesional , Comunicación en Equipo y Cultura
          2. Causas comunes de conflicto en el equipo y enfoques para la resolución de conflictos.
          3. Programación cooperativa:
            1. Programación por parejas (pair programming) o Enjambre (swarming)
            2. Revisión de código
            3. Colaboración mediante control de versiones enumerate
            4. Roles y responsabilidades en un equipo de software: Códigos de Ética y Responsabilidad Legal , Responsabilidad Profesional y Política Pública , Valores, Naturaleza y Actualización Profesional , Disidencia Ética y Contexto Cultural , Ética en el Lugar de Trabajo
              1. Ventajas del trabajo en equipo
              2. Riesgos y complejidad de dicha colaboración enumerate
              3. Procesos del equipo: responsabilidades para las tareas, estimación de esfuerzo, estructura de reuniones, cronograma de trabajo

              Aprendizaje esperado (Learning Outcomes)

              1. Seguir prácticas efectivas de comunicación en equipo [Analizar]
              2. Articular las fuentes, peligros y beneficios potenciales del conflicto en el equipo, especialmente enfocándose en el valor de estar en desacuerdo sobre ideas o propuestas sin insultar a las personas [Articular]
              3. Facilitar una estrategia de resolución de conflictos y resolución de problemas en un entorno de equipo [Analizar]
              4. Colaborar efectivamente en desarrollo/programación cooperativa [Analizar]
              5. Proponer y delegar los roles y responsabilidades necesarios en un equipo de desarrollo de software [Proponer]
              6. Redactar y seguir una agenda para una reunión de equipo [Componer]
              7. Facilitar, a través de la participación en un proyecto de equipo, los elementos centrales de la formación de equipos, el establecimiento de una cultura de equipo saludable y la gestión de equipos, incluida la creación y ejecución de un plan de trabajo del equipo [Crear]
              5.29.4.4. Principios y Arquitectura de Software (12 horas) [Habilidades AG-C03,AG-C09] ↑ Volver arriba

              Referencias Bibliográficas: (Gamma et al., 1994a; Pressman and Maxim, 2019)

              Temas

              1. Principios de diseño de sistemas. Confiabilidad del Sistema
                1. Niveles de abstracción (por ejemplo, diseño arquitectónico y diseño detallado)
                2. Separación de preocupaciones (separation of concerns)
                3. Ocultación de información (information hiding)
                4. Acoplamiento y cohesión (coupling and cohesion) enumerate
                5. Arquitectura de software. Confiabilidad del Sistema
                  1. 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 enumerate
                    5. Arquitecturas estándar (por ejemplo, cliente-servidor y arquitecturas de microservicios incluyendo discusiones sobre REST, n-capas, tuberías y filtros, Modelo Vista Controlador)
                    6. Identificar límites y dependencias de componentes enumerate
                    7. Programación a gran escala vs programación a pequeña escala (programming in the large vs programming in the small). Confiabilidad del Sistema
                    8. 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)

                    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.29.4.5. 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

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

                        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.29.4.6. Herramientas y Análisis de Pruebas (4 horas) [Habilidades AG-C03,AG-C09] ↑ Volver arriba

                        Referencias Bibliográficas: (Sommerville, 2015; Pressman and Maxim, 2019)

                        Temas

                        1. Herramientas y automatización de verificación y validación
                          1. Análisis estático
                          2. Cobertura de código
                          3. Fuzzing
                          4. Análisis dinámico y contención de fallos (sanitizadores, etc.)
                          5. Registro y seguimiento de fallos enumerate
                          6. Planificación y generación de pruebas
                            1. Estimación de fallos y terminación de pruebas, incluyendo siembra de defectos
                            2. Uso de números aleatorios y pseudoaleatorios en las pruebas enumerate
                            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.29.4.7. Pruebas de Rendimiento y Evaluación Comparativa (4 horas) [Habilidades AG-C03,AG-C09] ↑ Volver arriba

                            Referencias Bibliográficas: (Bondi, 2015; Gregg, 2020)

                            Temas

                            1. Pruebas de rendimiento y evaluación comparativa
                              1. Rendimiento (throughput) y latencia
                              2. Degradación bajo carga (pruebas de estrés, manejo FIFO vs LIFO de solicitudes)
                              3. Aceleración (speedup) y escalado (scaling)
                                1. Ley de Amdahl
                                2. Ley de Gustafson
                                3. Escalado suave (soft) y débil (weak) enumerate
                                4. Identificar y medir figuras de mérito (figures of merit)
                                5. 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 enumerate
                                  4. Métodos estadísticos y mejores prácticas para la evaluación comparativa (benchmarking)
                                    1. Estimación de la incertidumbre
                                    2. Intervalos de confianza enumerate
                                    3. Análisis y presentación (gráficos, etc.)
                                    4. Técnicas de medición de tiempo (timing) enumerate

                                    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.29.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.

                                    Wiegers, K. and Beatty, J. (2013). Software Requirements. Microsoft Press, 3rd edition.

                                    Wigdor, D. and Wixon, D. (2011). Brave NUI World: Designing Natural User Interfaces for Touch and Gesture. Morgan Kaufmann.

                                    Johnson, J. (2013). Designing with the Mind in Mind. Morgan Kaufmann, 2nd edition.

                                    Gamma, E., Helm, R., Johnson, R., and Vlissides, J. (1994a). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional.

                                    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.

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

                                    Escanea para abrir en tu teléfono