Antigravity: l'LLM lo fa meglio
Nelle ultime settimane ho scritto delle mie esperienze con Antigravity, o meglio con gli agenti (più o meno) intelligenti integrati in questo editor. I risultati sono stati contrastanti: a volte gli agenti si sono dimostrati molto efficaci, alleviando con precisione alcuni compiti complessi o ripetitivi, in altri casi non hanno combinato niente di buono facendo solo perdere una montagna di tempo.
Programmare male con l’LLM
Fra tutti gli impieghi più o meno utili degli LLM, uno dei più controversi è l’idea che chiunque possa usare un LLM per programmare, anche quando di programmazione non se ne sa una cippa. È il cosidetto vibe coding, un concetto che si può riassumere così: “vedo cose, dico cose, copio e incollo cose, e nella maggior parte dei casi funziona”. Non è una citazione da Nanni Moretti, lo dice Andrej Karpathy, uno dei fondatori di OpenAI.
Ora, mettendo da parte le tante questioni relative alla sicurezza, alla manutenibilità di codice prodotto senza sapere bene cosa fa, alla deriva verso la media che implica che la qualità del codice prodotto dall’IA tenderà inevitabilmente a crollare, basta sperimentare un po’ in prima persona, anche con progetti semplici, per accorgersi che l’idea del coding per tutti non funziona, e che se vuoi ottenere qualcosa di buono dall’IA devi sapere bene cosa vuoi e come lo vuoi.
Ci ho provato io stesso a fare vibe coding: ho chiesto a Gemini di scrivere un driver per una videocamera Arducam, spiegandogli solo le cose indispensabili a aspettando che facesse tutto da solo.1
Questo approccio però non ha funzionato. Ci sono volute ore ed ore di lavoro, di errori, di risposte inconcludenti, di correzioni e di consigli per raggiungere un risultato accettabile.
E questo solo perché a un certo punto ho buttato alle ortiche l’idea di far fare tutto a Gemini e gli ho dato dei consigli su come procedere. Senza quelli sarebbe stato solo un sacco di tempo buttato via inutilmente.
Anche Mimmo ha provato, in modo del tutto indipendente da me, a far scrivere a Lumo un programma in Micropython per gestire la mia Arducam Mini 5MP Plus con il Pico. E anche Lumo, che è senza dubbio uno dei migliori chatbot in circolazione, non ce l’ha fatta da solo.
– Immagine generata da Google Gemini.
Programmare meglio con lo stesso LLM
Tutto questo però non significa che un LLM non possa essere prezioso quando si programma, basta solo usarlo come si deve. Bisogna spiegargli per filo e per segno cosa deve fare, mettergli a disposizione tutto il materiale che gli serve per lavorare, e piazzargli dei paletti entro cui deve muoversi.
In poche parole, bisogna trattarlo come un tesista o una stagista, con poca esperienza ma tanta voglia di imparare.
Sono bastati infatti due prompt scritti con criterio, il primo che definiva la struttura delle directory del progetto e istruiva l’agente ad usare fin dall’inizio git per il controllo di versione del codice e uv per installare i pacchetti Python che gli sarebbero potuti servire,
Prompt
Start a new project and name it project13-pico-camera5mp-reprise.
Read the AGENTS.md file that defines your basic behaviour.
Create a new directory with this name and initialize an empty git repository using git init
Use uv for managing Python packages.
All the code must stay in the code directory, with no subdirectories within it.
This project does not need a data directory and the output directory must be renamed as images.
e il secondo che conteneva tutto quello che mi è venuto in mente per aiutarlo a lavorare,
Prompt
I have a Rasperry Pi Pico 2W connected to a Arducam 5MP Plus OV5642 Mini Module Camera Shield (https://www.arducam.com/arducam-5mp-plus-spi-cam-arduino-ov5642.html).
I have connected the camera to the Pico using the standard layout found in the documentation:
| Camera | CS | MOSI | MISO | SCK | GND | VCC | SDA | SCL |
|---|---|---|---|---|---|---|---|---|
| Pico | GP5 | GP3 | GP4 | GP2 | GND | 3V3 | GP8 | GP9 |
The main documentation for the camera can be found at these links:
- https://docs.arducam.com/Arduino-SPI-camera/Legacy-SPI-camera/Introduction/
- https://docs.arducam.com/Arduino-SPI-camera/Legacy-SPI-camera/Hardware/Arducam-Shield-Mini-5MP-Plus/
- https://docs.arducam.com/Arduino-SPI-camera/Legacy-SPI-camera/Software/Quick-Start-Guide/
- https://docs.arducam.com/Arduino-SPI-camera/Legacy-SPI-camera/Pico/Camera-Module/SPI-Camera/
- https://www.uctronics.com/download/Image_Sensor/OV5642_DS.pdf
- https://blog.arducam.com/downloads/shields/ArduCAM_Camera_Shield_Software_Application_Note.pdf
- https://www.uctronics.com/download/Amazon/B0067-B0068-Pico.pdf
The code to drive this camera with the Pico is written in C (i.e., for Arduino) and CircuitPython, and can be found here: https://github.com/ArduCAM/PICO_SPI_CAM. You can download all the files you need from this repository.
In particular, the files for CircuitPython are in the Python directory:
Arducam.py, which contains the functions to drive the camera,OV5642_reg.pywhich, as far as I have understood, defines the resolutions allowed when taking pictures, andboot.py, but I don’t know what it does. In the same directory there is also the scriptArduCAM_Mini_5MP_Plus_VideoStreaming.pywhich sends the video captured by the camera to a Windows application and that is of no use here.
Please write a basic CircuitPython script that uses the functions defined in Arducam.py to test that the camera works and can take photos.
per permettere a Gemini 3 Flash di generare rapidamente uno script in CircuitPython che gira direttamente sul Pico e che fa tutto quello che gli è stato chiesto.
In verità, la primissima versione dello script non funzionava, ma è bastato a Gemini modificare una sola riga del driver Arducam.py fornito dal produttore per mettere tutto a posto (ha tolto uno zero al valore della frequenza).2
– La linea evidenziata in azzurro indica l’unica modifica effettuata da Gemini al file Arducam.py; a sinistra il file originale, a destra quello modificato da Gemini.
Tutti gli altri file forniti dal produttore sono rimasti intatti.
Alla prova dei fatti, il driver del produttore funzionava benissimo con il Pico e Gemini si è limitato ad imparare ad usarlo per scrivere lo script che cattura l’immagine direttamente dal microcontroller (una cosa che con un po’ di pazienza avrei potuto fare anch’io).
Guidare l’LLM o lasciarlo fare da solo?
La differenza rispetto al vibe coding della volta scorsa è abissale.
In quel caso Gemini aveva lavorato furiosamente per ore, combinando dei tali casini da costringermi a riavviare per ben due volte il Mac. E nel frattempo si era convinto (e mi aveva convinto) che il driver Arducam.py fosse incompatibile con Il Pico e l’aveva riscritto da zero, buttando via una libreria essenziale per interloquire con la videocamera (quella indicata dalla freccia rossa),
– Modifiche alle prime righe del file Arducam.py; a sinistra il file originale, a destra come appare lo stesso file dopo le modifiche di Gemini. La freccia indica una libreria importante che viene rimossa di peso da Gemini.
e togliendo senza nessun motivo, e senza nemmeno un guadagno reale in termini di efficienza o di funzionalità (anzi!), la maggior parte delle funzioni definite nello stesso file (si noti nell’immagine qui sotto la differenza nella lunghezza del codice originale, a sinistra, rispetto a quello modificato, a destra).
– Modifiche al file Arducam.py. I rettangoli rossi mettono in evidenza la differenza fra il numero di righe del codice originale (a sinistra) e di quello modificato da Gemini (a destra).
E non contento di tutto ciò, aveva pure stravolto il file OV5642_reg.py contenente i dati di configurazione della videocamera, adducendo dei presunti problemi di memoria. Problemi che evidentemente non esistevano, visto che in questo secondo esperimento tutto è filato liscio usando il file originale del produttore.
– Modifiche al file OV5642_reg.py, contenente i dati di configurazione della videocamera. La configurazione originale (a sinistra) è stata totalmente stravolta da Gemini (a destra).
E Arduino?
Arrivato a questo punto era inevitabile che chiedessi a Gemini di generare anche il driver per Arduino, usando le stesse informazioni che gli avevo già fornito per CircuitPython.
Questa volta Gemini ha penato di più, ma soprattutto perché gli avevo imposto di effettuare solo delle modifiche minime alle librerie originali Arducam. Un vincolo che questa volta era impossibile da soddisfare, perché queste librerie non supportano nativamente il Raspberry Pi Pico.
Risposta
ArduCAM library and the Arducam_mini library. Neither version contains native support for the RP2040/RP2350 (Pico) architecture. Specifically, both libraries are missing the necessary definitions for regtype, regsize, cbi, and sbi for this platform, which is the root cause of the compilation errors.
Una volta allentato questo vincolo le cose sono filate lisce e in poco tempo anche il driver modificato ad hoc per il Pico ed il relativo programma di acquisizione delle immagini erano pronti.
Gratis o a pagamento?
C’è chi sostiene che i modelli a pagamento sono molto meglio di quelli gratuiti. Di conseguenza, i miei problemi con il vibe coding sarebbero scomparsi se avessi pagato per usare Gemini o Claude.
Non è proprio così. Nel corso delle prove ho usato prevalentemente la versione gratuita di Gemini, proprio per verificare cosa succedeva all’utente non professionale che voleva provare a giocare un po’ con questi strumenti. Ma quando finivano i token sono passato alla versione a pagamento di Gemini fornita dall’università, e non ho mai notato differenze significative. Su Claude non posso dire niente, perché dover pagare 200 dollari al mese per usarlo in modo serio non ha senso per chi, come il sottoscritto, non è un programmatore professionista.
Ho notato però che Claude Opus e Claude Sonnet si sono sempre dimostrati molto più bravi di Gemini a risolvere i problemi che si presentavano nel corso dello sviluppo del codice. Ma poiché li ho utilizzati sempre a lavoro inoltrato, potrebbero solo essere stati facilitati da quello che Gemini aveva già fatto.
Conclusioni
È inutile dire che sia questo esperimento che quello precedente non hanno nulla di scientifico. Per essere tale, dovrei almeno utilizzare tipi diversi di microcontroller e di moduli collegati, stabilire un set di prompt ben definito e misurare in qualche modo come cambia la risposta dell’agente di turno al variare delle condizioni sperimentali.
Ma nonostante questo, l’esperimento ha un pregio: è riproducibile. Chiunque, con una spesa ridotta, può provare a ripeterlo usando lo stesso hardware e gli stessi prompt, in modo do verificare di persona se quello che ho trovato io è corretto o no.3
Una cosa che gli apostoli del vibe coding da decine di milioni di letture evitano sempre accuratamente di proporre. I loro articoli sono pieni di certezze e di previsioni roboanti, ma mancano sempre di fornire il sia pur minimo appiglio che permetta di verificare i loro claim.
Nessuno, oggi, può ancora negare che gli LLM possano essere di grande aiuto durante la programmazione, ma è difficile credere che riescano davvero a farlo senza nessun intervento umano. E questo almeno finché gli apostoli di cui sopra non si degneranno di fornirci dati chiari e ripetibili a supporto delle loro affermazioni.
-
Pur sapendo qualcosa di programmazione, non avevo la minima idea di come si potesse sviluppare un driver e non avevo nessuna voglia di passare dei giorni a studiare come si fa. ↩︎
-
Tecnicamente questo file è una libreria di funzioni, ma i microcontroller non hanno un sistema operativo e quindi queste funzioni accedono direttamente all’hardware, proprio come fanno i driver che controllano i componenti di un computer. Di conseguenza, in questo caso i termini libreria e driver sono interscambiabili. ↩︎
-
Dico spesa ridotta ma ormai la penuria di componenti elettronici ha fatto impazzire i prezzi del Pico e ancor di più della Arducam Mini 5MP Plus. Quest’ultima, dai 40 euro di pochi mesi fa ora si trova su Amazon o AliExpress a più del triplo. Per fortuna alcuni rivenditori mantengono (almeno per ora) dei prezzi più onesti. ↩︎
Commenti
Aggiungi un commento
@name
@message
IT
EN