Recientemente descubrí que Github Copilot, una IA que ayuda a escribir el código al sugerir fragmentos completos (a menudo basados solo en comentarios en lenguaje natural), ahora está disponible como un servicio comercial. Ya no necesito esperar para acceder a la versión beta, me registré para una prueba gratuita de dos meses.
Debo decir que mis expectativas eran altas. He jugado un poco con OpenAI API antes. Creo que usa el mismo modelo que Copilot, así que sabía que podría ser una experiencia alucinante. Lo instalé como una extensión de Visual Studio Code y comencé a preguntarme cómo debo desafiar a mi nuevo colega virtual.
Al leer algunos de los comentarios y artículos de la comunidad, descubrí que una de las ventajas de Copilot es que esta IA conoce más lenguajes de programación, marcos y API que cualquier desarrollador de flash y huesos que viva hoy. Después de todo, aprende usando cada repositorio público de GitHub que haya existido. Puede ser algo más que una herramienta de productividad. También puede ser una forma interactiva de descubrir cosas nuevas.
Mientras espero utilizarlo de esta manera, he decidido construir un juego. Un clon de Space Invaders parecía ser una elección adecuada, pero para hacer esto más interesante, hice algunas suposiciones:
Configuré la grabación de pantalla, encendí mi micrófono para hacer un pequeño comentario, inicié Visual Studio y acabo de escribir mi primera solicitud:
"""main function for a pygame"""
Copilot comenzó a darme líneas de código, una tras otra. Acabo de ingresar con tabulación a través de la lista de sugerencias y acepto un montón de importaciones. Entusiasmado al principio, rápidamente me encontré atrapado en un ciclo infinito de agregar las mismas dos líneas de código una y otra vez. No es bueno.
Con un mal comienzo, rápidamente me di cuenta de que estoy tratando de hacer demasiado, demasiado rápido. Pedir a Copilot que agregue una importación de PyGame primero y luego que cree una función que muestre una ventana funcionó.
En ese momento, también me di cuenta de que al hacer mi solicitud más precisa, puedo mejorar los resultados. Mientras escribe
"""create a function showing a game window"""
Lo tengo funcionando excepto por el hecho de que se mostró solo por un segundo y luego se detuvo de inmediato. Entonces me imaginé que tenía que ser muy directo con respecto a mis expectativas. cambiándolo a
"""create a function showing a game window and then left it open"""
Copilot amplió el código agregando un bucle de juego básico que evitaba que la ventana se cerrara.
Parecía que mi amigo y yo comenzamos a comunicarnos entre nosotros. ¡Agradable!
El siguiente paso fue crear una clase de nave espacial. Creé una clase en un archivo separado, nuevamente comencé a escribir otra solicitud y encontré otra cosa interesante. Resulta que Copilot sugiere no solo el código sino también el contenido de los comentarios que estoy escribiendo. Comencé a pedir usar las teclas de flecha para mover mi nave espacial y sugirió una oración completa.
Tengo que decir que era un poco escéptico si Copilot realmente entendería lo que está pasando en cuanto al proyecto. Analizar el código en un archivo editado actualmente es una cosa. Averiguar cómo estos archivos están interconectados es otra tetera.
El copiloto dice: "Te tengo cubierto". Es consciente de las clases en otros archivos, y no fue un problema usar la nave espacial en nuestra clase de juego. Copilot también descubrió que hemos definido un tamaño de ventana de juego específico y lo usamos mientras colocamos la nave espacial en la parte inferior central de la pantalla.
Debes pensar - "esta herramienta es asombrosa". ¿Derecha?
Lo es, pero nuestra relación no era solo luz de luna y rosas. Algunos de los problemas eran triviales, como lógica innecesaria en funciones que le pedí a Copilot que escribiera para mí. Algunas sugerencias llegaron con retraso y he perdido un poco de tiempo esperándolas.
A veces me sentía frustrado por mis propios errores. Dejé un comentario de que la función debería devolver cero en la parte superior del archivo, y luego, escribiendo otro comentario a continuación, estaba averiguando por qué Copilot intenta devolver cero al final de mi función. Pero no fue nada en comparación con el problema que pasé casi una hora resolviendo.
Estaba buscando colocar el barco en el lugar correcto y establecer su tamaño en 50x50 píxeles. Estaba tratando de formular mi comentario de muchas maneras. Obteniendo siempre el mismo resultado. Código, que no funcionaba porque Copilot decidió usar métodos que no existían en PyGame.
Obstinado como una mula, estaba tratando de invocar set_size y set_center en mi objeto sprite cargado, cada vez que obtenía:
AttributeError: 'pygame.Surface' object has no attribute 'set_size'
Innumerables veces he intentado reformular mi solicitud y siempre obtengo el código que no funcionaba en absoluto. Muy frustrante.
En algún momento, incluso pensé que debería dejar de grabar y olvidarme de eso. Etiquete Copilot como no apto para este propósito y finalice el experimento. Sin embargo, sentí que debe haber una manera de superar esto.
Pensé que trabajando con Copilot podía olvidarme de los documentos, pero resultó que era mi culpa por no entender los conceptos básicos de PyGame. No entendí el concepto de Rect ayudando a mover objetos en la escena. No entendí cómo usar las clases de utilidad para escalar mi sprite.
Encontrar esa información en la documentación rompió el hechizo. Pude sugerir una estrategia diferente de Copilot separando el sprite representado como un objeto Surface del Rect y pasándolos por separado a la pantalla.
El resto de este curso fue pan comido. Cuanto más código produje, más inteligente se volvió Copilot. Fue mágico cuando leyó mi mente e hizo que las balas y los extraterrestres se movieran en las direcciones correctas. Fue pan comido agregar un contador de puntuación que Copilot descubrió automáticamente que debería sumar las colisiones de balas con los invasores.
Después de todo, fue un éxito. El juego funcionaba y lo hice en menos de 2 horas aprendiendo todo desde cero. Copilot escribió al menos el 99 % del código y apenas he tenido que mirar la documentación, aunque sin ella probablemente todavía estaría atascado con el código incorrecto que me entregó mi nuevo amigo.
Puedes ver todos mis esfuerzos en este video de 2 horas en YouTube:
👉
Sin preparación, sin edición, sin trucos. Pura improvisación.
Solo una advertencia rápida: es emocional. Estoy frustrado la mitad del tiempo solo por reír y estar totalmente emocionado de dar cada pequeño paso en la dirección correcta.
También puede encontrar el código fuente que generó en mi Github. Como mencioné en el video, no es bonito, pero funciona:
👉 https://github.com/lukasz-wronski/copilot-invaders
Espero que lo hayas disfrutado. ¡Gracias por leer!