AI-POWERED

AI in grado di automatizzare il rilevamento e correzione di vari tipi di bug in modo da ridurre i tempi di manutenzione del codice.

L'Idea

Durante l’AI-Disruption Hackathon organizzato dal Gruppo Reply un team internazionale (composto anche da un collega di Technology Reply) ha sviluppato, in 48 ore, un’applicazione per trovare bug in un frammento di codice e fornire una versione priva di essi. L'idea è che uno sviluppatore invii parti di codice a questa applicazione che, attraverso un’analisi che sfrutta una rete neurale, identifica una lista di possibili errori nel codice. Lo sviluppatore seleziona poi quali di questi errori vuole correggere e l'applicazione ne produce una versione senza di essi.
Il team ha elaborato le due richieste, una per il rilevamento, una per la correzione dei bug. Reiterati invii di esse alla rete neurale permettono di ottenere il risultato voluto.

Codex: la soluzione!

La soluzione si basa su Codex, un set di motori (“engine”) di Intelligenza Artificiale sviluppati da OpenAI come specializzazione di GPT-3 (Generative Pre-trained Transformer 3). GPT-3 è una rete neurale di apprendimento automatico che mima testo prodotto da un umano (linguaggio naturale).
Codex è quindi un derivato di GPT-3 in quanto il risultato di un ulteriore addestramento di GPT-3 con miliardi di righe di codice nei più svariati linguaggi di programmazione (Python, SQL, etc.). Il risultato è una rete neurale in grado di comprendere e generare sia linguaggio naturale che di programmazione. Tale rete può essere quindi utilizzata per analizzare e per produrre codice sorgente partendo da semplici istruzioni scritte in linguaggio naturale.

I compiti del Codex


Sintetizzare programmi a partire dai brevi testi che documentano una specifica porzione di codice (“i commenti”) è stato l’obiettivo principale per il quale GPT-3 è stato ulteriormente addestrato con codice macchina. Questi commenti sono trasformati in codice eseguibile con una precisione maggiore al 70% rispetto alla metrica “Correttezza Funzionale”, cioè rispetto al fatto che il codice generato svolga correttamente l’operazione richiesta.
Pur interagendo con molti linguaggi di programmazione senza bisogno di alcuna configurazione specifica, Codex è stato addestrato principalmente con Python. Durante l’Hackathon abbiamo quindi testato la nostra applicazione solo con codice Python, lasciando gli altri linguaggi per futuri casi di studio.

Come i moderni servizi mail (GMail, Outlook, etc.) offrono automaticamente suggerimenti dei testi che stiamo componendo, così è possibile utilizzare Codex per effettuare il completamento automatico delle righe di codice che stiamo scrivendo.
In quanto potenzialmente in grado di aumentare la produttività dei programmatori, una versione di Codex perfezionata per questa funzionalità specifica è già stata integrata in alcuni degli strumenti usati per sviluppare codice (gli IDE, “Integrated Development Environment”) come IntelliJ o Visual Studio.
Rimane tuttavia da misurare il reale impatto sulla produttività degli sviluppatori, sulla loro qualità della vita e sui loro compensi.

Intere porzioni di codice possono esser riproposte mantenendo inalterata la logica, ma aumentandone la leggibilità e quindi la manutenibilità.
Ripetute invocazioni di Codex hanno dimostrato essere una strategia sorprendentemente efficace per migliorare la leggibilità del codice. Applicando tale tecnica a porzioni autonome di un progetto software si possono abbattere i tempi di manutenibilità di intere applicazioni.
Per esempio, in un’applicazione sviluppata con un linguaggio orientato agli oggetti è possibile sostituire un’implementazione intricata di un metodo con una sua versione più intellegibile e quindi più facilmente modificabile in caso di errori di sintassi, errori funzionali, o anche di vulnerabilità a livello implementativo.

Codex è in grado di generare codice sorgente in una dozzina tra i linguaggi di programmazione più diffusi (Python, SQL, Java, etc.) a partire dal linguaggio naturale (inglese, italiano, etc.). Questo può esser sfruttato da uno sviluppatore per:

  1. 1) Aumentare le proprie competenze in uno specifico linguaggio di programmazione;
  2. 2) Tradurre in codice funzionante richieste formulate in linguaggio naturale;
  3. 3) Apprendere come certe funzionalità possano esser implementate utilizzando librerie o API specifiche.

Rimane tuttavia da misurare l’effettiva capacità di Codex da una parte nel ridurre le barriere all’ingresso al settore, dall’altra nella progressione formativa e di carriera, sia degli sviluppatori che degli ingegneri del software.

CONCLUSIONI


I motori di Codex, offerti con la formula “pay-per-use”, sono estremamente efficienti e non richiedono una fase di apprendimento per essere utilizzati. Sono già stati addestrati su un enorme insieme di dati. Tuttavia, poiché si tratta di una rete neurale “general purpose”, è essenziale che la richiesta della funzionalità desiderata sia formulata in modo da ottenere il comportamento previsto per lo specifico caso.
La sfida più interessante è stata quella di trovare il set di impostazioni appropriate per i due compiti specifici: il rilevamento dei bug e la loro correzione. Ciò ha comportato la necessità di scegliere lo specifico “engine” di Codex, di formularne la richiesta da eseguire e, soprattutto, di impostarne correttamente i parametri.