ЕМ>Чтобы обнаружить это на этапе проектирования, нужно фактически провести почти тот же объем работы, выписав хотя бы все форматы данных, внешние интерфейсы, функции API, наборы параметров и прочее, и уже потом писать со всего этого код. Проще и быстрее сразу начинать писать код.
Ну так можно сразу разбить на какие-то логические блоки, выторчить из каждого интерфейсы. Все внешние зависимости/API засунуть в свои модули. Вот уже будет хороший задел на будущее: в последствии можно менять какой-то модуль/блок по месту локально, не переписывая всю систему.
Ну и ко всему прочему: все-равно постоянно идет какой-то рефакторинг и переписывание каких-то частей системы. Вопрос в том, насколько локализованные части системы это будут и сколько зависимых частей будут затронуты.