Dot.Blog

C#, XAML, WinUI, WPF, Android, MAUI, IoT, IA, ChatGPT, Prompt Engineering

GitHub Copilot avec C#

Copilot est la petite touche de ChatGPT qu'on trouve dans Office 365 mais aussi dans Visual Studio. Intellisense s'en trouve grandement amélioré. Découvrez comment ce diable écrit le code à votre place !

GitHub Copilot

Le 29 juin 2021, Github Copilot a fait une entrée fracassante ! Les développeurs du monde entier ont partagé de nombreux gifs, vidéos et captures d'écran montrant une expérience d'intellisense incroyablement boostée : des méthodes entières peuvent être automatiquement tapées pour vous. C'était tout simplement époustouflant ! Mais c'était expérimental, pour demain... Mais ça y est, nous sommes demain !

J'ai cependant commencé à me demander si ce n'était pas seulement des exemples très spécifiques qui brillaient, ou si cela pouvait vraiment aider à la programmation quotidienne. Ni une, ni deux, j'ai téléchargé l'extension (sa mise en route, l'abonnement, tout cela vous le trouverez sur le site de GitHub Copilot) et mes premiers tests ont commencé.

Après m'être inscrit et j'ai activé tout cela dans mons Visual Studio 2022. Il faut savoir que GitHub Copilot travaille avec de très nombreux langages et IDE même avec Visual Studio Code. Mais je préfère Visual Studio tout court et C#. Chacun fera comme il préfère c'est évident.

J'y suis enfin ! Il est vrai que j'ai zappé toutes les previews de l'année passée, comme je l'ai expliqué ici il y a un an ou deux j'ai donné dans l'expérimental et j'en ai assez. Je ne parle plus que des choses qui existent et qui marchent, largement avant leur adoption massive, mais je ne veux plus parler des zinzins en test c'est lassant. Mais désormais les rêves peuvent devenir réalité ! Si vous ne l'avez pas encore fait, inscrivez-vous ! Certes rien n'est gratuit ici-bas, mais ce n'est pas cher et la productivité gagnée devrait convaincre votre patron de débourser quelques dollars par mois pour gagner des heures de travail...

Que tester en premier ? Eh bien, parmi les nombreux exemples de Github Copilot que j'ai vus, je ne me souviens pas en avoir vu pour C# au début, il y en a maintenant. Il peut y avoir de nombreuses raisons à cela, mais cela m'intéresse car je pense que la manière dont nous développons en C# a beaucoup évolué au fil des années. Juste pour donner un exemple, avant .NET 4.5, nous n'avions pas les mots-clés async/await. Mais il serait presque impossible de trouver du code C# écrit aujourd'hui qui n'utilise pas la programmation asynchrone d'une manière ou d'une autre. Mais si Github Copilot utilise tout le spectre du code C# écrit au cours des 20 dernières années, il pourrait bien tomber dans les mauvaises habitudes d'antan. Sait-il écrire du code "à jour" ?

Quoi qu'il en soit, essayons-le !

Ajouter deux nombres ensemble

Ma première tentative d'utilisation de Copilot a été un simple test : ajouter deux nombres ensemble. Voici comment Copilot vous montre ce qu'il pense que vous voulez faire :

Vous pouvez ensuite appuyer sur la touche Tab pour accepter la proposition d'intellisense, comme vous le feriez normalement dans Visual Studio. Il peut y avoir un peu de délai entre la saisie et l'affichage des suggestions. Cela ne donne pas la même impression de l'intellisense d'avant, le bête sans IA. Mais il reste réactif si vous voulez (et devez !) vous arrêter une seconde ou deux pour voir ce qu'il pense que vous devriez faire. Car n'oublions jamais que tout code généré par une IA doit être rigoureusement expertisé avant d'être pris pour argent comptant ! Parfois Copilot offre des alternatives, on les balaye avec "Ctrl ;" mais cela peut dépendre des réglages de votre clavier et même du langage et de l'IDE.

Récupérer le contenu d'une page Web

Ensuite, j'ai voulu voir si je pouvais le piéger un peu en utilisant une méthode asynchrone, mais la logique était simple. Tout ce que je voulais faire, c'était récupérer le contenu d'une page web et renvoyer sa chaîne de caractères. Voici ce qu'il m'a donné (rappelez-vous on ne tape que le commentaire qui décrit la fonction ou même le début de sa signature seulement !) :


Encore une fois, ce n'est pas de la rocket science, mais c'est assez impressionnant. Il savait que la méthode elle-même était asynchrone (donc il pouvait utiliser "await"), et que nous utilisions une chaîne de caractères, donc il devrait renvoyer l'intégralité du contenu.

Disons alors que je veux faire un peu plus sophistiqué. Au lieu de renvoyer la chaîne de caractères du contenu de la page, je veux utiliser HtmlAgilityPack (un parseur HTML courant) pour renvoyer le document HTML analysé. De mon point de vue je pensais qu'il allait charger la page Web normalement, puis essayer de la parser en un document. Mais au lieu de cela voici ce qu'il a proposé :

Apparemment, HtmlAgilityPack a une classe appelée "HtmlWeb" qui le fait pour vous. Je n'aurais même jamais su cela sans Github Copilot. Cela m'a impressionné parce que, bien qu'il s'agisse d'une tâche assez courante, c'est aussi une bibliothèque tierce, pas le framework, ce qui, je pensais à coup sûr, le ferait trébucher. Et bien non. Il semble avoir gobé le code de tous les paquets Nuget aussi ! Au point d'en connaître des secrets que nous ignorons parfois. A la fois bluffant et un peu vexant...

Coder à partir des commentaires

L'une des choses les plus impressionnantes que j'ai vues dans les démos Copilot était la possibilité d'écrire un commentaire et de lui faire comprendre quel code écrire en fonction de ce seul commentaire. Encore une fois, c'est quelque chose sur lequel je pensais à coup sûr le faire trébucher, mais à la place:

On est d'accord, c'est un exemple assez simple mais ça m'a complètement époustouflé qu'à partir du seul commentaire, il savait quoi faire. Et puis cet article est un premier contact, une façon de vous faire découvrir Copilot. Nous n'allons pas décomposer un gros soft pour faire quelques exemples dont vous ne comprendriez rien sauf à lire 200.000 lignes de code...

Alors à la place, j'ai essayé de le faire choir. J'ai commencé avec le code suivant. Cela ne donne pas grand-chose.

static async Task Main(string[] args)
{
  var searchQuery = args[0];
  // Go to google and use the search query to find the first result
}

Et cette fois, Copilot m'a nourri ligne par ligne d'un code plutôt acceptable pour finir comme ça :

static async Task Main(string[] args)
{
  var searchQuery = args[0];
  // Go to google and use the search query to find the first result
  var url = $"https://www.google.com/search?q={searchQuery}";
  var client = new HttpClient();
  var html = await client.GetStringAsync(url);
  // Find the first result
  var startIndex = html.IndexOf("<h3 class=\"r\">");
  var endIndex = html.IndexOf("</h3>", startIndex);
  var result = html.Substring(startIndex, endIndex - startIndex);
  // Print the result
  Console.WriteLine(result);
}

Encore une fois, tout ce que j'ai fait a été d'accepter chaque suggestion en appuyant sur Tab encore et encore, je n'ai pas du tout modifié ce code. Et en fait c'est plutôt bon ! Il existe probablement de meilleures façons de le faire avec Regex et/ou HtmlAgilityPack, mais c'est en fait plutôt efficace. Et c'est tout cela qu'on ne tape pas, la productivité fait un bon de géant !

Coder des algorithmes

C'est là que je pense avoir vu Copilot briller le plus. Si vous savez expliquer quelque chose comme "j'ai besoin de l'algorithme qui fait XYZ", Copilot est alors assez malin pour comprendre et le faire pour vous.


Ici, il écrit un Bubblesort rapide, rien que pour vous et basé sur rien d'autre que le nom de la méthode et l'entrée. C'est l'enfance de l'art dirons les grincheux, mais demandez autour de vous à brûle-pourpoint à un développeur de vous cracher un tri par bulle correct du premier coup. Vous serez surpris du temps qu'il prendra sans peut-être même y parvenir. Alors on ne rigole pas, même d'un exemple simpliste !

Bien entendu Copilot peut traiter des algos un peu plus complexes.. sinon cela ne servirait à rien. Ce qui fait se poser la question des concours de code... Un tri mémoire rapide, une recherche optimisée telle que celle du "voyageur de commerce", ce n'est pas du code si simple. S'il suffit d'écrire ce qu'on veut dans un commentaire pour que Copilot le fasse, les règles du jeu devront être changées !

Conclusion

Je vais être honnête, je suis arrivé là-dessus en étant assez sceptique. N'ayant jamais mis la main sur l'outil lui-même, j'avais lu d'autres articles de presse mais ce qu'ont dit dans les journaux...enfin sur le web, méfiance. Soit selon certains Copilot est la prochaine grande chose qui va bouleverser le monde du dev, soit c'est juste un gadget de plus pour remplir les poches de sociétés déjà riches. Bien entendu ce n'est pas dans ce petit article que vous pourrez vous faire une idée vous non plus... Mais ici je n'avais pas cette prétention, juste l'envie de vous parler de Copilot et de commencer doucement. Et je dois admettre que je pense que Copilot a vraiment sa place. C'est ChatGPT adapté au code dans un IDE, c'est très fort et cela va changer plein de choses comme tout ce que touche ChatGPT. Vous devrez toujours être un programmeur pour l'utiliser, et un bon car il faut de l'expertise pour relire vite un code et savoir le valider, il ne va pas écrire une App pour vous (pas de suite en tout cas...), mais il est clair que le monde va se scinder en deux, ceux qui auront pris le train de l'IA et ceux qui resteront sur le quai à regarder les TGV passer....
Quoi que vous en pensiez le monde est en train de changer, Office, les dessins de DALL-E ou MidJourney, les vidéos, les voix, et maintenant notre bon vieux Visual Studio. Il faudrait être aveugle et sourd pour ne pas comprendre qu'une page se tourne et l'ère de Terminator a peut-être commencée... On s'était habitué à "Skynet" c'était assez sympa comme nom. Ca risque d'être ChatGPT (prononcer le G à l'anglaise sinon c'est vraiment pas classe, mais quitte à être un jour dans la m*rde au mois on aura été prévenu :-) ) 

Stay Tuned, la suite va être passionnante.

Faites des heureux, partagez l'article !
blog comments powered by Disqus