Вопрос такой – не является ли придумывание и фиксация
Архитектуры приложения – разновидностью преждевременной оптимизации?
Тезисы такие.
Существует процедура рефакторинга.
Довольно монстрообразные программы при помощи последовательного применения довольно очевидных рефакторингов приводятся к благообразному виду.
С дргугой стороны, как правило, задуманная первоначально структура программы со временем размывается и довольно быстро перестает быть актуальной.
Напрашивается мысль, что рефакторинги можно было бы применять автоматически при комитах изменений.
Искать повторно используемый код – выделять функции и переменные.
Инлайнить функции и переменные.
Группировать функции с данными, с которыми они наиболее плотно используются.
Превращать аргументы функций в члены классов и обратно.
Ну и множество других довольно тупых действий.
При этом считать различные метрики графа кода и добиваться их оптимизации.
Еще раз повторюсь, в каждом шаге рефакторинга ничего особо интеллектуального нет, можно и машину научить его применять, а вот результаты систематического применения дают весьма сносный и логичный код.
Напрашивается аналогия с алгоритмом балансируемого дерева.
Вы добавляете элементы к дереву, они встраиваются в соответствующие узлы.
Когда большое число новых элементов нарушает баланс дерева, оно автоматически перестраивается.
Предлагается то же самое для дерева кода программы.