Software Development
AI e programmazione: quale futuro per i programmatori?
L’intelligenza artificiale sa già scrivere codice. La vera sfida sarà formare programmatori capaci di comprenderlo, valutarlo e decidere cosa la macchina deve fare.
L’intelligenza artificiale sta trasformando lo sviluppo software e pone una domanda inevitabile: ha ancora senso imparare a programmare? La risposta, a mio avviso, è sì. Ma cambierà profondamente ciò che chiediamo a un programmatore e, soprattutto, il modo in cui dovremo formare le nuove generazioni di sviluppatori.
Negli ultimi mesi sono state molte le persone che mi hanno posto una domanda che, fino a qualche anno fa, sarebbe sembrata quasi paradossale: ha ancora senso imparare a programmare nell’era dell’intelligenza artificiale? Me lo chiedono professionisti, colleghi e soprattutto giovani che si stanno avvicinando allo sviluppo software e che vedono strumenti capaci di produrre in pochi secondi funzioni, classi, query, interfacce e perfino intere porzioni di applicazioni.
È una domanda legittima. Oggi basta descrivere in linguaggio naturale ciò che si vuole ottenere per ricevere una soluzione apparentemente pronta all’uso. Chi sta iniziando può quindi avere la sensazione che dedicare mesi allo studio di un linguaggio, degli algoritmi, delle strutture dati o dei principi della programmazione sia diventato improvvisamente superfluo. A mio avviso è vero esattamente il contrario: l’intelligenza artificiale rende ancora più importante comprendere cosa significhi realmente programmare, perché sta progressivamente separando due attività che per molto tempo abbiamo considerato quasi coincidenti: scrivere codice e sviluppare software.
Scrivere codice non significa necessariamente saper programmare
Non avrebbe alcun senso minimizzare ciò che sta accadendo. I moderni sistemi di intelligenza artificiale sono già molto efficaci nella generazione del codice e continueranno inevitabilmente a migliorare. Possono costruire rapidamente una funzione, suggerire un algoritmo, produrre una query SQL, spiegare un errore, effettuare un refactoring o proporre differenti implementazioni dello stesso problema. Per uno sviluppatore rappresentano strumenti straordinari e credo che, nel prossimo futuro, diventeranno una componente ordinaria dell’ambiente di lavoro, esattamente come oggi lo sono un IDE, un debugger o un sistema di versionamento.
Il punto, però, è un altro. Produrre del codice non equivale automaticamente a comprendere il problema che quel codice dovrebbe risolvere. Una funzione può essere formalmente corretta, compilare senza errori ed essere persino elegante dal punto di vista tecnico, ma risultare completamente sbagliata rispetto al comportamento richiesto dall’applicazione. È una distinzione fondamentale, soprattutto quando si passa dagli esercizi didattici ai sistemi realmente utilizzati da aziende e utenti.
Nello sviluppo professionale, infatti, raramente il problema consiste semplicemente nello scrivere cinquanta righe di C#, Java, Python o JavaScript. La parte complessa viene spesso prima: comprendere un requisito, individuare le eccezioni, valutare l’impatto di una modifica sulle funzionalità esistenti, progettare la struttura dei dati, considerare sicurezza, performance, concorrenza e manutenibilità. Il codice è la traduzione finale di un processo di ragionamento molto più ampio.
Ed è proprio su questo terreno che si giocherà, secondo me, il futuro della professione.
Il rischio di una generazione che sa ottenere codice ma non sa leggerlo
Occupandomi anche di formazione, questo cambiamento mi interessa particolarmente. Chi comincia a programmare oggi dispone fin dal primo giorno di strumenti che soltanto pochi anni fa sarebbero sembrati fantascienza. Uno studente può chiedere all’AI di risolvere praticamente qualsiasi esercizio: ordinare una collezione, interrogare un database, costruire una classe, realizzare un endpoint API o correggere un errore.
Impedire l’utilizzo di questi strumenti sarebbe, a mio avviso, poco lungimirante. I programmatori che stiamo formando oggi lavoreranno in un mondo nel quale l’intelligenza artificiale sarà presente quotidianamente; devono quindi imparare a utilizzarla. Il problema nasce quando l’AI diventa una scorciatoia per evitare proprio quel processo di apprendimento che dovrebbe accompagnare la formazione.
Se un discente utilizza l’intelligenza artificiale per arrivare alla soluzione di un esercizio, ciò che mi interessa non è soltanto verificare che il programma funzioni. Voglio capire se è in grado di spiegarmi perché funziona, perché sia stata scelta una determinata struttura, cosa accadrebbe modificando una condizione e quali alternative avrebbe potuto utilizzare. È in quel momento che emerge la differenza tra possedere una soluzione e averla compresa.
Questa distinzione diventerà sempre più importante. Generare cento righe di codice richiederà probabilmente sempre meno tempo; comprendere le conseguenze di quelle cento righe continuerà invece a richiedere conoscenza, esperienza e capacità critica.
L’AI non dovrebbe sostituire il ragionamento, ma potenziarlo
Credo quindi che sia necessario modificare anche il modo in cui insegniamo a utilizzare l’intelligenza artificiale. Il modello più semplice consiste nel formulare una richiesta e attendere il codice: “realizza questa funzione”, “risolvi questo esercizio”, “correggi questo metodo”. È certamente utile, ma rappresenta soltanto una piccola parte delle possibilità offerte da questi strumenti.
Un utilizzo molto più interessante consiste nel trasformare l’AI in uno strumento di confronto. Uno studente può sottoporle la propria soluzione e chiedere quali siano i punti deboli, farsi spiegare perché un algoritmo abbia una determinata complessità, confrontare due architetture oppure chiedere di essere guidato verso la soluzione senza riceverla immediatamente. Può utilizzarla per approfondire un concetto che non ha compreso durante una lezione o per osservare approcci differenti allo stesso problema.
In questa prospettiva, l’intelligenza artificiale non riduce la necessità di ragionare: può addirittura aumentarla. Per ottenere una risposta realmente utile bisogna essere capaci di descrivere correttamente il problema, specificare i vincoli e valutare criticamente ciò che viene restituito. Un requisito descritto male può produrre un codice tecnicamente perfetto che risolve perfettamente il problema sbagliato.
È un principio che valeva molto prima dell’arrivo dell’AI e che oggi assume un significato ancora maggiore.
Il programmatore del futuro dovrà soprattutto saper valutare
Uno degli aspetti più interessanti di questa trasformazione riguarda le competenze che considereremo importanti nei prossimi anni. Per molto tempo, soprattutto nei percorsi iniziali, abbiamo dato grande importanza alla capacità di ricordare sintassi, metodi e costrutti. Naturalmente le basi di un linguaggio continueranno a essere necessarie, ma credo che il loro peso relativo diminuirà.
Un programmatore non è mai stato bravo perché ricordava a memoria l’intera documentazione di un framework. Prima dell’intelligenza artificiale consultavamo manuali, documentazione tecnica, motori di ricerca e piattaforme come Stack Overflow. L’AI rende semplicemente questo processo infinitamente più rapido e interattivo.
Diventeranno invece ancora più importanti la capacità di progettare, leggere il codice, effettuare il debugging, comprendere un database, ragionare sulla sicurezza e riconoscere gli effetti collaterali di una modifica. Soprattutto, sarà fondamentale essere capaci di valutare la soluzione proposta da una macchina.
Questo perché l’AI possiede una caratteristica che può diventare insidiosa: sa essere estremamente convincente anche quando sbaglia. Un codice ben scritto, accompagnato da una spiegazione plausibile e magari perfettamente compilabile, può contenere un errore logico, una vulnerabilità o semplicemente non rispettare un requisito. Chi non possiede le competenze necessarie per riconoscere questi problemi rischia di trasformarsi da programmatore a semplice esecutore delle indicazioni ricevute dal modello.
Ed è esattamente ciò che dobbiamo evitare.
Ha ancora senso studiare un linguaggio di programmazione?
La mia risposta è quindi decisamente affermativa. Studiare C#, Java, Python, JavaScript o qualsiasi altro linguaggio non serve soltanto a imparare dove mettere una parentesi o come dichiarare una variabile. Significa acquisire un modo di ragionare: comprendere condizioni, cicli, funzioni, oggetti, strutture dati, eccezioni, asincronia e relazioni tra componenti differenti.
Programmare insegna soprattutto a scomporre un problema complesso in problemi più piccoli, a definire una sequenza logica di operazioni e a prevedere situazioni che inizialmente non erano state considerate. Insegna inoltre una lezione tanto semplice quanto fondamentale: il computer esegue ciò che gli abbiamo detto di fare, che non sempre coincide con ciò che pensavamo di avergli detto.
Senza queste fondamenta diventa molto difficile valutare ciò che un’intelligenza artificiale produce. Se non conosco il funzionamento di una query, non posso sapere se quella generata sia efficiente. Se non conosco i principi della programmazione asincrona, non posso riconoscere determinati problemi di concorrenza. Se non comprendo autenticazione e autorizzazione, non posso affidarmi ciecamente a una soluzione soltanto perché appare corretta.
L’AI può quindi ridurre enormemente il tempo necessario a produrre una soluzione, ma non elimina la necessità di possedere gli strumenti intellettuali per giudicarla.
Non dobbiamo insegnare ai giovani programmatori a competere con l’AI
Probabilmente è proprio questo il cambiamento culturale più importante. Non avrebbe senso formare oggi un giovane sviluppatore con l’obiettivo di renderlo più veloce di una macchina nella produzione di codice standard. Sarebbe una competizione inutile e destinata a diventare sempre più impari.
Dobbiamo invece formare professionisti capaci di utilizzare l’intelligenza artificiale come moltiplicatore delle proprie competenze. Se un modello può produrre in dieci secondi una struttura che richiederebbe mezz’ora di lavoro manuale, non c’è alcuna ragione per non sfruttarlo. Quel tempo può essere dedicato alla progettazione, alla verifica, ai test, alla sicurezza e alla qualità complessiva del software.
Il valore del programmatore si sposterà quindi progressivamente dalla semplice produzione del codice alla capacità di governare il processo che porta dal problema alla soluzione. Significa sapere cosa chiedere all’AI, ma soprattutto sapere se la risposta ricevuta è corretta, incompleta o completamente sbagliata.
In questo senso non credo che dovremmo parlare di “AI contro programmatori”. La distinzione più interessante sarà probabilmente tra programmatori capaci di utilizzare bene l’intelligenza artificiale e programmatori che ne diventeranno dipendenti senza possedere le competenze necessarie per controllarla.
Una grande opportunità per chi comincia oggi
Non vedo quindi il futuro della programmazione con pessimismo. Al contrario, penso che chi inizia oggi abbia davanti a sé opportunità straordinarie. Un giovane sviluppatore può disporre di una sorta di tutor permanente, approfondire immediatamente ciò che non comprende, confrontare differenti soluzioni e sperimentare tecnologie che prima avrebbero richiesto giorni di studio preliminare.
La condizione è che l’intelligenza artificiale venga utilizzata per accelerare l’apprendimento e non per evitarlo.
Ai ragazzi direi quindi di utilizzarla senza paura. Di farle domande, chiederle spiegazioni, sottoporle il proprio codice, confrontare soluzioni e utilizzarla quando rimangono bloccati. Ma direi anche di non accettare mai una risposta soltanto perché sembra corretta. Bisogna leggere il codice, modificarlo, romperlo volontariamente, capire perché smette di funzionare e provare a riscriverne almeno alcune parti.
Perché il vero obiettivo della formazione non può essere ottenere un programma che funziona. Deve essere formare una persona che sappia spiegare perché funziona.
Il futuro della programmazione sarà ancora umano
L’intelligenza artificiale cambierà profondamente il nostro settore e sarebbe ingenuo pensare il contrario. Probabilmente tra pochi anni considereremo normale delegare alle macchine una quantità di codice molto superiore a quella che deleghiamo oggi. Cambieranno gli strumenti, cambieranno i percorsi formativi e cambierà probabilmente anche il ruolo dello sviluppatore.
Ma non credo che verrà meno il bisogno di persone capaci di comprendere problemi, progettare sistemi, prendere decisioni e assumersi la responsabilità tecnica delle soluzioni realizzate. Al contrario, più aumenterà la quantità di codice che una macchina sarà capace di produrre autonomamente, più sarà importante avere professionisti in grado di stabilire quale codice debba essere prodotto, perché e con quali conseguenze.
È anche il messaggio che cerco di trasmettere ai miei discenti e ai collaboratori più giovani quando si avvicinano alla programmazione. L’intelligenza artificiale deve essere utilizzata, studiata e sfruttata: ignorarla significherebbe rinunciare a uno degli strumenti più importanti che la nostra professione abbia avuto a disposizione negli ultimi anni. Ma non dobbiamo mai invertire i ruoli.
Come dico spesso a chi si forma e lavora con me: «Siamo menti pensanti e capaci. Dobbiamo essere noi a dire al computer cosa deve fare, non il contrario. L’AI potrà aiutarci a scriverlo più velocemente. Potrà suggerirci una strada migliore e magari accorgersi di qualcosa che ci era sfuggito. Ma sapere dove vogliamo arrivare deve continuare a essere compito nostro.»
W il code!