T.A.P.
Técnicas Actuales de Programación
Curso: 2025/26
|
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Clases: {aula: 1.4} {horario: lunes 12:00-12:50, jueves 10:40-11:30, viernes 9:40-10:30}
Laboratorios: {Laboratorio: aula 0.23} {horario: 15:00-17:30}
Tutorias {con las excepciones que puedan indicarse en GAUR}: Miercoles de 9h a 13h y Jueves de 8h a 10h
Este curso introduce una novedad sustancial en la metodología: el uso activo de herramientas de Inteligencia Artificial como apoyo al aprendizaje de la Programación Orientada a Objetos (POO). Aunque el programa que sigue a continuación se mantiene como referencia, no se seguirá de forma estricta. Algunos temas menos relevantes serán tratados de forma superficial o incluso omitidos, con el fin de dedicar más tiempo a explorar conceptos clave mediante el uso de IA. El objetivo es que el alumno no solo comprenda la POO desde una perspectiva técnica, sino que aprenda a utilizar la IA como herramienta para afianzar, experimentar y profundizar en los contenidos. Se espera una actitud proactiva, curiosa y crítica frente a esta nueva forma de aprender.
El curso va dirigido a alumnos que ya saben de programación puesto que han cursado, en su itinerario a través de los grados de Ingeniería Electrónica o Física, asignaturas introductorias (también Métodos Numéricos en el caso de los Físicos). En dichas asignaturas han adquirido (o reforzado, si damos por bueno que vienen de enseñanzas medias donde la informática ya está presente) los elementos básicos que permiten resolver pequeños problemas. Con "pequeños problemas" no hacemos referencia a que sean "insignificantes" o "fáciles de resolver", sino a que no se trata de problemas que requieran de gran estructuración. Como ejemplo tenemos los "Métodos Numéricos", que en muchas ocasiones son algoritmos muy elaborados y de gran complejidad, pero en todo caso tienen una definición muy sencilla que, a grandes rasgos, consiste en aplicar una determinada función a un conjunto de datos.
Ahora se trata de aprender a escribir software capaz de resolver problemas con una complejidad estructural mayor. Para facilitar esta tarea, los lenguajes de programación evolucionaron allá por la decada de los 80 del pasado siglo (aunque naturalmente esto tiene sus raices anteriores) hacia lo que se comoce como Programación Orientada a Objetos (POO).
Si bien en los cursos introductorios se ha utilizado el lenguaje Python que tiene capacidades de Orientación a Objetos (igualmente el Fortran utilizado en Métodos Numéricos), no se ha hace mucho hincapié en este aspecto. En la presente asignatura el elemento central es la adquisición de habilidades en este sentido: básicamente entender a fondo la POO para programar usando todas sus capacidades, y conocer algunas de las soluciones tecnológicas a las que la POO ha dado pie.
Con este objetivo, podríamos abordar el curso utilizando Python como lenguaje, de modo que partiríamos de un punto en que ya tendríamos las habilidades básicas adquiridas, pero no va a ser así: utilizaremos Java. Cambiar de lenguaje tiene lo que inicialmente puede entenderse como una desventaja, que es partir desde cero. Pero se verá que el tiempo invertido en aprender de Java lo que ya se sabe de Python tiene también sus enseñanzas (qué hay de común y qué de distinto entre los dos modos de hacer, con la reflexión que se hará al respecto). Java es un lenguaje excelente para este aprendizaje: el primero en ser realmente exitoso en la POO, el que ha sido "copiado" por otros muchos para incluir la POO en sus capacidades, y el que, desde el año 1995, sigue estando al frente de los más utilizados. Python es también un gran lenguaje (cada vez más al estar resultando el "ganador" en las áreas más impactantes en ciencia y tecnología actuales: big data, machine learning, etc.) pero no lo es tanto desde el punto de la didáctica de la POO.
Por tanto, el programa de la asignatura se corresponde casi en su totalidad con un curso de Java. A lo largo del mismo se irá reflexionando sobre el fundamento racional que justifica determinadas características y se irán destacando las técnicas utilizadas en la actualidad que Java facilita o incluso incluye en sí mismo.
Desde que apareció Java, allá por 1995, la secuencia de versiones ha sido muy llevadera y "considerada" con los usuarios (compatibilidades absolutas en todos los sentidos). Desde hace algún tiempo el modelo ha cambiado para dar respuesta más rápida a las nuevas características que se hacen necesarias en el "mundo real" del desarrollo de software (es algo que está sucediendo en multitud de desarrollos, no sólo en Java). Esto supone la capacidad de estar mucho mas "al día", pero es una incomodidad, ya que requiere cambios muy frecuentes (cada 6 meses en nuestro caso).
La versión actual de Java es la 24, pero el día 16 tendremos disponible la 25. que será LTS (Long Time Support), es decir, tendrá más tiempo de vigencia (soporte) que el que transcurra hasta que surja la siguiente versión (en Wikipedia hay detalles de todo esto). El protocolo de desarrollo de versiones en Java es uno de los puntos fuertes de Java.
Este tema de las versiones se ha convertido en algo relativamente complejo, y si quisieramos hacer un uso comercial deberíamos entenderlo a fondo (no porque conlleve ningún "peligro" como pueden ser incompatibilidades -caso de Python v2 vs. v3-), pero en nuestro caso no supone mayor problema.
En todo caso, para el contenido del curso nos basta con las capacidades que Java presenta ya desde hace tiempo, en la versión 7, aunque algunas de las capacidades posteriores tienen cierta importancia y las comentaremos en su momento. La versión 7 tiene un pequeño problema en todo caso -que en realidad no nos afecta- y es que los programas desarrollados con ella ya no funcionan en las máquinas que tengan Java 13 o posterior, por lo que es mejor usar Java 8 que funcionará en cualquier entorno Java. Pero esto a su vez tiene un inconveniente para nosotros, que es que Java 8 incluye "programación funcional", algo que se sale de la temática de este curso, y que hace que la documentación y los mecanismos de ayuda al desrrollo se compliquen en exceso. La propuesta final es, con todo ello, utilizar Java 8 pero programar limitando al uso de caraterísticas de Java 7.
Además del soporte del lenguaje, necesitaremos un Entorno de Desarrollo Integrado (IDE - Integrated Development Environment). A la par de la introducción de la versión 9 de Java por parte de Oracle tras comprar Sun Microsystems (empresa desarrolladora y propietaria de Java), ésta quiso reestructurar empresarialmente todo lo referente al lenguaje y elementos relacionados. El entorno de desarrollo que utilizaremos (Netbeans) era también propiedad de Sun Microsystems (tras numerosos avatares) pero fue puesto, algún tiempo después, en manos de Apache (fundación para desarrollo de software libre). Esto supuso un periodo transitorio con diversos avances y retrocesos en caracteristicas, pero con el tiempo recupero la estabilidad y actualmente disponemos de la versión 22 que es la que utilizaremos.
Con todo ello nos quedamos con que instalaremos Java 8 y Netbeans 27 (con lo que tenemos plataforma e IDE "más que de sobra"). Quien tenga interés por ir más allá de lo que veamos en el curso, puede instalar también en unos días el material más actual: Java 25
Es necesario saber programar (mejor “con soltura”) en un lenguaje cualquiera.
Es conveniente hacerlo con “conocimiento de causa”, es decir sabiendo de algorítmica y de estructuras de datos.
Es conveniente seguir con "estructuras de datos", ya que es fundamental para programar con un conocimiento de los elementos que se utilizan, pero en la Wikiversity se desarrolla en lenguaje C, y no es adecuado a nuestro caso. En el curso veremos unas cuantas estructuras de un modo que podríamos llamar "usuario".
De este modo, se cuenta con unas bases de programación, y si se quiere empezar a ver el lenguaje Java también con la Wikiversity: Introduction to Programming in Java".
Este año la evaluación se aleja del modelo tradicional basado en exámenes individuales frente al ordenador. En su lugar, se propone un enfoque más colaborativo, práctico y continuado: el desarrollo en equipo de una aplicación funcional a lo largo del curso.
Todos los grupos trabajarán en el desarrollo de una misma aplicación: un sistema de mensajería peer-to-peer que permita la comunicación directa entre usuarios sin necesidad de servidor central. Este proyecto servirá como hilo conductor para aplicar los conceptos clave de la Programación Orientada a Objetos, así como para explorar el uso de herramientas de Inteligencia Artificial en el diseño, depuración y mejora del software.
Criterio | Peso (%) | Descripción |
---|---|---|
🔧 Funcionalidad técnica | 30% | La aplicación debe cumplir los requisitos básicos: conexión P2P, envío/recepción de mensajes, persistencia local. |
🎨 Interfaz de usuario (GUI) | 15% | Diseño intuitivo, responsivo, y con una experiencia de usuario clara. |
🔌 Arquitectura y modularidad | 15% | Uso correcto de POO, separación de responsabilidades, claridad en el diseño. |
🤖 Uso de IA en el desarrollo | 10% | Aplicación efectiva de IA para generar código, depurar, documentar o mejorar el diseño. |
📚 Documentación y presentación | 10% | Manual de usuario, documentación técnica, presentación final clara y estructurada. |
🧠 Organización del equipo | 10% | Reparto de tareas, coordinación interna, gestión de entregas y comunicación. |
🧪 Pruebas y calidad del software | 10% | Pruebas funcionales, manejo de errores, estabilidad y rendimiento. |
La nota final será grupal, pero se podrá ajustar individualmente en función del grado de implicación, según autoevaluaciones y observaciones del profesor.
Semana 3–4
- Formación de equipos
- Reparto de responsabilidades por parejas/tríos
- Primer esquema de la arquitectura de la aplicación
- Propuesta de herramientas de IA que se utilizarán
Semana 6–7
- Implementación básica de conexión entre dos nodos
- Prueba de envío y recepción de mensajes
- Documentación técnica inicial
Semana 9–10
- GUI operativa con al menos dos vistas: conexión y chat
- Integración con el sistema de comunicación
- Feedback de usuarios simulados
Semana 12–13
- Guardado local de conversaciones
- Implementación básica de cifrado de mensajes
- Pruebas de integridad y recuperación
Semana 15
- Interoperabilidad entre aplicaciones de distintos grupos
- Informe de compatibilidad y errores detectados
- Ajustes finales
Última semana lectiva
- Demo funcional
- Entrega de documentación completa
- Exposición oral del proyecto (10 min por grupo)