Две вещи, помимо большого списка @ Судханшу (и, в некоторой степени, не согласны с его # 8):
Во-первых, имейте в виду, что непроверенный код является ошибочным кодом - то, с чего вы начинаете, почти наверняка работает неправильно, для любого определения «правильно», кроме «работает так же, как неизмененный код». То есть будьте готовы обнаружить непредвиденное поведение в системе, спросить экспертов в системе об этом поведении и сделать для них вывод, что оно работает не так, как должно. Подготовьте их к этому - предупредите их, что без тестов или другой документации нет причин думать, что это работает так, как они думают, что это работает.
Далее: Рефакторинг Низко висящий фрукт Полегче, медленнее, очень осторожно. Заметьте что-нибудь простое в коде - скажем, дублирование - и, черт возьми, протестируйте все методы, содержащие дублирование, а затем устраните его. Вспенить, промыть, повторить. Не пишите тесты для всего, прежде чем вносить изменения, но пишите тесты для всего, что вы меняете. Таким образом, он остается доступным на каждом этапе, и вы постоянно добавляете ценность, постоянно улучшая кодовую базу.
Я сказал «две вещи», но, думаю, добавлю еще одну: «Управлять ожиданиями». Сообщите вашему клиенту, насколько вы напуганы этой задачей; пусть знают, как плохо у них. Дайте им знать, насколько медленным будет прогресс, и дайте им знать, что вы будете держать их в курсе этого прогресса (и, конечно, сделайте это). Ваш клиент может подумать, что он / она просит «просто небольшого исправления» - и функциональность действительно может измениться лишь немного - но это не значит, что это не будет много работы и много времени. Вы понимаете это; Ваш клиент тоже должен.