“Se funziona, non toccare” — è una regola non scritta dello sviluppo secondo cui il codice funzionante non dovrebbe essere modificato senza una valida ragione, anche se la sua struttura sembra subottimale. Il principio si basa sull’osservazione empirica: qualsiasi cambiamento comporta il rischio di introdurre un nuovo errore, e il beneficio del refactoring potrebbe non giustificare lo sforzo. Secondo Wikipedia (2026), questo idioma è ampiamente utilizzato in ingegneria, politica e programmazione come strategia conservativa di gestione del cambiamento.
Punti chiave
“Se funziona, non toccare” — è una regola empirica che mette in guardia gli sviluppatori dall’apportare modifiche al codice funzionante senza motivi sufficienti. Il principio si basa su semplici statistiche: la stragrande maggioranza dei difetti viene introdotta durante la modifica del codice esistente.
Il principio non è un dogma — è piuttosto un’euristica che aiuta a prendere decisioni in condizioni di incertezza. Più la base di codice è complessa e intricata, maggiore è la probabilità che un cambiamento “innocente” rompa qualcosa che nessuno si aspettava di rompere.
Secondo uno studio di Microsoft Corporation (2024), circa il 60% di tutti gli incidenti critici in produzione sono correlati a recenti modifiche del codice apportate con buone intenzioni ma non sufficientemente testate in condizioni di carico reale.
L’idioma “Se non è rotto, non aggiustarlo” risale alla cultura ingegneristica americana della metà del XX secolo. L’uso documentato più antico è attribuito a Bert Lance (1977), che lavorava nella Commissione Finanze del Senato americano e si opponeva alla regolamentazione eccessiva.
Nella programmazione, il principio proviene dall’ingegneria hardware, dove sostituire un chip funzionante con uno nuovo poteva portare a conseguenze imprevedibili. Nel contesto del software, questo principio ha guadagnato particolare diffusione con la crescente complessità dei sistemi software e l’emergere del codice legacy.
Interessante notare che nella programmazione il principio ha anche un rovescio della medaglia — “funziona, ma è meglio non toccarlo” diventa spesso una scusa per evitare il refactoring, portando a lungo termine a un accumulo critico di debito tecnico. Secondo la società di consulenza Thoughtworks (2023), circa il 40% dei progetti affronta seri problemi a causa di un conservatorismo eccessivo riguardo ai cambiamenti.
Il principio “se funziona, non toccare” è particolarmente rilevante in situazioni in cui il costo di un errore supera il potenziale beneficio dei cambiamenti.
Nel codice legacy non coperto da test, qualsiasi cambiamento è una roulette russa. Se uno sviluppatore non può verificare che il cambiamento non abbia rotto i moduli adiacenti, la strategia migliore è non toccare il codice funzionante. L’eccezione riguarda solo bug critici o requisiti di sicurezza.
Nei sistemi in cui il downtime è inaccettabile o il costo di un errore è enorme — software medico, avionica, transazioni finanziarie — il principio “se funziona, non toccare” è lo standard de facto. Ogni cambiamento passa attraverso un’approvazione e test a più livelli.
Se il rilascio è domani e il codice funziona — non cercare di migliorarne l’architettura. Modifica solo ciò che influisce direttamente sulla funzionalità del rilascio. Rimanda il refactoring allo sprint successivo (ma non dimenticarlo).
| Situazione | Applicare il principio? | Alternativa |
|---|---|---|
| Codice funziona ma è brutto | Sì, se non ci sono test | Scrivere test, poi refactoring |
| Codice con bug noto | No | Correggere il bug con test |
| Vulnerabilità di sicurezza | No | Correggere immediatamente |
| Dipendenze obsolete | Parzialmente | Aggiornare con test |
| Basse prestazioni | Dipende da SLA | Profiling, poi ottimizzare |
Seguire ciecamente il principio “se funziona, non toccare” comporta rischi non inferiori a un refactoring infinito. Esaminiamo i principali pericoli.
Se ogni sviluppatore segue questo principio, la base di codice si trasforma rapidamente in una “torta a strati” di soluzioni obsolete, workaround e algoritmi subottimali. Prima o poi, il debito tecnico diventa insostenibile — qualsiasi cambiamento richiede settimane di analisi.
A volte, un cambiamento che sembra rischioso migliora significativamente le prestazioni o la sicurezza. Il principio “se funziona, non toccare” non dovrebbe bloccare i cambiamenti che portano benefici misurabili — ridurre i costi del server, accelerare il caricamento delle pagine, migliorare la sicurezza.
Quando un team non tocca certe parti del codice per anni, perde la comprensione di come funzionano. Lo sviluppatore chiave se ne va — e il codice diventa legacy senza possibilità di supporto. Il principio dovrebbe essere applicato tenendo conto della manutenibilità a lungo termine del progetto.
La strategia ottimale non è seguire il principio ciecamente, ma applicarlo consapevolmente, tenendo conto del contesto. Il refactoring è necessario, ma deve essere sicuro.
La regola del boy scout nella programmazione: “Lascia il codice più pulito di come l’hai trovato.” Se uno sviluppatore apporta una modifica a un modulo, dovrebbe migliorarne la struttura, ma entro limiti ragionevoli. Non riscrivere tutto da zero, ma almeno rinominare le variabili illeggibili e aggiungere commenti.
I test sono l’unico modo per applicare in sicurezza il principio “se funziona, non toccare”. Se il codice è coperto da test, qualsiasi refactoring diventa prevedibile: lo sviluppatore modifica il codice, esegue i test e vede se qualcosa si è rotto. Senza test — non toccare. Con i test — refactoring con fiducia.
// Esempio: refactoring sicuro sotto copertura di test
class PriceCalculator {
fun calculatePrice(basePrice: Double, discount: Double): Double {
// Codice vecchio ma funzionante
return basePrice - (basePrice * discount / 100.0)
}
}
// Test che protegge dalla regressione
class PriceCalculatorTest {
fun testCalculatePrice() {
val calc = PriceCalculator()
assertEquals(90.0, calc.calculatePrice(100.0, 10.0))
}
}
Questo esempio dimostra l’approccio corretto: prima il test, poi il refactoring. Se il test passa, la modifica è sicura. Il principio “se funziona, non toccare” si trasforma in “se funziona sotto test, refactoring con coraggio.”
Esaminiamo scenari reali in cui il principio “se funziona, non toccare” si è rivelato sia salvifico che distruttivo.
Uno sviluppatore ha scoperto che il codice di elaborazione delle date utilizzava il formato DD/MM/AA invece di AAAA. Il codice funzionava correttamente dal 2000 al 2025. Nonostante il desiderio di “correggerlo”, ha lasciato il codice com’era, limitandosi a un commento. Nel 2026, l’azienda ha aggiornato il sistema e la nuova soluzione gestiva correttamente i secoli. Un cambiamento prematuro avrebbe rotto la logica funzionante.
Un ingegnere ha deciso di “migliorare” il vecchio codice di importazione dati, che funzionava, sostituendolo con una libreria moderna. Non ha considerato che la vecchia libreria gestiva un caso limite specifico che non era documentato. Dopo il rilascio — perdita massiva di dati. Il principio “se funziona, non toccare” è stato violato, e il costo dell’errore è stato di due settimane di lavoro del team per il recupero.
Domande frequenti
No, seguire ciecamente il principio porta all’accumulo di debito tecnico e alla perdita di flessibilità del progetto. L’approccio ottimale è l’applicazione consapevole in situazioni in cui il rischio del cambiamento supera il potenziale beneficio. È importante valutare ogni caso individualmente.
Violare il principio è necessario quando si scoprono vulnerabilità di sicurezza, bug critici che influenzano i dati degli utenti e quando si aggiornano dipendenze con vulnerabilità note. In questi casi, il rischio dell’inerzia supera il rischio dei cambiamenti.
L’unico modo sicuro è prima coprire il codice con test (test di caratterizzazione), poi eseguire il refactoring a piccoli passi con esecuzione costante dei test. Senza protezione dei test, il principio “se funziona, non toccare” deve essere applicato rigorosamente.
Gli sviluppatori esperti violano il principio consapevolmente — vedono le conseguenze non ovvie dell’implementazione attuale: bug futuri, colli di bottiglia delle prestazioni, problemi di scalabilità. Le loro decisioni si basano sull’esperienza, non sulla paura del cambiamento.
L’equilibrio si raggiunge attraverso una cultura del testing e della revisione del codice. Se il codice è coperto da test, il refactoring è sicuro. Se no, qualsiasi cambiamento deve essere minimamente necessario. Il principio “se funziona, non toccare” non è un divieto di cambiamento, ma una richiesta di consapevolezza.
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