В ранней юности, начиная более-менее всерьез программировать, писал исключительно "из головы". Если был доступ к машине, то сразу начинал колотить код, если не было — писал на бумаге, потом наколачивал. Разумеется, регулярно вылезали непредусмотренные проблемы (несовместимость, особые случаи, сложности с расширением и т.п.). Иногда приходилось по нескольку раз переписывать изрядную часть кода.
Позже несколько раз пытался, как взрослые, начинать с проектирования. Помогало очень слабо.

Общая структура программы, иерархия модулей/классов, их взаимодействие в целом неплохо видны и умозрительно. Если все это оформить в виде схемы или описания на псевдоязыке — выглядит логично и красиво, пока не начинаешь наполнять все это кодом. Почти всегда вылезают те же самые несовместимости, особые случаи, взаимные блокировки параллельных потоков, потеря полезной информации в недрах вложенных вызовов и т.п. Полученное так же приходится изрядно переписывать, плюс добавляется время на само проектирование.
Еще с возрастом усиливается склонность к прокрастинации.

Если раньше, когда не было интернета (сперва — никакого, потом — богатого информацией), многое приходилось придумывать самостоятельно и делать с нуля, то теперь все чаще понимаешь, что бОльшая часть нужного уже где-то и как-то сделана, но сразу же встает вопрос, на что потратишь больше ресурсов: на разработку своего, понятного и полностью контролируемого, или на ковыряние в чужом, хождение по скрытым граблям, ожидание исправления багов и прочее. В итоге все больше времени уходит на тягостные раздумья о выборе оптимальных вариантов, а если б то же самое время убить на тупое написание кода, получилось бы не менее (а то и более) эффективно.
Вот сейчас заставил себя взяться за переделку одной из программ, чем собирался заняться уже года три, но в голове никак не складывалась четкая картина того, что должно было получиться в итоге. После нескольких дней наколачивания кода, с периодической переделкой структуры и взаимодействий, стало более-менее понятно, что получится в результате, и в целом уже начало оформляться. На несколько предыдущих попыток, когда пытался заранее спроектировать все красиво и изящно, ушло в разы больше времени — понятно, с нулевым результатом.
О подобных проблемах говорят и писатели: только у гениальных бывает, что текст льется на бумагу/клавиатуру прямо из головы, и потом достаточно лишь внести мелкие правки. Большинство же однозначно утверждает, что нужно тупо фигачить текст в том виде, как он получается прямо сейчас, расставляя метки в сомнительных местах, и заранее понимать, что бОльшую часть придется переписывать еще и еще. Когда я в молодости баловался журналистикой, именно такой подход давал наилучшие результаты. Бывало, наколотив уже половину статьи, понимал, что так выходит полная фигня, и нужно начинать совершенно с другой стороны, в другой последовательности, с другими акцентами и т.п. Иногда достаточно было переставить местами куски и слегка подправить, но приходилось и переписывать почти полностью. Если же силился заранее выстроить полную схему — толком ничего не получалось, пока не начинал писать текст.
Когда читаешь умные книги о разработке ПО, создается впечатление, что люди нашли способы достаточно быстрой и надежной разработки. Когда пытаешься применять это на практике, получается, что многие решения хороши лишь в идеальной среде, а в реальной они не намного лучше наколенных, зато менее очевидны и более сложны.
Кто делает софт в одиночку (хотя бы в объеме отдельных модулей/библиотек) — поделитесь, как у вас организована работа?

Сперва тщательно проектируете структуру, интерфейсы, взаимодействие, и потом это чаще всего остается неизменным (хотя бы в целом), или же сразу начинаете делать наиболее явные куски, постепенно заполняя пробелы и подстраивая общую структуру к тому, что получилось? Удается ли выстроить стройную логику взаимодействия в многослойных абстракциях, параллельных потоках и подобном, или везде приходится лепить костыли для неочевидных частных случаев? Насколько сложно заставить себя перестать обдумывать, как сделать лучше, и начать делать хоть как-нибудь?