Curso 2013-14
Ingeniería de Software
Titulación: | Código: | Tipo: |
Grado en Ingeniería Informática | 21418 | Obligatoria 2º curso |
Grado en Ingeniería Telemática | 21770 | Optativa |
Grado en Ingeniería en Sistemas Audiovisuales | 21657 | Optativa |
Créditos ECTS: | 8 | Dedicación: | 200 horas | Trimestre: | 2º y 3º |
Departamento: | Dpto. de Tecnologías de la Información y las Comunicaciones |
Coordinador: | Anders Jonsson |
Profesorado: | Anders Jonsson, Radwan Qasrawi, Kamruddin Nur, Oriol Galimany |
Idioma: | Anders Jonsson: Castellano Radwan Qasrawi, Kamruddin Nur: Inglés Oriol Galimany: Catalán |
Horario: | |
Campus: | Campus de la Comunicación - Poblenou |
La ingeniería de software se encarga de desarrollar y de mantener los sistemas de software para que sean eficientes y fiables. También se dedica a desarrollar software de manera asequible para satisfacer los requerimientos de los clientes y de los usuarios que han definido y especificado la solución. Es una disciplina importante por el impacto amplio que tiene el software en las actividades económicas de la humanidad y la sociedad moderna y por el papel que juega el software en sistemas críticas y en la seguridad de muchas aplicaciones. La disciplina integra métodos formales de las matemáticas, de las ciéncias de la computación y de las prácticas y orígenes de la ingeniería.
Así pues, la ingeniería de software es la aplicación sistemática, disciplinada, cuantificable y rigurosa de enfoques de desarrollo, operación, mantenimiento e implementación del software. Evidentemente, el estudio de los enfoques que conducen a la producción de software de calidad es la materia central de la ingeniería de software. Simplemente, la ingeniería de software se preocupa para construir correctamente el software. El software no puede fallar porque, hoy dia, se controlan, se usan o se regulan miles de actividades a través de sistemas que ejecutan software.
La ingeniería de software engloba una serie de conocimientos, definiciones de procesos, prácticas, herramientas y estándares. Todo este conocimiento lo utilizan los equipos de trabajo que llevan a cabo tareas que producen productos de software de alta calidad y que cumple con las necesidades de los usuarios. Las tareas incluyen el análisis y la especificación, el diseño, la implementación, la verificación, la realización de pruebas, el mantenimiento y la gestión de los proyectos. Todo eso a tiempo y dentro del presupuesto establecido.
La ingeniería de software moderna también tiene un enfoque importante para que los proyectos produzcan sistemas sostenibles y que su impacto al medio ambiente sea mínimo y sus objetivos consideren también principios sociales y éticos. Los ingenieros de software aplican la tecnología per tal de desarrollar nuevos sistemas, construir nuevos instrumentos y utilizar la tecnología para el progreso y el beneficio general, al mismo tiempo que se garantiza la calidad de los resultados.
Es recomendable haber aprobado las asignaturas de programación (Fundamentos de Programación, Programación Orientada a Objetos, Estructuras de Datos y Algoritmos).
Los requerimientos incluyen la capacidad de trabajar en equipo, la solución de problemas, la organización, la planificación, el diseño conceptual y las habilidades cognitivas.
Competencias generales | Competencias específicas |
---|---|
Instrumentales 1.- Las habilidades cognitivas (comprensión, interrelación de ideas y pensamientos, análisis y síntesis) son muy importantes para la resolución de problemas, la planificación, el análisis y el diseño. 2.- Sentido común. De manera similar, esta competencia es una herramienta para resolver los problemas de diseño i dar prioridad a restricciones y requerimientos. 3.- Organización del tiempo. Ser capaz de resolver un problema complejo de forma subóptima, dadas las restricciones de tiempo. Planificar anticipadamente la gestión del tiempo es fundamental en todas las actividades de ingeniería. 4.- Investigación documental y uso de fuentes y referencias. Como el diseño es principalmente una resolución conceptual de problemas, el hecho de utilizar el conocimiento existente es fundamental en el desarrollo del software de calidad. Interpersonales 1.- Capacidad de comunicación. El contexto de trabajo de la ingeniería de software es normalmente una colaboración en equipo donde se tienen que comunicar problemas, soluciones y criterios, tanto en un lenguaje técnico como en un lenguaje para usuarios que no son técnicos. La comunicación tiene que ser efectiva tanto de forma escrita como oral, en presentaciones a clientes o en equipos de trabajo pequeños. 2.- Capacidad de comunicación con expertos de otros ámbitos. Los ingenieros de software interactuan con otros ingenieros en proyectos complejos, así como con usuarios y consumidores del sistema de software final. Las soluciones son efectivas si se obtiene la información clara y los acuerdos necesarios. 3.- Lideraje. Ser capaz de tomar decisiones en un grupo de trabajo o de guiar el proceso de pensamiento a soluciones efectivas. Salir de la situación de falta de productividad es esencial. 4.- Uso de instrumentos tecnológicos. Para poder aplicar diferentes tecnologías, enfoques y patrones, se tienen que utilizar herramientas de manera idonea. 5.- Capacidad de aplicar la teoría a la práctica. La construcción de sistemas de software de magnitud real requiere fundamentos y la aplicación de conceptos teóricos a la práctica sólida y sistemática. Sistémicas 1.- Gestión de la información. Un problema complejo se presenta con mucha información, a veces inconsistente o incompleta. El ingeniero de software tiene que organizar la documentación de requerimientos, de gestión del proyecto y del producto. 2.- Análisis de puntos fuertes y débiles. Ser capaz de identificar el punto más débil de'un sistema es fundamental para juzgar su calidad y seguridad. 3.- Toma de decisiones. A partir de un análisis previo, poder optar a las mejores opciones disponibles. 4.- Introducción de mejoras. Es muy importante poder analizar una solución y poder sugerir mejoras. 5.- Capacidad de generar ideas nuevas. Para resolver un problema complejo, se tiene que disponer de la creatividad suficiente como para generar alternativas. 6.- Interés para la calidad. Esta competencia es fundamental para la aplicación de soluciones tecnológicas a un problema. 7.- Diseño y dirección de proyectos. Se tiene que ser capaz de crear soluciones que satisfagan los requerimientos y de gestionar los procesos que implementan el diseño. 8.- Anticipación de riesgos. Cada proyecto tiene riesgos y posibles cambios. Por eso, se tiene que hacer una planificación que pueda ajustar soluciones y diseños a cambios o modificaciones en los requerimientos. 9.-Rediseño de procesos. Cada proceso que presenta poca eficiencia o proporciona productos de baja calidad tiene que ser revisado. 10.- Capacidad de adaptación a soluciones nuevas. Los cambios causan ajustes y se necesita la capacidad de adaptación. 11.- Capacidad de aprendizaje. Es muy importante estar dispuesto a asimilar conceptos nuevos y nuevas tecnologías en una era de cambio tecnológico constante. |
Las competencias específicas se resumen en tres grandes capacidades. 1.- Conocimiento de las herramientas, de las prácticas y de las metodologías de la ingeniería de software. 2.- Capacidad para analizar y descubrir requerimientos de un problema complejo, la solución del cual involucra el desarrollo de un sistema de software. 3.- Capacidad de diseñar e implementar una solución para el problema complejo que se adhiere a los principios de la ingeniería de software y que satisfaga los requerimientos funcionales al mismo tiempo que cumple con especificaciones de alta calidad y que se implementa dentro del tiempo y el presupuesto anticipados. Si se desglosan estas capacidades i competencias, a continuación obtendremos los detalles siguientes sobre las competencias específicas. 1.- Conocimiento de las diferentes metodologías de la ingeniería de software. 1.a.- Conocimiento de los diferentes tipos del "ciclo de vida" del software. 1.b.- Capacidad de escoger una metodología concreta entre las existentes según el caso concreto. 1.c.- Capacidad de entender como el proceso de análisis y las decisiones de diseño afectan al producto final. 2.- Capacidad de analizar y de describir los requerimientos de un problema complejo. 2.a.- Capacidad de extraer los requerimientos: identificar las partes interesadas, los actores, los casos de uso, clasificar requerimientos según si son funcionales, no funcionales o de dominio. 2.b.- Capacidad de expresar requerimientos de forma organizada i técnicamente concreta y unívoca. 2.c.- Dominio de algún lenguaje de modelado estándar (por ejemplo UML) para expresar requerimientos. 2.d.- Capacidad de trabajo en equipo para capturar requerimientos. 2.e.- Capacidad de comunicación de requerimientos a clientes, de forma clara para obtener retroalimentación y validar requerimientos. 3.- Capacidad de diseñar una solución para un problema complejo de ingeniería de software a partir de requerimientos. 3.a.- Capacidad de entender los requerimientos dados. 3.b.- Capacidad de organización y de planificación de diversas fases y tareas de desarrollo. 3.c.- Toma de decisiones de diseño. Para conseguirlo, se tienen que seguir dos pasos: a) Identificar las fuerzas involucradas y encontrar la mejor solución que obtenga un equilibrio entre los criterios y las prioridades. b) Verificar que la solución tenga componentes y módulos con un mínimo de acoplamiento y máxima cohesión. 3.d.- Capacidad de comunicar de forma convincente y clara las decisiones tomadas en la resolución de un caso práctico. 3.e.- Optimización del tiempo: capacidad de encontrar una aproximación suficientemente buena a la solución de un problema complejo. 3.f.- Capacidad de trabajo en equipo. 3.g.- Conocimientos de tecnologías orientadas a objetos. Por eso, se necesita: a) dominio de un lenguaje orientado a objetos (por ejemplo, C++) b) conocimientos de un lenguaje estándar de modelado (por ejemplo UML) c) capacidat de aplicar y utilizar patrones de diseño. 3.h.- Capacidad de implementar el diseño. Por eso, se necesita la capacidad de obtener retroalimentación, de revisar el código y de hacer pruebas para ajustar el diseño. 3.i.- Capacidad de realizar pruebas y de validar la implementación de una solución. |
Criterios generales de evaluación
Se evaluarán todos los tipos de competencias de la sección 3, así como las competencias específicas a través de las siguientes actividades que se evaluan y son obligatorias:
• Cuatro exámenes (al medio y al final de cada uno de los dos trimestres), correspondientes a los siguientes cuatro temas:
o El ciclo de vida y las metodologías
o Modelado visual y UML
o Los patrones de diseño
o La implementación con C++
• Problemas resueltos en las prácticas (por pareja) y que pueden formar parte de un proyecto global durante los dos trimestres de la asignatura
• Participación y discusión durante los seminarios del material de la classe, las sesiones de seminarios y los ejercicios entregados después de los seminarios
La nota final de la asignatura se calcula así:
• Cuatro exámenes (4x10% = 40%)
• 8 sesiones de prácticas y entrega posterior de soluciones (8x5% = 40%)
• 10 sesiones de seminarios y entrega posterior de ejercicios resueltos (10x2% = 20%)
Para aprobar la asignatura se tiene que aprobar por separado 1) cada uno de los cuatro exámenes; 2) el proyecto implementado a las sesiones de prácticas; y 3) la asistencia en las sesiones de seminarios y los ejercicios entregados posteriormente.
Las prácticas y los seminarios son NO RECUPERABLES, por lo que se tienen que aprobar estas dos partes durante la misma asignatura.
Cada examen es recuperable por separado durante una prueba adicional en julio. Sin embargo, para tener derecho a repetir un examen se tiene que cumplir con los siguientes criterios: 1) aprobar al menos 2 de los 4 exámenes durante la asignatura; 2) aprobar la parte práctica; y 3) aprobar la parte de seminarios.
Detalle de la evaluación
Cuatro exámenes
En cada examen se harán preguntas concretas sobre temas fundamentales de la ingeniería de software, y se presentarán problemas reales que se tienen que resolver.
¿Qué se evaluará?
Competencias generales:
• Resolución de problemas
• Organización y planificación
Competencias específicas:
• Capacidad de analizar y descubrir los requerimientos de un problema complejo de la ingeniería de software
• Capacidad de diseñar una solución para un problema complejo de software a partir de los requerimientos dados
• Capacidad de aplicar el UML
• Capacidad de aplicar conceptos del análisis y el diseño orientado a objetos
• Capacidad de aplicar y usar patrones de la ingeniería de software
• Capacidad de distinguir entre diferentes metodologías de la ingeniería de software
• Capacidad de estructurar, escribir y leer programas escritos en C++
¿Cuándo se evaluará?
• Al medio y al final de cada trimestre (2 y 3)
Sesiones de prácticas
En las prácticas se introducirán herramientas que dan soporte a las metodologías de la ingeniería de software y que conformarán fases de un proyecto para realizar en equipo y donde se pondrán en práctica las competencias generales y específicas. Se tiene que colaborar con otra persona e implementar un proyecto en C++, que se entregará de manera contínua durante el largo de los dos trimestres. El cuarto examen forma parte de la evaluación de las prácticas, para asegurar que cada alumno haya adquirido el conocimiento esperado.
¿Qué se evaluará?
Competencias generales:
• Resolución de problemas
• Organización y planificación
• Trabajo en equipo
• Comunicación efectiva y eficiente
Competencias específicas:
• Capacidad de analizar y descubrir los requerimientos de un problema complejo de la ingeniería de software
• Capacidad de diseñar una solución para un problema complejo de software a partir de los requerimientos dados
• Capacidad de aplicar el UML
• Capacidad de aplicar conceptos del análisis y el diseño orientado a objetos
• Capacidad de aplicar y usar patrones de la ingeniería de software
• Capacidad de distinguir entre diferentes metodologías de la ingeniería de software
• Capacidad de estructurar, escribir y leer programas escritos en C++
¿Cuándo se evaluará?
• Se reparten las 8 sesiones de prácticas durante los dos trimestres. Por tanto, hay una sesión de prácticas aproximadamente cada 2-3 semanas. Normalmente, las actividades de una sesión de prácticas se tendrán que completar durante y despuès de la sesión y se tendrán que entregar los resultados de una sesión de prácticas antes de la siguiente sesión.
Participación en seminarios
Durante las sesiones de seminario se discutirán y se resolverán casos y ejercicios prácticos. Los ejercicios se tienen que completar y entregar después de cada seminario, típicamente antes del seminario siguiente. El objetivo es profundizar en las capacidades generales y específicas y conseguir una retroalimentación y evaluación contínua.
¿Qué se evaluará?
Competencias generales:
• Resolución de problemas
• Organización y planificación
• Trabajo en equipo
• Comunicación efectiva y eficiente
Competencias específicas:
• Capacidad de analizar y descubrir los requerimientos de un problema complejo de la ingeniería de software
• Capacidad de diseñar una solución para un problema complejo de software a partir de los requerimientos dados
• Capacidad de aplicar el UML
• Capacidad de aplicar conceptos del análisis y el diseño orientado a objetos
• Capacidad de aplicar y usar patrones de la ingeniería de software
• Capacidad de distinguir entre diferentes metodologías de la ingeniería de software
¿Cuándo se evaluará?
• Se reparten las 10 sesiones de seminarios durante los dos trimestres, es decir, 5 sesiones cada trimestre. Normalmente, las actividades de una sesión de seminarios consisten en la discusión de soluciones de casos concretos y problemas específicos y en la discusión colectiva o presentación por parte de los estudiantes de sus soluciones par debatir alternativas y obtener una retroalimentación del profesor de seminario. Se tiene que entregar la solución a cada ejercicio dentro de un plazo determinado.
La descripción breve del contenido es:
• Ciclo de vida del software
• Modelado visual y uso de lenguajes como UML
• Análisis y diseño orientado a objetos
• Uso y aplicación de patrones de la ingeniería de software
• Herramientas avanzadas de implementación
La descripción detallada es la siguiente:
Parte I: La ingeniería de software y sus procesos
Bloque de contenido 1: Ciclo de vida y metodologías
Conceptos:
• Noción de ingeniería de software
• Relación de la ingeniería de software con los ámbitos profesionales de la informática y con otras profesiones
• Ciclo de vida de los productos de software y sus modelos
Procedimientos:
• Identificación de las diferentes partes o procesos del ciclo de vida genérico y de las actividades que se realizan en cada fase
• Análisis de las ventajas y desventajas de los diferentes modelos para el ciclo de vida y en relación con el contexto de un proyecto determinado
Actitudes:
• Interés por la ingeniería de software y por su importancia en la mayoría de los ámbitos de la profesión informática
• Espíritu crítico para evaluar las ventajas e inconvenientes de los diferentes modelos del ciclo de vida y de las metodologías de la ingeniería de software
Bloque de contenido 2: Ingeniería de requerimientos
Conceptos:
• Definición y clasificación de tipos de requerimientos
• Elementos de un documento de requerimientos y formalismos asociados
• Ciclo de vida de la ingeniería de requerimientos
Procedimientos:
• Clasificación de los requerimientos funcionales, no funcionales y de dominio
• Identificación de las partes interesadas y de actores
Actitudes:
• Utilización de diagramas de casos de uso en UML para analizar y descubrir requerimientos
• Redacción de documentos de requerimientos como resultado de un análisis de un caso práctico
• Mantenimiento de un documento de requerimientos y gestión de su actualización como resultado de cambios
Bloque de contenido 3: Metodologías
Conceptos:
• Descripción de diferentes ejemplos de metodologías
• Metodologías ágiles en oposición a los tradicionales
• Metodologías basadas en procesos en oposición a metodologías basadas en personas
Procedimientos:
• Identificación de beneficios e inconvenientes de diferentes metodologías
• Aplicaciones de las prácticas y procesos de algunas de las metodologías
Actitudes:
• Actitud crítica para evaluar una metodología
Parte II: Análisis y diseño orientado a objetos
Bloque de contenido 4: El modelado con UML
Conceptos:
• Ventajas del modelado visual
• Definición e historia breve del UML
• Los principales diagramas UML y los elementos incluídos
Procedimientos:
• Utilidad de los diferentes diagramas UML y su uso en diferentes fases del ciclo de vida
• Comprensión de los diagramas UML y su aplicación a un problema concreto
• Utilización de los diagramas UML más importantes (diagramas de casos de uso estáticos y de sequencia) en la resolución de un problema y, en menor medida, de algunos otros tipos de diagramas
Actitudes:
• Acceptación de la importancia de utilizar un formalismo estándar a la hora de utilizar diagramas
Bloque de contenido 5: Análisis y diseño orientado a objetos
Conceptos:
• Definición y propiedades de los objetos
• Definición y propiedades de las clases
• Las relaciones de herencia, composición, agregación, asociación y dependencia
• El polimorfismo y las jerarquías de herencia
• El lenguaje C++ como ejemplo de un lenguaje orientado a objetos
Procedimientos:
• División de un problema complejo utilizando los conceptos y los procedimientos del paradigma orientado a objetos
• Utilización del lenguaje UML para modelar los sistemas orientados a objetos
• Utilización de un lenguaje como C++ para implementar un diseño orientado a objetos
• Desarrollo dirigido por tests
Actitudes:
• Las buenas prácticas de programación (encasillamiento, no duplicación, métodos cortos y nomenclatura clara)
• Adequación a las convenciones para la codificación en el equipo de trabajo
• Adaptación al cambio, el código que conforma un modelado en evolución constante
• Comprensión de las ventajas del desarrollo dirigido por tests
Bloque de contenido 6: Patrones software
Conceptos:
• Concepto de patrón software
• Catálogos de patrones y su utilidad
Procedimientos:
• Utilización de UML para entender un patrón de diseño concreto
• Utilización de los catálogos de patrones para identificar un patrón como solución genérica a un problema concreto
• Utilización de patrones en el diseño de una solución para un caso concreto
Actitudes:
• No se debería volver a inventar la rueda. La gran mayoría de los problemas que aparecen en el ámbito práctico ya están solucionados y la solución está disponible en forma de un patrón que seguramente tiene características de calidad superiores a lo que podemos desarrollar en una primera iteración aislada
Bloque de contenido 7: Herramientas avanzadas de implementación
Conceptos:
• Aprender a utilizar herramientas avanzadas de implementación
• Qt: librería para implementar interfaces gráficas de usuario
• Templates: programación genérica
Procedimientos:
• Aplicación práctica de Qt para implementar una aplicación gráfica
• Desarrollo de programas con templates
Actitudes:
• Herramientas típicas de desarrollo de software que conviene dominar
La asignatura representa, para el estudiante, 18 sesiones de teoría (2 horas cada una, que incluye dos de los exámenes), 8 sesiones de prácticas (2 horas cada una) y 10 sesiones de seminarios (2 horas cada una) durante dos trimestres.
Las sesiones de teoría son clases magistrales donde participan todos los estudiantes y se introducen los conceptos teóricos básicos, las metodologías y se demuestran los procedimientos adequados para la resolución de problemas complejos con herramientas y técnicas de la ingeniería de software.
Las sesiones de seminarios son en grupos pequeños y consisten en la discusión de problemas concretos y en la retroalimentación inmediata derivada de la discusión constructiva de soluciones propuestas por los estudiantes y profesores de ejercicios concretos.
Las sesiones de prácticas son en grupos medios pero los estudiantes trabajan por pareja en la culminación de fases de un proyecto de software aplicando también herramientas concretas para la producción de software en un contexto de ingeniería de software. Estas sesiones de prácticas tienen como objetivo una realización práctica y una ilustración concreta que permiten utilizar herramientas como CASE, IDE o control de versiones. Su objetivo es poner los conceptos teóricos en práctica y sirven para complementar las competencias y las capacidades en un sentido real, concreto y práctico.
Bibliografía básica
- Fowler, Martin. UML distilled: a brief guide to the standard object modeling language / Martin Fowler with Kendall Scott Reading (Mass.) : Addison-Wesley, cop. 2000
- Meyer, Bertrand. Construcción de software orientado a objetos / Bertrand Meyer traducción: Miguel Katrib Mora, Rafael García Bermejo, Salvador Sánchez ; revisión técnica: Jesús García. Madrid [etc.] : Prentice Hall, 1998
- Sommerville, Ian. Software engineering / Ian Sommerville Harlow : Addison-Wesley, 2009
- Larman. Applying UML and patterns: an introduction to object-oriented analysis and design
Bibliografía complementaria
-Costal, Dolors. Enginyeria del software especificació: especificació de sistemes orientats a objectes amb la notació UML / Dolors Costal, M. Ribera Sancho, Ernest Teniente Barcelona: Edicions UPC, 2000
- Joyanes Aguilar, Luis. Pla docent assignatura Estudis Programación orientada a objetos / Luis Joyanes Aguilar Madrid: Osborne/McGraw-Hill , cop. 1998
- Peralta Giménez, Allen J. Enginyeria del software: programació orientada a objectes / Allen J. Peralta Giménez, Horacio Rodríguez Hontoria Barcelona: Edicions UPC, 1994 Upper Saddle River, N.J.: Prentice Hall PTR, cop. 1998
- Pressman, Roger S. Ingeniería del software un enfoque práctico / Roger S. Pressman adaptación: Darrel Ince traducción: Rafael Ojeda Martín [et al.] dirección, coordinación y revisión Madrid McGraw-Hill cop. 2002
- Schach, Stephen R. Software engineering / Stephen R. Schach Boston: Irwin, cop. 1993 Shtern, Victor
- Shtern, Victor. Core C++: a software engineering approach / Victor Shtern Upper Saddle River: Prentice Hall PTR, cop. 2000
- Stroustrup, Bjarne. The C++ programming language / Bjarne Stroustrup
Recursos didácticos
- Apuntes en formato libre
- Colección de problemas
- Web de la asignatura en el Aula Global