Лично я просто пишу как получается. На каком-то этапе обычно всё переписываю с нуля, но переиспользуя куски старого кода, когда станет очевидно, что задуманная изначально архитектура не учитывала определённые вещи. Вероятно мне помогает то, что я использую Java, с которой такие трюки хорошо проходят в силу развитой IDE. Обычно со второго раза получается результат, который меня устраивает. Потом он обрастает дополнительным функционалом, доработками и тд, и в конце концов можно переписать всё ещё раз.
При таком подходе главное стараться писать код максимально изолированно, чтобы при переписывании собственно переписывания было как можно меньше, а было как можно больше переиспользования.
Но такой подход категорически не подойдёт, если разработчиков более одного человека.