Depuis longtemps déjà, certains prédisent la mort de la programmation informatique, mais cela n’est jamais arrivé pour diverses raisons, la plus importante étant que la programmation est tout autant un art qu’une science ou une discipline d’ingénierie. Présenté comme un assistant IA pour la programmation, Copilot de GitHub, actuellement en préversion technique à accès limité, cherchait à automatiser l’écriture de code en allant un peu plus loin que ce permettent IntelliSense et les outils équivalents. Il n’est pas entièrement autonome. Il faut lui déclarer ses intentions avant que Copilot ne puisse générer du code significatif et il faut aussi le superviser pour le remettre sur les rails lorsque, inévitablement, il déraille.

Copilot est un service cloud avec des interfaces pour Visual Studio Code (installé sur la machine du développeur ou dans le cloud sur Github Codespaces), pour un environnement de développement Jetbrain comme IntelliJ IDEA et pour Neovim. Le service cloud est un moteur de prédiction de code qui s’appuie sur OpenAI Codex, un modèle d’intelligence artificielle entraîné sur des milliards de lignes de code public. Oui, Codex et Copilot ont tous les deux suscité des controverses. Avant de dénoncer de potentielles violations de droits d’auteur et de confidentialité commises par Copilot (comme l’a déploré la Free Software Foundation), il faut comprendre que Codex a été entraîné sur du code publiquement disponible d’une manière souvent considérée comme équitable au sein de la communauté de l’apprentissage machine. Il faut aussi comprendre que Codex est un synthétiseur de code, et non un moteur de recherche. Mais les développeurs de Copilot reconnaissent eux-mêmes qu’il a encore beaucoup à dire sur la question : «… il s’agit d’un nouvel espace et nous souhaitons engager une discussion avec les développeurs sur ces sujets et conduire l’industrie à établir les standards appropriés pour la formation des modèles d’IA ». 

Comment fonctionne Copilot

OpenAI ayant été entraîné sur du code source accessible publiquement et sur du langage naturel, il comprend à la fois la programmation et les langages humains, indique GitHub. « L’extension éditeur de Copilot envoie vos commentaires et votre code vers le service GitHub Copilot qui utilise alors OpenAI Codex pour synthétiser et suggérer des lignes individuelles et des fonctions entières ». Et le service utilise les choix de l’utilisateur pour améliorer les suggestions futures.

Copilot étant en préversion limitée, il faut d’abord s’inscrire sur une liste d’attente avant de pouvoir y accéder. Une fois l’email de bienvenue reçu, on peut se rendre sur la page de l’extension GitHub Copilot sur la marketplace de Visual Studio Code pour pouvoir l’installer. Il faut ensuite autoriser l’extension dans Visual Studio Code. La page de démarrage contient un tutoriel que l’on peut suivre, à partir du point numéro 2. Dans ce tutoriel, on crée un fichier .JS du type « fonction calculateDaysBetweenDates(begin, end) { » et l’on obtient une fonction entièrement mise en oeuvre, déduite du nom de la fonction. Sur le tutoriel suivant, même page, on tape un commentaire résumant ce qu’une fonction doit faire et l’on obtient une fonction entièrement mise en oeuvre déduite du commentaire, même si le nom de la fonction est trop général pour être utile.

 

La page d’extension de GitHub Copilot sur la marketplace Visual Studio Code. Comme on peut le voir en haut de l’écran, l’extension est déjà installée. (agrandir l'image)

Capture d'écran de Visual Studio Code avec Copilot actif (agrandir). On y voit le 1er tutoriel dans la documentation avec la suggestion de code "ghost" au-dessous de la saisie, de même que la barre de contrôle pop-up de Copilot. (Crédit : Martin Heller / InfoWorld)

En plus de déduire les corps de fonction à partir du nom de la fonction et d’un commentaire sommaire, Copilot peut s’inspirer d’autres codes dans le fichier que l’on édite ainsi que des noms de variables. Par exemple, si l’on saisit deux points au clavier après un nom de variable en TypeScript, Copilot essaie de remplir le type. Si l'on saisit au clavier « var test1= », Copilot repère le mot « test » et génère un test exécutable pour la fonction précédente. Si je saisis plusieurs lignes qui forment un motif répétitif, Copilot essaiera de générer d’autres exemples sur le même modèle. 

Copilot s’utilise avec un large jeu de frameworks et de langages mais c’est avec Python, JavaScript, TypeScript, Ruby et Go qu’il fonctionne le mieux. Plus récemment avec Java, la famille des langages C (C, C++ et C#) étant prévue plus tard. Certains utilisateurs ont mentionné son bon fonctionnement avec certains frameworks JavaScript populaires comme React. A l’avenir, GitHub prévoit que Copilot prenne en compte une plus grande partie de code du projet dans son contexte, au-delà du seul fichier en cours.

(agrandir l'image) Dans cet exemple, les lignes 8 et 9 ont été générées en saisissant le début des lignes et une série de tabulations. La ligne 10 a été saisie, de même que le début de la ligne 11 et Copilot a terminé la ligne 11. En TypeScript, après compilation vers JavaScript exploité sous Node.js comme on peut le voir au bas de l'écran. Notez les commentaires incorrects générés sur les valeurs de résultats attendues en lignes 8 et 9.

Les défauts de Copilot

Tout d’abord, Copilot ne génère pas toujours du bon code ni du code correct. Pire, il lui arrive de générer du code que l’on ne peut pas faire tourner. J’ai rencontré ces trois cas de figure dans mon test. Il faut absolument vérifier le code que Copilot génère, comme s’il avait été écrit par un programmeur débutant qui sait effectuer des recherches sur Google mais qui nécessite d’être contrôlé de près. L’une des façons d’éviter d’accepter la première proposition offerte par Copilot consiste à recourir à l’option Open Copilot dans le menu contextuel, ou d’utiliser le raccourci Ctrl-Enter pour afficher la fenêtre de suggestions de Copilot dans un onglet séparé. On peut alors consulter les 10 solutions suggérées et accepter celle qui se rapproche le plus de ce que l’on veut. On pourra ensuite éditer un peu le code généré pour améliorer sa robustesse. 

GitHub a réalisé un benchmark sur la génération de code de Copilot. « Nous l’avons récemment comparé à un ensemble de fonctions Python qui ont une bonne couverture de test dans les dépôts open source », explique-t-il. Nous avons effacé le corps des fonctions et demandé à Copilot de les remplir. Le modèle l’a fait correctement dès le premier essai dans 43% des cas, et après 10 tentatives dans 57% des cas. Et il s’améliore à chaque fois ». Evidemment, 43% de bonnes réponses, ce n’est pas un très bon score d’exactitude (ni même acceptable) pour une utilisation en production, même si cela constitue une réussite impressionnante pour une nouvelle technologie de génération de code. Néanmoins, les bons réviseurs de code pourront rectifier le code généré par Copilot pour le rendre correct et robuste bien plus rapidement qu’ils ne l’écriront eux-mêmes en partant de zéro, surtout s’ils travaillent avec une bibliothèque ou un framework qu’ils utilisent depuis peu.

(agrandir l'image) L'onglet sur la droite présente 10 portions de code suggérées pour le corps de la fonction. On peut accepter celui qui se rapproche le plus de ce que l'on veut obtenir.

Quelques exemples

La page d’accueil de Copilot présente une série de petits exemple de génération de code et des exemples plus importants accompagnés de vidéos d’écrans dans la galerie Copilot. Il est probable que l’équipe de développement du logiciel en publie davantage avec le temps. Cela vaut la peine de regarder les animations proposées et de télécharger les vidéos depuis la galerie.

(agrandir) Un exemple Copilot pour l'analyse de sentiments en Python, en suivant la galerie. Des parties de six lignes ont été saisies, plus un lot de tabulations pour accepter le code. Plusieurs suggestions ont été rejetées, dont des phrases tests qui générait des négatives pour la liste de phrases positives. Le code n'a pas tourné avant l'installation du package Python Requests sur la machine avec pip3. (Crédit : Martin Heller / InfoWorld) 

Dans l’ensemble, Copilot est assez utile dans sa phase actuelle de développement. Ses performances actuelles laissent espérer que l’outil permettra de gagner du temps dans le futur. La question de savoir s’il vaudra la peine d’acheter le produit commercial quand il sera livré reste ouverte. Elle dépendra non seulement de l’évolution de ses performances, mais aussi des propres compétences du développeur qui l’utilisera et de son rôle.

Il existe plusieurs produits qui prétendent concurrencer Copilot. Le plus prometteur d’entre eux semble être Tabnine, de l’éditeur du même nom situé à Tel Aviv. Tabnine ressemble à IntelliSense sous stéroïdes. Il peut s’entraîner sur le corpus de code du développeur ainsi que sur du code source ouvert. Différentes autres alternatives recherchent essentiellement le code pertinent sur StackOverflow ce qui peut interroger sur la méthodologie. Cela vaut certainement la peine d’essayer Copilot dans son propre environnement et de suivre ses progrès au fil du temps.