Uma parte da resposta é refatoração .
Primeiro, comece a escrever testes de unidade para garantir que você não interrompa acidentalmente nada com suas alterações. Em seguida, comece a melhorar o design, removendo duplicações etc. em pequenas etapas, executando seus testes de unidade após cada etapa, corrigindo quaisquer problemas se algum dos testes falhar ou revertendo imediatamente se você encontrar um problema maior do que pode resolver facilmente.
A outra parte é educação .
As pessoas devem ser ensinadas a não deixar códigos ruins para trás. Esta é certamente uma batalha de longo prazo, já que hábitos e processos de pensamento são difíceis (às vezes até impossíveis) de mudar . No entanto, sem ele, você continuará recebendo um suprimento infinito de códigos ruins gritando para ser refatorado.
Você pode optar por fazer análises de código de grupo para abrir uma discussão sobre bons e maus hábitos de codificação e espalhar os méritos dos primeiros. Não basta dizer "você deve (não) escrever um código como este", você precisa convencer as pessoas com lógica e fatos concretos. Como "se você duplicou esse pedaço de método pela base de código n vezes, quais são as chances de que, se um erro for encontrado nesse método, ele será corrigido em cada cópia do código do método?"
Sua empresa também pode precisar revisar os incentivos e os critérios de aceitação para os consultores - se eles conseguirem escrever código malfeito, certamente continuarão escolhendo o caminho mais fácil. Se a empresa continuar avaliando a "entrega rápida" e a manutenção a longo prazo, nada mudará :-( Portanto, talvez você precise discutir isso com a gerência. Uma maneira de fazê-los entender é o seguinte: refatorar significa manter o código limpo e fácil de entender e manter. Omissão refatoração é como dívida acumulando em seu cartão de crédito. Você pode se safar por um tempo, mas se você não estiver gerenciando ativamente seus hábitos de compra e dívidas, isso inevitavelmente desmoronará sobre seus ombros um dia. Na vida de um projeto de software, a falência ocorre quando o projeto se torna insustentável: fica mais fácil reescrevê-lo do zero do que adicionar um novo recurso à base de código existente. Ou os usuários ficam tão cansados do nível inferior de suporte e recursos que simplesmente mudam para a concorrência.