I was seven when I started learning how to program.
Mostly it was just typing in BASIC code read from old magazines and text books I got from the local library. I didn't understand a THING. Not what I was entering did or what any of it meant but it fed the curiosity and fired up the determination to learn what it was it DID do!
I was almost ten when I started writing real "programs." By my standards of today, they were utterly trivial programs. They were written in QBASIC and were mostly bad emulations of GUIs such as Mac OS 7.6 or simple interpreters for imaginary programming languages. There was no mouse in the GUIs and everything was pretty much hardcoded but I learned the value of functions, structures (as far as QBASIC had them) and variables.
When I was eleven, I started learning Pascal. The desire to learn Pascal was motivated by what I perceived to be serious slowness in QBASIC in doing rendering. I didn't know any assembly back then or even know that it existed. Even if I did, I doubt I would've understood how to make use of it within QBASIC. Anywho. Most of my time in Pascal was spent "porting" the small programs I wrote in QBASIC. It didn't take the opportunity to really make use of the "new" concepts Pascal offered such as pointers but the experience did highlight the difference between the general principles and techniques of programming versus the particular syntax or constraints of a given language.
When I was thirteen, I started experimenting with C after getting into a conversation with someone from high-school. She handed me a massive book on C the next day. I had a lot of trouble getting started, coming from Pascal and QBASIC. Including header files and such seemed completely alien to me. Not having all kinds of bells and whistles provided out of the box also seemed alien to me as TurboPascal and QBASIC were pretty "batteries included" for their time.
It didn't really help that I was trying to code on multiple platforms pretty much from when I started learning C. I was experimenting in TurboPascal in MSDOS, Visual C++ in Windows, Watcom in OS/2 and GCC in Linux. My friend was instrumental in my progress. If it wasn't for her, I would've probably given up. She didn't explain things very clearly or simply but she never, ever, got sick of trying to answer my questions or show me how something should've been written. Or rather, how I could accomplish what I wanted.
I started playing with x86 assembly a few months after I started experimenting in C. This might sound kind of crazy but my friend was very much into systems programming. She was writing a kernel herself way back then and naturally I wanted to learn some of what she was doing. And so, I started off in assembly by writing inline assembly graphics routines in TurboC. It was very jarring at the time to me and it certainly didn't click. I didn't understand anything about the stack as previously it was just... magic, automatic. It wasn't until much later that I really started to understand those details.
The next few years were full of learning basic data structures and through implementing those structures growing a rather basic understanding of pointers and how to utilize them. Around this time I swore to never use any extensions specific to a given compiler as I was very annoyed when a large chunk of my TurboC code wouldn't build on BeOS or Linux. I had no understanding of "Standard C" or "Standard C++" back then. It was just C or C++ to me. I thought it was the same everywhere! Well, it wasn't and lesson learned.
More years passed and more advanced programs were written. Basic games, experimenting with OpenGL, learning a little Javascript, PHP and MySQL. It's a large list that I can't remember fully. One thing stands out in my memory and that is that my knowledge of data structures didn't really grow during this time.
Fast forward to me being seventeen, when I initiated my first kernel project. This project more than any other pushed the boundaries of my understanding. It taught me more than anything else I'd ever done with relation to programming. I started researching intensely to achieve the things I wanted, to understand what I couldn't. Data structures, compilers, processors, memory management, parsing. The list goes on and on and on. Many people on the predecessor to this forum helped me. Of them all, Candy was the kindest and most understanding. He was always happy to answer my questions, regardless of how simple or silly they seemed.
Now I'm 27 and while I'll never believe I'm an expert, I've certainly grown skill and understanding. I am where I am because of the people who've helped me and the projects I've done. If it wasn't for the kernel project way back when I was 17, I really wouldn't be where I am now.
Or rather, I'd be one of the "clueless" developers I consider many people I've encountered in jobs to be. Those, who like myself years and years ago, have no real understanding of the architecture of the machine on which they work. No idea of the stack, no real understanding of memory management or what the heap is. Poor understanding of data structures. No understanding or even knowledge of omega notation. The environment they work in and the languages they use make that understanding optional: data structures are provided out of the box and are, in languages like Python or Javascript, an absolute cinch to use. People can use things like associative arrays, etc, without even knowing it.
Things have certainly changed a lot in that sense. Depending on the language you choose, it's trivial to write programs that once would've taken some serious understanding and time!
~K
PS: There were a lot of other people that helped me out, people that seemed to have vanished! They used to frequent #osdev. Names of cippo, ronny, silverfox, etc. I wonder what happened to them.