I agree, but having abstractions allow us to learn things in a system that are broadly applied.
This is out the door for AI generated systems. Unless extreme care is taken there is is no consistency in these new-found codebases. New paradigms are introduced left and right, because in the eye of the LLM, and the prompter, they worked.
It didn't matter that the same pattern was repeated 37 times in a slightly different manner.
So your knowledge now is no longer portable.
It used to be that you could look at code, and ask why? And usually (not always) the answer was something like: 'I tried x, y, and z, and those didn't work', either by past experience or current experimentation. (we could argue if the current experimentation should be documented).
But for LLMs they put in something complex for no other reason than that it does what is requested. Reading a string from a valid source byte by byte until you hit \0 is valid, and it'll work. But if you take a step back at, read the API docs of what you're consuming, and then consider: if the API says X, why am I testing whether that's correct?