- Généralisation
- De l'espoir pour JavaScript ?
- Go
- Python
- Déductions hâtives (mais pas forcément fausses...)
- Conclusion
Le développement informatique va mal, très mal, à en croire mes dernières expériences.
Généralisation
Un peu de contexte : depuis quelque temps, j'utilise ChatGPT pour faire plein de choses, principalement dans mon langage de prédilection (PHP) et avec mon framework préféré (Laravel). Très satisfait du résultat : le code que ChatGPT me fourni est très propre, bien architecturé, bien documenté. C'est assez rare que je sois obligé de faire de grosses modifications sur ce qu'il me propose, y compris sur des blocs de code assez complexes.
Avec plus de vingt ans d'expérience avec PHP et presque neuf avec Laravel, mon niveau d'exigence est élevé : je lui impose de me fournir des tests unitaires, et de suivre les principes fondamentaux du développement à la lettre (DRY, KISS, SOLID, tout ça). Il a légèrement tendance à oublier le SRP, mais dans l'ensemble, c'est très bon, même sur des design-pattern complexes ou totalement nouveaux (il suffit de lui expliquer avec un exemple pour qu'il le reproduise dans un autre contexte).
Il ne faut pas en déduire que ChatGPT est bon avec PHP et Laravel : il faut en déduire que les données avec lesquelles il a été entraîné sont de bonne qualité.
Autrement dit, que les développeurs PHP et Laravel qui ont produit le code source avec lequel ChatGPT a été entraîné sont de bons développeurs. Si cette formulation ne vous convient toujours pas, cela signifie que statistiquement, ChatGPT a été exposé à davantage de "bon" code PHP/Laravel que de "mauvais".
De l'espoir pour JavaScript ?
Enthousiasmé par ces bons résultats, je me suis dit que j'allais peut-être réussir à me débarrasser de ma haine multidécennale pour JavaScript. J'ai donc décidé de créer une application complète en JavaScript, en me positionnant comme le maître ignorant.
Il m'a fallu bien plus d'efforts pour parvenir à quelque chose d'à peu près correct. Comprendre : un MVP, sans tests unitaires ou fonctionnels.
J'ai dû, à de nombreuses reprises, rappeler à ChatGPT de documenter le code, de respecter le SRP, d'utiliser des conventions de nommage correctes, bref, tout ce que j'estime être la base du développement.
Et, alors que j'ai fini par obtenir une application tournant à peu près correctement sur mon Mac mini M2, impossible de la faire tourner sur le serveur sous NixOS... Un comble !
Au final, je me retrouve encore plus frustré par JavaScript qu'avant. Il y a de nombreuses causes à cela et, malgré les années que j'accumule à essayer d'apprécier le langage et son écosystème, je n'en ai anticipé aucune :
-
import
ourequire
? - C'est quoi "CommonJS" et "ECMAScript" ? (tip : l'un est un projet de standard utilisé par une moitié des projets, l'autre est un standard utilisé par l'autre moitié des projets, démerde-toi avec ça, et démerde-toi pour démêler les dépendances qui ne sont compatibles qu'avec l'un ou l'autre)
- express ? next ? nuxt ? (nixt ? non, ça, c'est juste pour la blague...) démerde-toi pour choisir ton framework parce qu'une fois choisi, même si ton code ne change pas le moindre point-virgule, t'es coincé avec jusqu'à la fin de ta vie
- les tests avec Jest ou mocha ? comme d'habitude, aucune interopérabilité : si t'en choisi un, t'es coincé avec
- les dépendances (modernes et connues) qui fonctionnent nativement sur mon M2, mais pas dans docker avec Rosetta 2
- etc.
J'en déduis que ChatGPT a été abreuvé de code merdique (où la documentation est en option et les principes de développement sont bons pour les nazis du code), splitté en deux mondes différents que ChatGPT essaye vainement de faire cohabiter. Il en résulte une profonde frustration et beaucoup de temps perdu à essayer de l'orienter dans une direction ou l'autre, laissant tomber les tests dans la foulée pour ne pas totalement perdre l'esprit...
Go
À contrecœur, j'essaye alors de réaliser le même projet en Go. Abhorrant tout ce qui vient de Google, peut-être encore plus que JavaScript, je me suis dit qu'étant donné la popularité du langage, ChatGPT ferait peut-être mieux. En vérité, c'était encore pire.
On a pourtant commencé très doucement : tout ce que je lui demandais, c'était de créer un début de base d'application dont le seul objectif à ce stade était de répondre "Hello world" à une requête HTTP.
La petite "complication", c'était d'avoir un fichier .env
optionnel permettant de définir l'interface et le port d'écoute.
Et du coup, les tests unitaires ou fonctionnels qui allaient bien.
Littéralement rien de plus.
On a passé trois heures sur le débogage du code permettant de charger le .env
.
On a ajouté des dizaines de lignes pour tenter de trouver la raison pour laquelle les tests ne passaient pas, avec le seul message que le fichier .env
ne pouvait pas être chargé.
Finalement, c'était parce qu'apparemment, une bonne pratique en Go serait de placer les fichiers contenant les tests aux côtés des fichiers "réels".
Du coup, l'application cherchait un fichier .env
dans le mauvais dossier (il était à la racine de l'application, là où il est censé être).
Alors, ChatGPT m'a proposé des solutions absolument abominables, à base de ../../../
ou de path.Dir(path.Dir(path.Dir))
.
Et même la solution propre os.Executable
ne fonctionnait pas, parce que le chemin renvoyé pointait sur un dossier créé dynamiquement.
Incompréhensible, totalement contre-intuitif.
En plus de ça, ChatGPT n'a pas commenté son code, ce que je n'ai pas manqué de lui faire remarquer. Il a corrigé en rajoutant (par exemple) :
// parseFile parse specified file
Au-dessus de chaque méthode/fonction. J'en ai déjà parlé dans mon rant contre Hugo : Go, c'est de la merde, avec des morceaux de what-the-fuck dans chaque boulette.
N'ayant trouvé aucune solution au problème de chargement du .env
, et après trois heures de tentatives vaines et pitoyablement pathétiques du genre... ne rien changer au code, mais faire croire que "j'ai" (ChatGPT) changé quelque chose, j'ai simplement abandonné, supprimé les conversations avec ChatGPT, supprimé toutes les sources, aussi misérables soient-elles, que nous avons écrites, et je me suis mis à écrire le présent article.
Python
J'ai aussi demandé à ChatGPT de développer la même application avec les mêmes spécifications en Python. Étant donné que j'ai des ambitions d'utiliser l'IA localement, j'ai pensé que ça serait une bonne idée.
Je vais être bref ici : je ne supporte pas la syntaxe de Python. Ni la façon de documenter le code, ni l'empilement de code, ni son indentation, au moins aussi casse-couilles qu'en yaml. Désolé, je n'écris pas cet article pour faire le procès de certains langages ou l'apologie de PHP/Laravel, mais je ne peux que constater que le code Python que m'a proposé ChatGPT est tout aussi merdique qu'en Node.js ou en Go, à des kilomètres de la qualité presque académique qu'il m'a fourni en PHP.
Et les caractéristiques de Python que je viens de citer m'ont découragé à tenter de modifier le code proposé par ChatGPT, ce qui m'a obligé à faire d'incessants copier-coller entre mon IDE et l'interface de chat.
Déductions hâtives (mais pas forcément fausses...)
Ne nous cachons pas derrière l'excuse que ChatGPT soit faillible. Oui, il l'est, mais cette excuse ne peut expliquer à elle seule la mauvaise expérience que j'ai eue avec lui dans le développement d'une application Node.js, Go ou Python.
Premièrement parce que ce n'est pas la première fois que je développe avec ces langages/technos. Je suis très loin d'avoir la même expertise qu'avec PHP/Laravel, mais je connais assez pour savoir qu'on peut faire du code très propre, bien documenté et bien architecturé. Même si Laravel est un cas très particulier de framework incitant les développeurs aux bonnes pratiques, au contraire de Node.js par exemple.
Deuxièmement parce que c'est trop facile de ne pas admettre l'inéluctable absolue vérité universelle (répétition volontaire) : les développeurs "nouvelle génération" sont de grosses feignasses qui n'ont plus aucun respect ni pour la profession, ni pour leur production, et encore moins pour les gens (ou les LLM) qui vont lire leurs immondices. La merdification est partout, et ChatGPT ne fait que la mettre en évidence sans en être la source directe. Vous faites de la merde, donc ChatGPT fait de la merde. C'est un fait, inutile d'en débattre.
On est d'ailleurs au tout début de ce dont je parlais il y a quelque temps dans notre rapport à l'IA. Pour l'instant, ce n'est pas très visible, et je parle ici de quelque chose de très spécifique (le développement d'une application), mais un retour de flamme généralisé ne va plus tarder. Et une fois de plus, on va accuser la technologie, alors que la cause réelle du problème est sociale.
On pourra, et non sans raison, critiquer mes prompts, qui peuvent bien sûr jouer un rôle dans la qualité des réponses. Je ne nie pas cette possibilité. Il me serait de toute façon difficile de prouver que mes prompts n'y sont pour rien dans cette histoire. Mais il est aussi facile de critiquer mes prompts que la pertinence de ChatGPT, alors qu'au fond, nous savons tous que ni l'un ni l'autre ne sont en cause et qu'encore une fois, ce sont les sources qui sont à blâmer.
Conclusion
Je viens de vous faire un bref résumé de mes trois dernières semaines. J'ai atteint de nouveaux niveaux de frustration que je n'aurai jamais pensé tolérer. Inversement, chaque fois que je crois qu'on a touché le fond en matière d'informatique en général et de développement en particulier, je constate avec effarement qu'on creuse encore plus profond :
- le code ne se documente plus (je ne dis pas ça qu'avec mes dernières expériences avec ChatGPT, il suffit de piocher dans un projet au hasard sur GitHub pour s'en convaincre)
- pour une même technologie, on trouve tout et son contraire, les deux étant par définition mutuellement exclusifs
- ce n'est pas parce qu'une technologie est populaire qu'elle est "bonne" et surtout qu'elle est bien utilisée — en tout cas, les bonnes pratiques pour ces technologies ne semblent pas diffusées sur des canaux accessibles à ChatGPT, ou statistiquement moins représentées
Le sentiment global que j'ai, c'est que le développement a changé au point que ce qui était auparavant un simple même ("tester c'est douter", "le code se documente tout seul", etc.) semble être devenu la norme. C'est un constat dramatique. Alors que nous sommes censés évoluer, nous persistons à vouloir régresser, c'est à n'y rien comprendre. L'humain est comme un perpétuel adolescent, explorant sans relâche les limites de tolérance de ceux qui lui apprennent la vie. Et puis un jour, l'ado claque parce qu'il a bouffé de la lessive (ou de la colle sur sa pizza).
Au-delà de l'aspect purement technique de ces expériences, je me demande vraiment comment le monde (les entreprises) peut tourner avec une telle généralisation de la médiocrité. Nous ne devrions peut-être pas définir l'avancée d'une IA en se basant sur l'idée qu'elle devienne consciente d'elle-même, ni même qu'elle devienne plus intelligente que nous.
L'avancée la plus importante de l'IA se fera lorsqu'elle sera capable de filtrer la médiocrité de façon autonome.