teleporthq
Piattaforma
Soluzioni
Integrazioni
Risorse

Crediamo nella generazione di codice basata sull’intelligenza artificiale

Immagine in evidenza sulla generazione di codice basata sull'intelligenza artificiale

Nel settembre 2018, teleportHQ ha pubblicato questo video di 30 secondi che mostrava i risultati preliminari del nostro motore di generazione automatica del codice.

Automatic code generation example

Nel giro di un paio di giorni, il video è diventato virale, superando i 2 milioni di visualizzazioni. Gli spettatori hanno pubblicato commenti entusiasti sui nostri canali social (Facebook, LinkedIn, Twitter). La reazione del mercato ha superato ogni nostra aspettativa. È stata una grande ricompensa, molto apprezzata, per il nostro team.

Ma, a essere sinceri, il nostro percorso è stato tutt’altro che perfetto. I mesi di ricerca e sviluppo che lo avevano preceduto erano stati davvero tortuosi. Abbiamo avuto molti dubbi e spesso ci siamo sentiti soli e al buio. Quella conferma esterna è stata un enorme sollievo: finalmente sapevamo di essere sulla strada giusta.

Quando si svolgono attività di ricerca e sviluppo, bisogna essere pronti a buttare via tutto e ricominciare da capo tutte le volte che serve. Noi eravamo pronti a farlo. Ma abbiamo imparato che c’era qualcos’altro per cui non eravamo pronti: affrontare l’incertezza.

Gli sviluppatori sanno che ogni riga di codice produce risultati immediati e prevedibili. O funziona oppure no. Non esistono vie di mezzo. E quando funziona, dà una soddisfazione immediata. Ho sempre trovato questo aspetto della programmazione molto gratificante.

Logica fuzzy

Con l'apprendimento automatico, però, le cose sono molto diverse. Bisogna lavorare con la logica fuzzy e i livelli di confidenza.

- Ma aspetta un attimo!... Funziona oppure no?

- Beh, sì, il più delle volte...

La scarsa precisione di una risposta del genere è esasperante per uno sviluppatore. Non ha senso usare un risultato impreciso dell'apprendimento automatico per generare codice preciso.

All'inizio, in effetti, sembra molto controintuitivo. Ci è voluto molto tempo per integrare l'apprendimento automatico nella nostra cultura dello sviluppo (e binaria). Ma una volta riunite le prospettive dello sviluppatore e del data scientist e imparato ad aggiungere i necessari livelli algoritmici per gestire l'incertezza, non si torna più indietro. È una strada aperta verso la creazione di valore illimitato.

Per questo abbiamo pensato di condividere alcune riflessioni sugli inizi della nostra avventura. Vorremmo incoraggiare altri team di sviluppo software ad abbracciare l'apprendimento automatico nella propria cultura di sviluppo. Nonostante le tante difficoltà, in fondo al tunnel c'è una luce brillante!

Le origini

Come si può immaginare, non ci si sveglia una mattina con l'idea di generare automaticamente codice usando l'apprendimento automatico. Per arrivarci, bisogna che si incontrino alcune idee.

Nel nostro caso, il processo è stato piuttosto lungo. È iniziato con alcuni esperimenti casuali con chatbot e interfacce conversazionali. All’epoca, nel 2015, la maggior parte di noi lavorava ancora nel reparto JavaScript di Evozon. Quel lavoro non è mai arrivato in produzione, ma siamo rimasti tutti entusiasti: ci ha aperto nuove prospettive su come creare esperienze utente innovative.

In seguito, il contesto in cui lavoravamo ci ha portati a considerare la possibilità di creare un ambiente di sviluppo visivo (VDE) in modalità SaaS. Sapevamo che, se lo avessimo fatto, avremmo dovuto realizzare qualcosa di straordinario. Creare un nuovo prodotto senza una proposta di valore unica e convincente sarebbe stato uno spreco di tempo e denaro.

Mentre ci ponevamo queste domande, è emersa un’idea interessante. E se la nostra piattaforma potesse integrare un agente conversazionale basato sull’intelligenza artificiale, in grado di progettare e programmare il nostro sito web in tempo reale?

Abbiamo deciso di realizzare un prototipo che simulasse tutte le funzionalità che sognavamo. Ci ha permesso di visualizzare e perfezionare l’esperienza. Ci ha fatto sognare e sorridere!

Ritorno alla realtà

Eppure, un prodotto del genere sembrava del tutto irraggiungibile. Oltre alla complessità intrinseca del progetto, nessuno di noi riusciva a immaginare l’intero percorso per realizzarlo. In quel momento abbiamo capito quanto gli sviluppatori siano simili ai costruttori. I bravi costruttori sanno che ogni opera richiede un buon piano e una sequenza di esecuzione precisa e logica. Ma come si procede quando il progetto finale è ancora solo un’idea e ha dimensioni così ambiziose?

Fiducia e piccoli passi

Quando non si hanno le conoscenze preliminari necessarie per capire come raggiungere il proprio obiettivo, bisogna provare. Cose nuove. Non appena si presentano problemi lungo questi nuovi percorsi — e succederà — si sarà molto tentati di mollare tutto. Ogni problema diventerà un buon motivo per farlo. L’unico modo per resistere alla tentazione di arrendersi è avere fiducia nel fatto che, alla fine, si riuscirà a superare ogni difficoltà.

Poi bisogna iniziare con piccoli passi e, si spera, vincere qualche battaglia. Ogni piccola vittoria rafforza la fiducia e avvicina di un passo all’obiettivo finale. Ogni vittoria, anche se piccola, rivelerà nuove possibilità inaspettate per i passi successivi. In fondo, tutto si basa su un delicato equilibrio tra sognare e agire.

Linguaggio di definizione dell’interfaccia utente (UIDL)

Ecco perché abbiamo deciso di iniziare il nostro percorso con qualcosa che conoscevamo e comprendevamo bene. Fin dall’inizio sapevamo che avremmo voluto essere in grado di generare codice in qualsiasi linguaggio. Questo significava che dovevamo usare un livello intermedio di rappresentazione dell’interfaccia utente, indipendente dal codice. Non si tratta affatto di una novità nel settore. Prendendo spunto da altri, abbiamo creato una nostra versione di questo tipo di rappresentazione. In sostanza, è un oggetto JavaScript conforme al nostro formato User Interface Definition Language (UIDL). Si può pensare a ogni rappresentazione come a un JSON (il nostro blog è realizzato con questo sistema: fai clic qui per vedere com’è).

Generatori di codice

Dopo aver definito il nostro UIDL, ci siamo dedicati ai motori di generazione del codice. Sapevamo che dovevano essere in grado di generare codice all’avanguardia a partire da un oggetto UIDL, in tempo reale e per qualsiasi linguaggio o framework.

Considerata la nostra esperienza professionale con JavaScript, abbiamo iniziato con React. L’esperimento è andato bene e oggi supportiamo già React/Next e Vue/Nuxt. Entro la fine dell’anno prevediamo di supportare anche React Native. Parleremo più approfonditamente del nostro percorso con i generatori di codice in un prossimo articolo del blog.

Per fortuna, nel settore IT i wireframe sono ampiamente utilizzati per prototipare le interfacce utente. Abbiamo addestrato un motore di rilevamento degli oggetti a riconoscere “solo” circa 20 tipi di oggetti, che rappresentano gli elementi costitutivi fondamentali delle interfacce utente. Dopo un paio di mesi dedicati alla raccolta dei dati e all’addestramento, siamo riusciti a creare la prima versione della nostra Vision API. A partire da un’immagine, restituisce un elenco degli oggetti rilevati e delle rispettive posizioni.

Una volta che il nostro UIDL e i generatori di codice hanno iniziato a funzionare insieme, eravamo pronti per passare alla fase successiva: il rilevamento degli oggetti.

Apprendimento automatico e rilevamento degli oggetti

Machine learning and object detection from paper image

La chiave di volta

A quel punto eravamo in grado di rilevare la posizione relativa degli elementi. Dovevamo poi affrontare la parte difficile: trasformare la posizione assoluta degli elementi in una struttura ad albero. Ma questa è un’altra storia. È questa la fase in cui entra in gioco il complesso bagaglio di conoscenze che gli sviluppatori front-end devono acquisire per prendere le giuste decisioni architetturali. Anni di lavoro.

È qui che è iniziata la parte più affascinante di questo percorso. È il punto in cui l’apprendimento automatico e gli algoritmi tradizionali convergono e danno vita alla magia, iniziando a prendere le giuste decisioni architetturali per le interfacce utente. Ed è proprio qui che stiamo concentrando tutti i nostri sforzi. Consideriamo questo ultimo tassello tecnologico la chiave di volta del futuro dello sviluppo front-end.

In questo futuro, gli sviluppatori front-end saranno notevolmente potenziati dalla tecnologia. Dedicheranno molto più tempo all'esperienza utente dei prodotti che stanno realizzando, anziché agli aspetti tecnici interni. Questo creerà molto valore per tutti e ci impegniamo a lavorare duramente per avvicinare questo futuro.

Per riassumere, ecco come funziona il nostro flusso di lavoro:

Code generation workflow explained image

Conclusione

Il nostro percorso è appena iniziato e stiamo investendo molto in ricerca e sviluppo. Siamo convinti che nei prossimi anni l'apprendimento automatico e l'intelligenza artificiale trasformeranno irrevocabilmente, e in meglio, il modo in cui verranno realizzate le interfacce utente. Questo libererà una notevole quantità di prezioso tempo umano, che potrà essere impiegato meglio.

Lavoriamo instancabilmente sui nostri componenti tecnologici fondamentali e siamo lieti di annunciare che entro la fine del primo trimestre del 2019 rilasceremo la nostra piattaforma SaaS e le versioni più recenti dei nostri generatori di codice open source. Se ti interessa, seguici su Twitter.

Infine, ci farebbe molto piacere conoscere le tue opinioni sui progressi che abbiamo compiuto finora. Se vedi del potenziale in questi componenti tecnologici, scrivici. Ci piace confrontarci con persone curiose e siamo lieti di valutare qualsiasi opportunità di collaborazione!

Prodotto

Articoli correlati

Commenti

Non ci sono ancora commenti. Sii il primo a condividere le tue opinioni.

Lascia un commento

Il tuo indirizzo email non sarà mai mostrato pubblicamente.
I commenti vengono esaminati prima di essere pubblicati.