10.d.1 - IA aplicada al código

Objetivo

Aplicar herramientas de inteligencia artificial a tareas habituales de programación, utilizándolas para comprender, generar, depurar, refactorizar, documentar y probar código sin perder el control técnico sobre la solución.

1. Contenidos

1.1 La IA como asistente de programación

La inteligencia artificial puede ser una herramienta muy útil durante el desarrollo de aplicaciones. Puede ayudar a explicar código, proponer soluciones, localizar errores, mejorar la estructura de un programa, generar documentación o sugerir pruebas.

Sin embargo, la IA no debe utilizarse como una máquina de copiar y pegar. El programador sigue siendo responsable de entender el problema, revisar la solución, ejecutar el código y comprobar que el resultado es correcto.

Idea clave: Usar IA para programar no significa dejar de pensar. Significa disponer de un asistente que puede acelerar algunas tareas, pero que necesita supervisión humana.

En esta sesión trabajaremos con ejemplos sencillos en Java, pero las técnicas pueden aplicarse también a otros lenguajes como JavaScript, Python, SQL, HTML o CSS.

1.2 Explicar código existente

Una de las tareas más útiles de la IA es explicar código que no entendemos completamente. Esto puede ocurrir al revisar código de un compañero, estudiar un ejemplo de clase o recuperar un proyecto antiguo.

Para obtener una explicación útil, conviene pedir a la IA que identifique las partes importantes del programa:

  • Qué datos de entrada utiliza.
  • Qué variables intervienen.
  • Qué proceso realiza.
  • Qué salida produce.
  • Qué ocurre paso a paso.

Ejemplo de prompt:


Explícame paso a paso este código Java.
Indica qué hace cada variable y cuál será la salida del programa.

public class EjemploSuma {
	public static void main(String[] args) {
		Integer suma = 0;

		for (Integer i = 1; i <= 5; i = i + 1) {
			suma = suma + i;
		}

		System.out.println("Resultado: " + suma);
	}
}
				

La explicación esperada debería indicar que el programa acumula los números del 1 al 5 y muestra el resultado final, que es 15.

Uso recomendado: Cuando estudies código generado por IA, pide siempre una explicación. Si no entiendes la explicación, no aceptes todavía el código.

1.3 Generación de código

La IA puede generar código a partir de una descripción del problema. Esta capacidad puede ser útil para obtener una primera versión, ver una posible estructura o comparar diferentes soluciones.

Para generar código con mejores resultados, el prompt debe incluir el lenguaje, el nivel, las restricciones y el comportamiento esperado.

Ejemplo de prompt:


Crea un programa Java de primer curso llamado CalcularDescuento.

Requisitos:
- Usa datos fijos en el código, sin Scanner.
- Utiliza Double para los precios.
- Calcula el precio final de un producto con un 15% de descuento.
- Muestra el precio inicial, el descuento aplicado y el precio final.
- Añade comentarios solo donde sean necesarios.
				

Posible código generado:


public class CalcularDescuento {
	public static void main(String[] args) {
		Double precioInicial = 80.0;
		Double porcentajeDescuento = 15.0;

		Double descuento = precioInicial * porcentajeDescuento / 100;
		Double precioFinal = precioInicial - descuento;

		System.out.println("Precio inicial: " + precioInicial + " euros");
		System.out.println("Descuento aplicado: " + descuento + " euros");
		System.out.println("Precio final: " + precioFinal + " euros");
	}
}
				

Este código puede servir como punto de partida, pero debe revisarse. Por ejemplo, habría que comprobar que los cálculos son correctos y que el formato de salida es adecuado.

Precaución: La IA puede generar código que compila pero no cumple exactamente el enunciado. Compilar no es lo mismo que funcionar correctamente.

1.4 Generación de funciones y métodos

En lugar de pedir programas completos, suele ser más útil pedir métodos pequeños y concretos. Esto permite revisar mejor el código y probar cada parte por separado.

Ejemplo de prompt:


Crea un método Java llamado esMayorDeEdad.

Requisitos:
- Recibe un parámetro Integer llamado edad.
- Devuelve Boolean.
- Devuelve true si la edad es mayor o igual que 18.
- Devuelve false en caso contrario.
- No uses Scanner.
- Añade un main sencillo para probar el método con tres edades.
				

Posible solución:


public class ValidarEdad {
	public static Boolean esMayorDeEdad(Integer edad) {
		return edad >= 18;
	}

	public static void main(String[] args) {
		System.out.println(esMayorDeEdad(17));
		System.out.println(esMayorDeEdad(18));
		System.out.println(esMayorDeEdad(25));
	}
}
				

Esta solución parece correcta para edades normales, pero todavía podríamos mejorarla si queremos controlar edades negativas o valores nulos.

Pregunta útil: ¿Qué casos no ha tenido en cuenta esta solución?

1.5 Depuración de errores con IA

Depurar consiste en localizar y corregir errores en un programa. La IA puede ayudar a interpretar mensajes de error, revisar fragmentos de código o proponer hipótesis sobre el origen del problema.

Para pedir ayuda con un error, debemos aportar información concreta:

  • Qué esperábamos que hiciera el programa.
  • Qué ha ocurrido realmente.
  • El mensaje de error completo.
  • El fragmento de código relacionado.
  • Qué pruebas hemos realizado.

Prompt poco útil:


El programa falla. Arréglalo.
				

Prompt mejorado:


Estoy programando en Java. Este código debería mostrar los números del 1 al 5,
pero se queda ejecutándose indefinidamente.

Código:
Integer contador = 1;

while (contador <= 5) {
	System.out.println(contador);
}

Explícame:
1. Por qué se produce el problema.
2. Qué tipo de error es.
3. Cómo corregirlo modificando lo mínimo posible.
				

El problema es que la variable contador no cambia dentro del bucle. La condición siempre sigue siendo verdadera y se produce un bucle infinito.

Código corregido:


Integer contador = 1;

while (contador <= 5) {
	System.out.println(contador);
	contador = contador + 1;
}
				

Buena práctica: Cuando la IA proponga una causa del error, compruébala ejecutando el código o haciendo una prueba pequeña.

1.6 Tipos de errores que puede ayudar a revisar

La IA puede ayudar a analizar distintos tipos de errores, pero no todos se detectan igual.

Tipo de errorDescripciónEjemploCómo puede ayudar la IA
Error de compilaciónEl programa no llega a ejecutarse porque el código no es válido.Falta un punto y coma.Puede interpretar el mensaje del compilador.
Error de ejecuciónEl programa compila, pero falla mientras se ejecuta.División entre cero.Puede explicar la excepción y localizar la línea problemática.
Error lógicoEl programa se ejecuta, pero el resultado es incorrecto.Calcular mal un descuento.Puede revisar el algoritmo, pero requiere pruebas del programador.
Error de diseñoLa estructura del programa dificulta su mantenimiento.Un método hace demasiadas cosas.Puede proponer una organización más clara.

Atención: Los errores lógicos son especialmente peligrosos porque el programa puede parecer correcto. Por eso son imprescindibles las pruebas.

1.7 Refactorización con IA

Refactorizar consiste en mejorar la estructura interna del código sin cambiar su comportamiento externo. Es decir, el programa debe seguir haciendo lo mismo, pero el código debe quedar más claro, organizado y fácil de mantener.

La IA puede ayudar a:

  • Mejorar nombres de variables, métodos y clases.
  • Eliminar código repetido.
  • Dividir métodos largos.
  • Separar responsabilidades.
  • Simplificar condiciones.

Código inicial:


public class Pedido {
	public static void main(String[] args) {
		Double p = 100.0;
		Double iva = 21.0;
		Double r = p + p * iva / 100;
		System.out.println(r);
	}
}
				

Prompt de refactorización:


Refactoriza este código Java sin cambiar su comportamiento.
Objetivos:
- Mejorar los nombres de las variables.
- Extraer el cálculo a un método.
- Mantener un nivel de primer curso.
- Explicar los cambios realizados.
				

Posible código refactorizado:


public class Pedido {
	public static Double calcularPrecioConIva(Double precioBase, Double porcentajeIva) {
		return precioBase + precioBase * porcentajeIva / 100;
	}

	public static void main(String[] args) {
		Double precioBase = 100.0;
		Double porcentajeIva = 21.0;

		Double precioFinal = calcularPrecioConIva(precioBase, porcentajeIva);

		System.out.println(precioFinal);
	}
}
				

Comprobación obligatoria: Antes y después de refactorizar, el programa debe producir el mismo resultado para los mismos datos de entrada.

1.8 Documentación de código con IA

La IA puede generar documentación para explicar cómo funciona una parte del programa. Esto puede incluir comentarios, documentación de métodos o un pequeño archivo README para un proyecto.

Una buena documentación no repite lo evidente. Debe explicar la intención del código, las decisiones importantes y las condiciones de uso.

Ejemplo de prompt:


Genera documentación breve para este método Java.

Condiciones:
- No expliques línea por línea lo evidente.
- Indica qué recibe, qué devuelve y cuándo debería usarse.
- Usa un lenguaje claro para alumnado de primer curso.

public static Double calcularPrecioConIva(Double precioBase, Double porcentajeIva) {
	return precioBase + precioBase * porcentajeIva / 100;
}
				

Posible documentación:


/**
 * Calcula el precio final de un producto aplicando un porcentaje de IVA.
 *
 * @param precioBase Precio del producto antes de aplicar el IVA.
 * @param porcentajeIva Porcentaje de IVA que se desea aplicar.
 * @return Precio final con el IVA incluido.
 */
public static Double calcularPrecioConIva(Double precioBase, Double porcentajeIva) {
	return precioBase + precioBase * porcentajeIva / 100;
}
				

Precaución: Documentar no significa llenar el programa de comentarios. Un código con buenos nombres suele necesitar menos comentarios.

1.9 Generación de pruebas

Una prueba sirve para comprobar si una parte del programa funciona como esperamos. La IA puede ayudar a proponer casos de prueba, pero el programador debe decidir si son suficientes.

Al probar código conviene incluir:

  • Casos normales: datos habituales.
  • Casos límite: valores justo en la frontera.
  • Casos erróneos: datos no válidos.

Ejemplo de método:


public static Boolean esMayorDeEdad(Integer edad) {
	return edad >= 18;
}
				

Prompt para generar pruebas:


Propón casos de prueba para este método Java.
Clasifícalos como casos normales, límite y erróneos.
No escribas todavía código de pruebas, solo una tabla con entradas y resultado esperado.

public static Boolean esMayorDeEdad(Integer edad) {
	return edad >= 18;
}
				
Tipo de casoEntradaResultado esperadoMotivo
Normal25trueEdad claramente mayor de edad.
Normal12falseEdad claramente menor de edad.
Límite18trueValor exacto de mayoría de edad.
Límite17falseValor inmediatamente inferior.
Erróneo-1Debe tratarse como dato no válidoUna edad negativa no tiene sentido.

Idea clave: La IA puede proponer pruebas, pero el programador debe comprobar si cubren realmente el enunciado y los casos importantes.

1.10 Verificación del código generado por IA

Todo código generado o modificado con ayuda de IA debe verificarse antes de aceptarse. La verificación es el proceso mediante el cual comprobamos que el programa cumple los requisitos.

Una revisión mínima debería incluir:

  1. Leer el código completo.
  2. Comprobar que se ajusta al nivel y a las restricciones del ejercicio.
  3. Ejecutarlo con datos normales.
  4. Ejecutarlo con casos límite.
  5. Ejecutarlo con datos incorrectos si el programa debe validarlos.
  6. Revisar que los nombres de variables y métodos son claros.
  7. Confirmar que puedes explicar la solución con tus palabras.

Checklist antes de entregar código asistido por IA:

PreguntaSí/No
¿He entendido todo el código?
¿El código cumple exactamente el enunciado?
¿He probado casos normales?
¿He probado casos límite?
¿He revisado posibles entradas incorrectas?
¿Los nombres de variables y métodos son claros?
¿Puedo justificar la solución oralmente?

Regla final: La IA puede participar en el proceso, pero la responsabilidad del código entregado es del programador.

1.11 Flujo de trabajo recomendado

Un uso profesional de la IA en programación debe seguir un flujo controlado. El siguiente proceso permite aprovechar la herramienta sin perder el control del proyecto:

  1. Comprender el problema: leer el enunciado y detectar entradas, procesos y salidas.
  2. Intentar una solución inicial: escribir una primera versión o al menos un diseño.
  3. Pedir ayuda concreta a la IA: explicar la duda o el bloqueo.
  4. Revisar la respuesta: comprobar si respeta las restricciones.
  5. Probar el código: ejecutar varios casos de prueba.
  6. Corregir y mejorar: ajustar la solución.
  7. Documentar decisiones: anotar qué se ha cambiado y por qué.

Buenas prácticas: En proyectos reales se recomienda trabajar con control de versiones, hacer cambios pequeños y revisar cada modificación antes de aceptarla.

2. Ejercicios

2.1 Explicación de código con IA

Enunciado: Observa el siguiente código Java:


public class SumaPares {
	public static void main(String[] args) {
		Integer suma = 0;

		for (Integer i = 1; i <= 10; i = i + 1) {
			if (i % 2 == 0) {
				suma = suma + i;
			}
		}

		System.out.println("Suma: " + suma);
	}
}
				

Tareas:

  1. Escribe un prompt para pedir a una IA que explique el código paso a paso.
  2. Indica cuál debería ser la salida del programa.
  3. Explica qué parte del código detecta si un número es par.

2.2 Generación de un método

Enunciado: Escribe un prompt para pedir a una IA que genere un método Java llamado calcularPrecioFinal.

El método debe cumplir estas condiciones:

  1. Recibe un Double precioBase.
  2. Recibe un Double porcentajeDescuento.
  3. Devuelve el precio final después de aplicar el descuento.
  4. No debe usar Scanner.
  5. Debe incluir un main con tres pruebas.

2.3 Depuración de un bucle infinito

Enunciado: El siguiente código debería mostrar los números del 1 al 3, pero no termina nunca:


public class BucleInfinito {
	public static void main(String[] args) {
		Integer contador = 1;

		while (contador <= 3) {
			System.out.println(contador);
		}
	}
}
				

Tareas:

  1. Escribe un prompt para pedir ayuda a una IA.
  2. Indica cuál es el error.
  3. Corrige el código modificando lo mínimo posible.

2.4 Refactorización de código

Enunciado: El siguiente código funciona, pero es poco claro:


public class Compra {
	public static void main(String[] args) {
		Double a = 50.0;
		Double b = 21.0;
		Double c = a + a * b / 100;
		System.out.println(c);
	}
}
				

Tareas:

  1. Escribe un prompt para pedir a una IA que lo refactorice.
  2. Indica qué nombres de variables mejorarías.
  3. Extrae el cálculo a un método.
  4. Comprueba que el resultado sigue siendo el mismo.

2.5 Casos de prueba

Enunciado: Tenemos el siguiente método:


public static Boolean esNumeroPositivo(Integer numero) {
	return numero > 0;
}
				

Tareas:

  1. Escribe un prompt para pedir a una IA casos de prueba.
  2. Propón al menos dos casos normales.
  3. Propón al menos dos casos límite.
  4. Propón al menos un caso erróneo o discutible.

Reto: Mejora un programa con ayuda de IA

Elige un programa Java sencillo que hayas realizado en unidades anteriores. Puede ser un ejercicio de condicionales, bucles, métodos o cálculos básicos.

Utiliza una herramienta de IA para realizar las siguientes acciones:

  1. Pedir una explicación del código.
  2. Pedir una revisión crítica.
  3. Pedir una propuesta de refactorización.
  4. Pedir una lista de casos de prueba.
  5. Aplicar solo los cambios que entiendas y puedas justificar.

Entrega el código inicial, los prompts utilizados, los cambios aplicados y una breve reflexión explicando qué aportó la IA y qué decisiones tomaste tú como programador.

Criterio principal: No se valorará que la IA haga mucho trabajo, sino que sepas usarla con criterio, comprobar sus propuestas y justificar el resultado final.

3. Bibliografía