От использования абстракций в программировании у меня осталось впечатление об их большем вреде, чем пользе, так как слишком часто при изменении или уточнении требований к программе или модификации используемого алгоритма приходится дырявить или перестраивать стену абстракции, с таким трудом построенную и оттестированную, так, что лучше было бы вообще без стены.
С другой стороны, писать конкретный прямолинейный код может быть еще более разрушительно, так как со временем код естественным образом начинает запутываться, подобно сваленным в кучу проводам, удивительным образом самопроизвольно спутывающимся в неразвязываемый узел. В слишком конкретном коде в нужный момент не получится заменить компонент на аналогичный, хотя, надо сказать, что в хорошо абстрагированном коде такая проблема, как ни странно, тоже нередка, так как вдруг выясняется, что абстракции были сделаны не в тех местах, недостаточны или просто не подходят под новую задачу, так как написать в одной конкретной программе все возможные виды абстракций невозможно, как и предвидеть любые будущие требования. Да и вообще, человеческий мозг слаб и мал, и не способен продумать, представить и просчитать все заранее.
Это мучительное балансирование между абстрактным и конкретным — одна из дилемм программирования, которые снижают продуктивность программистов, убивают удовольствие от работы и убивают проекты и стартапы.
Можно ли как-то научиться, есть ли какая-то более-менее четкая методика для соблюдения баланса между абстрактным и конкретным в программировании?