L'AI può rivoluzionare lo sviluppo delle applicazioni generando, ottimizzando e traducendo il codice durante l'intero ciclo di vita dello sviluppo del software. L'adozione dell'AI generativa può portare alla creazione di software uniforme, all'utilizzo ottimale della creatività degli sviluppatori e a migliori competenze degli sviluppatori. Ad esempio:
L’uso dell’AI generativa nello sviluppo di applicazioni offre importanti potenziali benefici:
L’applicazione dell’AI generativa alla revisione, al refactoring e all’adozione degli standard di programmazione aziendali nel software produce codice più coerente, ad esempio approcci comuni alla risoluzione di problemi ricorrenti, una struttura del codice uniforme, codice autoesplicativo, ecc., indipendentemente dallo sviluppatore che lo ha scritto. Questo rende l'applicazione risultante più facile da risolvere e mantenere, poiché c'è meno bisogno che i manutentori comprendano prima la struttura e le idiosincrasie delle diverse sezioni di codice.
Come per altri domini, l'AI generativa può sollevare gli sviluppatori di applicazioni dalle attività a basso valore aggiunto, come scrivere codice semplice o ripetitivo, o individuare la causa di bug problematici. Avendo più tempo a disposizione per concentrarsi sulle attività di maggior valore, gli sviluppatori possono realizzare cicli di sviluppo più brevi, più funzionalità per ogni rilascio del software e modifiche più piccole e frequenti.
Infine, applicare l'AI generativa allo sviluppo di applicazioni può potenziare le competenze degli sviluppatori, permettendo anche a quelli di livello junior di operare a livello senior o addirittura esperto. Gli sviluppatori senior possono integrare l’addestramento dei modelli nei cicli di rilascio, adottando le best practice via via che il codice viene migliorato. L'AI generativa può fungere da mentore esperto per i membri junior del team, consentendo agli sviluppatori senior di occuparsi di altre attività e migliorando il livello di competenza dell’intero team di sviluppo.
L'AI generativa può essere utilizzata per lo sviluppo di applicazioni in diversi casi d'uso. Molti modelli generali, come Llama 2, sono addestrati su codice applicativo scritto in diversi linguaggi di programmazione contemporanei; inoltre, sono disponibili anche modelli ottimizzati per la generazione di codice.
I casi d'uso che possono trarre beneficio dall'AI generativa includono:
Ciascuno di questi casi d'uso è descritto di seguito.
La funzionalità nativa di generazione di testo dei modelli linguistici di grandi dimensioni (LLM) può essere utilizzata per generare nuovo codice a partire dai prompt. Ad esempio, uno sviluppatore può inviare il prompt "Scrivi una query SQL per recuperare il nome e il cognome di un cliente dalla tabella clienti" e ricevere in risposta una SQL query.
L’utilizzo degli LLM per la generazione di codice può aumentare significativamente le competenze nello sviluppo di applicazioni degli sviluppatori junior o persino dei non sviluppatori, ma può rapidamente raggiungere un punto di rendimento decrescente quando gli output richiesti diventano più complessi o quando il livello di dettaglio richiesto nei prompt si avvicina al codice che sarà generato.
L'ottimizzazione e il refactoring del codice, ovvero il processo di miglioramento del codice per renderlo più efficiente e meglio strutturato, può essere considerato come una combinazione di due funzionalità degli LLM: generazione di testo e riassunto del testo. Utilizzando un LLM generale o ottimizzato, uno sviluppatore può fornire un prompt per ottimizzare o ristrutturare un pezzo di codice, rendendolo più efficiente e/o eliminando il codice duplicato.
Gli LLM sono efficaci nell’ottimizzazione e nel refactoring di piccole porzioni di codice che rientrano nella finestra di contesto del modello, ma per ottenere risultati accettabili su frammenti di codice più grandi e/o su interi sistemi software è necessario ricorrere a soluzioni più ampie, in grado di mantenere i metadati sull’intera applicazione.
Come avviene per l’ottimizzazione del codice, gli LLM possono essere utilizzati per applicare e far rispettare gli standard di codifica aziendali su aspetti come la denominazione di funzioni e variabili, la struttura del codice e le convenzioni di programmazione adottate dall’azienda. Tipicamente applicati a livello di repository quale parte del processo di revisione del codice e di commit, gli LLM ottimizzati sugli standard di codifica aziendali possono tradurre il codice inviato per conformarsi a tali standard. Questi standard possono anche includere convenzioni di sicurezza che aiutano l'azienda a rispettare gli standard normativi.
Poiché i linguaggi di programmazione sono come qualsiasi altro linguaggio, la capacità nativa di traduzione testuale degli LLM può convertire software scritto in un linguaggio di programmazione in un altro, ad esempio trasformando codice C# in Java.
Come avviene per l’ottimizzazione del codice, gli LLM da soli sono efficaci nella conversione di piccoli pezzi di codice entro la loro finestra di contesto, mentre per convertire frammenti di codice più grandi o interi sistemi software sono necessarie soluzioni più ampie che conservino metadati e altre informazioni contestuali importanti.
Attraverso le funzionalità di conversione del codice, la gen AI può anche facilitare la traduzione del codice tra diversi linguaggi di programmazione, ad esempio convertendo codice COBOL in Java. Questo può essere particolarmente utile negli ambienti multi-linguaggio o durante le migrazioni di sistema, poiché consente agli sviluppatori di risparmiare tempo e fatica nella riscrittura manuale del codice.
La comprensione del codice può essere considerata equivalente alla generazione del codice. Invece di convertire prompt in linguaggio naturale in codice, la spiegazione del codice prende come input un frammento di codice e genera una spiegazione del suo funzionamento in linguaggio naturale. Ad esempio, un prompt come "Spiega la funzione di questo frammento di codice Python" seguito da una sezione di codice Python può generare una spiegazione riga per riga e un riepilogo generale dello scopo del codice.
Questa funzionalità, nota anche come bug hunting o ricerca di bug, può essere utilizzata anche per rilevare errori nel codice, fornendo al modello un prompt "Indica perché questo frammento di codice non funziona".
La selezione di API e librerie è l'applicazione della retrieval-augmented generation (RAG) alla gestione delle API aziendali e delle librerie software. Uno sviluppatore in cerca di un’API da usare con un'applicazione potrebbe creare un prompt RAG che interroga un database aziendale di nomi API, descrizioni, endpoint, ecc. per rispondere a domande come: "Abbiamo un'API che fa xyz?" Se le descrizioni di API e librerie di codice sono mantenute con alta qualità e con parole chiave, tale applicazione potrebbe essere ottimizzata per fornire risposte coerenti, accelerando sia lo sviluppo delle applicazioni che l’onboarding degli sviluppatori.
Gli architetti devono prendere una serie di decisioni importanti sull’architettura quando progettano soluzioni di sviluppo applicativo basate su LLM.
Il modello offre indennizzo/protezione del copyright? Come è possibile stabilire se il codice generato è soggetto a vincoli di licenza? Anche i modelli addestrati su licenze permissive possono essere soggetti a clausole di licenza, come l’obbligo di riconoscere il titolare originale del copyright.
Gli architetti che progettano soluzioni volte ad applicare e far rispettare gli standard di codifica aziendali devono considerare lo sforzo necessario per addestrare un LLM a "comprendere" questi standard e prendere una decisione informata sul fatto che altri strumenti, come i linting tool, possano essere più adatti a ottenere capacità simili.
L’assistenza al codice di tipo auto-complete deve fornire risposte rapide, così da non interrompere il flusso di pensiero dello sviluppatore. Gli architetti devono considerare il posizionamento e la connettività dei modelli di assistenza per garantire che il supporto agli sviluppatori sia utile e non invasivo.
Non è garantito che i modelli linguistici di grandi dimensioni producano codice funzionalmente corretto, in particolare se il codice generato o rivisto deve rientrare in un sistema software più ampio. Sebbene non esista una soluzione diretta a questo problema (e sta diventando sempre meno possibile con l'evoluzione degli LLM), gli architetti devono essere consapevoli che il codice generato dagli LLM deve essere sottoposto agli stessi controlli di qualità e sicurezza previsti per il codice prodotto dagli sviluppatori umani.
Gli LLM generalmente disponibili sono tipicamente addestrati su un piccolo numero di linguaggi di programmazione contemporanei, come Python, Javascript, C# e altri. Gli architetti di soluzioni che devono supportare linguaggi più vecchi o di nicchia possono trovarsi con poche opzioni per i modelli disponibili, oppure potrebbero essere costretti ad adattare aggressivamente un modello generale per soddisfare le proprie esigenze specifiche.