Schrödinbug è un tipo unico di bug software che esiste nel codice ma non si manifesta mai finché uno sviluppatore non legge quella sezione di codice e realizza che contiene un bug. Il termine è un gioco di parole con “il gatto di Schrödinger”: il bug esiste e non esiste simultaneamente finché non viene osservato. Secondo Wikipedia (2026), questo termine è usato principalmente nel gergo professionale e descrive piuttosto un fenomeno psicologico che tecnico nel lavoro dello sviluppatore.
Punti Chiave
Schrödinbug è un termine del gergo professionale degli sviluppatori che designa un bug software che esiste nel codice per anni ma non causa mai un guasto finché qualcuno non legge quella sezione di codice e si accorge che c’è un errore. Dopo di che, il bug inizia a manifestarsi.
Il nome si riferisce chiaramente all’esperimento mentale di Erwin Schrödinger con un gatto che è simultaneamente vivo e morto finché l’osservatore non apre la scatola. Nel caso di un bug — è simultaneamente “funzionante” e “rotto” finché uno sviluppatore non guarda il codice.
È importante capire che Schrödinbug non è una caratteristica tecnica dell’esecuzione del programma ma un fenomeno cognitivo. Il codice contiene oggettivamente un errore, ma una combinazione di circostanze o caratteristiche dei dati di input non ha mai attivato il percorso di esecuzione problematico finché lo sviluppatore non ha analizzato il codice.
Da un punto di vista tecnico, uno Schrödinbug è un normale difetto logico che non è mai entrato nel flusso di esecuzione del programma perché tutte le chiamate seguivano il percorso “felice”. Non appena uno sviluppatore legge il codice, cambia il suo comportamento o la modalità di test — e il bug si manifesta.
Il nome Schrödinbug è una contrazione del cognome del fisico Erwin Schrödinger e della parola “bug” (errore). Nel 1935, Schrödinger propose un esperimento mentale che illustra il problema dell’interpretazione di Copenaghen della meccanica quantistica.
L’esperimento con il gatto: in una scatola sigillata ci sono una sostanza radioattiva, un contatore Geiger e una fiala di veleno. Se la sostanza decade, il contatore attiva un meccanismo che rompe la fiala e il gatto muore. Finché la scatola è chiusa, il gatto è simultaneamente vivo e morto (sovrapposizione di stati).
L’analogia con la programmazione: finché nessuno ha letto la sezione di codice contenente l’errore, il programma funziona correttamente — il bug è simultaneamente “vivo” e “morto”. Non appena uno sviluppatore apre il file e legge il codice, la sovrapposizione collassa e il bug inizia a manifestarsi (“uccidendo” il comportamento corretto del programma).
Schrödinbug è principalmente un fenomeno psicologico e non una caratteristica tecnica dell’esecuzione del codice. Esaminiamo il meccanismo del suo verificarsi dal punto di vista della psicologia cognitiva del programmatore.
Quando uno sviluppatore scrive codice, si trova in uno stato di “flusso” e potrebbe non notare un errore logico. Il codice supera la revisione, i test, va in produzione e funziona per mesi. Poi lo sviluppatore torna a questo codice per rifattorizzarlo, lo legge attentamente e improvvisamente vede: “Questo è chiaramente un bug!”
Dopo essersi accorto dell’errore, lo sviluppatore inizia a cercare deliberatamente scenari in cui il bug si manifesti. Modifica i dati di test, esegue il debugger, percorre i rami del codice — e a un certo punto provoca effettivamente il guasto. Il bug viene “trovato” proprio perché lo sviluppatore ora sa dove cercare.
Il pregiudizio cognitivo — bias di conferma — gioca un ruolo chiave. Dopo aver visto un errore nel codice, lo sviluppatore inizia inconsciamente a cercarne la manifestazione nel comportamento del programma. Qualsiasi log insolito o guasto viene immediatamente interpretato come conseguenza dell’errore trovato, anche se la causa reale potrebbe essere diversa.
Esaminiamo diversi scenari reali dalla pratica di sviluppo che descrivono un classico Schrödinbug.
In un’applicazione Android, uno sviluppatore ha usato il flag `isEnabled = true` di default, sebbene la nuova funzionalità dovesse essere disattivata. Il codice con il flag errato ha funzionato in produzione per tre mesi — nessuno si è lamentato perché la funzionalità doveva effettivamente essere attivata. Quando lo sviluppatore ha letto il codice per preparare la prossima release, si è accorto dell’errore, ha cambiato il flag in `false` — e ha immediatamente ricevuto una segnalazione di bug che la funzionalità era scomparsa.
Un metodo di libreria conteneva un ovvio errore di divisione per zero ma non veniva mai chiamato in scenari reali. La libreria era usata in cinque progetti e nessuno ha notato il problema. Durante una revisione del codice, un nuovo sviluppatore ha segnalato l’errore — e dopo la correzione si è scoperto che uno dei progetti dipendeva da quel comportamento “errato”.
Schrödinbug occupa un posto unico nella classificazione degli errori software. Confrontiamolo con altri tipi.
| Tipo di bug | Manifestazione prima di leggere il codice | Manifestazione dopo aver letto il codice | Natura |
|---|---|---|---|
| Schrödinbug | Mai | Inizia a manifestarsi | Psicologica |
| Bohrbug | Sempre con gli stessi dati | Sempre con gli stessi dati | Deterministica |
| Mandelbug | A volte, caoticamente | A volte, caoticamente | Sistemica |
| Heisenbug | Costantemente | Scompare nel debugger | Tecnica |
Schrödinbug è l’unico tipo di bug la cui manifestazione dipende direttamente dalla consapevolezza dell’errore da parte dello sviluppatore. Questa è la sua natura paradossale.
Sebbene Schrödinbug sia più un fenomeno psicologico, esistono metodi pratici per minimizzare il suo impatto su un progetto.
Quanto prima viene rilevato un errore, tanto minore è la probabilità che cada nella categoria Schrödinbug. La programmazione in coppia e le revisioni obbligatorie del codice per ogni riga riducono al minimo il numero di difetti nascosti.
Gli analizzatori statici di codice (ESLint, detekt, ktlint, SpotBugs) rilevano errori potenziali al momento della compilazione senza aspettare che un essere umano li noti. I linter possono identificare bug “dormienti” in rami di codice morto.
La copertura dei test di tutti i rami del codice, inclusi quelli usati raramente, è l’unico modo per garantire che uno Schrödinbug non aspetti anni il suo momento. Strumenti come JaCoCo per Java aiutano a tracciare i rami non coperti.
// Example of potential Schrödinbug — bug in rarely called branch
def processOrder(Order order) {
if (order.isRush()) {
// This branch was never tested in production
sendRushNotification(order) // there may be a bug here
}
}
In questo esempio, uno Schrödinbug può esistere per anni se ordini urgenti non sono mai entrati nel sistema. Non appena appare il primo ordine di questo tipo, il bug si manifesterà — ma fino a quel momento, gli sviluppatori pensano che il codice sia corretto.
Domande Frequenti
Schrödinbug è un fenomeno reale del gergo professionale, ma descrive piuttosto un fenomeno cognitivo e psicologico che una categoria tecnica di errore. Il termine è usato dagli sviluppatori per descrivere una situazione in cui accorgersi di un errore nel codice porta alla sua prima manifestazione.
Il paradosso è che il bug esiste oggettivamente ma soggettivamente non si manifesta fino a quando non viene scoperto. Prima di leggere il codice, il programma funziona correttamente anche se contiene un errore. Dopo la lettura, il bug “materializza” e inizia a causare guasti.
L’analogia è diretta: come il gatto di Schrödinger è simultaneamente vivo e morto finché la scatola non viene aperta, uno Schrödinbug è simultaneamente “funzionante” e “rotto” finché lo sviluppatore non apre il file di codice e lo legge. L’osservazione distrugge la sovrapposizione.
Sì, uno Schrödinbug può essere pericoloso se l’errore nascosto si trova in una sezione critica del codice raramente eseguita — ad esempio, nell’elaborazione dei pagamenti in condizioni specifiche o nella logica di recupero dopo un guasto. Scoprire un tale errore nel momento peggiore può portare a seri problemi.
L’unico metodo affidabile è garantire una copertura del codice al 100% con test, inclusi tutti i rami e i casi limite. Se ogni riga di codice viene eseguita in almeno un test, uno Schrödinbug verrà rilevato durante i test e non dopo la lettura del codice in produzione.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche