L'idea generale è semplice - codice che è rimasto intatto per un lungo periodo di tempo e che ora non viene compilato / eseguito senza alcuno sforzo. La domanda su "come" è un po 'più complicata.
Dato un pezzo di codice e un ambiente fisso, il comportamento del sistema non cambierà. Questo determinismo fa appello al nostro senso generale della logica.
Il problema è che i nostri ambienti non sono mai statici. Stiamo eseguendo nuovi compilatori, IDE diversi, i server sono stati aggiornati e le patch del sistema operativo sono state rilasciate. In generale, anche l'hardware è cambiato. Raramente queste differenze sembrano grandi. Li accumuliamo uno per uno e ci rendiamo conto che il nuovo ambiente non funziona ancora con il vecchio codice.
Il nocciolo della questione è, naturalmente, che si tratta di un processo graduale di cui non prendiamo realmente nota mentre il codice era, in un certo senso, fuori dalla vista. Questo è ciò che porta alla sensazione che il codice sia marcito. Come alcuni avanzi, lo abbiamo lasciato incustodito nel frigorifero e ora l'intero contenitore è rovinato.
Potrebbe essere corretto dire che "deriva dell'ambiente" è un termine più preciso per ciò che è accaduto in questa situazione rispetto al "codice marciume", ma quest'ultimo in modo più specifico cattura ciò che prova per i manutentori del sistema. Da qui la popolarità del termine.