Question: My younger brother is looking to start programming. He's 14, and technically-inclined, but no real experience programming. He's looking to me for guidance, and I don't feel as if my experience is enough, so I figured I'd ask here.

He's more interested in web programming, but also has an interest in desktop/mobile/server applications.

What would be a good learning path for him to take? I'm going to buy him a bunch of books for Christmas to get him started; the question is, what should he learn, and in which order?

The way I see it, he needs to learn theory and code. I'd like to start him off with Python or Ruby or PHP. If he wants to get in to web, he's also going to need to learn HTML, CSS, Javascript, etc.

Out of those three domains (Languages, Theory, Markup/Etc.), what is the best order do you think to learn in? Also, am I missing anything?

Thanks!

Answer: 
I *really* like the way that I came into programming; the only thing I can imagine changing is my access to books. My family didn't have the money for all the books I could devour, and our small rural library didn't exactly stock tech manuals. In the grand scheme of things, this is a small nitpick.

I wholeheartedly disagree with those who say you can't learn theory at 14. The earlier you learn the theory, the better. I read [*The Art of Computer Programming*](http://rads.stackoverflow.com/amzn/click/0321751043) at 14, though I'd already been coding a while.

The best thing you can do for your brother is to give him the tools to pursue his interests, and include him in the hacker/coder community whenever possible, so he can learn the *mindset* of a great coder.

* Nudge him away from proprietary tools wherever possible. There's so much more available to him in the open source world. I got as good as I am largely due to the guidance I received from more experienced folks in the open source community.
* If you can afford to, get him a [Safari](http://www.safaribooksonline.com/oreilly/knowledge/?cid=201012-orm-safari-knowledgewebhome) account, or help him buy books when needed. Even lending what you already own can help.
* Make sure he has access to a decent desktop or laptop *and* a server or VPS to experiment on. If mobile apps are his thing, make sure he has a phone or demo device to work on.
* Show him how to find IRC channels, mailing lists, etc. for the things he is interested in working with/on.
* Make sure he knows [how to ask smart questions](http://www.catb.org/~esr/faqs/smart-questions.html) and, conversely, the particulars of a [support leech](http://www.binaryredneck.net/node/161) so he knows what not to do.
* His first programming language isn't the most important factor. The totality of programming languages he learns is extremely important. One-language coders never pass a certain (relatively low) level of coding-foo.
Does his high school offer classes in computer science? For example in the United States the Advanced Placement program has a computer science class that goes through quite a bit of the basic computer science concepts (flow of control, basic object oriented development practices, loops, etc.). 

I was able to attend a high school that offered computer science courses for basically all 4 years (from an introductory course through to basic LIPS, MIPS, and Open GL). I ended up testing out of the basics in college and then re-learning a lot of the other languages and topics in upper level courses. I can tell you that 14-17 year old brain had a lot more difficulty wrapping around the theory than an 18-22 year old brain did. Topics like recursion, pointer arithmetic, low-level programming, network topography, and functional programming took me a long time to get in high school, but the second time around in college I found them to be a breeze, perhaps because I'd already tackled them but also perhaps because of what developmental scientists have proved about the young brain - some of the abstract thinking required for higher math and CS concepts is still developing.

Even though it was difficult, thinking through CS starting at 14 is extremely helpful. Doing it without teachers seems like it would have been complicated. I would've spent time developing web pages for fun because it's what I loved to do back then (and now), but I would never have taught myself pointers, recursion, and LISP for fun at the time.