Récemment, j'ai découvert que Github Copilot, une IA qui aide à écrire le code en suggérant des extraits entiers (souvent basés uniquement sur des commentaires en langage naturel), est désormais disponible en tant que service commercial. N'ayant plus besoin d'attendre l'accès à la version bêta, je me suis enregistré pour un essai gratuit de deux mois.
Je dois dire - mes attentes étaient élevées. J'ai déjà joué un peu avec l'API OpenAI. Je crois qu'il utilise le même modèle que Copilot, donc je savais que cela pourrait être une expérience époustouflante. Je l'ai installé en tant qu'extension Visual Studio Code et j'ai commencé à me demander comment défier mon nouveau collègue virtuel.
En lisant certains des commentaires et articles de la communauté, j'ai découvert que l'un des avantages de Copilot est que cette IA connaît plus de langages de programmation, de frameworks et d'API que n'importe quel développeur flash et bone vivant aujourd'hui. Après tout, il apprend en utilisant chaque référentiel GitHub public qui ait jamais existé. Il peut être plus qu'un simple outil de productivité. Cela peut aussi être un moyen interactif de découvrir de nouvelles choses.
Tout en ayant hâte de l'utiliser de cette façon, j'ai décidé de créer un jeu. Un clone de Space Invaders semblait être un choix approprié, mais pour rendre cela plus intéressant, j'ai fait quelques hypothèses :
J'ai configuré l'enregistrement d'écran, allumé mon microphone pour faire un petit commentaire, lancé Visual Studio et je viens d'écrire ma première requête :
"""main function for a pygame"""
Copilot a commencé à me donner des lignes de code, les unes après les autres. Je viens d'entrer moi-même dans la liste des suggestions acceptant une tonne d'importations. Enthousiaste au début, je me suis rapidement retrouvé coincé dans une boucle infinie consistant à ajouter les mêmes deux lignes de code encore et encore. Pas bien.
Mal parti, je me suis vite rendu compte que j'essayais d'en faire trop, trop vite. Demander à Copilot d'ajouter d'abord une importation PyGame, puis de créer une fonction affichant une fenêtre a fait l'affaire.
À ce moment-là, j'ai aussi réalisé qu'en précisant ma demande, je pouvais améliorer les résultats. En écrivant
"""create a function showing a game window"""
Je l'ai fait fonctionner, sauf pour le fait qu'il n'a montré qu'une seconde, puis s'est immédiatement arrêté. Ensuite, j'ai imaginé que je devais être très simple concernant mes attentes. Le changer en
"""create a function showing a game window and then left it open"""
Copilot a étendu le code en ajoutant une boucle de jeu de base qui empêchait la fenêtre de se fermer.
Il semblait que mon copain et moi avons commencé à communiquer les uns avec les autres. Agréable!
L'étape suivante consistait à créer une classe de vaisseau spatial. J'ai créé une classe dans un fichier séparé, j'ai recommencé à écrire une autre requête et j'ai trouvé une autre chose intéressante. Il s'avère que Copilot suggère non seulement le code mais aussi le contenu des commentaires que j'écris. J'ai commencé à demander d'utiliser les touches fléchées pour déplacer mon vaisseau spatial, et cela a suggéré une phrase entière.
Je dois dire que j'étais un peu sceptique quant à savoir si Copilot comprendra réellement ce qui se passe au niveau du projet. Analyser le code d'un fichier en cours d'édition est une chose. Comprendre comment ces fichiers sont interconnectés est une autre paire de manches.
Le copilote dit : "Je t'ai couvert". Il est conscient des classes dans d'autres fichiers, et ce n'était pas un problème d'utiliser un vaisseau spatial dans notre classe de jeu. Copilot a également compris que nous avions défini une taille de fenêtre de jeu spécifique et que nous l'avions utilisée pour positionner le vaisseau spatial en bas au centre de l'écran.
Vous devez penser - "cet outil est incroyable". Droit?
C'est en quelque sorte, mais notre relation n'était pas seulement clair de lune et roses. Certains des problèmes étaient triviaux, comme une logique inutile dans les fonctions que j'ai demandé à Copilot d'écrire pour moi. Certaines suggestions arrivaient avec du retard, et j'ai perdu un peu de temps à les attendre.
Parfois, j'étais frustré à cause de mes propres erreurs. J'ai laissé un commentaire indiquant que la fonction doit renvoyer zéro en haut du fichier, puis en écrivant un autre commentaire ci-dessous, je cherchais pourquoi Copilot essayait de renvoyer zéro à la fin de ma fonction. Mais ce n'était rien en comparaison du problème que j'avais passé près d'une heure à résoudre.
Je cherchais à positionner le vaisseau au bon endroit et à définir sa taille à 50x50 pixels. J'essayais de formuler mon commentaire de tant de façons. Toujours le même résultat. Code, cela ne fonctionnait pas car Copilot a décidé d'utiliser des méthodes qui n'existaient pas dans PyGame.
Têtu comme une mule, il essayait d'invoquer set_size et set_center sur mon objet sprite chargé, obtenant à chaque fois :
AttributeError: 'pygame.Surface' object has no attribute 'set_size'
D'innombrables fois, j'ai essayé de reformuler ma demande en obtenant toujours le code qui ne fonctionnait pas du tout. Tellement frustrant.
À un moment donné, j'ai même pensé que je devrais arrêter d'enregistrer et oublier. Étiquetez Copilot comme ne convenant pas à cette fin et mettez fin à l'expérience. Pourtant, je sentais qu'il devait y avoir un moyen de surmonter cela.
Je pensais qu'en travaillant avec Copilot, je pouvais oublier la documentation, mais il s'est avéré que c'était de ma faute si je ne comprenais pas les bases de PyGame. Je n'ai pas compris le concept de Rect aidant à déplacer des objets sur la scène. Je n'ai pas compris comment utiliser les classes utilitaires pour mettre à l'échelle mon sprite.
Trouver cette information dans la documentation rompit le charme. J'ai pu suggérer une stratégie différente de Copilot en séparant le sprite représenté comme un objet Surface du Rect et en les passant séparément à l'écran.
Le reste de ce cours était la paix du gâteau. Plus j'ai produit de code, plus Copilot est intelligent. C'était magique quand il lisait dans mon esprit et faisait bouger les balles et les extraterrestres dans la bonne direction. C'était un jeu d'enfant d'ajouter un compteur de score que Copilot a automatiquement compris qu'il devrait ajouter des collisions de balles avec des envahisseurs.
Après tout, ce fut un succès. Le jeu fonctionnait et je l'ai fait en moins de 2 heures en apprenant tout à partir de zéro. Copilot a écrit au moins 99% du code et j'ai à peine eu besoin de consulter la documentation, bien que sans elle, je serais probablement encore coincé avec le code incorrect servi par mon nouvel ami.
Vous pouvez regarder tous mes efforts dans cette vidéo de 2 heures sur YouTube :
👉
Aucune préparation, aucun montage, aucune astuce. Pure improvisation.
Juste un avertissement rapide - c'est émotif. Je suis frustré la moitié du temps juste pour rire et être totalement excité de faire chaque petit pas dans la bonne direction.
Vous pouvez également trouver le code source généré sur mon Github. Comme je l'ai mentionné dans la vidéo, ce n'est pas joli, mais ça marche:
👉 https://github.com/lukasz-wronski/copilot-invaders
J'espère que vous en avez profité. Merci d'avoir lu!