I keep coming back to
this article, which explores in some detail how the path that led a lot of modern day programmers into their skill set has been mostly ripped up and paved over for kids today.
I wasn't directly exposed to computer technology at all until I got to high school in the early 80's. I had been exposed to the idea of digital logic circuits before that, in books, but hadn't gotten to experiment with computers at all until I a) ran across some (very primitive by today's standards) examples of programming in BASIC in one of my math textbooks, and b) found that one of the neighborhood Radio Shack stores had one of their first-generation TRS-80 computers out on display as a demo, which gave me a platform to experiment on.
One of the math teachers at my school got wind of that and decided to set me up with one of their student dialup accounts on UT's Cyber 170/760 (a piece of bleeding-edge tech when it was built!) so I had a more easily accessible way to experiment, and gave me access to BASIC and later FORTRAN. I learned more by playing with both languages than I ever would have learned from a book -- BASIC in its original, line-edited, interactive interpreted form was a perfect way to play around with code and explore what changes had what effects (and what sorts of things would end up not doing what I wanted them to do, and more importantly, why!), while FORTRAN gave me early exposure to compiled languages and how what was then the reality of software development worked.
And I continued playing around with the relatively primitive 8-bit machines like the TRS-80, Apple II, and later, the Kaypro 10 I inherited from my dad, and learning how their hardware worked, and learning how to get performance out of my code within the rather severe limitations of the platform. The Z80, a rather popular early offshoot of the early Intel 8080 series, was the heart of the TRS-80 and the Kaypro (which used CP/M, a fairly successful early 8080-based command-line OS) and at one time I had enough of its instruction set memorized that I could actually dump RAM and be able to see instructions in the binary. When I migrated to Turbo Pascal not long after I could no longer escape the limitations of BASIC on those machines, the overall limitations of the hardware -- the Z80 could only address a maximum of 64K of RAM, 8 MHz was considered blindingly fast clock speed, and the lack of hardware floating point meant a huge performance hit if you needed to do floating point in software -- defined my programming style from then on. I still write lean, tight, and efficient code, because in those days, you had to or it just flat didn't work.
There really isn't an equivalent to that experience today. People doing what I was doing were pioneers -- no one had ever done programming on home machines as a hobby before, because the technology hadn't existed to do recreational computing anywhere but large university computer labs before. We were learning as we went because there wasn't really anyone there to teach us, other than fellow home experimenters. And in those days, there was real hope of being able to make the skill set pay off in terms of future jobs. It was exciting, it was rebellious, it was something we owned and no one could take away from us, that thrill of making machines do subtle and amazing things and translating an idea into code that worked.
Nowadays the tech is whole orders of magnitude beyond anything I had access to as a kid .. but it's increasingly walled off by "no user serviceable parts inside" barriers. The early Mac models were my first exposure to that -- the first-generation machines were originally not designed for users to write their own apps, and in fact, if I remember correctly, any kind of serious software development for the first-gen Macs with early System versions required the hideously expensive Apple Lisa as a development platform. Even in later years when Apple released the early Mac-based SDK's, coding on them was a significant challenge, and IDE's for Mac OS up to OS 9 were costly and complex, and designed for seasoned programmers rather than as entry-level tools.
I've been able to keep up with software development tools somewhat better, recently, having been able to regain access to software development in Mac OS when Apple released Xcode for free .. but I have enough knowledge and skills to be able to navigate and look up what I need to in online developer support libraries. It's not an experience I'd recommend to a kid just now taking the early steps toward the basics of translating an abstract idea into an algorithm and then translating that into working code. As a means for me to create my own applications to do what I need to do with the computer, it's great (and syntax-based color coding is a godsend to my somewhat neuro-atypical brain!) but it's not an entry-level tool by any means. And having the equivalent of a 57,000 VAX cluster in a portable machine doesn't force one to code efficiently. (I had the very strange experience recently of finding out that the accepted way to read a text file, now, is to declare a string variable and read the entire contents of the file into it (!), which would have brought any machine I learned to code on straight to its knees..)
And there's not really that sense of needing to invent the wheel when a perfectly good one is already there ready-made for you. The utter ubiquity of modern technology and the sheer volume of ready-made apps out there for almost any task imaginable (at least within the horizons of an inexperienced and/or modest imagination) removes most of the sense of necessity, and a lot of the motivation for practice and developing skills. The need to code a solution oneself is going to be much more niche-oriented than it was when I was learning. Learning for its own sake will always be an attraction, but it's not as urgent as it was when everyone was doing things for the first time.
The stakes are high. The future is very much software-defined, and the ability to code will still be a precious currency, more so as more of our lives are managed with computers in various ways and this process will only accelerate, I think. We've let ourselves be lulled into a state of passive consumerism with regard to technology, to the point that most of our consumer goods can't readily be produced in the USA anymore and very few of them can even still be designed here to any reasonably competent standards, and that is not a sustainable condition if we have any hope of being genuine contributing participants in our future on this planet. We've exported too much of our expertise to places that are only too happy to let us pay for the privilege of being buried in their cheap flashy consumer goods while we slowly poison ourselves on junk food and junk culture. It's a seductive siren song, and it will lead us to a genuine decline and fall if we keep listening to it and following it.
There is hope. I've been very interested in embedded microcontroller modules like the Arduino as a teaching tool for basic programming and for learning to solve hardware-constraint problems, which I still believe are the best way to learn how to code efficiently and elegantly, and I firmly believe we should be introducing kids to platforms like that as a means of learning by doing. Toys with elaborate software-designed behavior are cool, to be sure .. but what could be cooler than for a kid to have a toy he/she wrote the code for and understands on that deep a level? Those, I think, are the best equivalent today to those crude early home machines my generation of coders learned on.
But we need something. We need to plant seeds now for our own future generation of programmers, even if it now seems like it's hopeless for kids outside of certain Asian countries to dream of any kind of future career in the field. We let ourselves be led into that trap, and there is no way out of it but to think our way out and solve the basic bootstrap problem it now presents. And maybe we shouldn't just focus on the kids, either -- there's a whole potential adult workforce that could be brought up to speed with the right motivations. We're throwing away brain-share we could be putting to use, and we wonder why our unemployment is so high and our economy is stagnant. The writing is on the wall.