Here's a stupid analogy that always comes to mind.

Imagine a LEGO set or a similar toy that was comprised of small simple pieces, building blocks, that the child was to assemble. Most of us probably have experience with these type of toys. The ones where some imagination is required.

If I recall correctly they sometimes included special pieces in addition to the basic pieces/building blocks. These special pieces had certain complexity "built-in" (e.g. curved shapes or even moving parts), the purpose being that you could create something that would otherwise be nearly impossible to create using only the basic pieces, and you could do this just by attaching the special piece. Tack on the special piece and voila, you had added some special design or functionality to your LEGO construction project that was otherwise limited by what you could possibly build using only the basic LEGO pieces.

If none of that triggered any images from your childhood then you might as well stop reading. My memory might be failing.

The stupid analogy to the LEGO set that I see in software development is that the more we have moved toward easy to use "special pieces" with built-in complexity, the more we have moved away from the basic pieces, and hence the more we have inhibited creativity. What do I mean when I say inhibted creativity?

With special pieces, the child can build more functional and complex things with less effort, and faster. No doubt. But his creativity is also effectively reduced. This is because there are only so many combinations he can create with the special pieces.

The special pieces make the child more "productive" but at the same time reduce the number of possible project ideas and design choices. The child's creativity comes from using the basic pieces. The only limits as to what he might try to build from the basic pieces are the child's imagination. Who knows, maybe he'll build a dot matrix printer (Is there a picture of that somewhere?)

In today's computing environment, when you want work on low-level stuff, when you want to use "basic pieces", unless that is your trade, unless you work with low level stuff for a living, you are almost always going against the grain. Everything, an entire world of programming, is steering you the other way. "Do not go there. You do not need to know how this works. Learn [some scripting language]." There are certainly exceptions, but just look at how difficult it is to even get something like Raspberry Pi off the ground. It should be easy!

(Not to mention the Raspberyy Pi people want to steer kids into using a scripting language on the Pi, right from the get-go. Skip that useless low level stuff. What long-term effect does that have on learning about systems programming?)

And so returning to the LEGO analogy, the LEGO set that todays children are given seems to be all special LEGO pieces with built-in functionality. (Libraries?) Convenient, but no imagination required. If we never give children LEGO sets with the basic pieces, how can we expect creativity to flourish? An intelligent child will quickly become bored with just "special pieces" and the severely limited number of possible things it allows him to build. Should anyone be surprised when he starts prying the special pieces open to see what's inside? (Jailbreak!)

End of stupid analogy.

"Limitation breeds creativity."

An observation from the real world: the more state of the art, powerful tools you give research scientists (which they demand to keep pace with their peers), the less innovation they may actually produce.