Nella mia esperienza lo schema è questo:
- Il sistema funziona, spesso per anni
- È stato segnalato un errore
- Lo sviluppatore indaga sull'errore e trova un po 'di codice che sembra essere completamente difettoso e dichiara che "non avrebbe mai potuto funzionare"
- Il bug viene corretto e cresce la legenda del codice che non avrebbe mai potuto funzionare (ma che ha funzionato per anni)
Siamo logici qui. Codice che non avrebbe mai potuto funzionare ... non avrebbe mai potuto funzionare . Se ha fatto il lavoro, allora l'affermazione è falsa.
Quindi sto per dire che un bug esattamente come descritto (che sta osservando il codice imperfetto smette di funzionare) è palesemente senza senso.
In realtà ciò che è successo è una delle due cose:
1) Lo sviluppatore non ha compreso appieno il codice . In questo caso il codice è di solito un casino e da qualche parte in esso ha una maggiore ma non ovvia sensibilità a una condizione esterna (diciamo una specifica versione o configurazione del sistema operativo che governa il funzionamento di alcune funzioni in modo minore ma significativo). Questa condizione esterna viene modificata (ad esempio da un aggiornamento o modifica del server che si ritiene non sia correlato) e, in tal modo, il codice si rompe.
Lo sviluppatore quindi esamina il codice e, non comprendendo il contesto storico o avendo il tempo di rintracciare ogni possibile dipendenza e scenario, ha dichiarato che non avrebbe mai potuto funzionare e lo riscrive.
In questa situazione, la cosa da capire qui è che l'idea che "non avrebbe mai potuto funzionare" è dimostrabilmente falsa (perché l'ha fatto).
Questo non vuol dire che riscrivere è una cosa negativa - spesso non lo è, mentre è bello sapere esattamente cosa c'era che non andava spesso che richiede tempo e riscrivere la sezione del codice è spesso più veloce e ti permette di essere sicuro di aver corretto le cose.
2) In realtà non ha mai funzionato, nessuno lo ha mai notato . Ciò è sorprendentemente comune, in particolare nei sistemi di grandi dimensioni. In questo caso qualcuno di nuovo inizia e inizia a guardare le cose in un modo in cui nessuno ha mai fatto prima, o un processo aziendale cambia portando un caso marginale in precedenza minore nel processo principale e qualcosa che non ha mai funzionato (o ha funzionato, ma non tutto il tempo) viene trovato e segnalato.
Lo sviluppatore lo guarda e dichiara "non avrebbe mai potuto funzionare" ma gli utenti dicono "sciocchezze, lo usiamo da anni" e hanno ragione, ma qualcosa che considerano irrilevante (e di solito non menzionano fino al sviluppatore trova la condizione precisa a questo punto se ne vanno "oh sì, noi non facciamo che ora e non hanno fatto prima") è cambiato.
Qui lo sviluppatore ha ragione: non avrebbe mai funzionato e mai funzionato.
Ma in entrambi i casi una delle due cose è vera:
- L'affermazione "non avrebbe mai potuto funzionare" è vera e non ha mai funzionato - la gente pensava semplicemente di averlo fatto
- Ha funzionato e l'affermazione "non avrebbe mai potuto funzionare" è falsa e dipende da una (generalmente ragionevole) mancanza di comprensione del codice e delle sue dipendenze