Abstractions reduces the cognitive load. There are two types of languages. Greedy and minimal - on cognitive aspect. Java - OOP is complex, factories, beans... C - minimal set, build rest on your own. Too much low level will fry your brain. Too many foggy abstractions - the same. There is the balance between them both. Whatever system you decompose - make it concrete. The paper: Scenario-Based Programming: Reducing the Cognitive Load, Fostering Abstract Thinking