Du code pourri 💩 en quantités industrielles
Dans le développement logiciel, on sait qu'utiliser un outil peut donner du très bon comme du très mauvais. 👍👎
Quand j'ai découvert comment les IA génératives peuvent nous aider à coder, j'étais plutôt enthousiaste et optimiste.
Plus le temps passe, plus je me dis que ça va être très compliqué.⏳🙅♀️
Hors de question pour moi d'arrêter l'utilisation de ces IA. Elles permettent de coder plus rapidement. Il n'y a même pas de débat à avoir.
Le problème, c'est qu'elle permettent à tout le monde de coder, même quand on n'a pas la maturité suffisante en développement logiciel pour produire du code correct et maintenable.
Et si ce n'était que ça, on pourrait encore y faire face. Mais quand les vendeurs d'outils d'IA eux-mêmes valorisent le code pourri, on se dit que le pire est à venir.
J'ai eu le malheur de tomber sur la video de démonstration de Cursor, un de ces outils.📹🍀
Built to make you extraordinarily productive,
Cursor is the best way to code with AI.
Et je suis persuadé qu'ils ont raison. Bien utilisé, leur produit, comme celui de leurs concurrents est probablement génial. Mais leur code de démonstration est juste pourri.
À 15 secondes dans la video, on voit ce qui pourrait être un morceau de composant React en TypeScript ?
1onStream={async (stream) => {
2 return await props.onReturn(
3 (async function* () {
4 let buffer = ""
5 let state: "outside" | "newline" = "outside"
6 for await (const datum of stream) {
7 const newToken = datum.content;
8 for (const char of newToken) {
9 buffer += char;
10 if (char === "`" && state !== "newline") {
11 if (state === "outside") {
12 state = "newline";
13 }
14 buffer = ""
15 } else if (state === "newline") {
16 buffer = ""
17 }
18 }
19 }
20 })()
21 );
22 }}
23/>
Cursor core feature is Ctrl-K, which lets you write code in plain English
Le développeur exécute Ctrl-K, et demande "add an inside case", le programme lui propose des modifications. Le développeur demande un supplément "also yield at end". L'IA s'exécute et le développeur accepte le résultat.
1onStream={async (stream) => {
2 return await props.onReturn(
3 (async function* () {
4 let buffer = ""
5 let state: "outside" | "newline" | "inside" = "outside"
6
7 for await (const datum of stream) {
8 const newToken = datum.content;
9 for (const char of newToken) {
10 if (state === "inside") {
11 if (char === "`") {
12 state = "outside"
13 if (buffer) {
14 yield {text: buffer};
15 buffer = ""
16 }
17 } else {
18 buffer += char;
19 }
20 } else {
21 if (char === "`") {
22 if (state === "outside") {
23 state = "inside";
24 } else if (state == "newline") {
25 state = "outside"
26 buffer = ""
27 }
28 } else {
29 if (state === "newline") {
30 buffer = ""
31 state = "outside"
32 }
33 }
34 }
35 }
36 }
37 if (buffer)
38 yield {text: buffer};
39 })()
40 );
41 }}
42/>
A quel moment quelqu'un s'est dit que c'était le meilleur code à montrer pour promouvoir cette fonctionnalité ?
Si c'est pour écrire du code jetable, à la limite, pourquoi pas ? Mais si c'est pour aller dans une base de code qui va perdurer, ça fait peur.
Je vois au moins 5 raisons de jeter ce code. Et vous, vous en voyez combien ?🗑️❓