Con la tan en voga IA, y desde mi perspectiva más chapada a la antigua, no veía cómo esto de la inteligencia artificial iba a sustituir o reemplazar a un perfil de desarrollo con cierta experiencia. No lo hace, pero se acerca. Eso sí, con matices.

Cursor AI, características principales

Lo primero que debemos saber es que Cursor AI es un IDE con la confianza y apoyo de compañías prestigiosas y de renombre como estas:

trusted by engineers at: johnson & johnson, openAI, stripe, samsung, instacart, perplexity, ramp, shopify, us foods, mercado libre

Configuración

Cuando nos descargamos Cursor desde su web oficial y procedemos a instalar, vemos que tenemos la opción de aplicar los atajos de teclado de varios IDEs (en este caso hemos elegido Jetbrains, que es al que estoy habituado). Podemos especificar el idioma en el que nos vamos a comunicar. También podemos marcar que tenga el contexto del código para realizar preguntas.

página de configuración de cursor, donde podemos modificar el ide del que venimos, el idioma y marcar el contexto del código

Los modelos premium utilizan GPT-4 y Claude 3.5, que son modelos de IA bastante potentes. Una vez abrimos Cursor, tenemos un pequeño onboarding para aprender a manejar el IDE con IA, que es bastante intuitivo.

Aceptar autocompletado

Cursor hace sugerencias de autocompletado que aparecen al lado de nuestro cursor (por eso la aplicación se llama Cursor 😉). Esta es una de las tareas que tenemos que aceptar antes de comenzar.

pantallazo de cursor ai donde se muestra que, al poner el cursor en el código, te sugiere autocompletar

A continuación, creamos un fichero para ir completando los distintos check de bienvenida. El fichero que he creado es “Autocomplete.java” y simplemente con escribir el “public Class”, tab y después ”private”, ya me sugiere el siguiente código. Le damos “tab” y automáticamente nos genera el código:

imagen del ide donde sale el código autocompletado

Pedir una edición (Prompt an edit)

Sobre el ejemplo anterior, vamos a realizar algunas modificaciones. Usando tab, escribimos en nuestra función el argumento “Long” para que imprima un valor u otro en función de dicho parámetro. Seleccionamos el código escrito y nos saldrá algo como esto:

pantallazo del ide donde se muestra el código autocompletado después de la edición

En la parte derecha nos dará una explicación del cambio. En rojo nos enseñará el código previo y en verde, los cambios que va a hacer. Ejecutamos lo que ha generado y vemos que la tarea prompt se ha completado:

imagen donde se muestra la tarea completada

Completar una pregunta

Para mostrar su funcionamiento, voy a introducir a propósito una línea return “unknow” después del bloque if-else. Seleccionamos el bloque de código y damos al comando+L:

imagen donde se muestra añadida la línea "return unknow" en el ide

La respuesta que recibimos es la siguiente:

el ide responde que ha detectado un problema en el código: un error de código inalcanzable porque hay un return unknow después del bloque else que nunca se ejecutará ya que el bloque else ya tiene su propio return. a continuación, elimina la línea para resolver este error.

Vemos que en la parte derecha nos indica qué hay que cambiar y ,en caso de que estemos de acuerdo, procedemos a aceptar el cambio. Al mismo tiempo, podemos preguntar cualquier cosa acerca del código. En mi caso, he preguntado acerca de esta pequeña función y nos responde lo siguiente:

¿qué hace este código? este código es una clase java simple que hace lo siguiente:  1. define una clase autocomplete con un método privado foo que acepta dos parámetros de tipo long:  n: un número a evaluar,  maxN: un límite máximo para el número 2. el método foo implementa la siguiente lógica: si n es mayor que maxN, devuelve “número fuera de rango si n es 1, devuelve “foo” si n es 2, devuelve “bar” para cualquier otro valor, devuelve “unknow” 3. en el método main, el código: crea una instancia de la clase autocomplete realiza tres llamadas al método foo con diferentes valores es un ejemplo simple que demuestra el uso de condicionales y manejo de casos en java

Chatea con tu código base

Podemos hacerle cualquier pregunta sobre el proyecto, siempre y cuando tengamos muy claro qué queremos preguntar. En este caso, al tener solamente un fichero, voy a preguntar por una salida de la función, a ver si la encuentra:

¿ tenemos una respuesta unknow en el código? Voy a buscar en el código si hay alguna respuesta o mensaje "unknown". Q Searched codebase for "response unknown OR message unknown OR "unknown"' Sí, he encontrado una respuesta "unknown" en el código. Específicamente, está en el archivo Autocomplete java. Voy a leer el archivo completo para entender mejor el contexto. ® Read Autocomplete.java Sí, hay una respuesta "unknow" (que parece tener un error ortográfico, debería ser "unknown") en el archivo Autocomplet e-java. Esta respuesta aparece en el método foo() como el valor de retorno por defecto cuando: 1. El número n no es 1 (que retorna "foo") 2. El número n no es 2 (que retorna "bar") 3. El número n es menor o igual que maxN El código tiene la siguiente estructura de respuestas: • Sin > maxN → retorna "número fuera de rango" • Sin = 1 → retorna "foo" • Sin = 2 → retorna "bar" • Para cualquier otro caso → retorna "unknow" ¿Te gustaría que corrijamos el error ortográfico de "unknow" a "unknown"?

Con esto, habríamos acabado el manual de bienvenida. Es como el entrenamiento de un videojuego antes de ponerte a jugar un torneo: fácil e intuitivo.

Entramos en detalles: mejorando una PoC

Para mostraros parte de su potencial, había que verlo con un ejemplo práctico. En mi caso, he cogido esta PoC de TestContainers para ver qué me dice acerca de esto que codifiqué hace unos años.

Sé que las librerías están desactualizadas, que podría haber separado la configuración… he detectado varias mejoras, así que voy a empezar pidiéndole que me describa este proyecto:

Descripción del Proyecto Read pom.xml L1-183 Basado en la información recopilada, te puedo describir el proyecto de la siguiente manera: Este es un proyecto de demostración (POC - Proof of Concept) que utiliza Testcontainers, desarrollado por Paradigma Digital. Aquí están los detalles principales: 1. Tecnologías principales: • Java 17 • Spring Boot 3.2.3 • Testcontainers 1.19.7 • Oracle Database (usando ojdbc8) • Maven como gestor de dependencias 2. Características principales: • Es un microservicio (como indica el nombre del proyecto poc-testcontainers-ms- example) • Utiliza Spring Boot con varias características: • Spring Web (para endpoints REST) • Spring Data JPA (para persistencia) • Spring JDBC (para acceso a base de datos) • Spring Actuator (para monitoreo y health checks) 3. Estructura del proyecto: • Sigue una estructura estándar de Maven con directorios como: • src/ para el código fuente • doc/ para documentación • scripts/ para scripts de utilidad

Ahora le voy a pedir que busque problemas en el proyecto, a ver cómo se comporta:

¿ Qué problemas ves en el proyecto ? Voy a examinar el proyecto para identificar posibles problemas. Listed 13 items in current directory Voy a examinar algunos archivos clave para entender mejor el proyecto. Read pom.xml L1-172 Read README.md L1-54 Basado en mi análisis, he identificado varios problemas potenciales en el proyecto: 1. Versiones desactualizadas: • Spring Boot 2.5.5 (versión antigua, actualmente hay versiones más recientes y estables) • Java 1.8 (aunque es estable, podría beneficiarse de una versión más reciente) • Lombok 1.16.18 y 1.18.12 (hay una duplicación de la versión en el pom.xml) 2. Problemas de Seguridad: • El driver de Oracle (ojdbc6) está en una versión antigua (12.1.0.1.0) • Las URLs de los repositorios en el README están expuestas y podrían contener información sensible 3. Problemas de Estructura: • Hay múltiples Dockerfiles (Dockerfile y Paradigma-Dockerfile) lo que podría causar confusión • La documentación está marcada como "BETA" y podría necesitar actualización 4. Problemas de Configuración: • Las IPs hardcodeadas en el README para los hosts podrían no ser correctas para todos los entornos

A continuación, le pido que me lo solucione:

cursor ai lanza una propuesta para solucionar los problemas anteriores, marcando las líneas de código que ha propuesto en color rojo para que se puedan aceptar o rechazar

Una vez que Cursor me ha propuesto los cambios de mejora sobre mi código, iré revisándolos uno a uno y aceptándolos o rechazándolos, en función de si considero que lo que quiere cambiar es adecuado o no.

Mejoras en la estructura del código: • Reemplazado @EnableAutoConfiguration por @Sprin gBootApplication en la clase principal • Eliminado código redundante y mejorado el formato • Movido la configuración de la base de datos a applica tion-properties 3. Mejoras en la configuración: • Añadida configuración de JPA en application.proper ties • Configurado el puerto del servidor • Añadida configuración de logging SQL • Configurado el dialecto de Hibernate para Oracle 4. Mejoras en la seguridad: • Eliminada la configuración hardcodeada de la base de datos • Las credenciales ahora se pueden configurar a través de variables de entorno o archivos de propiedades Para completar la migración, deberías: 1. Asegurarte de tener Java 17 instalado en tu sistema 2. Actualizar Docker a una versión reciente para compatibilidad con TestContainers 3. Revisar y actualizar los tests para que sean compatibles con las nuevas versiones 4. Considerar usar variables de entorno para las credenciales de la base de datos en producción > Edited 4 files +225 -240 Reject

Después de realizar unos ajustes con la JVM, la versión de Maven y arrancar Docker, le pedimos que ejecute una prueba, y ¡vemos que lo soluciona! Ha migrado la configuración y ha reescrito lo necesario para solucionar los problemas.

imagen donde se muestra que los resultados son exitosos y se han solucionado los problemas

Conclusiones

Después de este estudio, estoy convencido de que esto es el futuro (y presente) y que va a aportar una productividad nunca antes vista a los equipos de desarrollo. Sin embargo, esto no es magia, ya que es necesario tener una base técnica fuerte para saber qué hay que preguntar y supervisar los cambios, ya que no siempre acierta.

La IA (en este caso para este IDE, debo probar Copilot y Windsurf también) debe ser una herramienta de apoyo y no sustituir nuestro trabajo. Debemos de tener claro que, si una buena solución de diseño consiste en aplicar X patrón, necesitamos guiar a la IA para que se comporte como nosotros le indiquemos, y no al contrario.

Por otro lado, también pienso que esto va a cambiar los marcos de trabajo, estimar, eso que tanto nos piden los clientes y tantos problemas nos presenta, no va a tener mucho sentido ahora.

Para ver las estimaciones en un ejemplo, realicé otra prueba en mi proyecto actual en el que tenemos una clase heredada de 1.700 líneas. Estimamos que nos llevaría 10 jornadas refactorizarlo. Cursor AI lo ha hecho en 3 horas. Eso sí, no sin problemas, ya que en algún momento he aceptado algún cambio de dependencia y eso me ha generado un referencia cíclica que me ha costado desenredar.

Sin embargo, y a pesar de los posibles errores y la supervisión que debemos darle, nos va a ayudar a generar mucha más certidumbre sobre lo que se está codificando.

Cuéntanos qué te parece.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.

Suscríbete