Одна часть ответа - Рефакторинг .
Во-первых, начните писать модульные тесты, чтобы убедиться, что вы случайно не нарушите свои изменения. Затем начните улучшать конструкцию, удаляя дубликаты и т. Д. Небольшими шагами, запуская модульные тесты после каждого шага, исправляя любые проблемы, если какой-либо из тестов не пройден, или немедленно возвращаясь, если вы столкнетесь с более крупной проблемой, которую вы можете легко решить.
Другая часть - это образование .
Людей нужно учить не оставлять плохой код. Это, безусловно, долгосрочное сражение, так как привычки и мыслительные процессы трудно (иногда даже невозможно) изменить . Однако без этого вы просто будете получать бесконечный запас плохого кода, требующего рефакторинга.
Вы можете сделать групповые обзоры кода, чтобы открыть обсуждение хороших и плохих привычек кодирования и распространить достоинства первого. Недостаточно сказать «вы должны (не) писать такой код», вам нужно убедить людей в логике и неопровержимых фактах. Например, «если у вас этот фрагмент метода продублирован на базе кода n раз, как вы думаете, есть вероятность, что если в этом методе будет обнаружена ошибка, она будет исправлена в каждой копии кода метода?»
Вашей компании также может потребоваться пересмотреть стимулы и критерии приемлемости для консультантов - если им удастся написать небрежный код, они наверняка продолжат выбирать более легкий путь. Если компания продолжает ценить «быструю доставку» в течение длительного срока поддержки, ничего не изменится :-( Поэтому вам, возможно, придется обсудить это и с руководством. Один из способов дать им понять это: рефакторинг означает поддержание кода в чистоте, простота понимать и поддерживать. Отказ от рефакторинга подобен накоплению задолженности по вашей кредитной карте, Вы можете сойти с рук на некоторое время, но если вы не будете активно управлять своими покупательскими привычками и долгами, это неизбежно рухнет вам на плечи в один прекрасный день. В жизни программного проекта банкротство - это когда проект становится неуправляемым: его легче переписать с нуля, чем добавить новую функцию в существующую кодовую базу. Или пользователи настолько устали от низкого уровня поддержки и функций, что просто переключаются на конкурентов.