Не борьба, а управление по типу "разделяй и властвуй". Потому что есть непонижаемая сложность, которая определяется сложностью поставленной задачи. И теперь уже вопрос стоит в том, как эту сложность распределить - в используемых абстракциях или в готовом коде. Причём, замечу, что любая абстракция увеличивает итоговую сложность, потому что не все возможности абстракции используются, а только те, что необходимы для задачи.