Proyectos de Programación

Usted está aquí

Créditos
6
Tipos
Obligatoria
Requisitos
  • Prerrequisito: EDA
  • Precorrequisito: IDI
  • Precorrequisito: IES
Departamento
CS
Hacer un proyecto de programación asociado al ciclo de vida de una aplicación informática, con énfasis en la fase de implementación.

Profesorado

Responsable

  • Alicia Ageno Pulido ( )

Otros

  • Alejandro Ivan Paz Ortiz ( )
  • Borja Valles Fuente ( )
  • Carles Arnal Castello ( )
  • Guillem Godoy Balil ( )
  • Jordi Turmo Borrás ( )
  • Miquel Sanchez Marre ( )
  • Pablo Blanco del Prado ( )
  • Ricardo Fernández Domenech ( )
  • Salvador Medina Herrera ( )
  • Sergio Álvarez Napagao ( )

Horas semanales

Teoría
2
Problemas
0
Laboratorio
2
Aprendizaje dirigido
0.28
Aprendizaje autónomo
5.72

Competencias

Competencias Transversales

Trabajo en equipo

  • G5 [Avaluable] - Ser capaz de trabajar como miembro de un equipo, ya sea como un miembro más, o realizando tareas de dirección con la finalidad de contribuir a desarrollar proyectos con pragmatismo y sentido de la responsabilidad, asumiendo compromisos teniendo en cuenta los recursos disponibles.
    • G5.2 - Planificar y acordar los objetivos, las reglas de funcionamiento, las responsabilidades, la agenda y el procedimiento de revisión del trabajo. Identificar conflictos, negociarlos y resolverlos de forma efectiva. Adaptarse a diferentes tipos de grupo (grande-pequeño, técnico-mixto, presencial-a distancia). Interactuar con eficacia y promover la participación de todos los miembros del grupo.

Espíritu emprendedor e innovador

  • G1 [Avaluable] - Conocer y comprender la organización de una empresa y las ciencias que rigen su actividad; capacidad de comprender las reglas laborales y las relaciones entre la planificación, las estrategias industriales y comerciales, la calidad y el beneficio. Desarrollar la creatividad, el espíritu emprendedor y la tendencia a la innovación.
    • G1.2 - Tomar iniciativas que generen oportunidades, nuevos objetos o soluciones nuevas, con una visión de implementación de proceso y de mercado, y que implique y haga partícipes a los otros en proyectos que se tienen que desarrollar (capacidad de actuar de manera autónoma).

Competencias Técnicas

Competencias técnicas comunes

  • CT2 - Utilizar de forma apropiada teorías, procedimientos y herramientas en el desarrollo profesional de la ingeniería informática en todos sus ámbitos (especificación, diseño, implementación, despliegue -implantación- y evaluación de productos) de manera que se demuestre la comprensión de los compromisos adoptados en las decisiones de diseño.
    • CT2.3 - Diseñar, desarrollar, seleccionar y evaluar aplicaciones, sistemas y servicios informáticos, y al mismo tiempo asegurar su fiabilidad, su seguridad y su calidad, conforme a principios éticos y a la legislación y la normativa vigente.
    • CT2.4 - Demostrar conocimiento y capacidad de aplicación de las herramientas necesarias para el almacenaje, el procesamiento y el acceso a los Sistemas de información, incluidos los basados en web.
    • CT2.5 - Diseñar y evaluar interfaces persona-computador que garanticen la accesibilidad y la usabilidad a los sistemas, a los servicios y a las aplicaciones informáticas.
  • CT3 - Demostrar conocimiento y comprensión del contexto organizativo, económico y legal en el que desarrolla su trabajo (Conocimiento adecuado del concepto de empresa, marco institucional y jurídico de la empresa, organización y gestión de empresas.)
    • CT3.6 - Demostrar conocimiento de la dimensión ética en la empresa: la responsabilidad social y corporativa en general y, en particular, las responsabilidades civiles y profesionales del ingeniero en informática.
  • CT4 - Demostrar conocimiento y capacidad de aplicación de los procedimientos algorítmicos básicos de las tecnologías informáticas para diseñar soluciones a problemas, analizando la idoneidad y la complejidad de los algoritmos
    • CT4.1 - Identificar las soluciones algorítmicas más adecuadas para resolver problemas de dificultad mediana.
    • CT4.2 - Razonar sobre la corrección y la eficiencia de una solución algorítmica.
    • CT4.3 - Demostrar conocimiento y capacidad de aplicación de los principios fundamentales y las técnicas básicas de los sistemas inteligentes y su aplicación práctica.
  • CT5 - Analizar, diseñar, construir y mantener aplicaciones de forma robusta, segura y eficiente, escogiendo el paradigma y los lenguajes de programación más adecuados.
    • CT5.1 - Escoger, combinar y explotar diferentes paradigmas de programación, en el momento de construir software, atendiendo a criterios como la facilidad de desarrollo, la eficiencia, la portabilidad y la mantenibilidad.
    • CT5.2 - Conocer, diseñar y utilizar de forma eficiente los tipos y las estructuras de datos más adecuados para la resolución de un problema.
    • CT5.3 - Diseñar, escribir, probar, depurar, documentar y mantener código en un lenguaje de alto nivel para resolver problemas de programación aplicando esquemas algorítmicos y usando estructuras de datos.
    • CT5.4 - Diseñar la arquitectura de los programas utilizando técnicas de orientación a objetos, de modularización y de especificación e implementación de tipos abstractos de datos.
    • CT5.5 - Usar las herramientas de un entorno de desarrollo de software para crear y desarrollar aplicaciones.
    • CT5.6 - Demostrar conocimiento y capacidad de aplicación de los principios fundamentales y de las técnicas básicas de la programación paralela, concurrente, distribuida y de tiempo real.
  • CT6 - Demostrar conocimiento y comprensión del funcionamiento interno de un computador y del funcionamiento de las comunicaciones entre ordenadores.
    • CT6.1 - Demostrar conocimiento y tener capacidad para administrar y mantener sistemas, servicios y aplicaciones informáticas.
  • CT8 - Planificar, concebir, desplegar y dirigir proyectos, servicios y sistemas informáticos en todos los ámbitos, liderando su puesta en marcha, su mejora continua y valorando su impacto económico y social
    • CT8.6 - Demostrar comprensión de la importancia de la negociación, de los hábitos de trabajo efectivos, del liderazgo y de las habilidades de comunicación en todos los entornos de desarrollo de software.
    • CT8.7 - Controlar versiones y configuraciones del proyecto.

Objetivos

  1. Invocar los conocimientos de programación adquiridos en asignaturas anteriores durante el desarrollo de un proyecto de programación de tamaño medio, eligiendo algoritmos y estructuras de datos adecuados para construir un programa correcto y eficiente.
    Competencias relacionadas: CT4.1, CT4.2, CT5.2,
  2. Organizar el trabajo de diseño y programación de un equipo de personas de tamaño medio (de tres a cuatro), de acuerdo con una planificación temporal preestablecida. Esta organización incluye tanto el cumplimiento de la planificación dada como el reparto de tareas entre los miembros del grupo.
    Competencias relacionadas: CT6.1, CT8.6, G5.2, CT8.7,
  3. Identificar partes susceptibles de ser factorizadas en la especificación, diseño e implementación de un programa, para resolverlas una sola vez. Usar de manera efectiva los mecanismos de la orientación a objetos para hacer la factorización.
    Competencias relacionadas: CT5.4, CT5.5, CT5.1, CT2.3,
  4. Conocer los principios del diseño y la programación orientadas a objetos, su justificación, y las ventajas e inconvenientes de adoptar este paradigma en un proyecto de programación.
    Competencias relacionadas: CT5.4, CT5.1,
  5. Usar el mecanismo de clases y herencia para evitar la redundancia y para capturar abstracciones de especificación, diseño e implementación. Entender las ventajas de este uso de la orientación a objetos con respecto a fiabilidad, modificabilidad, portabilidad, reusabilidad y productividad.
    Competencias relacionadas: CT4.2, CT5.2, CT5.3, CT2.3,
  6. Tratar correctamente las situaciones anómalas dentro del programa, usando, si es conveniente, el mecanismo de excepciones ofrecido por el lenguaje de programación. Testear el programa de forma sistemática y exhaustiva.
    Competencias relacionadas: CT5.1, CT5.3,
  7. Diseñar una interfaz de usuario razonablemente cómoda y eficaz para el programa, usando una librería GUI.
    Competencias relacionadas: CT2.5, CT5.6,
  8. Desarrollar un proyecto de programación de tamaño medio, en grupo, de acuerdo con un plan de desarrollo y una arquitectura proporcionados de antemano.
    Competencias relacionadas: G5.2, CT3.6, CT4.1, CT4.2, CT5.2, CT5.4, CT5.5, G1.2, CT2.4, CT4.3, CT5.3, CT2.3,

Contenidos

  1. Repaso IES: Especificación, diagramas de clases y casos de uso.
    Ciclos de vida.
    Definición del proyecto. Requerimientos. Especificación funcional. Modelar primero el dominio.
    UML: diagrama de clases (dominio). Diagrama de casos de uso. Explicaciones textuales. Estudio de un caso.
  2. Introducción a Java y Conceptos de OO en Java
    Especificación, diseño y programación orientadas a objetos (OO). Clases, objetos, atributos, métodos y relaciones. Encapsulamiento y ocultación, abstracción y clasificación, herencia. Polimorfismo, "binding" estático y dinámico. Otras relaciones: asociación, agregación, dependencia.
  3. Diseño e implementación en Java de la arquitectura en 3 capas
    Descripción del paradigma de diseño de arquitectura en 3 capas y su implementación en Java
  4. Prueba de programas
    Verificación. Program Testing: prueba y depuración.
    Prueba de componentes.
    Estategias de prueba e integración. Drivers y stubs/mocks. Planificación de pruebas.
    "Andamiaje" y tests de regresión.
    Herramientas de ayuda a la prueba (JUnit).
    Tratamiento de errores y excepciones.
  5. Patrones de diseño en Java
    Se describiran e implementaran algunos de los patrones de diseño clásicos (decorador, estado, singleton, etc)
  6. Conceptos básicos de diseño de interfaces en Java
    Cómo diseñar una interfice gráfica sencilla usando las librerías standard de Java y aplicando los principios de arquitectura en capas
  7. Herramientas para el desarrollo de programas
    Se describiran a grandes rasgos las herramientas para desarrollar software: control de versiones (Git), integración con testing (JUnit)

Actividades

Actividad Acto evaluativo


Repaso ciclo de vida del software

Repaso de conceptos de ingeniería del software y UML. Ejemplo práctico de (parte de ) una primera entrega.
Objetivos: 3 4 5
Contenidos:
Teoría
4h
Problemas
0h
Laboratorio
0h
Aprendizaje dirigido
0h
Aprendizaje autónomo
3h

Descripción del proyecto y formación de equipos

Descripción de las entregas del proyecto. Formación de los equipos de prácticas.
Objetivos: 8 2
Teoría
0h
Problemas
0h
Laboratorio
2h
Aprendizaje dirigido
0h
Aprendizaje autónomo
0h

Introducción a Java y Conceptos básicos de OO

Desarrollo del tema 2 de la asignatura.
Objetivos: 8 4 5
Contenidos:
Teoría
8h
Problemas
0h
Laboratorio
0h
Aprendizaje dirigido
0h
Aprendizaje autónomo
8h

Diseño e implementación en Java de la arquitectura en 3 capas

Desarrollo del tema 3 de la asignatura.
Objetivos: 8 3 4 5
Contenidos:
Teoría
4h
Problemas
0h
Laboratorio
0h
Aprendizaje dirigido
0h
Aprendizaje autónomo
2h

Depuración de programas

Desarrollo del tema 4 de la asignatura.
Objetivos: 8 6
Contenidos:
Teoría
6h
Problemas
0h
Laboratorio
0h
Aprendizaje dirigido
0h
Aprendizaje autónomo
6h

Patrones de diseño en Java

Se explicaran (o repasaran si ya se vieron en IES) e implementaran algunos de los patrones clásicos de diseño.
Objetivos: 4 5
Contenidos:
Teoría
4h
Problemas
0h
Laboratorio
0h
Aprendizaje dirigido
0h
Aprendizaje autónomo
4h

Java: implementación de interfaces

Desarrollo del tema 6 de la asignatura.
Objetivos: 8 7
Contenidos:
Teoría
4h
Problemas
0h
Laboratorio
0h
Aprendizaje dirigido
0h
Aprendizaje autónomo
4h

Primera entrega del proyecto

Diseño y principio de la implementación. Se debe implementar completamente el modelo del dominio y el núcleo básico algorítmico del proyecto, proporcionando los juegos de pruebas y tests de la parte implementada.
Objetivos: 8 1 2 3 6 4 5
Semana: 10
Tipo: entrega
Teoría
0h
Problemas
0h
Laboratorio
0h
Aprendizaje dirigido
0h
Aprendizaje autónomo
0h

Segunda entrega del proyecto

Entrega intermedia. La documentación a presentar debe incluir el diagrama de clases completo (UML) del proyecto.
Objetivos: 8 1 2 3 7 4 5
Semana: 14
Tipo: entrega
Teoría
0h
Problemas
0h
Laboratorio
0h
Aprendizaje dirigido
0h
Aprendizaje autónomo
0h

Tercera entrega del proyecto

Entrega final. La documentación a presentar debe incluir la implementación completa del proyecto, así como los juegos de prueba y el manual de usuario. Además de la entrega de la documentación, cada equipo deberá hacer una presentación de su proyecto.
Objetivos: 8 1 2 3 6 7 4 5
Semana: 15 (Fuera de horario lectivo)
Tipo: entrega
Teoría
0h
Problemas
0h
Laboratorio
0h
Aprendizaje dirigido
2h
Aprendizaje autónomo
0h

Teoría
0h
Problemas
0h
Laboratorio
16h
Aprendizaje dirigido
0h
Aprendizaje autónomo
29h

Teoría
0h
Problemas
0h
Laboratorio
12h
Aprendizaje dirigido
0h
Aprendizaje autónomo
29.8h

Teoría
0h
Problemas
0h
Laboratorio
0h
Aprendizaje dirigido
2.2h
Aprendizaje autónomo
0h

Metodología docente

El temario se expone de forma muy práctica, a través de la presentación de muchos ejemplos.

Las clases de teoría introducen todo los conocimientos, las técnicas y los conceptos necesarios para la realización del proyecto de la asignatura. Algunas de las clases de laboratorio, normalmente hacia principio de curso, sirven para que el profesor presente brevemente las notaciones, lenguajes, librerías y herramientas a utilizar. En la mayoría de clases de laboratorio, sin embargo, no es el profesor quien lleva la iniciativa. Son unas horas que cada grupo de proyecto puede utilizar para trabajar en común, o bien para consultar dudas con el profesor y recibir sus comentarios.

Las dos horas de clases de teoría y las dos de laboratorio se hacen semanalmente, excepto la primera semana en que sólo se hace teoría (dos sesiones) y las dos últimas que sólo se hace laboratorio.

La realización del proyecto es la parte principal del trabajo a realizar dentro de la asignatura. Este proyecto tendrá un fuerte componente algorítmico y de estructuras de datos.

Para implementar este proyecto, el sistema de trabajo será el siguiente:
- Los estudiantes se organizan en grupos de 4 personas, y los equipos se estructuran en grupos de laboratorio de 15-20 personas.
- Cada grupo de laboratorio tendrá un profesor tutor asignado.
- Dentro de cada equipo, un estudiante y sólo uno es responsable de programar y probar cada clase.

El curso utiliza el lenguaje de programación Java.

Método de evaluación

Nota Final: Nota_Proyecto

Nota_Proyecto: (0.40 * Entrega1 + 0.15 * Entrega2 + 0.45 * Entrega3) * FT

Dado que el proyecto es un trabajo en grupo en el que deben participar todos y sólo los miembros del equipo, la nota final del proyecto está ponderada por FT. Este Factor de Trabajo (FT) es una ponderación (0 <= FT <= 1) individual que valora el grado de trabajo de cada miembro del equipo. Se hará público junto con las notas de la última entrega, y se determinará a partir del reparto de tareas dentro del equipo (entregado en la Entrega1 y la Entrega3) y de las presentaciones finales del equipo con su tutor.


Competencia transversal "Trabajo en equipo": Se evalúa usando una rúbrica simple, disponible para los estudiantes, en que el tutor de cada grupo puntúa los diferentes aspectos relacionados con la competencia de cada miembro de los equipos.

Competencia transversal "Emprendeduría e innovación": Se evalúa considerando la iniciativa del equipo en los dos momentos en que se han de tomar decisiones propias, no predeterminadas en la asignatura: las funcionalidades extras del proyecto y los algoritmos y estructuras de datos con los que se va a resolver la funcionalidad principal. Por tanto, la evaluación es una combinación de dos criterios:
1) En función de las funcionalidades opcionales propuestas versus las funcionalidades opcionales implementadas
2) En función de la iniciativa del equipo al escoger algoritmos y EDs para implementar las funcionalidades principales

Bibliografía

Básica:

Complementaria:

Web links

Capacidades previas

- Capacidad para resolver problemas algorítmicos de dificultad media a partir de una especificación clara, y de implementar las soluciones en un lenguaje de programación imperativo.

- Conocimiento de los mecanismos básicos de estructuración de programas (modularización, encapsulación, tipos abstractos de datos, clases) y capacidad para aplicarlos a problemas pequeños-medios (unos pocos módulos)

- Conocimiento de los elementos de programación orientada a objetos (clases, objetos, mecanismos de ejecución).

- Familiaridad con un lenguaje imperativo orientado a objetos.

- Capacidad de usar y programar estructuras de datos en este lenguaje.

- Capacidad de usar librerías en este lenguaje.

- Dominio de estrategias básicas para encontrar y corregir errores en módulos sencillos.