Leader di pensiero
Il Futuro della Costruzione di App AI Dipende dalla Sicurezza dei Tipi

Il codice generato dall’AI può compilare, ma senza una sicurezza dei tipi rigorosa, quel successo è estremamente effimero. La sicurezza dei tipi è il guardrail che impedisce al codice fragile di degenerare in bug nascosti e errori di runtime mentre il sistema scala.
Dobbiamo iniziare a forzare l’AI a utilizzare una tipizzazione rigorosa attraverso il contesto, le istruzioni, il linting e i feedback loop. Ci vuole un po’ più di tempo, ma produce codice che dura.
Il Problema degli Incentivi
L’AI vuole compiacerti. Si ottimizza per la funzione di reward che gli viene data, e la maggior parte del tempo è solo “si compila?”. Ciò significa che taglierà ogni angolo necessario per ottenere un segno di spunta verde. Quei tagli sembrano fini al momento della compilazione, ma crollano al momento dell’esecuzione.
Questo è il motivo per cui l’AI ama any. O sceglie un tipo ampio come string dove qualcosa di più stretto, come un UUID, è atteso. Il codice compila, ma la correttezza è già compromessa. Peggio, l’AI non ricorda cosa ha scritto pochi file fa, quindi senza sicurezza dei tipi il progetto si sgretola rapidamente sotto il suo stesso peso man mano che la complessità cresce.
I Due Tipi di Errori
Quando il codice generato dall’AI viene eseguito, di solito si vedono due tipi di problemi di sicurezza dei tipi:
1. Errori di Compilazione

- Cosa succede: Il compilatore rileva una discrepanza tra il tipo dichiarato e quello che è stato passato.
- Come lo risolve un umano: Decide se il chiamante è sbagliato (converte 42 in una string) o la firma della funzione è sbagliata (la cambia per accettare un tipo number).
- Come lo “risolve” l’AI: Cambia il tipo dell’argomento in any. Problema “risolto”, ma hai appena rimosso il guardrail che avrebbe catturato gli errori futuri.
2. Errori di Runtime

- Cosa succede: Il compilatore pensa che tutto sia a posto (spesso perché i tipi sono stati allentati), ma il valore reale al momento dell’esecuzione non corrisponde all’ipotesi.
- Come lo risolve un umano: Ricerca la variabile fino alla sua origine (come un’API o una query di database) e risolve il tipo al limite in modo che i dati arrivino come una string corretta.
- Come lo “risolve” l’AI: Senza contesto, indovina. Forse avvolge tutto in String(…), o allarga semplicemente il tipo. Il crash scompare in quel punto, ma ora la logica è rotta. I number destinati alla matematica sono improvvisamente string.
Questo ciclo di errori di runtime → “risoluzione” dell’AI → tipizzazione più lasca si accumula rapidamente. Il risultato è un codice che compila e che genera meno errori di runtime, ma che non può essere considerato attendibile. Immagina un sistema di pianificazione sanitaria in cui gli orari dei medici sono gestiti dall’app. Una discrepanza di tipo si insinua: un int per le ore è trattato come una string. L’AI “risolve” il problema allentando il tipo in any. Il codice compila e l’errore scompare, ma i calcoli degli orari si rompono silenziosamente, doppiando gli orari dei medici e lasciando un’intera ala dell’ospedale scoperta.
Il Moltiplicatore del Database
Il momento in cui si collega a un database, gli errori si moltiplicano e le loro cause diventano più difficili da rintracciare. SQL è tipizzato per una ragione. Ogni schema (INT, TEXT, UUID, BOOLEAN) codifica ipotesi sui dati.
Quando un’AI appiattisce tutto in string | any, si perdono quelle garanzie:
- Scritture errate: l’inserimento di “true” in un campo booleano compila, ma corrompe il database.
- Letti errati: la query restituisce NULL, ma l’AI ha assunto una stringa, portando a un crash di runtime.
- Relazioni rotte: se una chiave di relazione è attesa come un UUID ma l’AI la tratta come una string e invia valori spazzatura, le join non si rompono ma non restituiscono dati. Ciò nasconde gli errori fino a quando non si presentano in seguito come risultati mancanti o incoerenti..
Questo è il motivo per cui i team seri utilizzano linguaggi tipizzati e impongono la sicurezza dei tipi dallo schema all’API. Se non lo fai, il database smette di proteggerti e i problemi nascosti si accumulano.
Perché i Team Maturi Impongono la Tipizzazione Rigorosa
La tipizzazione rigorosa non è questione di rallentare gli sviluppatori. È questione di rendere possibile la scalabilità.
I tipi:
- Codificano l’intento nel codice.
- Rendono le rifattorizzazioni sicure e prevedibili.
- Catturano intere classi di bug prima che raggiungano la produzione.
- Mostrano ai futuri sviluppatori (e all’AI) esattamente come utilizzare una funzione o un oggetto.
Senza sicurezza dei tipi, la sciatteria del codice dell’AI si accumula. Con essa, la stessa AI produce codice che puoi considerare attendibile e estendere.
Come Forzare l’AI a Utilizzare la Sicurezza dei Tipi
Devi trattare l’AI come un giovane ingegnere. Veloce, talentuoso, ma senza direzione.
Fornire il Contesto Giusto
Dargli le interfacce e i tipi che può utilizzare. Mostrare esempi di utilizzo. Essere precisi sul modo giusto di strutturare il codice.
Dare Istruzioni Semplici
Far capire chiaramente all’AI di non utilizzare any, di non permettere unknown e di avere ogni metodo, oggetto e variabile tipizzato. Aspettarsi che abbia difficoltà a seguire queste istruzioni (soprattutto al primo passaggio).
Imporre con il Linting
Come quando si revisiona il codice di un giovane sviluppatore, devi controllare il codice dell’AI. Progettare regole di linting personalizzate che definiscono cosa significhi “buon codice” per te. Restituire i fallimenti del linting al modello fino a quando non supera. Potrebbe richiedere più passaggi, ma sposta la funzione di reward verso l’inclusione della sicurezza dei tipi.
Iterare con i Controlli
Errori di compilazione, logging di runtime, test di clic. Ogni iterazione costringe l’AI a stringere i tipi e a muoversi verso un codice di qualità produttiva.
Un Modo Migliore per Costruire
Ho imparato che sacrificare la velocità di generazione grezza per una qualità più alta paga nel lungo termine. Ciò significa lottare per una tolleranza zero per i tipi any, imporre più feedback loop e regole di linting rigorose che l’AI deve superare prima di considerare il codice “finito”. Richiede uno sforzo costante, ma è l’unico modo per mantenere la qualità dal calare.
In precedenza ho menzionato un punto chiave: una volta che l’AI inizia a correggere gli errori di runtime allentando i tipi, si entra in un ciclo vizioso. Ogni correzione elimina un’altra barriera, e il risultato si accumula in un codice che compila ma è fragile e non mantenibile. Il contrario è anche vero: se si costringe l’AI a rispettare la sicurezza dei tipi in ogni passaggio, si crea un ciclo virtuoso. Ogni iterazione stringe le barriere, il codice diventa più pulito e la qualità si accumula in qualcosa di cui puoi fidarti e costruire.
Questo è il sistema che credo consegni una qualità del codice duratura. Ogni iterazione è progettata per stringere gli standard, non indebolirli. È lo stesso motivo per cui i migliori team di ingegneria scelgono linguaggi fortemente tipizzati. La sicurezza dei tipi è la barriera di base per la manutenibilità, e permettere all’AI di ignorarla garantisce che la tua app non raggiungerà mai il livello di produzione.












