scenari

AI, luci e ombre del “software che scrive software”

L’intelligenza artificiale sta trasformando anche lo sviluppo del software. Il machine learning può non solo accelerare la scrittura del programma, automatizzandola, ma aprire anche a paradigmi in grado di sparigliare le carte nella progettazione di tecnologia. Lo stato dell’arte

31 Dic 2019
Rossana Damiano

professore associato del Dipartimento di Informatica dell'Università degli Studi di Torino e membro dell’Associazione Italiana per l’Intelligenza Artificiale (AIxIA)


Ci sono tutte le premesse perché l’Intelligenza Artificiale nel prossimo decennio svolga un prezioso ruolo di assistente nella creazione del software.

Complici gli interessi dei grandi produttori di software a livello mondiale, infatti, la ricerca sulla produzione automatica di software sembra aver compiuto un cambiamento di prospettiva decisivo nell’ultimo decennio: anche in questo ambito, come in altri, il cambiamento è avvenuto in larga parte grazie all’avvento dei big data, affiancati da tecniche di apprendimento automatico che permettono di trarne il massimo beneficio.

Big Code e produzione automatica di software

Accanto alla ricerca condotta dai giganti del software come Google e Microsoft, un decisivo impulso allo sviluppo di applicazioni intelligenti per la produzione di software è stato fornito da alcune start up tecnologiche e spin-off nate in ambito accademico, quali Diffblue (Regno Unito) e Codota (Israele) e vere e proprie multinazionali, tra cui vale la pena menzionare TestPlant Europe Limited (nota come Eggplant), che ha filiali in Europa, Asia e America.

Alimentate dalla collaborazione con l’accademia, società di questo tipo hanno immesso sul mercato strumenti che sfruttano l’Intelligenza Artificiale per automatizzare la produzione di software in modi diversi e supportandone tutte le fasi, dalla pianificazione alla programmazione, al testing. Attingendo dalla conoscenza contenuta in miliardi di righe di codice già scritte negli archivi pubblici e privati (“Big Code”), affrontano il compito di creare nuovi programmi con nuova linfa rispetto agli approcci del passato, basati su conoscenza esperta e formalismi di tipo logico.

Le applicazioni proposte negli ultimi anni spaziano dalla documentazione del software, alla scrittura vera e propria del codice, alla sua compilazione e al testing. Per esempio, Kite (Open Mind) e Codota forniscono un servizio di auto-completamento nella scrittura del codice, suggerendo possibili continuazioni al programmatore.

Entrambi si presentano come plugin per ambienti di sviluppo software esistenti (Integrated Development Environments, IDE) e già saldamenti posizionati sul mercato. Kite fornisce l’autocompleamento per il linguaggio Python, supportando anche la documentazione del codice, Codota fornisce lo stesso servizio per il linguaggio Java. Nelle parole dei creatori di Codota, i suggerimenti forniti sono “appresi da milioni di programmi” tramite tecniche di apprendimento automatico. Dietro questa etichetta si nasconde molto spesso l’utilizzo di tecniche di Deep Learning: basate su reti neurali, queste tecniche sfruttano la conoscenza depositata negli enormi serbatoi di software disponibili oggi come GitHub.

Creazione automatica di software: funziona così

Rispetto ai precedenti strumenti di tipo logico-deduttivo, questo paradigma non punta a ottenere una copertura accettabile e tanto meno ottimale di tutti i casi possibili nella programmazione, inclusi i casi peggiori, ma a fornire buoni risultati nella media dei casi. Per comprenderne potenzialità e limiti, è utile il paragone con il linguaggio naturale stabilito da un gruppo di ingegneri del software: così come le tecniche di elaborazione del linguaggio naturale che supportano chatbot, app per la traduzione automatica e motori di ricerca si alimentano, più che di una reale comprensione del linguaggio umano, della conoscenza depositata in immensi corpora linguistici (testi in formato digitale, trascrizioni di dialoghi, ecc.), allo stesso modo la creazione automatica del software (code synthesis) si basa sulla vasta disponibilità di software esistente accumulata negli ultimi decenni grazie al paradigma del software open source.

Miltiadis Allamanis (ricercatore di Microsoft Research) e colleghi[1] enunciano questo parallelismo come “ipotesi della naturalezza”: nella misura in cui la programmazione costituisce una forma di comunicazione umana, vero e proprio ‘linguaggio’ al pari del linguaggio umano, i milioni di programmi di Big Code hanno proprietà simili ai milioni di esempi di cui si alimentano chatbot e traduttori automatici, e come tali possono a pieno titolo supportare la programmazione automatica senza rappresentarsene il significato.

WEBINAR
Intelligenza Artificiale, Data Analysis e Image Recognition: i vantaggi concreti per l’azienda
Big Data
Intelligenza Artificiale

Anzi, a detta di Allamanis e colleghi, rispetto agli approcci tradizionali è assai più facile per una rete neurale riconoscere la manifestazione di un costrutto di programmazione (per esempio, un ciclo) quando esso si presenta in forme superficialmente diverse in programmi diversi, proprio per la capacità tipica di questa tecnologia di cogliere schemi generali astraendo dai dettagli.

Di più, utilizzando Big Code, i produttori di software riescono non solo nella finalità di creare nuovi programmi, ma anche nel migliorare quelli scritti dagli sviluppatori umani, grazie al fatto che nei milioni di programmi utilizzati per addestrare i sistemi sono presenti anche i dati relativi alle revisioni e correzioni del software, utili per imparare a correggere il codice e svelarne possibili vulnerabilità.

Google è stata tra i primi ad accorgersi delle potenzialità dei propri immensi archivi per identificare e correggere i bug, gli errori del software: studiando la correlazione tra le modifiche successive effettuate dai programmatori nei singoli programmi e la presenza di errori, a partire dal 2013 Google ha messo a punto un metodo per identificare le porzioni di codice a rischio, migliorando l’efficienza dei propri processi di scrittura e verifica del software.

DeepCode e la tecnica dei “language models”

Ecco allora le applicazioni volte a rivelare le vulnerabilità nascoste nel codice, tra cui spicca DeepCode (dell’omonima società), che si basa sull’associazione di algoritmi statistici e di apprendimento automatico addestrati su grandi repository pubbliche di software come Github. Basandosi sull’ipotesi della naturalezza sopra enunciata, DeepCode ha messo a punto uno strumento che riempie i vuoti in un programma incompleto (“a partial program with holes”) sfruttando la tecnica dei “language models” utilizzata nel trattamento del linguaggio naturale per predire la probabilità delle frasi nel discorso umano: in pratica, questo strumento riempie i vuoti[2] nel programma da completare basandosi su predizioni statistiche elaborate a partire dai programmi esistenti.

Altro aspetto cruciale del ciclo di vita del software è rappresentato dalla fase di testing, in cui i programmi scritti sono messi alla prova su un ampio numero di casi per verificarne l’effettivo funzionamento. Poiché normalmente non è possibile generare tutti gli esempi d’uso possibili, ancora una volta, l’uso dell’Intelligenza Artificiale può avere un ruolo molto importante nell’individuare e generare un insieme di casi significativo per la valutazione, sia rispetto agli aspetti di sicurezza, sia rispetto alle circostanze di utilizzo, incluso il comportamento di coloro che lo useranno.[3]

Per esempio, DiffBlue Cover dello spin-off DeepBlue genera automaticamente test per il codice Java, mentre SoapUi di Smartbear automatizza il testing funzionale delle API, elemento fondamentale dell’architettura dei servizi web. Sul versante della valutazione delle interfacce utente, Eggplant incrocia un modello di funzionamento del sistema da testare con i dati di comportamento degli utenti per generare una casistica di test mirata a coprire tutte le sequenze di azioni che gli utenti potrebbero intraprendere nell’interagire con il sistema (“user journeys”).

Probabilmente meno interessanti per il profano, queste applicazioni sono cruciali per migliorare la qualità del software e ridurre il tempo che trascorre dalla sua ideazione all’apparizione sul mercato, in cui la fase di testing può costituire un vero e proprio collo di bottiglia impossibile da aggirare. Pianificazione delle attività di produzione del software, correzione e testing infatti sono proprio le motivazioni che spingono società di consulenza d’impresa come Gartner a raccomandare l’investimento nelle tecnologie di intelligenza artificiale nella produzione del software.

Software “auto-creato”, le zone d’ombra

Il quadro descritto fino a ora sembrerebbe ottimale, grazie all’integrazione tra ricerca e sviluppo di applicazioni pratiche che migliorano i processi di produzione con risultati misurabili in termini di qualità, costi e benefici per i lavoratori. Tuttavia, uno sguardo più attento rileva alcune zone d’ombra che meritano una riflessione.

In primis, se per imprenditori e sviluppatori le applicazioni che automatizzano la produzione software sono fortemente attraenti, un osservatore esterno potrebbe trovare paradossale e inquietante l’idea stessa del “software che scrive il software”. Infatti, alla luce degli allarmi sollevati da molte parti rispetto all’uso dell’IA per creare entità potenzialmente autonome ma prive di consapevolezza sociale e morale, l’automazione nella produzione di software si espone a numerose critiche.

Da un lato, l’utilizzo di Big Code a svantaggio della conoscenza esperta, esplicita e formalmente verificabile propria dell’AI tradizionale, introduce nel processo di produzione del software gli elementi già criticati rispetto ai Big Data, ovvero la forte dipendenza della qualità finale degli artefatti dalla qualità e copertura dei dati e la presenza di possibili pregiudizi impliciti negli algoritmi che su quei dati operano.

In altre parole, cosa accadrebbe se nascosti nel Big Code ci fossero programmi malevoli, o semplicemente scorretti? E se gli algoritmi tendessero a favorire implicitamente ma coerentemente determinati tipi di schemi o a dare maggior rilievo a specifici sottoinsiemi di dati, per esempio favorendo in fase di valutazione certe categorie di utenti a scapito di altre? Valgono, quindi, per l’uso dell’IA nella produzione software, le medesime linee guida proposte dall’Unione Europea a favore di un’Intelligenza Artificiale antropocentrica ed è interesse di tutti che le istituzioni preposte alla sorveglianza dei valori etici nella produzione software vigilino perché siano applicate.

E’ necessario inoltre osservare che, come in molti casi, oltre al rischio di abusi, l’Intelligenza Artificiale porta in sé anche gli strumenti per evitarli: per quanto riguarda la produzione del software, da un lato la responsabilità finale dei programmi che vengono rilasciati resta nelle mani degli esseri umani, che rivestono ruoli precisi in un processo produttivo ben consolidato dalla lunga tradizione del software engineering e in cui l’Intelligenza Artificiale ha un ruolo prevalentemente di supporto agli attori umani; dall’altro, i metodi di verifica prodotti dallo studio delle proprietà formali dei programmi e dall’utilizzo di paradigmi di tipo logico-deduttivo sono comunque applicabili al codice prodotto con l’ausilio di strumenti intelligenti.

Intelligenza artificiale e processi creativi

Ultimo, ma non meno importante, l’utilizzo dell’Intelligenza Artificiale nei processi creativi, quali sono la progettazione e la scrittura del software, è per sua natura tuttora caratterizzato da forti limitazioni rispetto alla creatività umana. La creatività umana, infatti, è influenzata anche da elementi sociali e culturali ed è del tutto distinta dalla creatività algoritmica che recentemente ha ricevuto grande attenzione nei media.

Tipicamente basate sull’imitazione di modelli, anziché sulla ricerca di paradigmi innovativi, le applicazioni del deep learning alla creazione artistica sono palesi esempi di una creatività meccanica, adatta a supportare e ispirare la creatività umana ma non sufficientemente matura da sostituirsi ad essa. La lunga tradizione di studio della creatività, dalle riflessioni dei padri dell’Intelligenza Artificiale[5] fino alle ricerche condotte dalla scienziata cognitiva Margaret Boden[6] negli anni Novanta, suggerisce infatti che la creatività umana propriamente detta sia di tipo “trasformazionale”, cioè non limitata alla mera manipolazione di uno spazio concettuale esistente, ma orientata a creare nuovi spazi concettuali da quelli esistenti.

Note bibliografiche

  1. Allamanis, M., Barr, E. T., Devanbu, P., & Sutton, C. (2018). A survey of machine learning for big code and naturalness. ACM Computing Surveys (CSUR), 51(4), 81.
  2. Code Completion with Statistical Language Models
  3. Riguardo alla mancata sperimentazione del software in tutti i casi rilevanti, si pensi per esempio alla disgrazia occorsa al Boeing 737 MAX del volo 302 Ethiopian Airlines, in cui ogni evidenza punta verso un errore del software in presenza di specifiche, ancorché rare, condizioni ambientali non previste in fase di testing (https://cacm.acm.org/news/235821-initial-findings-put-boeings-software-at-center-of-ethiopian-737-crash/fulltext).
  4. Per esempio, si consideri la canzone Daddy’s Car generata da reti neurali sulla base della produzione musicale dei Beatles (https://youtu.be/LSHZ_b05W7o)
  5. Schank, R. C., & Cleary, C. (1995). Making machines creative. In The creative cognition approach (pp. 229-247). MIT Press.
  6. Boden, M. A. (2009). Computer models of creativity. AI Magazine, 30(3), 23-23.
WEBINAR
Come ottenere un approccio Agile con Intelligenza Artificiale e Machine Learning?
Big Data
Intelligenza Artificiale

@RIPRODUZIONE RISERVATA

Articoli correlati