la lettura

L’AI che scrive codice: perché gli sviluppatori non sono a rischio



Indirizzo copiato

L’intelligenza artificiale generativa ha trovato nella scrittura di codice uno dei suoi casi d’uso più promettenti. Gli assistenti AI moderni integrano modelli generalisti e specializzati, offrendo supporto dalla semplice autocomplete fino alla gestione autonoma di progetti completi. Un estratto dal libro “La macchina che si autoprogramma”

Pubblicato il 15 dic 2025

Francesco Maria De Collibus

informatico, enterprise architect in AXA



AGI benchmark intelligenza artificiale generale valutazione dei modelli di IA AI coding assistant

L’intelligenza artificiale ha trovato nella scrittura di codice uno dei suoi primi casi d’uso. Chi tentava di perfezionare i modelli di intelligenza artificiale aveva a sua volta grande necessità di scrivere codice rapidamente.

GitHub Copilot ha utilizzato per primo una versione di GPT 3 addestrata specificatamente su codice, chiamata Codex.

L’esperienza maturata con Codex è poi servita per sviluppare GPT 3.5, il modello che ha stupito il mondo durante il suo rilascio pubblico attraverso il sito ChatGPT. Secondo Yao Fu, ricercatore di Google DeepMind, la capacità di seguire ragionamenti complessi attraverso catene di pensiero è una proprietà emergente, «probabilmente un “magico” effetto collaterale dell’addestramento su tanto vaste quantità di codice».

Senza questo addestramento specifico non saremmo dove siamo.

L’AI in qualche maniera scrive sé stessa anche così. Nelle pagine che seguono esamineremo in dettaglio lo stato attuale della Generative AI nello sviluppo software, parlando degli assistenti di programmazione AI e dei principali strumenti disponibili sul mercato in questo momento (come per esempio GitHub Copilot, Replit, Lovable e Cursor AI). Infine introdurremo il concetto di Agentic AI, ossia AI in grado di «agire», ossia sistemi ancora più autonomi che non si limitano a rispondere alle nostre domande, ma appunto agiscono quasi come colleghi virtuali, capaci di assolvere i compiti concreti che affidiamo loro, come risolvere un bug, implementare una nuova feature per il nostro prodotto oppure rilasciare una nuova versione del nostro software in produzione.

Cercheremo di capire insieme come la rivoluzione dell’intelligenza artificiale in corso stia cambiando per sempre la relazione non solo tra il programmatore e il codice, ma più in generale tra l’uomo e il software.

come funziona un assistente di programmazione ai

Un AI coding assistant (un assistente di programmazione basato sull’IA) è un software progettato per aiutare i programmatori a scrivere codice. Ha diverse applicazioni e utilizzi. Di base, o almeno come prima funzionalità resa disponibile, possiamo immaginarlo come un «autocompletamento» estremamente potente, addestrato non solo a completare singole parole ma intere linee di codice o funzioni.

Non siamo certo nuovi a esperienze di autocompletamento, è uno strumento pressoché ubiquo: quando scriviamo, spesso abbiamo in mente qualcosa di specifico che la macchina può prevedere a partire dalle prime informazioni di contesto che le abbiamo fornito (messaggio precedente, caratteri digitati fino adesso ecc.); per questo prova a suggerircelo, ne abbiamo esperienza come utenti sin dal vetusto T9 con cui scrivevamo gli SMS agli albori della telefonia cellulare.

Gli assistenti di oggi sono molto più potenti e sfruttano tecniche di machine learning e natural language processing per «comprendere» i linguaggi di programmazione e i contesti in cui vengono usati, e «prevedere» quelle che potranno essere le nostre intenzioni mentre stiamo scrivendo un software. In pratica, venendo addestrate su milioni di esempi di codice sorgente provenienti da progetti reali, documentazione e repository pubblici, le macchine hanno importato le strutture, la sintassi e anche alcuni pattern comuni di risoluzione dei problemi. Così, quando uno sviluppatore inizia a scrivere del codice, l’assistente AI prova a predire che cosa potrebbe servire dopo, suggerendo frammenti di codice che potrebbero risultare utili.

Bisogna però fare una premessa, che forse potrebbe sorprendere i lettori non abituati al mondo del software. La programmazione è un’operazione soprattutto testuale: si deve scrivere un testo, un insieme di caratteri strutturato non secondo i dettami dei nostri linguaggi naturali, ma sotto la specifica di un linguaggio formale. Questo linguaggio formale, spesso di «alto livello», ovvero non rigido come il codice macchina, viene poi compilato in qualcosa che la macchina è in grado di eseguire – nativamente, oppure su un ulteriore software. L’operazione di predizione è più raffinata e sottoposta a vincoli (derivanti dal linguaggio formale della programmazione) ma non è strutturalmente diversa dal suggerimento della parola che stiamo cercando di completare.

Personalizzazione e integrazione negli ambienti di sviluppo

Molti assistenti AI sono progettati per essere configurabili o per «imparare» in qualche modo le preferenze dell’utente. Se l’utente accetta o rifiuta certi suggerimenti, l’assistente può tenerne conto per adattare le proposte future (spesso a livello locale, sul progetto o per utente).

Alcuni sistemi permettono persino un training personalizzato su base aziendale: per esempio, un team può effettuare fine tuning dell’assistente sulla propria base di codice, così che conosca le funzioni interne e lo stile di quel team, oppure potenziare con un pattern retrieval augmented generation (RAG) che mette a disposizione informazioni contestuali addizionali per consentire all’LLM di operare meglio.

La maggior parte di questi assistenti si integra nei normali ambienti di sviluppo (integrated development environment, IDE) o editor di testo usati dai programmatori, come Visual Studio Code, IntelliJ, PyCharm, Neovim, Eclipse ecc. Questo significa che i suggerimenti compaiono in tempo reale mentre digitiamo, proprio come i suggerimenti del cellulare quando scriviamo un messaggio. L’assistente diventa così una sorta di copilota costante nel nostro ambiente di lavoro, sempre disponibile.

Limiti dell’ai e ruolo insostituibile del programmatore

Vale la pena sottolineare che l’AI – almeno a questo livello – non «pensa» e non «capisce» il codice nello stesso modo di un essere umano: non ha cognizione dello scopo ultimo del programma e di che cosa vogliamo davvero ottenere. Piuttosto, riconosce schemi e somiglianze con codice visto in precedenza e li riutilizza per costruire qualcosa di nuovo. Per esempio, potrebbe aver visto decine di migliaia di modi diversi di implementare la funzione fattoriale o la successione di Fibonacci e, in base a quello che scriviamo, ne sceglie uno adatto.

L’AI cerca solo di fornirci qualcosa che possa farci risparmiare tempo. Questa mancanza di vera comprensione può portare l’AI a commettere errori logici o a proporre soluzioni poco ottimali o del tutto sbagliate.

Per questo motivo il ruolo del programmatore umano rimane fondamentale: l’assistente AI suggerisce, ma spetta all’umano decidere se accettare, modificare o scartare il suggerimento. In questo processo è sempre l’essere umano che decide che cosa accetta e che cosa invece preferisce scrivere con le proprie mani.

Verso l’agentic AI: editing multi-file e automazione completa

Sempre più spesso, inoltre, gli AI coding assistant incorporano una funzione di chat come quella di ChatGPT per fornire consigli utili alla programmazione.

Un LLM può quindi rispondere a domande collegate al codice su cui sta lavorando e svolgere così task più complessi. Inoltre è ormai spesso disponibile anche una funzione di editing di più file assieme.

L’AI può scrivere e modificare più di un file contemporaneamente, definendo la complessa struttura di un intero progetto. Questo è un primo passo verso un’AI davvero «agentica», ovvero in grado di intraprendere un flusso di operazioni per noi complesse.

L’AI coding assistant può costruire il nostro progetto, lanciare i test e persino rilasciarlo in produzione, se vogliamo.

Modelli generalisti vs specializzati: il meglio di due mondi

Parlando di modelli di AI, la distinzione tra generici e specializzati dipende innanzitutto dal tipo di addestramento e dalle capacità ottenute: i modelli generici di ultima generazione, come GPT-5, Grok 4, Gemini Pro o Claude di Anthropic, sono stati allenati su enormi dataset che spaziano dal codice ai libri, dagli articoli tecnici alle conversazioni quotidiane, conferendo loro una conoscenza enciclopedica e una versatilità che va dalla scrittura creativa al ragionamento logico e alla programmazione; i modelli specializzati, invece, vengono ri-addestrati soprattutto su repository di codice e risorse correlate (pensiamo a OpenAI Codex, WizardCoder o Code Llama) e, pur eccellendo nell’accuratezza sintattica, nella gestione delle dipendenze e nel completamento di funzioni API, non sono in grado di svolgere compiti al di fuori del dominio del codice.

Molti strumenti moderni, come GitHub Copilot o Tabnine, integrano però il meglio di entrambi: offrono un’assistenza silenziosa e rapida durante la digitazione grazie al modello specializzato, unita alla possibilità di richiedere spiegazioni, refactoring o algoritmi complessi tramite un’interfaccia di chat basata su modelli generalisti. In questo modo l’utente beneficia di completamenti precisi, per esempio quando si tratta di riempire i parametri di una funzione standard, e al contempo di un supporto più articolato, per esempio per progettare un algoritmo efficiente o per tradurre e riassumere testi. La tendenza è verso assistenti sempre più contestualizzati al dominio d’uso, ma senza rinunciare alla versatilità dei modelli di base, in un equilibrio che continua a evolversi con la ricerca sull’intelligenza artificiale.

Benchmark e metriche: come si valuta l’AI che scrive codice

Parlare di intelligenza artificiale che scrive codice significa inevitabilmente porsi prima una domanda: come misuriamo davvero le sue capacità? Per il linguaggio naturale possiamo osservare la coerenza di un testo o la fluidità di un dialogo, ma il codice ha un vantaggio cruciale: o compila e funziona, oppure no. Naturalmente la realtà è più sfumata, ma questa apparente «oggettività» ha reso il testing dei modelli di codice un campo fertile.

Il primo benchmark diventato popolare è stato HumanEval, introdotto da OpenAI nel 2021 insieme a Codex. Si tratta di un insieme di 164 esercizi di programmazione, ciascuno definito da una docstring e da alcuni test. L’AI deve generare la funzione richiesta: il punteggio si calcola come pass@k, cioè la probabilità che almeno una tra le k soluzioni generate passi tutti i test. HumanEval è stato una pietra miliare, perché ha dato un metro comune di confronto tra diversi modelli (Codex, AlphaCode, CodeGen, PaLM-Coder).

Tuttavia, la sua dimensione ridotta lo rende ormai poco rappresentativo e in parte «consumato» perché i modelli moderni hanno ormai visto molti degli stessi problemi durante l’addestramento. Per questo sono nati benchmark più ampi come MBPP (Mostly Basic Python Problems) e soprattutto EvalPlus. Quest’ultimo estende l’idea di HumanEval con migliaia di test addizionali e verifiche più robuste, capaci di eliminare molti casi ambigui: è oggi tra gli standard di riferimento, usato da Google, Anthropic e OpenAI per confrontare i loro modelli di code generation.

C’è poi un’altra questione: passare i test non significa scrivere un buon software. Un modello può superare un caso d’uso minimo e fallire miseramente su casi più complessi, o generare soluzioni inutilmente lunghe e poco manutenibili. Per questo oggi si parla di metriche più ampie, che includono la qualità del codice, la leggibilità, la sicurezza e persino il consumo di energia per l’esecuzione. Non a caso, BlueOptima e altre società che misurano la produttività degli sviluppatori stanno cercando di applicare le stesse logiche al codice generato dall’AI. Il futuro richiederà strumenti più sofisticati, capaci di dire non solo se il codice funziona, ma se è davvero buon codice.

guest

0 Commenti
Più recenti
Più votati
Inline Feedback
Vedi tutti i commenti

Articoli correlati