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 ?đïžâ