Это действительно сложная проблема. Я опишу, что бы я сделал (и сделал), если старый код существенно большой.
В общем, старый код полон решений, исправлений ошибок и недокументированного поведения. Если вы выбросите это, вы неизбежно совершите те же ошибки, что и они, а затем еще несколько.
Что бы это ни стоило, вы должны развить систему вокруг старого кода. Попробуйте абстрагироваться от старого кода, например, путем создания интерфейсов, а затем реализовать их, вызвав старый код сначала . Напишите множество модульных тестов для интерфейсов и получите знания о том, как работает старый код. Новые функции должны получить новые реализации, поэтому старый код и новый код будут жить бок о бок столько, сколько потребуется, а может быть, даже навсегда.
Теперь медленно и осторожно вносите вторжения в старый код, реорганизуйте его, заменяя его и следя за тем, чтобы ваши тесты все еще проходили. Напишите также новые тесты. Если у вас есть регрессионные тесты для системы (кроме модульных тестов), они все равно должны пройти.
Нельзя трогать старый код, обычно, если он работает нормально, об этом не сообщается об ошибках, он проходит ваши тесты и его не нужно расширять.
Несколько хороших ресурсов:
http://martinfowler.com/bliki/StranglerApplication.html
Эффективная работа с устаревшим кодом
Я также нашел его в StackOverflow:
Стратегия масштабного рефакторинга