Bit #5 - Guidare o essere guidati dall’AI?
Come cambia il ruolo dei developer e lo sviluppo del software con l'AI
Sono passati alcuni mesi dall’ultimo Bit, ma ho avuto l’occasione di riflettere su ciò che ci sta succedendo dall’inizio della diffusione di massa delle AI generative. Sin dai primi giorni abbiamo avuto il timore che il ruolo del developer sarebbe stato sostituito dalle macchine, e devo essere sincero: anche io ho avuto il mio momento di smarrimento.
Stiamo vedendo come OpenAI, Anthropic e tutta la compagnia di mega aziende che stanno investendo in LLM stiano facendo a gara per creare i tool perfetti che automatizzano ogni cosa.
Ma siamo veramente sicuri che questa sia la strada giusta? Siamo sicuri che l’uso dei vari “Copilot” ci esonererà dallo scrivere codice? Ma ancora più importante, che non dovremo mai più scrivere i test?
Ecco, con questa riflessione voglio analizzare il contesto e farti leggere il mio punto di vista.
AIDD vs TDG
“AI Driven Development è un approccio allo sviluppo software che integra l'uso dell'Intelligenza Artificiale (AI) nei processi tradizionali di ingegneria del software. L'obiettivo principale dell'AIDD è sfruttare le capacità dell'AI per automatizzare compiti ripetitivi, migliorare l'affidabilità del software e accelerare il ciclo di sviluppo.”
Ho trovato questa definizione da qualche parte in rete e sinceramente mi trova perplesso se la dovessi leggere in modo letterale. Lo sviluppo guidato dall’AI è come dire che, se sono un pittore, dipingo un quadro spennellando lì dove una macchina mi dice di farlo. Sinceramente preferirei avere una macchina che spennella là dove le indico.
Questo approccio, se usato con superficialità, ci porta a chiedere alle AI di creare del codice a partire da un prompt, e se il prompt è superficiale allora la probabilità che il codice sia difettoso e di scarsa qualità è altissima e potrebbe facilmente portare a una serie di possibili problemi.
L'AI potrebbe non cogliere tutte le sfumature dei requisiti utente, portando a soluzioni incomplete o errate.
Senza una buona analisi delle user stories, l'AI potrebbe tralasciare casi d'uso importanti o edge cases e, magari senza test, il codice generato potrebbe contenere bug o non soddisfare realmente le esigenze dell'utente o, ancora peggio, essere dannoso.
Il rischio di affidarsi troppo all'AI riduce il coinvolgimento umano critico per l'interpretazione dei requisiti.
Nelle prime pagine di Clean Code, bellissimo libro di Robert C. Martin, leggo le seguenti righe:
“... Non ci libereremo mai del codice, perché il codice rappresenta i dettagli dei requisiti.
Oltre un certo livello, tali dettagli non possono essere ignorati o astratti; devono essere specificati. E specificare i requisiti a un livello di dettaglio tale che una macchina possa eseguirli secondo un programma. Tale specifica è il codice. …”
Queste poche righe mi fanno pensare a quanto sia importante invece usare lo strumento più importante che abbiamo: il cervello.
L’essere umano sarà fondamentale per definire questi requisiti e, quando questi requisiti vanno formalizzati e poi verificati, la cosa migliore è usare un approccio guidato dai test. Questo approccio si chiama TDD e ne ho parlato qualche Bit fa.
Ma siccome non vogliamo essere ancorati al passato e invece vogliamo abbracciare il futuro, allora ci faremo comunque aiutare dall’AI ed è qui che entra in gioco il TDG.
“Test Driven Generation (TDG) è un approccio allo sviluppo software in cui si scrivono prima i test basati su requisiti dettagliati e centrati sull'utente. Successivamente, si utilizza l'Intelligenza Artificiale per generare il codice che soddisfa questi test. In questo modo, il processo di sviluppo è guidato dai test, garantendo che il codice prodotto risponda esattamente alle aspettative dell'utente.”
Questa definizione mi fa stare molto più sereno. La generazione del codice è automatica, è vero. Magari non perfetta. Sicuramente l’essere umano potrebbe fare di meglio. Ma la certezza è che il test ci proteggerà da codice difettoso.
Non sono per niente affascinato dalla generazione di codice senza che l’essere umano ne verifichi la qualità, ma di certo è il passo giusto per far collaborare uomo e macchina.
Ovviamente avremo i primi vantaggi dall’usare questo approccio sin dal primo istante.
I test basati su user stories ben definite assicurano che il codice generato soddisfi le aspettative dell'utente.
Scrivere test prima evita lo sviluppo di funzionalità non necessarie (principio YAGNI - "You Aren't Gonna Need It").
I test fungono da specifiche eseguibili, garantendo che ogni parte del codice sia validata.
L'approccio TDG favorisce un ciclo iterativo di sviluppo, test e refactoring.
TDG si integra perfettamente con pratiche agili che promuovono iterazioni rapide e feedback costante e, infine, permette di mantenere il focus sui risultati reali per l'utente finale, anziché sulle mere funzionalità tecniche.
L'Importanza delle User Stories e dell'Approccio User-Centric
L’utilizzo di TDG, così come lo è per TDD, non ci esonera dal fare un’analisi dei bisogni degli utenti e dal raccogliere i feedback, per poi dettagliare i requisiti e scrivere quindi i criteri di accettazione.
È proprio per questo motivo che il mondo dello sviluppo del software moderno non può prescindere da attività di validazione, analisi e ricerca dei feedback relativi alle esigenze degli utenti.
Quando realizziamo un prodotto digitale, in buona sostanza stiamo risolvendo un problema o migliorando la vita a qualche utente. E in questo scenario i developer hanno un ruolo fondamentale: trasformare i bisogni degli utenti in soluzioni.
Ed ecco quindi che i developer dovrebbero lavorare a stretto contatto con UX designer, product manager e stakeholder. Tutto questo porta a basarsi sull’analisi dei bisogni che produce la scrittura delle user stories, e solo attraverso un'analisi attenta possiamo garantire che il software risponda alle reali necessità degli utenti.
User stories ben pensate portano a test completi, che coprono tutti gli scenari possibili.
L'AI manca della capacità umana di interpretare contesti complessi e impliciti, e gli sviluppatori devono mantenere il controllo sul codice prodotto, assicurando qualità e affidabilità.
Il codice è l'espressione finale dei requisiti e richiede precisione e attenzione ai dettagli che solo gli esseri umani possono garantire.
Ma quindi come cambia il ruolo dei developer?
Ovviamente non sto dicendo che un developer cesserà di essere tale, ma nel 2024 non può permettersi di aspettare che il requisito cali dall’alto per poi rinchiudersi nello stanzino a programmare.
Ogni developer è un essere pensante, che può dare molto di più di qualche riga di codice ben scritta. Può rispondere alle esigenze degli utenti, generare impatti positivi creando buon codice, preoccuparsi che questo non contenga difetti e che non produca danni verso l’ambiente o le persone.
E non è detto però che non debba fare uso delle nuove tecnologie come le AI generative.
Dobbiamo semplicemente assumerci la responsabilità del codice che realizziamo e, quando questo rispetta tutti i principi etici e di qualità, allora sì che potremo dire di aver fatto un ottimo lavoro.
Conclusioni
Usare gli strumenti per automatizzare azioni ripetitive è sacrosanto. L’AI generativa è un grande aiuto e sicuramente utilizzarla ci permetterà di essere più produttivi, nella peggiore delle ipotesi. Nella migliore, invece, ci permetterà di vivere una vita qualitativamente migliore. Non è saggio però pensare di sostituire l’essere umano.
TDG è un approccio che ci permetterà quindi di essere efficienti pur mantenendo alta la qualità, ma ricordiamoci che le basi sono importanti e imparare pratiche come il TDD dovrebbe essere la prima cosa.
Ricordiamoci infine che l’utente è al centro e, qualsiasi sia lo strumento, dovremo usarlo con responsabilità.
Se ti è piaciuto questo articolo invialo al tuo amico che ha bisogno di leggerlo.
E con questo ti saluto e ci sentiamo al prossimo bit.
Raffaele.