There'a real problem with abstraction. Look at any Java code. If you haven't seen it before you are going to deperately browse around the code to find out a single line that actually does something. But all you see is scaffolding. When you finally find a line that does actual work, it's not clear how it connect to other such lines. There's another such line 1000 lines below it but all the abstraction makes it almost impossible to find out how are the two executed. Which one goes first? Is one of them optional? Et c.
In general, abstractions are used to capture programmer's understanding of the structure of the program (it's more or less like boxes and arrow sketches in your notebook). But then, programmer's understanding of the structure of the program is often inadequate and lacking. As your understanding of the problem improves, so does your abstraction. But by then, it's hard-coded and cannot be easily changed. Many times I've seen how new functionality cannot be implemented because it doesn't fit the abstraction and re-writing the abstraction would mean re-writing the whole project.
> But all you see is scaffolding. When you finally find a line that does actual work, it's not clear how it connect to other such lines. There's another such line 1000 lines below it but all the abstraction makes it almost impossible to find out how are the two executed.
Wow, but as you say, that's "scaffolding" (or "boilerplate"), not "abstraction".
In general, abstractions are used to capture programmer's understanding of the structure of the program (it's more or less like boxes and arrow sketches in your notebook). But then, programmer's understanding of the structure of the program is often inadequate and lacking. As your understanding of the problem improves, so does your abstraction. But by then, it's hard-coded and cannot be easily changed. Many times I've seen how new functionality cannot be implemented because it doesn't fit the abstraction and re-writing the abstraction would mean re-writing the whole project.