Lo sviluppo è la creazione iterativa di qualcosa di nuovo e utile.
Quando pensiamo allo sviluppo, spesso ci viene in mente lo sviluppo di nuovi prodotti. Questo differisce dalla produzione, che realizza singoli prodotti; invece, implica la creazione delle specifiche di progettazione o degli stampi per i prodotti.
Pertanto, i progetti o gli stampi creati attraverso lo sviluppo di nuovi prodotti vengono ripetutamente utilizzati nelle fabbriche per produrre numerosi prodotti identici.
Esistono anche utilizzi come lo sviluppo di capacità individuali o lo sviluppo della società e delle nazioni. Questi implicano non solo un aumento di ciò che si possiede, ma la capacità di utilizzare ripetutamente e trarre beneficio dalle capacità sviluppate.
Sebbene il potere economico degli individui e delle società possa fluttuare a causa delle condizioni economiche, le capacità sviluppate sono fondamentalmente permanenti.
Anche se diminuiscono, ciò è considerato un declino piuttosto che le fluttuazioni economiche di prosperità.
Oltre a questi, c'è anche lo sviluppo di tecnologia e conoscenza. A differenza delle capacità degli individui o di specifiche società, queste hanno la caratteristica di essere facilmente condivisibili.
E tra i prodotti, le capacità, le conoscenze e le tecnologie che sono i risultati di questi sviluppi, alcuni possono contribuire allo sviluppo successivo.
Sviluppando tali output utili, l'ambito dello sviluppo si allarga e l'efficienza e la qualità migliorano.
Sviluppo Software basato sull'IA
In generale, lo sviluppo ha richiesto tempo e sforzi considerevoli. Soprattutto man mano che la società progredisce e varie cose diventano più sofisticate, creare nuove cose diventa ancora più difficile.
Tuttavia, con l'avvento dell'IA generativa, questa situazione sta cambiando. Attualmente, lo sviluppo software sta subendo cambiamenti drammatici grazie alle elevate capacità di programmazione dell'IA generativa.
In questo scenario, una visione futura in cui agenti autonomi basati sull'IA generativa diventano centrali nello sviluppo software come ingegneri del software sta già diventando una realtà.
Ci troviamo attualmente in una fase di transizione. Sebbene non possiamo affidare completamente lo sviluppo all'IA generativa, utilizzare abilmente l'IA generativa può far progredire potentemente lo sviluppo software.
Questo viene definito sviluppo software basato sull'IA.
Sviluppo Evolutivo
Quando l'IA generativa rende lo sviluppo software più efficiente, può semplificare non solo lo sviluppo del software target finale, ma anche lo sviluppo di software che aiuta lo sviluppo stesso.
Come menzionato in precedenza, gli output che facilitano lo sviluppo ne ampliano la portata e contribuiscono a migliorare efficienza e qualità. Inoltre, se creati efficacemente, possono essere riutilizzati in altri progetti di sviluppo.
Pertanto, sviluppando software che aiuta lo sviluppo durante il processo di sviluppo software, l'efficienza complessiva può essere aumentata e queste risorse possono essere sfruttate per futuri sviluppi.
Convenzionalmente, lo sviluppo di tale software ausiliario era una pratica comune, ma richiedeva tempo e sforzi di sviluppo propri, rendendo necessaria un'attenta considerazione e un'esecuzione mirata.
Utilizzando l'IA generativa, si può creare rapidamente un software semplice per automatizzare piccoli compiti che vengono in mente. Se il compito implica una elaborazione chiara, l'IA generativa può generare accuratamente il programma quasi senza errori.
Di conseguenza, sviluppare software di supporto durante il processo di sviluppo software è diventato più facile di prima.
E, riflettendo profondamente su questo, emerge uno stile di sviluppo in cui strumenti utili allo sviluppo vengono continuamente creati durante il processo, trasformando così la metodologia di sviluppo stessa.
Chiameremo questo "sviluppo evolutivo".
Per praticare lo sviluppo evolutivo, è necessario avere l'abitudine di osservare oggettivamente il proprio sviluppo software, considerando quali parti possono essere gestite dal software e quali solo dagli esseri umani, insieme alla capacità di sviluppare tale software ausiliario.
Inoltre, l'IA generativa può essere incorporata in questi strumenti software. Incorporandola nel software, a differenza degli agenti IA generativi, l'ambito di elaborazione può essere ristretto in una certa misura e i percorsi possono essere definiti.
Mentre gli agenti IA possono ottenere risultati simili tramite prompt, il software con IA generativa integrata può aumentare più facilmente la precisione combinando programmi e prompt.
Se tale sviluppo evolutivo può essere praticato, il secondo progetto mostrerà miglioramenti sia in termini di qualità che di costi rispetto al primo. Inoltre, con ogni progetto successivo – il terzo, il quarto e così via – i miglioramenti continueranno ad accumularsi.
Questo è completamente diverso dal semplice utilizzo dell'IA generativa per sviluppare software. Nel tempo emergerà un divario significativo tra i team che si limitano a padroneggiare gli strumenti di IA generativa e i team che praticano lo sviluppo evolutivo.
Testing basato sul Refactoring
Esiste un concetto chiamato Test-Driven Development (TDD), dove i test vengono progettati prima basandosi sulle specifiche, e poi il software viene sviluppato per superare tali test.
Inizialmente, anch'io pensavo che sfruttando l'IA generativa, sarebbe stato facile sviluppare programmi di test per il testing automatizzato, rendendo il TDD fattibile.
Tuttavia, iniziando a praticare lo sviluppo evolutivo, sono giunto alla conclusione che pensare ai test prima di implementarli non è sempre l'approccio più adatto.
Specialmente per software come le applicazioni web che implicano aspetti soggettivi come l'usabilità e il design visivo, con cui si interagisce direttamente, ho realizzato che eseguire e interagire effettivamente con il software ha la precedenza sui test dettagliati.
Questo perché, se c'è una significativa insoddisfazione a livello UI/UX dopo l'interazione, c'è la possibilità di voler cambiare parti fondamentali come il framework, l'architettura di base, il modello di dati o i casi d'uso.
Nel mio attuale progetto di sviluppo software personale, ho notato problemi di flessibilità e prestazioni delle funzionalità e ho finito per sostituire due framework con altri diversi.
Ho anche dovuto rivedere completamente l'elaborazione in alcune aree a causa di un uso inefficiente della memoria.
È in questi momenti di refactoring che il testing diventa per la prima volta una considerazione consapevole.
Se ci si trova in una fase iniziale di sviluppo, o se le funzioni e le specifiche cambieranno comunque in modo significativo, i test potrebbero essere superflui.
Tuttavia, se lo sviluppo è già piuttosto avanzato e ci sono molti elementi da verificare, i test saranno necessari per confermare che il refactoring non abbia introdotto difetti funzionali o omissioni.
Pertanto, l'approccio di creare programmi di test quando lo sviluppo è progredito a un certo punto e il refactoring diventa necessario non è una cattiva idea.
A questo punto, la chiave non è creare test per tutto il codice, ma concentrarsi sul testing di parti mature che difficilmente cambieranno molto in futuro, lasciando le parti fluide senza test automatizzati.
Questo può essere chiamato Testing basato sul Refactoring.
Conclusione
L'IA generativa sta trasformando radicalmente lo sviluppo software.
In un articolo precedente, ho scritto sull'importanza di puntare a essere un "Ingegnere Omni-direzionale", capace di sviluppare sistemi che combinano vari domini, infrastrutture e ambienti di esecuzione, andando oltre il tradizionale ingegnere full-stack.
Ho anche scritto un articolo suggerendo che stiamo entrando in un'era di "Sviluppo incentrato su Esperienza e Comportamento", dove l'attenzione non è sull'allineamento delle specifiche con l'implementazione, ma sul miglioramento dell'esperienza utente attraverso il comportamento del software.
Lo sviluppo evolutivo e il testing basato sul refactoring sono precisamente ciò che conduce a questi nuovi orizzonti nello sviluppo software.