Intelligenza Artificiale e Coding: Futuro o Presente?

AskJarvis_EXM

Considerazioni sullo stato dell’arte riguardo strumenti e conoscenze sull’integrazione tra intelligenza artificiale e coding

È molto semplice immaginare un’intelligenza artificiale (sigla: IA) in grado di programmare, o addirittura programmarsi e modificarsi a piacimento. Questo immaginario collettivo deriva da numerosi film o libri sull’argomento, ma anche dal semplice fatto che, essendo l’IA sviluppata in qualche modo tramite codice, molti collegano le due cose, presumendo che l’IA sia particolarmente ferrata sulle basi dalle quali è stata creata.

Ma, dunque, davvero può un’IA programmare? La risposta è SI*.

L’asterisco è d’obbligo: nonostante alcuni incredibili sviluppi sul campo portati da tecnologie come OpenAI, la cui IA può scrivere alcuni semplici programmi partendo dalla descrizione del loro funzionamento, in verità siamo ancora molto, molto lontani dallo sviluppare un’IA in grado di programmare qualcosa di minimamente complesso.
In generale, le intelligenze artificiali sono molto brave ad imparare a svolgere mansioni semplici, ripetitive o con regole ferree, ma lo stesso non si può dire riguardo lavori creativi (anche se alcuni recentissimi sviluppi come la recente IA di Google, Imagen, può far ricredere su questa affermazione). Non mi dilungherò su questo argomento in quanto è stato già trattato sul blog da un mio collega e potete trovare l’articolo qui:

Non è dunque possibile utilizzare l’IA a questo scopo?

Dato che il futuro del coding, almeno per il momento, non risiede nell’IA, gli sviluppatori hanno pensato bene di trovare una mansione più semplice e più adatta da affidargli: assistere gli sviluppatori stessi nella scrittura del codice.
L’IA può assistere lo sviluppatore in vari modi: scrivere direttamente codice o anche semplicemente aiutare lo sviluppatore a comprendere parti del codice su cui sta lavorando (a questo proposito, una statistica interessante da mostrare è che i programmatori spendono circa il 58% del tempo in attività di comprensione del codice).
Molti strumenti stanno nascendo per questo scopo, noi di Ex-Machina abbiamo recentemente iniziato a sperimentare l’utilizzo di uno di questi: askjarvis.io

Questo strumento aiuta lo sviluppatore proponendo codice partendo da una piccola descrizione in linguaggio naturale (in inglese). Lo strumento è anche in grado di generare test o documentazione per codice già scritto. L’esperienza è stata piuttosto positiva, ma ha anche mostrato decise limitazioni che sono intrinseche della metodologia proposta dallo strumento o, sorprendentemente, dal fatto che, imparando dagli umani, anche il codice scritto dall’IA contiene errori e sviste che possono essere difficili da individuare.

In particolare:

  • Il codice generato partendo dalla sua descrizione è spesso molto preciso
  • La generazione automatica dei test può essere molto comoda, specie per avere un’idea dei possibili test o uno scheletro del codice
  • In determinate situazioni, riduce il tempo che lo sviluppatore avrebbe dovuto spendere a documentarsi per scrivere lo stesso codice
  • Ottimo per piccole e specifiche parti di codice

Alcuni punti a sfavore:

  • Codice lungo o complesso generato dallo strumento non è utilizzabile
  • Il codice non è “personalizzato”: spesso non segue lo stile dello sviluppatore e quindi “stona” con il resto del codice. Lo sviluppatore deve, dunque, riscrivere integralmente o in parte il codice proposto
  • I test generati sono, a volte, troppo imprecisi e/o stravaganti
  • Non si può accettare del codice “a scatola chiusa”, è importante, specie per parti di codice delicate o collegate alla sicurezza del programma, leggere attentamente ed eventualmente correggere possibili errori nel codice

Un’esperienza, quindi, piuttosto positiva, ma che lascia immediatamente intravedere ampi margini di miglioramento che solo il tempo o nuove tecnologie potranno apportare.

Ci sono altri strumenti con funzioni analoghe?

Dozzine. Altri strumenti o approcci al problema esistono, ognuno con i suoi pro ed i contro. Nella mia tesi di laurea ho lavorato ad uno strumento simile: un plugin per un ambiente di sviluppo che offriva la possibilità per lo sviluppatore di cercare piccole parti di codice partendo da una descrizione in inglese. L’idea era di evitare allo sviluppatore continui cambi di ambiente (per esempio tra browser e ambiente di sviluppo), offrendo parti di codice “al volo”. L’approccio utilizzato in questo caso non si basava direttamente sull’IA, ma quanto più su un motore di ricerca basato su un enorme database di coppie <codice, descrizione> estratto automaticamente da codice open source. Confrontando il mio approccio con altri strumenti esistenti ai tempi, ho notato che i pro ed i contro erano, spesso, comuni: ottima capacità di produrre codice piccolo e preciso con conseguente riduzione del tempo impiegato, ma grande imprecisione per codice complesso o poco comune (per esempio impiegato in contesti precisi o per funzionalità poco usate) con aggiunta del bisogno di verificare la correttezza e/o adattare il codice generato alle proprie esigenze. Un’altra similarità con altri approcci, in particolare basati su Machine Learning, è che una base di dati più grande su cui basarsi porta inevitabilmente a migliori risultati.
Questa è una caratteristica che, personalmente, trovo molto interessante: questo tipo di approccio potrebbe virtualmente portare a risultati perfetti e precisi al 99.9% se solo possedesse abbastanza dati su cui basarsi. Purtroppo, si tratta di una mole di dati incredibilmente vasta che non è quasi fisicamente possibile accumulare. L’IA in grado di migliorarsi con ogni pezzo di codice servito ed assimilato significa anche che, lo stesso approccio proiettato 10 anni nel futuro, porterà risultati notevolmente migliori senza che nessuna modifica esterna venga apportata, ma, semplicemente, avendo più dati a disposizione.

In conclusione

È difficile al momento prevedere i futuri sviluppi, sempre più veloci, dell’IA e conseguenti tecnologie, ma, possiamo dire con certezza, che un’IA in grado di programmare grandi progetti autonomamente è ancora molto lontana.
Stanno nascendo, invece, molti strumenti con lo scopo di aiutare gli sviluppatori, ma appare certo che, se da un lato possono aiutare a risparmiare tempo, dall’altro presentano una serie di problemi, purtroppo, non ancora trascurabili.

Condividi su