28 settembre 2026
Gli agenti non “scrivono male” il codice: siamo noi che gli diamo un codebase ingestibile
Refactoring, modularità e confini chiari riducono token, tempo e rischio di allucinazioni. Anche quando la funzionalità non cambia.
Quando un agente deve implementare una feature o correggere un bug, il costo vero spesso non è “scrivere” codice: è leggere, capire e selezionare il contesto giusto. Un codebase disordinato (file monolitici, duplicazioni, assenza di moduli e confini) spinge l’agente a caricare più contesto del necessario, aumentando input token, tempi e probabilità di errori. In questo articolo vediamo perché il clean code è diventato anche un’ottimizzazione per l’AI, quali segnali indicano che il progetto è “token-inefficiente” e un approccio pratico al refactoring guidato, a piccoli passi, con metriche misurabili.
Negli ultimi mesi molti team stanno scoprendo un paradosso: più usi agenti per produrre codice velocemente, più rischi di costruire un codebase che rende gli stessi agenti lenti, costosi e imprecisi.
Non perché “l’AI scrive male” in assoluto, ma perché tende a ottimizzare per far funzionare la singola richiesta. Se non le imponi vincoli (struttura, riuso, confini, test, lint), spesso ottieni una sorta di vibe coding industriale: tanto output, poca architettura.
Il risultato è prevedibile: quando chiedi una modifica, l’agente deve leggere mezza codebase (o un file enorme), “sporcare” il contesto e spendere una quantità di token sproporzionata solo per capire dove mettere le mani.
Il problema reale: non è la scrittura, è la lettura
Gli agenti moderni passano una parte enorme del loro budget in:
- ricerca dei file rilevanti
- caricamento del contesto (file interi, dipendenze, porzioni ripetute)
- ricostruzione mentale di flussi e invarianti
Quando il progetto è strutturato male, la strategia più “sicura” per l’agente diventa includere troppo contesto. È un meccanismo difensivo: se non capisco dove sta la logica, mi porto dietro tutto.
Ed è qui che il clean code smette di essere solo una questione estetica o di manutenzione umana: diventa un’ottimizzazione diretta dei costi e delle prestazioni del coding assistito.
Un segnale chiarissimo: file monolitici e duplicazione
Un caso tipico (e sorprendentemente comune) è quello del “file-dio”:
- un singolo file da decine di migliaia di righe
- layer interi (es. data access, API, logica di dominio) mischiati
- porzioni copiate/incollate invece di funzioni riusabili
- nessun confine stabile (interfacce, moduli, responsabilità)
Quando l’agente deve cambiare “una cosa” lì dentro, non può ragionare per moduli: deve ragionare per scansione.
In uno scenario reale, la riduzione del file più grande (da ~17k righe a ~3k, tramite estrazioni e separazione in moduli) ha fatto crollare gli input token per change da circa 159k a ~27k: un risparmio nell’ordine dell’83%. Un dato interessante: gli output token sono rimasti relativamente stabili—segno che l’efficienza si guadagna soprattutto in lettura e contesto, non in scrittura.
Clean code per agenti: cosa cambia davvero
È importante essere onesti: “ripulire” il codice non garantisce automaticamente che l’agente risolva più task.
Studi controllati su repository “puliti vs resi sloppy” mostrano che la pass rate sui test nascosti tende a rimanere simile. In altre parole: un codebase più pulito non è magicamente più “corretto”.
Ma cambia altro, e spesso è ciò che paghi ogni giorno:
- meno input token (meno contesto necessario)
- meno revisite ai file (navigazione più efficiente)
- meno messaggi/iterazioni (minor “giro a vuoto”)
- tempo alla prima modifica più basso
Tradotto: costi minori, latenza minore, e meno probabilità che l’agente inventi collegamenti inesistenti perché il contesto è rumoroso o ridondante.
Perché i file grandi “inquinano” il contesto
Gli agenti devono decidere cosa caricare nella finestra di contesto. Se:
- una feature è sparsa senza un’API interna chiara
- la stessa logica è duplicata in 5 punti
- non esistono moduli con responsabilità definite
…l’agente non ha un “percorso” affidabile. E tende a fare la cosa più costosa: portarsi dietro l’intero file o intere porzioni di progetto.
Più contesto non significa più intelligenza: significa spesso più ambiguità. E l’ambiguità è il terreno perfetto per le allucinazioni.
Un approccio pragmatico: refactoring a piccoli passi, misurando
Un errore comune è chiedere: “ripulisci il codebase”. Gli agenti non sono bravi a scegliere in autonomia quali refactor siano sensati qui e ora senza una guida e senza vincoli.
Funziona molto meglio un ciclo disciplinato:
- Definisci un obiettivo misurabile (es. ridurre dimensione dei file principali, deduplicare, creare moduli stabili).
- Scegli un change rappresentativo (la stessa piccola feature/bugfix) e misura una baseline: token, tempo, file letti.
- Applica un solo refactor per volta (estrazione funzioni, separazione moduli, creazione interfacce, ecc.).
- Ripeti lo stesso change rappresentativo e confronta le metriche.
- Procedi finché il rapporto costo/beneficio del refactor resta positivo.
Questo ha due vantaggi enormi:
- eviti mega-refactor rischiosi
- capisci quali interventi riducono davvero il “contesto necessario”
Cosa fare subito in un progetto “agent-first”
Se stai costruendo o ereditando un progetto dove gli agenti scrivono gran parte del codice, queste mosse hanno impatto quasi immediato:
- imporre limiti alla dimensione dei file (soft limit + refactor quando si sfora)
- deduplicare senza pietà (se l’agente copia/incolla, è un bug di processo)
- estrarre un data access layer vero con interfacce chiare
- modularizzare per responsabilità (non per “tipi di file”)
- aggiungere lint/format e test minimi: non per perfezionismo, ma per stabilizzare il terreno sotto i refactor
Sintesi: il clean code è diventato un acceleratore per l’AI
In un mondo in cui una parte del lavoro è “pagare” token e latenza per far capire all’agente cosa succede, la qualità strutturale del codice è una leva economica e operativa.
Il punto non è rendere il codice elegante: è renderlo leggibile a macchina e a umani, con confini netti e poco rumore. Così l’agente carica meno contesto, trova prima il punto giusto, sbaglia meno strada—e tu spendi meno per ottenere lo stesso risultato.
Se oggi il tuo codebase è un monolite pieno di duplicazioni, non stai solo accumulando debito tecnico: stai costruendo un progetto token-inefficiente. E quello, alla lunga, lo paghi a ogni singola modifica.