Uno degli ambiti in cui le tecnologie dell’AI generativa sta mostrando già un impatto significativo è nella manipolazione dei programmi, portando ad un’accelerazione nello sviluppo di sistemi software grazie ad un incremento significativo della capacità della scrittura e di analisi di programmi.
Si è trattato di uno dei comportamenti emergenti dei modelli LLM come GPT che hanno forse più sorpreso, ed è ormai noto che si tratta di una capacità che emerge al crescere del numero di parametri del modello.
Ovviamente è possibile specializzare la fase di apprendimento in modo che l’AI acquisisca specificamente i programmi, anche se la capacità di generare ed analizzare il linguaggio naturale resta un elemento essenziale anche nella programmazione. Facciamo il punto sui modelli disponibili, come ChatGPT, Copilot di GitHub (Microsoft), Code Whisperer di Amazon, Code LLaMa di Meta e quali devono essere le aspettative nei loro confronti, anche rispetto a come questi sistemi rivoluzioneranno il mestiere del programmatore.
Indice degli argomenti
Come impiegare l’AI nella programmazione
La programmazione è un’attività complessa che si è specializzata nel tempo al crescere della dimensione dei programmi. I linguaggi di programmazione hanno cercato di supportare i programmatori nella composizione di programmi sempre più complessi fornendo numerosi strumenti di automazione, partendo dalla compilazione in linguaggio macchina, passando per gli strumenti di debugging interattivo, per poi arrivare a programmi che coordinano l’esecuzione di altri programmi (ignoti al tempo della scrittura dei primi) come avviene da trent’anni nel Web.
È necessario innanzitutto capire quindi in quali fasi del processo di sviluppo e manutenzione del software trovano applicazione questi modelli, e come vedremo ad oggi sono solo parzialmente confrontabili poiché funzionano su presupposti differenti.
La generazione del codice
Sebbene possa essere sorprendente chiedere a ChatGPT di generare un programma che genera il frattale di Mandelbrot ed ottenere, se si è fortunati, una versione dell’algoritmo eseguibile, la generazione di un algoritmo è completamente diversa dalla generazione di un sistema. Un sistema è un enorme castello di carte dove ciascun elemento si deve incastrare perfettamente con gli altri pena un errore e la terminazione del programma. È necessario quindi un supporto pervasivo nella generazione di codice al fine di sviluppare sistemi, e di conseguenza l’integrazione in strumenti di sviluppo capaci di fornire il contesto al modello di AI al fine di proporre completamento di blocchi di codici (inclusi i commenti).
Microsoft si è mossa con largo anticipo in questo settore: con l’acquisizione di GitHub nel 2018 per 7,5 miliardi di dollari si è assicurata il più grande servizio di hosting di codice aperto esistente e di conseguenza la possibilità di usare i codici aperti per addestrare i propri modelli di AI.
Il sistema Copilot di GitHub è stato uno dei primi ad essere rilasciato ed integrato in ambienti di sviluppo come Microsoft Visual Studio e Visual Studio Code (editor open source molto popolare).
Nell’immaginario collettivo la scrittura di codice è un’attività altamente creativa che solo hacker che leggono simboli in stile Matrix riescono a fare, ma la realtà dei fatti è che la maggior parte del codice di un sistema è noioso e ripetitivo, e se non è scritto bene ne può compromettere facilmente il comportamento. La mia personale esperienza con Copilot è che le proposte del codice sono spesso abbastanza corrette e il codice che genera, anche se con qualche aggiustatina è, fa risparmiare una rilevante quantità di tempo, soprattutto nel caso di codice ripetitivo si può facilmente ottenere un’accelerazione di un fattore 10x o anche di più.
A titolo di esempio ecco una proposta nella generazione di una classe in un progetto Open Source a cui sto lavorando. Come si può vedere dall’intestazione Copilot ha correttamente dedotto praticamente tutto il codice della classe (in grigio) e premendo “TAB” mi sono limitato ad accettare il suggerimento come punto di partenza.

Il sistema è capace anche di suggerire, oltre ai nomi delle variabili (per le quali i programmatori seguono convenzioni condivise o proprie), anche il testo dei commenti come si può osservare di seguito: è stato sufficiente cominciare a scrivere l’inizio del commento (con le sole due lettere “Cm” per ottenere una proposta assolutamente ragionevole.

Le tecnologie utilizzate dalla versione attuale di Copilot non includono ancora la potenza di modelli LLM come GPT, ma Microsoft sta lavorando a Copilot X, la nuova versione del sistema di suggerimento basato su GPT 4 fornendo sicuramente risultati decisamente superiori a quelli attuali.
È però importante sottolineare l’importanza del contesto: il modello AI osserva la struttura dell’intero progetto prima di proporre soluzioni, le proposte sono quindi spesso centrate e suggeriscono l’adozione di convenzioni e best practices adottate dalla comunità degli sviluppatori, contribuendo alla scrittura di un codice più facile da leggere e comprendere.
Più recentemente Amazon ha introdotto un supporto, anche se meno sofisticato di Copilot, allo sviluppo e all’analisi del codice chiamato Code Whisperer. Anche questo modello si integra in editor di codice popolari, ed è anche capace di analizzare il codice alla ricerca di riferimenti o di vulnerabilità di sicurezza.
Analizzare il codice
Se la generazione del codice è una parte importante visto che i programmi vanno scritti, anche la loro analisi offre spunti importanti. I principali casi d’uso sono:
- l’analisi automatica per individuare bug e vulnerabilità in codici esistenti
- l’analisi del codice per comprenderne il funzionamento (problema sempre più cogente quando vanno in pensione unità di personale che hanno manutenuto sorgenti per quarant’anni)
- la traduzione del codice in un linguaggio di programmazione differente
Sistemi come GPT e anche il modello Code LLaMa, rilasciato da Meta per poter essere eseguito anche sui propri sistemi, trovano più facilmente applicazione in questi contesti. Si tratta di modelli più flessibili ed espressivi di quelli usati da strumenti consolidati come Copilot, ma la cui applicabilità è decisamente più ostica avendo a disposizione un’interfaccia in stile Chat dove difficilmente è pensabile incollare gigabytes di codici sorgente.
La possibilità di programmare questi modelli offre però abilità di automatizzare l’analisi di programmi in modo più efficace di quanto si possa pensare di fare mediante un editor. Si tratta comunque di modelli interessanti che devono però ancora provare sul campo il proprio valore, anche se dai primi esperimenti emerge una chiara efficacia nel loro uso.
Modelli a confronto
I ricercatori cercano di confrontare la qualità di questi modelli di manipolazione di codici sorgente, come ad esempio il confronto tra Chat GPT, GitHub Copilot e Amazon Code Whisperer. Si tratta di studi ancora nella propria infanzia, la teoria ci insegna che è in generale impossibile determinare automaticamente ed esattamente cosa faccia un programma dal suo codice sorgente, e si tratta di un limite a cui sono soggetti sia uomini che macchine. Gli autori commentano che:
“Our analysis reveals that the latest versions of ChatGPT, GitHub Copilot, and Amazon CodeWhisperer generate correct code 65.2%, 46.3%, and 31.1% of the time, respectively”
Ancora una volta ChatGPT sorprende per la sua efficacia, mentre il rapporto tra Copilot e Code Whisperer era in qualche modo atteso vista la partenza anticipata di Microsoft nello sviluppo di queste tecnologie.
È bene però tenere presente che è difficile parlare di confronto vero e proprio: tutti questi modelli si inseriscono in posizioni differenti nel processo di sviluppo del codice e quindi la creazione di benchmark che consentano un confronto alla “pari” è quasi impossibile. È più probabile che se ne usi più di uno al fine di massimizzarne i benefici senza preoccuparsi che uno debba prevalere sugli altri.
L’importanza del saper leggere il codice
Per mia esperienza leggere il codice è di gran lunga più difficile che scriverlo (in fondo è vero anche per gli spartiti in musica). Un programmatore leggendo un codice va oltre la sintassi e riesce a “vedere” i concetti in esso modellati e il suo funzionamento. Si tratta di un’abilità che richiede anni di studio per comprendere il funzionamento dei linguaggi di programmazione ed altrettanta esperienza che consenta di individuare nel codice pattern e figure comuni.
Il nostro sistema di formazione si concentra al contrario sullo scrivere il codice, contribuendo alla formazione di scrittori di programmi spesso al limite dell’accettabilità e senza alcuna educazione alla lettura. Sarebbe come formare un musicista senza far ascoltare i grandi compositori o un pittore senza studiare i grandi del passato.
La qualità del codice generato nella mia esperienza spesso supera quella del codice scritto da uno studente (senza l’ausilio di questi strumenti). È prevedibile quindi che vi saranno cambiamenti nell’acquisizione di risorse umane nel mercato del lavoro della programmazione. Si privilegeranno probabilmente figure più competenti e in numeri decisamente minori a quanto ci abituati il mercato del lavoro negli ultimi 20 anni. Si vedono già i primi segni di questo trend con le multinazionali IT che hanno rivisto al ribasso le previsioni delle assunzioni nel corso del 2023.
Conclusioni
Ma in fondo Alan Turing all’inizio degli anni ’50 aveva previsto che dopo una prima fase in cui le macchine sarebbero state programmate da uomini a un certo punto sarebbero state le macchine stesse a programmarsi autonomamente. È sicuramente l’inizio di questo percorso quello a cui stiamo assistendo in questi ultimi mesi.