12 Lezioni Pratiche di Pair Programming con IA
Introduzione
Dopo sei mesi di intensivo utilizzo dell’IA come partner di sviluppo in vari progetti, abbiamo raccolto 12 lezioni pratiche che possono trasformare il vostro workflow. Questo articolo si basa su esperienze reali e offre consigli concreti per massimizzare la produttivitĂ e ridurre gli errori.
Lezione 1: Pianifica Prima di Scrivere Codice
Prima di aprire l’editor, crea un file instructions.md
in cui descrivi in modo chiaro la funzionalitĂ da sviluppare. Ad esempio, se devi implementare il rate limiting per la tua API, elenca:
- Gli endpoint da proteggere
- Il meccanismo di memorizzazione dei dati di rate (Redis, database relazionale o in-memory)
- Le risposte di errore e i codici HTTP da restituire
- I punti di integrazione con il middleware giĂ esistente
Una volta redatta la bozza, chiedi all’IA di individuare possibili gap o scenari edge (brute-force, failover del database, gestione del reset del contatore). Integra i feedback, rigenera la versione finale e salva tutto in instructions.md
. In questo modo elimini circa l’80% dei casi in cui l’IA si “confonde a metà lavoro”.
Lezione 2: Abbracciare lo Sviluppo Guidato dai Test
Invece di scrivere subito il codice di produzione, richiedi all’IA un test che fallisca e che descriva esattamente il comportamento desiderato. Per esempio:
“Scrivi un test JUnit per verificare che
validateEmail()
solleviValidationError
quando manca il simbolo@
.”
Quando il test fallisce inizialmente (poiché la funzione non è ancora implementata o non gestisce correttamente l’eccezione), chiedi all’IA di correggere il codice fino a vedere il test verde. Prima di tutto, rivedi tu personalmente il test: assicurati che verifichi il caso giusto (stringhe vuote, domini non validi, caratteri speciali). Dopo aver superato il test base, aggiungi casi aggiuntivi (domini molto lunghi, caratteri Unicode, formati borderline) e ripeti il ciclo. Così ogni riga scritta sodisfa un requisito preciso, riducendo al minimo regressioni e bug nascosti.
Lezione 3: Pretendi un Ragionamento Passo-Passo
Quando prepari un prompt per l’IA, includi sempre una richiesta esplicita come questa:
“Descrivi passo dopo passo il tuo approccio prima di scrivere qualsiasi riga di codice.”
Questa semplice aggiunta fa emergere in anticipo le eventuali incomprensioni: vedrai i passaggi logici (controllo di stringhe vuote, verifica del simbolo @
, controllo del dominio, ecc.) e potrai correggere la rotta prima che venga generato del codice scorretto. Eviterai ore di debugging, perché l’IA penserà “ad alta voce” anziché restituire subito un blocco di codice non verificato.
Lezione 4: Non Gettare Contesto a Caso: Cura le Informazioni
Nei progetti di grandi dimensioni l’IA va in affanno se riceve troppi file in un unico prompt. Ecco come semplificare:
Usare gitingest.com per i Riassunti del Codice
- Vai su gitingest.com.
- Incolla l’URL del repository (oppure sostituisci “github.com” con “gitingest.com” nell’indirizzo GitHub).
- Scarica il sommario testuale che l’app genera (file
codebase_summary.txt
). - Nei tuoi prompt, scrivi semplicemente:
“Consulta
codebase_summary.txt
per la struttura del progetto.”
In questo modo l’IA avrà una panoramica chiara senza dover elaborare ogni singolo file.
Tenere la Documentazione Sempre Aggiornata
Se le specifiche interne, i manuali o l’OpenAPI cambia spesso, collega tutto a una piattaforma di documentazione live come Context7 MCP. Quando chiedi all’IA informazioni sui tuoi endpoint o sulle tue librerie, scrivi:
“Accedi alla MCP della documentazione di autenticazione per i dettagli sui codici di errore.”
In questo modo l’IA recupera sempre l’ultima versione disponibile, evitando di basarsi su snippet obsoleti.
Lezione 5: Il Controllo di Versione è la Tua Rete di Sicurezza
Mantieni la tua area di lavoro Git pulita: prima di chiedere all’IA di generare codice, assicurati di non avere modifiche non commesse. Quando effettui un commit:
- Usa
git add -p
per selezionare solo le porzioni di codice relative a una singola logica di funzionalitĂ o bugfix. - Evita di accumulare cambiamenti troppo grandi in un unico commit: diff piĂą piccoli significano revisioni piĂą rapide e rollback piĂą semplici.
- Scrivi messaggi di commit chiari, spiegando non solo cosa hai fatto, ma anche perché, ad esempio:
git commit -m "Refactor validateEmail: estratta la logica di validazione in una funzione separata per semplificare i test"
Questi dettagli aiuteranno l’IA a contestualizzare meglio le successive richieste di supporto, rendendo i prompt più intelligenti e mirati.
Lezione 6: Prompt Laser-Focused
I prompt generici portano a risposte generiche. Se dici all’IA:
“Ecco l’intero codice. Perché l’autenticazione non funziona?”
otterrai un elenco di possibili problemi senza un focus preciso. Invece, specifica esattamente il file e la riga:
“Nel file
@src/auth.rs
, riga 85, il programma va in panic quando riceve un JWT malformato. Modifica la gestione degli errori in modo che, al posto del crash, venga restituito un JSON con401 Unauthorized
.”
In questo modo l’IA saprà esattamente dove guardare e come intervenire. Ricorda di utilizzare sempre i nomi delle funzioni e delle entità presenti nel tuo codice (per esempio, createOrder()
, processRefund()
, UserEntity
) anziché termini generici come “posizionare ordine” o “gestire account”, perché la precisione riduce i rischi di misunderstanding.
Lezione 7: Reindex dopo i Refactor Importanti
Molti plugin IA e servizi cloud tengono un indice del progetto: se sposti file, rinomini classi o ristrutturi moduli, l’indice diventa obsoleto e l’IA smette di “vedere” certe funzioni. Quando esegui un refactoring significativo:
- Nel tuo IDE (ad esempio VS Code o IntelliJ), lancia il comando “Rebuild Index” o “Refresh Workspace”.
- Attendi la ricostruzione dell’indice.
Così l’IA riprenderà a rispondere correttamente ai riferimenti, evitando errori come “funzione non trovata” su file che esistono realmente.
Lezione 8: Riferimenti ai File, Non Copia-Incolla
Se il tuo editor IA supporta riferimenti diretti ai file (come Forge, che accetta @
davanti al percorso), usa questa funzionalitĂ :
“Apri
@src/database.rs: implementa la funzione
getUserByIdin modo da gestire
Optionrestituisce un errore se
user_id` non esiste.”
Questo approccio ha tre vantaggi:
- L’IA legge sempre lo stato aggiornato del file, senza rischiare di usare uno snapshot vecchio.
- Riduci drasticamente il consumo di token, perché non incolli centinaia di righe di codice.
- Il prompt resta più snello e leggibile, e l’IA fornisce una risposta più mirata e veloce.
Nota che la sintassi può variare: Forge usa @
, altri plugin usano #
o comandi ad hoc.
Lezione 9: L’IA Genera i Test, Tu Definisci i Casi
Affida volentieri all’IA la stesura del boilerplate dei test, ma sii tu a stabilire i requisiti di ciascun scenario. Per esempio, per la funzione validate_email
, descrivi chiaramente tutte le casistiche:
- Email valide (esempi basilari come “[email protected]”)
- Formati non validi (assenza del simbolo
@
, piĂą di un@
, stringa vuota) - Casi limite (domini molto lunghi, caratteri Unicode)
- Formato del valore di ritorno (tipo
Result<(), ValidationError>
)
Una volta scritti questi punti, chiedi all’IA di generare i test secondo il framework scelto (JUnit, PyTest, Rust test, ecc.). Otterrai file di test completi di importazioni, macro e asserzioni, con commenti che descrivono ogni verifica. In questo modo risparmi tempo nella creazione della struttura, ma mantieni sotto controllo la qualità e la completezza dei casi di test.
Lezione 10: Debug con Report Diagnostici
Quando ti trovi bloccato su un bug difficile, non limitarti a chiedere “Perché non funziona?”. Formatta il prompt in modo da ottenere un report strutturato:
“Genera un report diagnostico per il bug attuale:
- Elenca tutti i file modificati nell’ultima sessione.
- Spiega brevemente il ruolo di ciascun file nella feature su cui stiamo lavorando.
- Indica perché si verifica l’
IndexOutOfBounds
inuser_service.rs
. - Propormi tre possibili approcci di debug, con pro e contro di ciascuno.”
L’IA ti restituirà un documento in cui evidenzia esattamente quali file sono stati toccati (basandosi sulla cronologia dei commit o sulla lista dei file modificati), descriverà l’importanza di ognuno, individuerà le cause probabili dell’errore (ad esempio accesso a un array fuori indice) e suggerirà strategie alternative come aggiungere controlli sui limiti, usare iterazioni sicure, o inserire log dettagliati. In questo modo ottieni non solo la diagnosi, ma anche un piano d’azione concreto per risolvere il problema.
Lezione 11: Stabilisci Linee Guida di Stile Chiare
Fin dal primo messaggio o dal system prompt, specifica le convenzioni di codice che il tuo team segue. Ad esempio:
- “In Rust, usiamo
anyhow::Result
per la gestione degli errori ethiserror
per i tipi di errore di dominio. Evitiamounwrap()
in produzione, preferiamo operatori?
omatch
espliciti.” - “Tutte le funzioni pubbliche devono avere docstring descrittive che spieghino comportamento e parametri.”
- “Manteniamo le funzioni al di sotto delle 50 righe; se superiamo questo limite, suddividiamo la logica in helper separati.”
- “Nei test impieghiamo
pretty_assertions
per migliorare la leggibilità dei risultati in caso di errore.” - “Non implementiamo
From<DomainError>
per convertire automaticamente errori di dominio; la trasformazione deve restare esplicita per mantenere il controllo sui messaggi restituiti.”
Se l’IA conosce queste regole sin dall’inizio, genererà codice coerente con lo stile del team, riducendo drasticamente il lavoro di rifacimento successivo e garantendo un’architettura omogenea.
Lezione 12: Controversial Take: L’IA in Pair Programming è Meglio dell’Umano (per Alcuni Compiti)
Per la maggior parte delle attività di implementazione l’IA non si stanca, non discute di stile, non critica le tue abitudini di ricerca online: è come avere un collega junior con pazienza infinita e memoria perfetta. Tuttavia, non coglie logiche di business complesse, non individua errori sottili e non mette in discussione idee sbagliate. In sintesi, è un ottimo esecutore, ma non un architetto né un revisore strategico: per queste parti servono ancora gli umani.
Conclusione
Gli strumenti IA per il coding possono davvero alzare l’asticella della produttività , a patto di usarli con metodo. Gli ingegneri più efficaci non inseguono prompt magici, ma seguono workflow rigorosi:
- Pianificare prima di scrivere il codice, per evitare di sprecare ore su funzionalitĂ incomplete.
- Usare il ciclo “fai fallire il test → implementa → ripeti” per garantire che ogni modifica rispetti un requisito concreto.
- Revisionare ogni output dell’IA come se fosse un pull request di un collega junior, con attenzione a sicurezza, performance e correttezza.
L’IA può essere il tuo “intern digitale” sempre disponibile, ma non sostituisce la saggezza e l’esperienza umana. Il vero vantaggio competitivo sarà di chi saprà coniugare al meglio capacità tecniche e strumenti IA: perché il futuro non è “umani contro IA”, ma “umani con IA contro umani senza IA”. Decidi da che parte stare.