Curso 2010-11

Ingeniería del Software (21418)

Titulación/estudio: Grado en Ingenieria en Informática (3377)
Curso: segundo
Trimestre: 2n/3r
Número de créditos ECTS: 8 créditos
Horas de dedicación del estudiante: 200 horas
Lengua o lenguas de la docencia: catalán y castellano
Profesor: Vladimir Estivill-Castro

 

1. Presentación de la asignatura

La Ingeniería del Software se encarga de desarrollar y dar mantenimiento a sistemas de software para que se comporten confiablemente y eficientemente. También se concentra en desarrollar software de manera costeable y satisfaciendo requerimientos de clientes y usuarios que han definido y especificado la solución. Es una disciplina importante por el espectro y amplio impacto que tiene el software en las actividades económicas de la humanidad y la sociedad moderna y el papel que juega el software en sistemas críticos y en la seguridad de muchas aplicaciones. La disciplina integra métodos formales de matemáticas, de las ciencias de al computación y de las practicas y orígenes de la ingeniería.

Luego entonces, la Ingeniería de Software es la aplicación sistemática, disciplinada, cuantificable y rigurosa de enfoques de desarrollo, operación, mantenimiento e implantación del software. Por supuesto, el estudio de los enfoques que conducen a la producción de software de calidad es materia central de la ingeniería de software.  Simplemente, la ingeniería del software se preocupa por construir software bien. El software no debe fallar porque hoy en día miles de actividades se controlan, manejan o regulan por sistemas que ejecutan software.

La Ingeniería de Software engloba una serie de conocimientos, definiciones de procesos, practicas, herramientas y estándares. Todo este conocimiento es utilizado por equipos de trabajo que llevan acabo tareas que producen productos de software de alta calidad y que cumplen las necesidades de los usuarios. Las tareas incluyen el análisis y al especificación, el diseño, la implementación, verificación, al realización de pruebas, el mantenimiento y la gestión de los proyectos, todo esto a tiempo, y dentro de lo presupuestado.

La ingeniería del software moderna tiene un enfoque importante también en cuanto a que los proyectos produzcan sistemas sustentables,  cuyos impacto al medio ambiente sea mínimo y cuyos objetivos considere también principios sociales y éticos. Los Ingenieros de Software aplican la tecnología para desarrollar nuevos sistemas, construir nuevos instrumentos y utilizar la tecnología para el progreso y el beneficio general garantizando la calidad de los resultados.

 

2. Competencias que se deben lograr

Se deben poseer capacidades para el trabajo en equipo, la solución de problemas y la organización y planificación. Diseño conceptual, Habilidades cognitivas

Competencias generales

Competencias específicas

Instrumentales

1.-Habilidades cognitivas (comprensión, interrelación de ideas y pensamientos, análisis y síntesis) son muy importantes para la resolución de problemas, planificación, análisis y diseño.
2.- Sentido común. De forma similar, esta competencia es una herramienta para resolver los problemas de diseño y dar prioridad a restricciones y requerimientos.
3.- Organización del tiempo. Ser capaz de resolver un problema complejo de forma sub-optima dadas restricciones de tiempo y planear anticipadamente el uso del tiempo es fundamental en toda actividad de ingeniería.
4.-Investigación documental y uso de fuentes y referencias. Dado que el diseño es fundamentalmente una resolución conceptual de problemas, usar 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 del software es usualmente una colaboración en equipo donde es necesario comunicar problemas, soluciones, criterios, tanto en un lenguaje técnico como ante usuarios no técnicos. La comunicación debe ser efectiva tanto en forma escrita como oral, en presentaciones a clientes y/o en pequeños equipos de trabajo.
2.- Capacidad de comunicación con expertos de otros ámbitos. Los ingenieros de Software interactúan 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 si se obtienen los acuerdos necesarios.
3.- Liderazgo. Ser capaz de tomar decisiones en un grupo de trabajo o de guiar el proceso de pensamiento a soluciones efectivas. Desatascar la falta de productividad es esencial.
4.- Uso de instrumentos tecnológicos. Para poder aplicar diferentes tecnologías, enfoques, patrones. Se deben utilizar herramientas de manera idónea.
5.- Capacidad de llevar la teoría a la practica. La construcción de sistemas de software de magnitud real requiere de fundamentos y de aplicación de los conceptos teóricos en una practica 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 y/o incompleta. El ingeniero de Software debe organizar al documentación de requerimientos, de gestión del proyecto y del producto.
2.- Análisis de puntos fuertes y débiles. Se capaz de identificar el punto más débil de un sistema es fundamental para juzgar la calidad y seguridad de un sistema.
3.- Toma de decisiones. A partir de un análisis previo poder optar por 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 nuevas ideas. Para resolver un problema complejo se debe disponer de la creatividad suficiente para generar alternativas.
6.- Interés por la calidad. Esta es una competencia fundamental de la aplicación de soluciones tecnológicas a un problema.
6.- Diseño y dirección de proyectos. Se ha de ser capaz de crear soluciones que satisfagan requerimientos y de gestionar los procesos que implementan el diseño.
7.- Anticipación de riesgos. Cada proyecto tiene riesgos y posibles cambios, y se debe hacer una planificación capaz de ajustar soluciones y diseños a cambios o modificaciones en los requerimientos.
8.-Rediseño de procesos. Cada proceso que representa en poca eficiencia o resulta en productos de baja calidad debe ser revisado.
9.- Capacidad de adaptación a nuevas soluciones. Los cambios causan ajustes y se debe tener la capacidad de adaptación.
10.-Capacidad de aprendizaje. Es muy importante tener la disposición para asimilar nuevos conceptos y nuevas tecnologías en una era de cambio tecnológico constante.


Las competencias especificas se resumen en tres grandes capacidades.

1.- Conocimiento de las herramientas, métodos, practicas y herramientas de la Ingeniería del Software
2.- Capacidad para analizar y descubrir requerimientos de un problema complejo cuya solución involucra el desarrollo de un sistema de software
3.- Capacidad de diseñar una solución al problema complejo que se apega a los principios de la ingeniería de software y que satisface los requerimientos funcionales a la vez que cumple con especificaciones de alta calidad y se implementa en el tiempo y presupuesto anticipados.




Desglosando estas capacidades y competencias a continuación obtenemos el siguiente detalle sobre competencias especificas.


1.- Conocimiento de las diferentes metodologías de la ingeniería del software.
     1.a.-  Conocimiento de los diferentes tipos de "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 comprender como el proceso de análisis y las decisiones de diseño afectan el producto final.



2.- Capacidad de analizar y describir los requerimientos de un problema complejo.
     2.a.- Capacidad de extraer los requerimientos: identificar "stakeholders", actores, casos de uso, clasificar requerimientos según si son funcionales, no funcionales y/o del dominio.
     2.b.- Capacidad de expresar requerimientos de forma organizada y técnicamente concreta y univoca.
     2.c.- Dominio de algún lenguaje de modelado estándar (por ejemplo UML) para ayudarse a 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 a un problema complejo de ingeniería de software a partir de requerimientos.
     3.a.- Capacidad de comprender requerimientos dados.
     3.b.- Capacidad de organización y planificación de diversas fases y tareas de desarrollo.
     3.c.- Toma de decisiones de diseno
       a) Identificar las fuerzas involucradas y hallar la mejor solución que obtenga un balance entre los criterios y las prioridades.
       b) Verificar que la solución tiene componentes y módulos con mínimo 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 practico.
     3.e.- Optimización del tiempo: capacidad de hallar una aproximación suficientemente buena a la solución de un problema complejo.
     3.f.- Capacidad de trabajo en equipo.
     3.g.- Conocimiento de tecnologías orientadas a objetos
       a) dominio de un lenguaje orientado a objetos (por ejemplo C++)
       b) Conocimiento de un lenguaje estándar de modelado (por ejemplo UML)
       c) Capacidad de aplicar y usar patrones de diseño.
     3.h.- Capacidad de implementar el diseño.
       a) Capacidad de obtener retroalimentación de revisar el código y de pruebas para justar el diseño.
     3.i.- Capacidad de realizar pruebas y validar la implementación de una solución.


3. Contenidos

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 del software

La descripción detallada es la siguiente.

3.1. Parte I: La ingeniería de Software y sus procesos.

Bloque de contenidos 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 diversas 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 esquemas para un ciclo de vida y en relación con el contexto de un proyecto determinado.

Actitudes:

  • Interés por al Ingeniería de Software y por su importancia en la mayoría de los ámbitos de la profesión informática.
  • Espíritu critico para evaluar las ventajas y los inconvenientes de los diversos modelos de un ciclo de vida y de las metodologías de la ingeniería del software
     

Bloque de contenidos 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 n funcionales, no funcionales y del demonio.
  • Identificación de "stake-holders" y de actores.

Actitudes:

  • Uso 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 practico.
  • Mantenimiento de un Documento de requerimientos y gestión de su actualización como resultado de cambios.

 

Bloque de contenidos 3: Metodologías:
Conceptos:

  • Descripción de diversos ejemplos de metodologías
  • Métodos ágiles vs tradicionales
  • Metodologías basadas en procesos vs metodologías basadas en personas.

Procedimientos:

  • Identificación de beneficios e inconvenientes de diversas metodologías.
  • Aplicaciones de las practicas y procesos de algunas de las metodologías.

Actitudes:

  • Actitud critica par evaluar una metodología.

3.2. Parte II: Análisis y diseño orientado a objetos.

Bloque de contenidos 4: 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:

  • Partición de un problema complejo empleando 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 UML para modelar sistemas Orientados a Objetos.
  • Utilización de un lenguaje como C++ para implementar un diseño orientado a objetos
  • Desarrollo dirigido por pruebas.

Actitudes:

  • Las buenas practicas de programación (encapsulamiento, no duplicación, métodos cortos, nomenclatura clara)
  • Adecuación a las convenciones para la codificación en el equipo de trabajo.
  • Adaptación al cambio, el código que conforma a un modelado en constante evolución
  • Comprensión de las ventajas del desarrollo dirigido por pruebas.
     

Bloque de contenidos 5: El modelado con UML.
Conceptos:

  • Ventajas del modelado visual
  • Definición e historia breve de UML
  • Los principales diagramas UML y os elementos incluidos en ellos..

Procedimientos:

  • Utilidad de los diversos diagramas UML y su uso en diversas fases del ciclo de vida.
  • Comprensión de los diagramas UML y su aplicación a un problema concreto.
  • Utilización de los diagramas ML mas importantes (diagramas de casos de uso estáticos y de secuencia) en al resolución de un problema y en menor medida de algunos otros tipos de diagramas.

Actitudes:

  • Aceptación de la importancia de utilizar un formalismo estandar a la hora de utilizar diagramas.

 

Bloque de contenidos 6: Patrones de software.
Conceptos:

  • Concepto de patrón en el software
  • Catalogo de patrones y su utilidad

Procedimientos:

  • Utilización de UMP 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 de un problema concreto.
  • Utilización de patrones en el diseño de una solución para un caso concreto.

Actitudes:

  • No se debe re-inventar la rueda. La gran mayoría de los problemas que aparecen en el ámbito practico están solucionados y la solución esta 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.

4. Evaluación

4.1. Criterios de evaluación generales 

Se evaluaran todos los tipos de competencias de la sección 3 así como las competencias especificas a través  de las siguientes actividades evaluadoras y de naturaleza obligatoria: 

  • Un examen final al termino de los dos trimestres cuya aprobación consiste el la resolución satisfactoria de un problema concreto en tiempo limitado
  • Problemas prácticos resueltos en laboratorio (en parejas) y que pueden formar parte de un proyecto global durante el transcurso del curso en dos trimestres (la evaluación es continua y la nota de las ocho sesiones de problemas prácticos corresponde a un 40%) 
  • Tres pequeños exámenes parciales que profundizan en conceptos y su discusión con respecto a los contenidos de la asignatura. 
  • Participación y discusión durante los seminarios del material de clase, las sesiones de seminarios y los ejercicios realizados durante los seminarios. 

La nota final de la asignatura es calculada como sigue

Examen Final (10%)

Tres pequeños tests (10%)

Sesiones de problemas en el laboratorio (40%)
            Cada sesión es 5% (8x5%-40%)

Participación en seminarios y discusión de ejercicios prácticos (20%)
            Cada sesión es 2% (10x2%=20%)

Siempre y cuando se cumpla con el siguiente criterio de integridad de la evaluación:

ES NECESARIO APROBAR EL EXAMEN FINAL, AL MENOS DOS DE LOS 3 PEQUENOS TEST, AL MENOS EL 60% DE LOS EJERCISIOS DE SEMINARIOS Y COMPLETAR MAS DEL 50% DE LAS SESSIONES DE PROBLEMAS PRACTICOS PARA APROBAR LA ASIGNATURA.

4.2. Detalle de la evaluación: 

- Examen Final
En un examen final se planteara un problema concreto y una serie de preguntas de análisis y diseño. El problema deber de resolverse en un tiempo limitado. Se podrá disponer de apuntes y de material complementario.

Que se evaluará
Competencias generales

  • Resolución de Problemas
  • Organización y Planificación 

Competencias especificas

  • Capacidad de analizar y describir los requerimientos de un problema complejo de la ingeniería del software
  • Capacidad de diseñar una solución a un problema complejo de software  partir de requerimientos dados. 

Cuando se evaluara
Durante el periodo de exámenes finales del tercer trimestre. 
 

- Tres pequeños tests
En un tiempo limitado se deberá resolver varios ejercicios pequeños que corresponden a la aplicación de los conceptos. Los ejercicios serán similares a ejercicios resueltos con anterioridad en discusiones de seminarios o en laboratorio y se enfocan a una practica concreta o a un concepto especifico. 

Que se evaluará 
Competencias generales

  • Resolución de Problemas
  • Organización y Planificación 

Competencias especificas

  • Capacidad de analizar y describir los requerimientos de un problema complejo de la ingeniería del software
  • Capacidad de diseñar una solución a un problema complejo de software  partir de requerimientos dados.
  • Capacidad de aplicar 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 

Cuando se evaluara 
Aproximadamente a la mitad de cada uno de los dos trimestres que conforman l asignatura y al final del primer trimestre de la asignatura. 

 

- Sesiones de problemas en el laboratorio 
Durante el laboratorio se introducirán herramientas que apoyan las metodologías de la ingeniería de software y que conformaran fases de un proyecto a realizar en equipo y donde se pondrán en practica las competencias generales y especificas. Se deberá colaborar con otra persona y realizar una comunicación practica tanto oral como escrita participando en roles como usuarios y "stake-holders" 

Que se evaluará 
Competencias generales

  • Resolución de Problemas
  • Organización y Planificación
  • Trabajo en equipo
  • Comunicación efectiva y eficiente 

Competencias especificas

  • Capacidad de analizar y describir los requerimientos de un problema complejo de la ingeniería del software
  • Capacidad de diseñar una solución a un problema complejo de software  partir de requerimientos dados.
  • Capacidad de aplicar 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 

Cuando se evaluara 
Las 8 sesiones de problemas se reparten durante los dos trimestres resultado en una sesión de problemas aproximadamente cada 3 semanas. Normalmente las actividades de una sesión de problemas y laboratorio deberán completarse durante la sesión misma y los resultados de una sesión de problemas deberán entregarse antes de la sesión siguiente. 

 

- Participación en seminarios y discusión de ejercicios prácticos 
Durante sesiones de seminarios se discutirán soluciones y conceptos en casos y ejercicios prácticos. Probablemente se requerirá que los estudiantes se presenten con soluciones parciales o completas y que sean expuestas y discutidas ante al colectividad de la clase y/o tutor. El objetivo es profundizar en las capacidades generales y especificas y lograr una retroalimentación y evaluación continua. 

Que se evaluará
Competencias generales

  • Resolución de Problemas
  • Organización y Planificación
  • Trabajo en equipo
  • Comunicación efectiva y eficiente 

Competencias especificas

  • Capacidad de analizar y describir los requerimientos de un problema complejo de la ingeniería del software
  • Capacidad de diseñar una solución a un problema complejo de software  partir de requerimientos dados.
  • Capacidad de aplicar 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 

Cuando se evaluara 
Las 20 sesiones de problemas se reparten durante los dos trimestres resultado en 10 sesiones cada trimestre, y por lo tanto en una sesión de seminario semanal. Normalmente las actividades de una sesión de seminario consiste en la discusión de soluciones a casos concretos, problemas específicos y en la discusión colectiva o la presentcion por estudiantes participantes de sus soluciones para poner a debate alternativas y obtener retroalimentación del facilitador del seminario.


5. Bibliografía y recursos didácticos

5.1. Bibliografía Recomendada

•·    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"
 

5.2. Bibliografía Complementaria

•·    Costal, DolorsEnginyeria del software especificació : especificació de sitemes orientats a objectes amb la notació UML / Dolors Costal, M. Ribera Sancho, Ernest Teniente Barcelona : Edicions UPC, 2000
•·    Joyanes Aguilar, LuisPla 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ónMadrid McGraw-Hill cop. 2002
•·    Schach, Stephen R. Software engineering / Stephen R. Schach Boston : Irwin, cop. 1993 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 


5.3. Recursos Didácticos

  • Apuntes en formato libre
  • Colección de Problemas
  • Web de la asignatura al Moodle


6) Metodología

La asignatura le representa al estudiante 18 sesiones de teoría (2 horas cada una),  8 sesiones de Problemas en laboratorios (2 horas cada una) y 20 sesiones de seminarios (2 horas cada uno) guante dos trimestres.

Las sesiones de teoría son clases magistrales en las que participan todos los estudiantes y se introducen los conceptos básicos teóricos, las metodologías y se demuestran los procedimientos adecuados para la resolución de problemas complejos por herramientas y técnicas de la ingeniería del software.

Las sesiones de seminario son en grupos pequeños y consisten en la discusión de problemas concretos y al retro-alimentación inmediata derivada de discusión constructiva de soluciones propuestas por estudiantes y facilitadotes de ejercicios concretos.

Las sesione  de problemas son en grupos medianos pero los estudiantes trabajan en parejas 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 laboratorio tienen como objetivo una realización practica y una ilustración concreta que permite utilizar herramientas como pueden ser herramientas CASE, herramientas IDE, herramientas de control de versiones. Su objetivo es llevar los conceptos teóricos a la practica y sirven APRA complementar las competencias y capacidades en un sentido real , concreto y practico.


7) Programación de actividades.  

Los horarios de clase y el detalle de cada sesión teórica, de problemas en laboratorio o de seminario se publica en el Calendario y Horarios de la WEB de l'ESUP.