
Ask HN: My nephew wants to learn programming. What should I recommend? - gruseom
My 11-year old nephew has been asking me how to get started programming. I'm thinking of suggesting Python because of its structure and clarity, though Javascript is tempting because of its web advantage. (There's Lisp of course, but I'm trying not to unfairly privilege the home team!)<p>What do you guys think? What language should he start on and what resources can you recommend for it? I think the goal should be to get him to rewarding feedback as quickly as possible, then he can either become an addict like the rest of us or drop it and move on.<p>Let me see what else... he's very smart and probably would prefer the straight goods to anything kidsy. Oh yeah, and (needless to say?) he wants to make games.
======
algorias
I'd say python with pygame hits the sweet spot of being simple and rewarding
(for 2D stuff anyway), while still exposing enough of the underlying mechanics
to be a good learning experience. You need to implement the main loop
yourself, call collision detection functions, update and redraw sprites, etc.

Considering that, the interval between sitting down and having _something_
that actually runs in front of you is still reasonably short.

~~~
torial
To add to this, I'd recommend a particular free book for learning programming
through game writing: <http://inventwithpython.com/chapters/>

------
gnosis
Logo. It's the gold-standard of introductory programming languages. It has
also been described as "lisp without the parenthesis", so it should have many
of the lisp fans on here on board.

Finally, it's just fun. I have fond memories of moving that little turtle
around with simple commands like "FORWARD 100" and "RIGHT 90", when I was
introduced to programming at around the same age as your nephew. You really
couldn't ask for a better first language.

------
b-man
I would recommend several things,

Squeak by Example[1], or better yet etoys[2]

How to design worlds, as already mentioned here

Alice[3], with something like [4].

Good old scratch from the logo tradition would also be cool[5].

[1] <http://squeakbyexample.org/>

[2] <http://www.squeakland.org/>

[3] <http://www.alice.org/>

[4] <http://www.aliceprogramming.net/>

[5] <http://scratch.mit.edu/>

Check them all out and decide for yourself. All of them are very consistent
and fun.

~~~
Zak
I wish someone had handed me Smalltalk at that age instead of telling me that
all real programming was done in C. I think one of the most important things
is being able to see results quickly to give it a hands-on feel.

------
javery
Ruby would be a good choice, I hear the Prag Prog Learn to Program book is
great and uses Ruby.

I was at my daughters new school the other day and I talked to the Librarian
who is also teaching technology and he talked about using Scratch
(<http://scratch.mit.edu/>) which looks very cool and is somewhat game
focused.

~~~
jackowayed
Seconding Ruby. The tutorial that later got expanded into the Prag Prog book
is available free online: <http://pine.fm/LearnToProgram/>

I'm told it's very good.

And then there's always Why's Poignant Guide to Ruby, which is fun to read and
teaches surprisingly well.

------
iamwil
I recently had a kid that wanted to program as well. He's about 12. Wanted to
program games, but didn't get very far in a directX book.

I had a couple choices for him, due to some requirements: 1) Something easy to
install or didn't have lots of things to install 2) Something with a all-in-
one gaming library 3) Something with some sort of community around it. 4) It'd
be nice if there was a book for it.

So with those there, there was: Ruby and HacketyHack.
<http://hacketyhack.heroku.com/> It also has a app framework called shoes that
you can use to build both games and apps. However, since _why left, all this
requires a lot of hand hold to set up.

Lua and Love. <http://love2d.org/> Lua is an easy language to pick up as it's
pretty minimal, and love's 2D engine is pretty fantastic. I've used it before
and it's pretty easy to get started with, and plenty of examples, as well as a
vibrant community.

Python and Pygame. <http://www.pygame.org/news.html> Pygame has all of the
above, and for me, the final winner, since there was a book that walks the kid
along from basic text games to the graphics part.
<http://inventwithpython.com/>

~~~
steveklabnik
Thanks for the Hackety Hack shoutout...

If I could find a copy of Windows XP, and someone who had a Mac, I'd have
installers done. Unfortunately, it's been a little hard to find people, even
for just what amounts to a recompile.

~~~
iamwil
Yes yes. :) I've not gotten around to it yet. Soon!

------
RyanMcGreal
My son wrote a program for school in grade 8 with Python and PyGame that
modeled mutation and natural selection among populations of predators and
prey. It was a great learning experience for him, and introduced him to:
classes and methods; inheritance; functions; datatypes; modules and
namespaces; cartesian geometry; for, if and try blocks; and so on. It was
challenging but not impossible for him to understand the stuff. Now he wants
to be a video game designer when he grows up.

------
techiferous
In order to accelerate learning, I believe it is best to try to learn one
concept at a time. That's why I like to introduce people to the LOGO
programming language if it's their very first programming language. It
introduces many basic concepts that we programmers take for granted, for
example:

* the fact that a computer will take everything you do literally and can't read your mind

* commands

* sequential iteration of commands

* loops

* conditionals

It's also easy to get quick results which keeps an early learner from getting
discouraged. Once the learner is bored with LOGO, then you take them to a more
powerful language. Ruby is nice because--even though it can get complex--you
can start off very simple.

I would recommend this book for learning Ruby as a first language:
[http://www.amazon.com/Learn-Program-Second-Facets-
Ruby/dp/19...](http://www.amazon.com/Learn-Program-Second-Facets-
Ruby/dp/1934356360/)

------
gcv
How about DrScheme? I can't imagine more direct, rewarding feedback than the
built-in graphics libraries. It's totally usable for games. It comes with a
solid development environment, with a good step-capable debugger.

~~~
techiferous
I would not recommend Scheme as a first language. The syntax is too far from
what we normally use, so it provides a barrier to learning.

Ruby:

    
    
      a = 7 * 8 + 10
    

Scheme:

    
    
      (let ((a (+ (10 (* 7 8)))))
    

Ruby:

    
    
      print "you are big" if height > 80
    

Scheme:

    
    
      (if (> height 80) (display "you are big"))

~~~
jrockway
Lisp:

    
    
       (loop for i from 1 to 10 collect i)
    

Ruby:

    
    
       [1..10].collect { |x| x }
    

But anyway, it turns out that people are not born with an inherent ability to
parse infix operators. Infix is just as arbitrary as prefix or postfix.
Anyone, even a kid, will figure the syntax out either way.

(Infix leads to confusing bugs, like "why doesn't 'foo < bar < baz' work?"
Prefix eliminates this ambiguity.)

------
mullr
Processing. It's simple, requires very little setup, and most importantly it's
FUN. You can give other people the things you made, and it works very easily
with cool stuff on your computer. (webcam, sound) You can do animations and
make simple games really easily. Spend a few evenings playing with it and I
think you'll agree.

------
Tristan-Leroux
I'd say Python too. It was the first language I ever tried and it was very
rewarding in terms of what I could do at such an early level. But I was a
couple of years older and very much into technology already. But I stand by
Python.

------
samc
He's in love with the idea of writing a game. He might not actually like
programming.

So, you need to start with something simple that will get him immediate
results. Which really means HTML these days as everything else needs umpteen
objects before you can see any results.

If he takes to it, you can then move to CSS and javascript. And if you get
this far then the leap to actionscript or python or whatever isn't that big
and you'll know that you have a good student,

------
sp332
Following hacker tradition, you should throw K&R at him and see if it sticks
:)

~~~
j_baker
You sound like my grandfather telling me how he learned to swim. :-)

------
cema
I second Javascript. It is widely and immediately available (even gui comes
for free), allows using and learning different styles of programming, can be
used to immediately write useful little programs, and scales up to moderately
sized projects.

Python is good too. Not always immediately available, but easy to install.
Other than gui (which would need to be learned), shares many advantages of
Javascript.

------
zaidf
HTML and Javascript worked for me.

Basic(4th grade) -> HTML(5th grade) -> Javascript hacking(using view
source)(8th grade) -> Visual Basic(8th grade) -> ASP(9th grade) -> PHP(11th
grade) -> Python(uni)

My personal learning route between ages 10 - 20.If I could change...

1\. I wish I had hopped onto PHP earlier.

2\. Also wish I didn't waste a huge chunk of time in middle school struggling
with Java.

------
derefr
I'm a game designer now, but I definitely wasn't back then; instead, I got my
start playing with scripting in RPG Maker. Kids, I think, don't want to make
new engines or mechanics; they mostly just want to create content to use with
their favorite pre-existing mechanics.

It didn't really ground me much into the why or how of what the game engine
was doing, though; today, I'd recommend playing with a genre-specific game
framework written in LÖVE—not least because learning Lua will actually count
toward your resume in the games industry, and because it's easy to distribute
on multiple platforms with no fuss.

------
metamemetics
definately python over javascript!

-interactive shell

-easy to debug

-lot of great simple graphics libraries too

-making 3d shapes is funner than div containers

For 3d shapes, <http://vpython.org> is a good simple library. He will be able
to figure out how to get balls rolling around in no time.

For a media library with sound for making 2d games, definately go with SFML
(simple fast multimedia library) over pygame: <http://www.sfml-dev.org/>

It's faster and also has versions for C, C++, .Net, D, and ruby, so if he
wants to learn one of those languages later he can try to port his game.

------
kochbeck
He's 11? By the time I was 11 I was pretty darn good in Z-80 Macro Assembler.
If he wants to make games, it's much better to get comfortable learning the
hard stuff first. At his age, learning to kick a sprite across the screen will
seem pretty... childish.

I've been reading the new edition of Jeff Duntemann's "Assembly Language Step
by Step." While I don't particularly like how he teaches hex (which is
terribly necessary to understanding Assembly), the rest of it made me think
that it was the book I wish I had when I was a kid.

------
extofer
Definitely start with Python. I found this great book
<http://www.manning.com/sande/> that is a good start regardless of age. In any
defense, read this article (Section: "The Pitfalls of Java as a First
Programming Language") to determine why learn with a language like Python
rather than Java.
[http://www.stsc.hill.af.mil/CrossTalk/2008/01/0801DewarSchon...](http://www.stsc.hill.af.mil/CrossTalk/2008/01/0801DewarSchonberg.html)

------
imok20
Make him a language: let me elaborate. Use Python or Ruby and write a library
of functions that he can call in particular ways that will make a "game." Let
him learn how they work, and let him dive into the source code and figure it
out and eventually make his own functions and classes and ... etc.

Discovery is the most rewarding part of learning to program, and having fast
payoffs is always nice to keep a kid interested. Worked for me (I started with
Logo around his age, but Python/Ruby is _way_ better.)

------
kungfooey
I suggest checking out this talk at Nashville's Barcamp '09.

<http://www.ustream.tv/recorded/2370164>

Christopher did a good job talking about his approach to teaching a group of
kids how to game. Syntax isn't as important at first - if you get them hooked
on something simple like processing (<http://processing.org/>), then they will
learn syntax later. Most kids just want to see results as quickly as possible.

------
jlsonline2010
Teach him Java J2EE, Spring, Struts 2, Hibernate, PL/SQL, and cure him of this
blight immediately. This is what I do daily and you don't want him to end up
like me :-)

I kid, of course. Probably the best thing to start with would be something
like Perl, Python, or perhaps even Lua. In fact, Lua might be something he
could even use in the gaming industry later. Whatever you do, don't introduce
the poor kid to C# and DirectX :)

edit - on second thought, follow the advice of others and teach him guitar

------
pingswept
diveintopython3.org + pygame

11 might be a little young (not for programming, but for what I've recommended
above).

------
alttab
Something with immediate results.

Mine were HTML, TI-83 Basic, and Visual Basic. All of these could get
something visible and interactive relatively quickly.

These days, I would say things like Javascript/Ruby/Python, while more simple
than C/C++/Java, still don't have a direct pipeline to results that matter
(for a learner).

Pygame would be my choice if ¥ou had to go the scripting route.

------
dan_sim
play guitar instead

~~~
cowmoo
Good advice.

After you have learned the basic open chords, scales and the fretboard notes,
and "Wonderwall" - and are bored with the strings. You could go always back to
silicon and build

a) an Arduino interface to an software/hardware mixer such as Ableton Live for
live mixing and improvisation

b) an machine-learning program that takes GuitarPro tabs of the entire catalog
of your favorite band and permute MIDI compositions/new guitar tabs based on
the band's style.

c) Program your own synth in Max/MSP.

d) Develop a real-time music note recognition software that tab/annotate the
chord changes, drum tabs, make music sheets for live online music jamming.

Also try to play the sitar/banjo/mandolin, there's already lots of guitar
players.

------
gcheong
This is an excellent series of blog posts about a father trying to teach his 6
year old son to program a simple game. Maybe you can draw some inspiration
from it.

[http://davidbau.com/archives/2005/07/27/a_programming_questi...](http://davidbau.com/archives/2005/07/27/a_programming_question.html)

------
roundsquare
Not sure if this is available, but is there a class near him which has kids
about the same age? Thats how I got started in programming. It was great
because the teacher knew how to teach kids and having other people around as
enthusiastic as myself created a great environment.

------
kls
I cannot believe that someone has not mentioned a LEGO Mindstorm yet. My 3
year old is already learning formal Logic with this and as a side effect he is
learning robotics. My 10 year old has already dropped the graphical language
for a C style language for robotics.

------
Sukotto
He might like Robocode <http://robocode.sourceforge.net/>

Teaches basic programming as a side-effect of trying to make your take kill
the other tank.

I haven't tried it, but what I've seen of it looks pretty interesting.

~~~
roryokane
You need to learn Java before you write for Robocode, which is a fairly big
task on its own.

------
jk4930
Okay, I throw something different in:

<http://en.wikipedia.org/wiki/BioBrick>

<http://2010.igem.org/Main_Page>

We'll see what kind of games he'll produce. :)

------
psawaya
Kind of obscure, but you might want to check out NodeBox. It's a bit like
Processing, but for python. <http://nodebox.net/code/index.php/Home>

------
rmason
There are two languages that would be a good first choice:

Ruby with the Ruby On Rails framework

CFML using the open source Railo with the CF on Wheels framework

Follow up second language would be javascript

------
j_baker
The Little Schemer: <http://www.ccs.neu.edu/home/matthias/BTLS/>

That's all you need.

------
d0m
I'd personnaly show him a bit of python and start him with small games. Sorry,
but I don't think scheme is the way to start for a kid.

~~~
j_baker
Why not? Lisp's grammer is much simpler than just about anything else. And
there's literally _decades_ worth of material on it.

~~~
cema
Lisp is clean and the grammar is simple, that is true. But many kids want to
see results as soon as possible, and there are languages (or rather systems
based on certain languages) where this can be achieved faster and easier.
Perhaps a lisp (scheme, specifically) may be a good first choice for a
mathematically inclined kid, or more likely a teenager. I think that most kids
would struggle with lisp.

------
Dilpil
XNA studio is nice because it comes with a finished game that you can edit,
and there's no pointer nonsense to get tripped up on.

------
qhoxie
Ruby and Shoes are a great pair to introduce people to code. Quick and elegant
results.

------
giardini
A hairshirt and a whip, possibly, or sackcloth and ashes. At least a good
talking to.

Seriously, by the time he's in college programming will likely be near the
bottom of the list of skills in demand. While programming has provided many a
good job for several generations, another field such as biotech or nanotech
would be better for the next generation.

