Una parte della risposta è Refactoring .
Innanzitutto, inizia a scrivere unit test per assicurarti di non interrompere accidentalmente nulla con le modifiche. Quindi iniziare a migliorare il design, rimuovere duplicati, ecc. In piccoli passaggi, eseguire i test unitari dopo ogni passaggio, risolvere eventuali problemi in caso di esito negativo di un test o ripristinare immediatamente se si verifica un problema più grande di quello che è possibile risolvere facilmente.
L'altra parte è l' educazione .
Alle persone deve essere insegnato a non lasciarsi alle spalle il codice negativo. Questa è certamente una battaglia a lungo termine, poiché le abitudini e i processi di pensiero sono difficili (a volte persino impossibili) da cambiare . Tuttavia, senza di essa, continuerai a ricevere una scorta infinita di codici errati che urlano per essere riformattati.
Puoi scegliere di fare revisioni del codice di gruppo per aprire una discussione sulle buone e cattive abitudini di codifica e diffondere i meriti del primo. Non basta dire "devi (non) scrivere codice come questo", devi convincere le persone con logica e fatti concreti. Come "se hai questo pezzo di metodo duplicato sulla base del codice n volte, cosa pensi che ci siano possibilità che se viene trovato un bug in quel metodo, sarà corretto in ogni copia del codice del metodo?"
La tua azienda potrebbe anche aver bisogno di rivedere gli incentivi e i criteri di accettazione per i consulenti : se riescono a cavarsela con la scrittura di codice sciatto, continueranno sicuramente a scegliere il percorso più semplice. Se la società continua a valutare la "consegna rapida" per manutenibilità a lungo termine, nulla cambierà :-( Quindi potrebbe essere necessario discuterne anche con il management. Un modo per farli capire è questo: refactoring significa mantenere pulito il codice, facile da capire e mantenere: omettere il refactoring è come accumulare debito sulla tua carta di credito. Puoi cavartela per un po ', ma se non gestisci attivamente le tue abitudini di acquisto e i tuoi debiti, un giorno si sbriciolerà inevitabilmente sulle spalle. Nella vita di un progetto software, il fallimento è quando il progetto diventa irraggiungibile: diventa più facile riscriverlo da zero piuttosto che aggiungere una nuova funzionalità alla base di codice esistente. Oppure gli utenti sono così stufi del livello inferiore di supporto e funzionalità che passano semplicemente alla concorrenza.