It seems to me you can learn the "fundamentals of why you're doing something" at any level of abstraction. A sorting algorithm is merely an arbitrary point on a nearly infinite scale. Should you be allowed to just work with arrays and memory allocation and operators without understanding the internals of the language runtime, the kernel, the bytecode, the logic hardwired into millions of tiny transistors in the CPU? That's stuff that's nice to know but it explodes people's brains to try and grasp all this right off the beginning with no mental framework to stuff it into. Even computer science folks don't really care about things like list sorting - they just want it sorted as fast as possible so they can move on to solving actual problems with it. It's all mere syntax, or, they're two different things. We can, and should, teach people to reason using any syntax. The more powerful the words the better. Then walk through problems the same way. Except these problems are meaningful to the learner. We need the paddle to release a brick onto the playfield? What does that mean the brick should do? How do we have a brick "on" the paddle anyway?