10.f.1 - Práctica con opencode

Objetivo

Utilizar opencode como agente de programación en terminal para analizar, modificar, probar y documentar un proyecto sencillo, manteniendo siempre la supervisión del programador sobre los cambios realizados.

1. Contenidos

1.1 ¿Qué es opencode?

opencode es una herramienta de inteligencia artificial orientada a la programación que se utiliza desde la terminal. A diferencia de un chatbot tradicional, puede trabajar sobre los archivos de un proyecto, analizar el código, proponer cambios y ayudar en tareas habituales de desarrollo.

En esta unidad no utilizaremos opencode para que programe por nosotros, sino para aprender a trabajar con un agente de IA de forma controlada. El objetivo es que el alumno sea capaz de pedir ayuda, revisar los cambios, probar el resultado y justificar las decisiones tomadas.

Idea clave: opencode puede actuar como asistente de programación, pero el responsable final del código sigue siendo el programador.

La práctica se realizará sobre un proyecto Java sencillo. El proyecto debe ser lo suficientemente pequeño para poder revisarlo completo, pero lo bastante realista para incluir análisis, generación, corrección, refactorización y pruebas.

1.2 Antes de empezar: preparación del entorno

Antes de utilizar opencode conviene preparar el entorno de trabajo. Un agente de IA puede modificar archivos, por lo que es importante trabajar de forma ordenada.

Requisitos recomendados:

  • Tener Java instalado y funcionando.
  • Tener Git instalado.
  • Tener un proyecto Java sencillo en una carpeta propia.
  • Comprobar que el proyecto compila antes de pedir cambios.
  • No incluir claves, contraseñas ni datos personales en el proyecto.

Comprobaciones iniciales:


java --version
git --version
				

Si el proyecto ya está en una carpeta, podemos entrar en ella desde la terminal:


cd ruta/del/proyecto
				

Buena práctica: Antes de usar un agente, guarda una copia del proyecto o trabaja con Git. Así podrás revisar o revertir cambios si algo sale mal.

1.3 Proyecto de práctica

Para esta sesión utilizaremos una aplicación Java sencilla llamada GestorTareas. La aplicación tendrá una lista de tareas representada de forma básica y algunas operaciones sencillas.

El objetivo no es construir una aplicación completa, sino practicar el flujo de trabajo con opencode. Trabajaremos con un proyecto pequeño para que cada cambio pueda revisarse fácilmente.

Estructura inicial propuesta:


gestor-tareas/
├── src/
│   └── GestorTareas.java
└── README.md
				

Código inicial:


public class GestorTareas {
	public static void main(String[] args) {
		String tarea1 = "Revisar apuntes de Java";
		String tarea2 = "Hacer ejercicios de bucles";
		String tarea3 = "Subir práctica al aula virtual";

		Boolean tarea1Completada = true;
		Boolean tarea2Completada = false;
		Boolean tarea3Completada = false;

		System.out.println("Listado de tareas:");
		System.out.println("1. " + tarea1 + " - " + tarea1Completada);
		System.out.println("2. " + tarea2 + " - " + tarea2Completada);
		System.out.println("3. " + tarea3 + " - " + tarea3Completada);
	}
}
				

Limitación intencionada: El código inicial es simple y mejorable. Esto nos permite practicar explicación, revisión, refactorización y mejora con ayuda de IA.

1.4 Inicializar el repositorio Git

Antes de permitir que una herramienta modifique archivos, debemos poder comprobar qué ha cambiado. Para eso utilizaremos Git.

Comandos iniciales:


git init
git status
git add .
git commit -m "Crea versión inicial del gestor de tareas"
				

Después del commit inicial, el proyecto queda guardado en un punto conocido. Si opencode realiza cambios incorrectos, podremos compararlos con la versión anterior.

Comando para revisar cambios:


git diff
				

Regla de seguridad: No aceptes un cambio de un agente sin revisar antes el diff.

1.5 Primer uso: pedir análisis sin cambios

El primer contacto con opencode debe ser de solo lectura. Antes de modificar archivos, es conveniente pedirle que analice el proyecto y explique qué ha encontrado.

Prompt recomendado:


Analiza este proyecto Java.

No modifiques ningún archivo todavía.
Quiero que expliques:
1. Qué archivos contiene el proyecto.
2. Qué hace la clase principal.
3. Qué limitaciones tiene el código actual.
4. Qué mejoras sencillas podrían hacerse con nivel de primer curso.
				

Este prompt permite comprobar si el agente entiende correctamente el proyecto. Si la explicación contiene errores, no deberíamos pedirle todavía que modifique el código.

Pregunta de control: ¿La explicación del agente coincide con lo que tú ves en el código?

1.6 Pedir una mejora concreta

Una vez analizado el proyecto, podemos pedir una mejora pequeña y concreta. En esta práctica, pediremos extraer la impresión de una tarea a un método.

Prompt recomendado:


Modifica el proyecto para extraer la impresión de una tarea a un método.

Restricciones:
- Modifica solo GestorTareas.java.
- Mantén un nivel de Java de primer curso.
- No uses arrays ni colecciones todavía.
- Usa tipos wrapper cuando corresponda.
- Haz el cambio mínimo necesario.
- Después del cambio, explica exactamente qué has modificado.
				

Posible resultado esperado:


public class GestorTareas {
	public static void mostrarTarea(Integer numero, String descripcion, Boolean completada) {
		System.out.println(numero + ". " + descripcion + " - " + completada);
	}

	public static void main(String[] args) {
		String tarea1 = "Revisar apuntes de Java";
		String tarea2 = "Hacer ejercicios de bucles";
		String tarea3 = "Subir práctica al aula virtual";

		Boolean tarea1Completada = true;
		Boolean tarea2Completada = false;
		Boolean tarea3Completada = false;

		System.out.println("Listado de tareas:");
		mostrarTarea(1, tarea1, tarea1Completada);
		mostrarTarea(2, tarea2, tarea2Completada);
		mostrarTarea(3, tarea3, tarea3Completada);
	}
}
				

Comprobación: El programa debe mostrar la misma información que antes. La estructura interna ha mejorado, pero el comportamiento externo debe mantenerse.

1.7 Revisar el diff después del cambio

Después de que opencode modifique el proyecto, debemos revisar qué ha cambiado. El objetivo es detectar si el agente ha hecho solo lo pedido o si ha añadido cambios innecesarios.

Comando:


git diff
				

Ejemplo simplificado de diff:


+ public static void mostrarTarea(Integer numero, String descripcion, Boolean completada) {
+ 	System.out.println(numero + ". " + descripcion + " - " + completada);
+ }

- System.out.println("1. " + tarea1 + " - " + tarea1Completada);
- System.out.println("2. " + tarea2 + " - " + tarea2Completada);
- System.out.println("3. " + tarea3 + " - " + tarea3Completada);
+ mostrarTarea(1, tarea1, tarea1Completada);
+ mostrarTarea(2, tarea2, tarea2Completada);
+ mostrarTarea(3, tarea3, tarea3Completada);
				

En este caso, el cambio es razonable: se añade un método y se sustituyen tres líneas repetidas por tres llamadas al método.

Pregunta de revisión: ¿El agente ha modificado solo lo necesario para cumplir el objetivo?

1.8 Ejecutar y probar el programa

Una vez revisado el diff, hay que ejecutar el programa. La revisión visual no sustituye a la prueba real.

Compilar y ejecutar desde terminal:


javac src/GestorTareas.java
java -cp src GestorTareas
				

Salida esperada:


Listado de tareas:
1. Revisar apuntes de Java - true
2. Hacer ejercicios de bucles - false
3. Subir práctica al aula virtual - false
				

Si el programa no compila o la salida ha cambiado sin motivo, debemos volver a revisar el cambio o pedir al agente que explique el error.

Prompt para corregir después de probar:


He probado el programa después del cambio y aparece este error:

[pegar aquí el error completo]

No hagas cambios todavía.
Explícame la causa probable y propón el cambio mínimo necesario.
				

Importante: El mensaje de error completo es una de las mejores pistas para depurar correctamente.

1.9 Añadir una nueva funcionalidad

Después de practicar con una refactorización sencilla, podemos pedir una funcionalidad nueva. Por ejemplo, mostrar el número total de tareas y cuántas están completadas.

Prompt recomendado:


Añade al programa un resumen final con:
- Número total de tareas.
- Número de tareas completadas.
- Número de tareas pendientes.

Restricciones:
- Modifica solo GestorTareas.java.
- No uses arrays ni colecciones.
- Mantén el código comprensible para primer curso.
- Crea métodos pequeños si ayuda a mejorar la claridad.
- Explica cómo probar el cambio.
				

Posible salida final:


Listado de tareas:
1. Revisar apuntes de Java - true
2. Hacer ejercicios de bucles - false
3. Subir práctica al aula virtual - false

Resumen:
Total de tareas: 3
Completadas: 1
Pendientes: 2
				

Control de alcance: Si el agente intenta convertir el programa en una aplicación mucho más compleja, hay que detenerlo y volver a pedir un cambio más pequeño.

1.10 Pedir casos de prueba a opencode

Además de modificar código, podemos pedir a opencode que proponga casos de prueba. En programas sencillos, las pruebas pueden ser manuales.

Prompt recomendado:


Propón casos de prueba manuales para este programa.

Quiero una tabla con:
- Caso de prueba.
- Datos utilizados.
- Salida esperada.
- Qué se comprueba.

No modifiques el código.
				

Ejemplo de tabla esperada:

CasoDatosSalida esperadaQué comprueba
Todas pendientes3 tareas con completada = falseTotal 3, completadas 0, pendientes 3Cuenta correctamente las pendientes.
Todas completadas3 tareas con completada = trueTotal 3, completadas 3, pendientes 0Cuenta correctamente las completadas.
Mezcla de estados1 completada y 2 pendientesTotal 3, completadas 1, pendientes 2Calcula bien el resumen mixto.

Idea clave: Las pruebas no deben limitarse al caso que ya funciona. Hay que buscar también situaciones límite o distintas combinaciones de datos.

1.11 Documentar el trabajo realizado

En una práctica con IA es importante documentar no solo el resultado final, sino también el proceso seguido. Esto permite demostrar que el alumno ha comprendido el trabajo y no se ha limitado a aceptar respuestas automáticas.

La documentación mínima debería incluir:

  • Objetivo de la práctica.
  • Estado inicial del proyecto.
  • Prompts utilizados.
  • Resumen de las respuestas importantes de opencode.
  • Cambios aceptados.
  • Cambios rechazados, si los hubo.
  • Pruebas realizadas.
  • Reflexión personal sobre el uso de IA.

Ejemplo de fragmento para README.md:


## Uso de IA

He utilizado opencode para analizar el proyecto, proponer una refactorización
y generar casos de prueba manuales.

Cambios aceptados:
- Extracción del método mostrarTarea.
- Añadido de resumen final de tareas.

Comprobaciones realizadas:
- Revisión del diff con git diff.
- Compilación con javac.
- Ejecución del programa con distintos estados de tareas.
				

Evaluación: Documentar los prompts y decisiones ayuda a diferenciar un uso responsable de IA de una simple copia de código.

1.12 Flujo completo recomendado

El siguiente flujo resume cómo trabajar con opencode de forma segura y formativa:

  1. Preparar un proyecto pequeño y comprensible.
  2. Comprobar que el proyecto inicial funciona.
  3. Inicializar Git y crear un commit inicial.
  4. Pedir a opencode un análisis sin cambios.
  5. Pedir un cambio pequeño y concreto.
  6. Revisar el diff.
  7. Compilar y ejecutar el proyecto.
  8. Probar casos normales y casos límite.
  9. Aceptar, ajustar o rechazar el cambio.
  10. Hacer un commit con un mensaje claro.
  11. Documentar prompts, cambios y pruebas.

Comandos finales recomendados:


git status
git diff
javac src/GestorTareas.java
java -cp src GestorTareas
git add .
git commit -m "Refactoriza gestor de tareas y añade resumen"
				

Conclusión: La práctica no consiste en que opencode genere código perfecto, sino en aprender a dirigir, revisar y validar el trabajo de un agente de IA.

2. Ejercicios

2.1 Preparación del proyecto

Enunciado: Crea el proyecto gestor-tareas con la estructura propuesta en la sesión.

Tareas:

  1. Crea la carpeta del proyecto.
  2. Crea el archivo src/GestorTareas.java.
  3. Copia el código inicial.
  4. Compila y ejecuta el programa.
  5. Inicializa un repositorio Git y realiza un commit inicial.

2.2 Análisis con opencode

Enunciado: Pide a opencode que analice el proyecto sin modificar archivos.

Tareas:

  1. Redacta un prompt de análisis de solo lectura.
  2. Anota qué archivos dice haber revisado.
  3. Resume qué entiende opencode que hace el programa.
  4. Indica si su explicación es correcta o tiene algún error.

2.3 Cambio controlado

Enunciado: Pide a opencode que extraiga la impresión de tareas a un método llamado mostrarTarea.

Tareas:

  1. Redacta un prompt con restricciones claras.
  2. Pide que modifique solo GestorTareas.java.
  3. Revisa el diff generado.
  4. Indica qué líneas se han añadido y cuáles se han eliminado.
  5. Compila y ejecuta el programa.

2.4 Nueva funcionalidad

Enunciado: Añade un resumen final con total de tareas, tareas completadas y tareas pendientes.

Tareas:

  1. Pide a opencode una propuesta antes de modificar archivos.
  2. Autoriza solo un cambio pequeño.
  3. Revisa que no use arrays ni colecciones.
  4. Prueba al menos tres combinaciones de tareas completadas y pendientes.
  5. Documenta el resultado.

2.5 Registro de prompts

Enunciado: Crea una tabla con los prompts utilizados durante la práctica.

NúmeroObjetivo del promptPrompt utilizadoResultado obtenido¿Se aceptó?
1Análisis inicial
2Refactorización
3Nueva funcionalidad
4Pruebas

Completa la tabla y añade una breve explicación de qué prompt fue más útil y por qué.

2.6 Defensa técnica

Enunciado: Prepara una explicación oral breve del proyecto final.

Debes poder responder a estas preguntas:

  1. ¿Qué hacía el programa inicial?
  2. ¿Qué cambios ha propuesto opencode?
  3. ¿Qué cambios has aceptado?
  4. ¿Qué pruebas has realizado?
  5. ¿Qué parte del código podrías mejorar en una siguiente versión?

Reto: Mini proyecto supervisado con opencode

Crea una versión mejorada del proyecto GestorTareas manteniendo un nivel adecuado para primer curso.

La nueva versión debe cumplir:

  1. Mostrar tres tareas.
  2. Indicar si cada tarea está completada o pendiente.
  3. Calcular cuántas tareas están completadas.
  4. Calcular cuántas tareas están pendientes.
  5. Mostrar un resumen final.
  6. Usar al menos dos métodos además de main.
  7. No usar arrays, colecciones ni entrada por teclado.

Durante el proceso debes utilizar opencode, pero siguiendo estas condiciones:

Entrega recomendada: Código inicial, código final, tabla de prompts, capturas o copia de las pruebas realizadas, commits de Git y reflexión final.

3. Bibliografía