En 2024, on avait fait un petit retour d'expérience sur l'utilisation de l'IA pour coder une application qui utilise nos modules. Depuis, l'IA a beaucoup progressé et s'est encore plus démocratisée. On s'est dit que ça serait intéressant de faire un point sur cette évolution.
Lors de notre précédent article sur le sujet, nous avions utilisé nous-mêmes l'IA pour réaliser le code. Cette fois, nous avons profité de la présence d'un stagiaire pour faire une expérience similaire, mais avec une approche plus neutre. En effet, on était intéressé d'avoir un feedback d'une personne plus jeune et qui a appris à programmer quand l'IA était déjà disponible. Il a une formation d'électronicien et a suivi des cours de programmation, mais n'a pas encore beaucoup d'expérience dans le développement informatique.
On lui a donc demandé de réaliser un programme qui contrôle une bouilloire pour maintenir de l'eau à 75° en utilisant un relais et une sonde de température Yoctopuce. Je vous rassure, il n'a pas fait que ça durant son stage, il a pu voir et contribuer à la conception d'un nouveau produit. On a simplement profité d'une journée libre pour l'utiliser comme "cobaie".
Il pouvait utiliser n’importe quelle IA tant qu’elle était gratuite et accessible à tous. Il était aussi libre de choisir les solutions techniques qu'il voulait. On lui a juste demandé son historique de chat pour nous rendre compte des difficultés qu'il a rencontrées et de l'efficacité des IA.
La bonne nouvelle, c'est qu'en une journée, il a réussi ce challenge en utilisant Claude et ChatGPT. Il a réalisé une application Python graphique qui utilise le framework Flask, mais, comme nous allons vous expliquer, tout n'est pas parfait. Nous n'allons pas vous divulguer le contenu des conversations, mais voici quelques observations que nous en avons tirées.
Les erreurs
Nous allons commencer par quelques remarques sur les résultats que les IA fournissaient.
Comme souvent, la première version de l'application que l'IA a réalisée ne fonctionnait pas. Il s'agit d'un paterne que nous avons aussi expérimenté. Quand on demande à une IA de réaliser une application, la première version contient des erreurs qui font que l'application ne démarre pas. C'est d'autant plus frustrant qu'il s'agit les 80% du temps de petite erreur stupide quand on connaît le sujet, mais qui peut dérouter un programmeur novice.
Par exemple, la première version de l'application générée par Claude contenait la ligne "from yoctopuce.cdll.yocto_api import YAPI, YRefParam" ce qui est complètement faux. Les deux possibilités sont:
- "from yoctopuce.yocto_api import YAPI, YRefParam" si la librairie Yoctopuce est installée via pip
- "from yocto_api import YAPI, YRefParam" dans tous les autres cas.
Aucune documentation ou exemple de notre librairie ne fait mention de "cdll", l'IA a simplement inventé une réponse qui paraissait plausible.
Quand on connaît le sujet, l'erreur est grossière et facilement détectable, mais, pour quelqu'un qui n'a jamais utilisé notre librairie, cela peut faire perdre beaucoup de temps. C'est du reste ce qui s'est passé. Claude a fini par corriger cette erreur, mais cela a pris quatre ou cinq allers-retours avec des questions pas souvent pertinentes.
Les solutions étranges
Une fois cette erreur corrigée, nous avons été assez impressionnés du résultat. L'application avait l'air bien finie et l'IA avait ajouté une interface graphique assez jolie.
Si le résultat était fonctionnel, il était loin d'être optimum. L'application n'était pas très réactive. En inspectant le code, on a compris le problème. L'IA n'a pas cherché à avoir une interaction optimisée avec les modules Yoctopuce.
Prenons le code qui allumait la bouilloire pendant x secondes.
Les relais Yoctopuce ont la possibilité d'être commutés d'un état à un autre avec la méthode "setState()", mais, dans ce cas, cela veut dire que l'application doit gérer manuellement les deux transitions (allumer la bouilloire et éteindre la bouilloire). Cela fonctionne correctement, mais le code est plus compliqué et moins efficace. Une des versions de l'application se figeait pendant quelques secondes, car elle allumait la bouilloire attendait X secondes et éteignait la bouilloire. Pendant ce temps le graphique et l'interface n'étaient plus mis à jour...
En plus, s’il y a une erreur dans le programme et qu'il plante, on peut se retrouver avec la bouilloire qui reste en position allumée.
La bonne solution estd'utiliser la méthode "pulse()". La fonction "pulse()" permet de faire basculer le relais dans l'état B pour un temps déterminé avant qu'il ne revienne automatiquement à l'état A. La transition est gérée directement par le board du relais et non par le PC. Cela a deux avantages: cela simplifie le code et cela garantit que le relais coupera le courant au bout du délai (même si le programme est interrompu).
Cette méthode est documentée, utilisée dans nos programmes d'exemples et a même fait le sujet d'un article en 2014. Pourtant, les IA n'ont jamais pensé à l'utiliser.
Quand notre stagiaire a demandé à l'IA de résoudre ce problème d'interface qui bloquait, l'IA a recréé une nouvelle version qui utilisait des Threads, ce qui a rendu le code encore plus compliqué. Les Threads permettent d'exécuter du code en parallèle, mais sont un sujet compliqué et souvent moins efficace. En plus, notre librairie Python n'est pas "Thread Safe" ce qui veut dire que le développeur doit gérer les problèmes de concurrence pour s'assurer qu'il n'y a pas deux Threads qui utilisent notre librairie en même temps.
Les IA n'ont pas géré les problèmes de concurrence, ce qui veut dire que le programme fonctionnait, mais qu'il y avait de forte chance que l'application plante si on la laisse fonctionner suffisamment longtemps...
Ce que nous avons remarqué
A la fin, plus que le résultat final, ce qui est intéressant, c'est comment notre stagiaire est arrivé à ce résultat et les conclusions que nous en avons tiré.
Les commentaires
Premièrement, le code généré est très verbeux. Entendez par là que le code source de l'application contient beaucoup de commentaires pour expliquer ce qui se passe. C’est bien, mais, dans notre cas, c’est un peu exagéré et cela devient contre-productif.
Pas forcément efficace
Même si l'application fonctionne, le code est souvent pas très optimisé. Nous avons parlé plus haut de la commutation des relais, mais c'est quelque chose que nous avons remarqué de manière générale. Si on regarde d'un peu plus près le code généré par les IA, il y a très souvent moyen de faire la même chose de manière plus efficace ou plus simple.
Trop complexe
Une autre caractéristique des IA, c'est qu’elles utilisent souvent des solutions trop complexes. Dans notre cas, il s'agissait des Threads, mais souvent, elles utilisent des librairies externes pour une toute petite fonctionnalité. Au final, on se retrouve avec une solution qui dépend de plusieurs librairies ou frameworks que l'on ne connait pas, alors qu'il aurait été plus judicieux de recoder la fonctionnalité autrement.
Difficile de les faire changer d'orientation
Quand une IA a choisi une approche, c'est en générale compliqué de la réorienter. Par exemple, quand nous avons vu que l'IA avait décidé d'utiliser des Threads, nous avons soufflé à notre stagiaire qu'il serait peut-être plus judicieux d'utiliser la méthode "pulse()". L'IA l'a complimenté sur son idée et s'est exécutée, mais a gardé des Threads. Au final, on se retrouve avec une solution aberrante, où le code utilise les Threads (avec la complexité que ça engendre) alors qu'il n'y en a plus besoin.
L'expérience
L'IA ne compense pas le manque d'expérience. C'est peut-être rassurant pour les développeurs seniors. L'expérience acquise avec les années est toujours utile.
Un développeur expérimenté aura nettement moins de problèmes avec l'IA, car, si elle part dans une mauvaise direction, il saura tout de suite la recadrer. Il arrivera rapidement à identifier là où l’IA est une vraie plus-value et là où il faut continuer à travailler à l’ancienne.
A contrario, pour un junior, l'IA est une arme à double tranchant. Le risque est de faire trop confiance à L'IA et de ne pas remettre en cause ses choix techniques. Le résultat final fonctionnera, mais il sera très probablement sous-optimal.
Conclusion
Nous sommes très partagés sur le sujet de l'IA. D’un côté, c’est un outil très puissant, capable de choses incroyables, comme le montrent les dernières nouvelles. D’un autre, elle semble buter sur des choses évidentes. C'est aussi ce que nous remarquons dans notre utilisation quotidienne. Parfois c'est bluffant et on se demande si notre job existera encore dans cinq ans, et juste après, elle se coince les pieds dans le tapis pour un problème simple....
