L’AI non è né buona né cattiva, è semplicemente lo specchio di chi l’ha addestrata. E in ambito sviluppo software, questo significa che riflette l’incompetenza generalizzata dell’umanità moderna nel saper scrivere codice decente. Potremmo raccontarcela con toni più politically correct, ma la realtà resta brutale: la maggior parte del codice che gira online fa schifo. E siccome l’AI è un animale statistico, imparando da quella spazzatura, finirà inevitabilmente per riproporla. Benvenuti nell’età dell’automazione della mediocrità.
Quando parliamo di “bad code”, non ci riferiamo solo a codice che non compila. Quello è il male minore. Parliamo di codice che compila, gira, funziona, ma che è un disastro da leggere, estendere, manutenere o semplicemente capire. Codice privo di coerenza architetturale, senza test, pieno di hardcoded, di if
annidati come le matrioske dell’orrore, di nomi di variabili che sembrano partoriti da uno scimmione bendato: foo
, temp
, x1
, y2
. E se credi che questi esempi siano caricature, fai un giro nei repository pubblici di GitHub. Vedrai orrori che farebbero piangere un compilatore.
Ora immagina di prendere questo pantano e darlo in pasto a un modello generativo. Il risultato? Ti genererà soluzioni simili. Non perché è stupido, ma perché è addestrato su dati che dicono: “Questo è il modo corretto di fare le cose”. L’AI apprende pattern, non concetti. Se mille sviluppatori scrivono if (a = b)
invece di if (a == b)
, non importa che sia un errore logico: l’AI lo apprenderà come pattern frequente. Il risultato? Ti suggerisce bug con la stessa sicurezza con cui ti suggerisce come fare un merge
in Git. E tu, fiducioso, lo implementi, lo committi, e poi ti chiedi perché l’app esplode in produzione.
Prendiamo ad esempio uno snippet generato da un modello LLM in Python:
def is_even(num):
if num % 2 == 0:
return True
else:
return False
Funziona, certo. Ma è terribilmente verboso. Uno sviluppatore decente lo scriverebbe così:
def is_even(num):
return num % 2 == 0
Due righe in meno, stesso comportamento. Ma l’AI tende a replicare la versione estesa perché è quella che ha visto più spesso. E sai dove l’ha vista? Nei tutorial per principianti, nelle risposte di Stack Overflow che spiegano passo passo anche la sottrazione.
Un altro esempio più tossico arriva dal mondo JavaScript:
var x = 10;
if (x = 5) {
console.log("x is 5");
}
Un classico errore: assegnazione dentro un if
, non confronto. Eppure, questo tipo di pattern compare spesso, perché i copy-paster seriali non lo notano, e l’AI lo apprende. Ad alto livello, un LLM che scrive codice si comporta come un mediocre sviluppatore junior: copia, incolla, prova, incrocia le dita. Solo che lo fa con la velocità della luce e la faccia tosta di un venditore di aspirapolveri a domicilio.
C’è di peggio. Uno studio pubblicato da Stanford University nel 2023 ha testato la qualità del codice prodotto da Copilot in ambito sicurezza. Hanno chiesto al modello di scrivere funzioni crittografiche, gestire input utente e creare connessioni HTTP. Il 40% delle soluzioni prodotte conteneva vulnerabilità note, come injection, mancanza di input sanitization o uso di algoritmi crittografici deprecati. L’AI aveva appreso codice “funzionante”, ma insicuro. Perché? Perché la maggior parte dei programmatori ignora le best practice sulla sicurezza. E Copilot, come un bravo scolaro, ha imparato dai peggiori della classe.
Il problema, ovviamente, non è (solo) tecnico. È culturale. Il mercato ha premiato per anni la velocità a discapito della qualità. Il developer medio è costretto a chiudere ticket in tempi ridicoli, con deadline imposte da PM che pensano che “refactoring” sia il nome di un Pokémon. In questo clima, non c’è tempo per scrivere codice pulito, figurarsi per pensare. Quindi si copia. Si arrangia. Si pasticcia. E quei pasticci finiscono nei dataset di addestramento dell’AI.
Il risultato è un circolo vizioso. Un mondo che produce codice mediocre addestra modelli su quella mediocrità. I modelli generano codice mediocre. Gli sviluppatori si affidano all’AI e ne assorbono le abitudini. E il livello medio si abbassa ancora. È un caso da manuale di entropia digitale, dove la complessità cresce e la qualità decresce, e nessuno ha voglia di rimettere ordine.
C’è chi propone una soluzione: creare dataset selezionati, con codice scritto da esperti, magari certificato e revisionato. Idea nobile, ma poco scalabile. Servono risorse, tempo, e una volontà etica che l’industria non ha. Nessuno vuole rallentare il training di un LLM da miliardi di parametri per fare code review. L’AI è un business, non un corso universitario. E quindi si continua a scavare.
Nel frattempo, noi ci ritroviamo a combattere con modelli che propongono loop infiniti, try
senza except
, funzioni che si chiamano da sole in un eterno suicidio ricorsivo. E quando qualcuno chiede “Perché l’AI scrive codice così brutto?”, la risposta è più semplice di quanto sembri: perché è quello che le abbiamo dato da imparare.
La colpa non è dell’intelligenza artificiale. È della stupidità naturale.
E sì, è davvero poetica giustizia.