My 7-year-old son likes computer programming and I suspect has a lot of innate aptitude for it. We have worked out a system that for every X minutes of learning he does with me he gets X minutes of computer gaming time. What kind of learning exercises could help him be a better programmer when he becomes an adult? Should I focus on him doing lots of coding or, for example, would he be better served by learning additional math?
For those of you who are adult computer programmers (and please identify yourself as such in your response) what, if anything, could you have done at a young age that you think would have caused you to now be a better programmer?
I’m a hobbyist computer programmer considering a career in it.
When I was 6, I met a friend who was into star-trek and science and such. We used to talk about science stuff and dig up “dinosaurs” and attempt to build spaceships. I think a lot of my intellectual personality came from being socialized by him. The rest came from my dad, who used to teach me things about electricity and physics and microeconomics (expected value and whatnot).
I learned to program when someone introduced it to me and I realized I could make video games. (I was 18) I absorbed a lot of knowledge quickly, and didn’t get much done. I would find some little problem, and then go and absorb all the relevant knowledge I could to get it exactly right. Even tho I didn’t accomplish much, now I know a lot about computer science, which is helpful. Having some thing I was trying to do put a powerful drive behind my learning, even if I didn’t actually act in a strategic or effective way.
My dad occasonally told me the importance of finishing the last project before beginning the next, but I don’t think it properly transferred. I still have lots of trouble shipping.
One thing that bit me a lot was regressing into the deep wizardry tech instead of focusing on the end product. Architecture and tech are a lot more interesting than the mere surface of the product, but what matters is getting the thing done. The tech side is the dark side. Lots of interesting insight on this on prog21.dadgum.com (a blog)
I wish I’d encountered Paul Graham’s essays a lot earlier. They have a lot of good advice about programming and growing up in general. I caught a lot of my ambition from there. The wider hacker news community is great too. Really inspiring and helpful community.
Overall (TL;DR:) Teach him to ship. This is important. Start with trivially small things if you have to, but make sure stuff gets to version 0.1 (releasable) at least. Do what you can to encourage friendships with other smart kids who are into science. Find something he’s interested in and wants to build, or the rest of it will be directionless. Focus on the creative output, not on the tech. Get him reading interesting and inspiring battle-wisdom like paul graham and prog21. Don’t make him hate it.
Of all my flaws, I currently consider my bias to thought (and study, research, etc.) over action my greatest. I suspect that LessWrong attracts many (a disproportionate number of) such people.
I am a software developer, and have glimpsed over many similar questions. To summarize: There are enormous individual differences in how one can become a better programmer, and even more so on the opinions on it. It is not even easy to agree on what basic skills should be there at the “end” (i.e., the beginning, after your first two years real experience), much less on how to get those skills.
don’t expect too much skill carry-over: mathematical thinking and programming are related, but different activities
being able to concentrate for some time is good (a.k.a.: conscientiousness helps)
as a kid, liking the task probably also helps
playing the trumpet—not that much (though it can be fun)
On skill-set:
The practical coding skills are always important. (Except if you want to earn more than a dev.)
Algorithmic knowledge is rarely helpful, but you will stumble at least once if you don’t have it (but nobody will notice).
Mathematics is necessary only in very small areas.
What should I have done? Training self-discipline would have helped (if something like that is possible). Knowing/Having somebody who is actually significantly better than me, and pushing me, would have helped (fuckarounditis on “learning” is too easy to do).
My Opinion: In professional software development there is very little time to broaden your knowledge—it goes into obscure platform and domain knowledge quite quickly, and Jobs where you do what is actually interesting are in very short supply. However, exactly this broader knowledge is what can keep you afloat even if you happen to be neurotic, unreliable, slow worker*. So: Let him do what is most interesting, but gently guide him to do it just a bit better, and a little bit more diverse than he would otherwise. About interest: Many people say kids usually like somewhat quick results, and things that crawl. Maybe?
Preparatory learning exercises: Sorry, no opinion and idea here. I always liked to take things apart, and sometimes also to put them together (as in Lego Technik models, or—almost always unsuccessful—attempts to construct my own). Actually, I think constructing Lego models (or of course anything that is “more real”) is great. But then there is the initial caveat of individual differences.
One thing I have observed about people who are better programmers than me is that many play musical instruments. (I don’t.) I have no idea what sort of causal structure is involved here.
Learn off-sequence math: logic puzzles, geometric constructions, number theory (primes, modular arithmetic) that are not represented in the standard school math sequence.
Learn something of electronics, digital logic, etc.
Use different languages: maybe Python and Pygame for animations and games, and HTML and JavaScript for web pages. Don’t allow the idea to develop that there is one “normal” way for code to look, e.g. “normal languages have curly braces; ones that don’t are gratuitously weird.”
I’m an adult professional programmer. The gaming machine of choice when I was a kid was C-64, not NES, so I knew programming your own stuff was a thing at elementary school age. The obvious interesting thing with the computer was game programming. The (generally correct back then) received wisdom also was that any serious game programming effort with the 8-bit home computers involved assembly languages, but I wasn’t able to find any manuals or software I could understand to teach myself assembly, so I never ended up learning it.
A few years later the PC was the top gaming box, and assembly had given way to C (and Turbo Pascal, which was a big thing on DOS back then for some reason), I managed to learn C after a false start or two, and went off happily coding many stupid things I did not finish with it. So not much of a lesson here, not learning assembly at age 10 didn’t seem to slow me down much later, and it also turned out that I never did need to learn to program 8-bit microcomputers right down to metal to make games. Still, I’m sure it would’ve been interesting to learn that.
The big thing that made me learn programming was the intrinsic drive to want to program computer games. Any sort of achievement-endorsing authority figures were generally entirely indifferent to this.
The hard things in programming for me are also ones which I suspect are inherently boring. Working with legacy codebases, working on uninteresting features that are needed for business reasons, finishing the countless little things like documentation, ports and packaging so that something can be released, and in general going from the 80 % solution to the 100 % one. I guess I could echo nyan_sandwich’s admonition to teach shipping here.
I did waste some time writing unnecessarily bad C++ before I read Stroustrup’s book on the language, so I guess hitting the books early could help. I also crashed, burned and never recovered enough to have any degree of academic success with university level maths after basically coasting all the way through high school, but as far as I can tell, this hasn’t had much any impact with my programming skill. It did keep me from ending up in any kind of grad school, which I thought I would end up in when going to university.
So I guess my first choice of an experiment for 10-year-old me would be to hook him up to the present-day internet and teach him to download lots of textbooks on programming. I might worry a bit about a parental authority figure pushing the stuff extremely hard, since that might kill off the intrinsic drive which has been pretty important for me, but having some sort of mentor who knows the stuff and who you can bounce things off might also have sped things up a lot back then.
I do miss never learning how to make tracker music and not getting into the demoscene as a a teenager, so there are those. Tracker music is kinda programmy and could exercise the hypothetical music and programming skill connection. The demoscene thing is a general programmatic art competitive thing that will teach someone a lot about how to make a computer do tricky things if they get into it. The demoscene seems to be pretty much an European phenomenon, for some reason, and also a dying one, since fewer people who know about computers nowadays consider making them do intricate moving colors and sounds to be an impressive achievement.
Should I focus on him doing lots of coding or, for example, would he be better served by learning additional math?
IMO, definitely lots of coding. Lots and lots of coding. There’s a big aspect of craftsmanship in being a good programmer, and at least for now, solid craftsmanship and weak theory seems to beat solid theory and weak craftsmanship most of the time.
I’m a computer programmer who started at age 12. At that time, by far the coolest thing about programming for me was being able to write my own game. I was also motivated by math and algorithms, but more weakly, at least initially.
I would recommend balancing two things. First, settle on a simple framework that lets you do simple graphics in a simple language with minimum boilerplate. Maybe pygame (never tried it), or processing.js (good because it works right there in your browser), or some learning-oriented language (when I was a kid, Logo was popular, though I quickly moved on to BASIC; is there an analog of Logo for the 2010s?). Show him how he can draw something with three lines of code, get him fascinated, move the goalposts, iterate.
Second, more math but I would especially advise math puzzles of all kinds. Tricks with numbers, geometric constructions, logical puzzles. It’s great if you can find material of this kind for your son that he’ll want to consume on his own and not just because of the time-sharing scheme. Martin Gardner’s books may be useful, though probably a bit later on; and other material of such kind.
Note that I haven’t answered your last question because while the things I listed were helpful to me, I did them, and I don’t know what other, different things would’ve caused me to be a better programmer. I don’t even know if starting at age 7 would’ve caused that; I suspect it’s true, but don’t have a solid argument.
My 7-year-old son likes computer programming and I suspect has a lot of innate aptitude for it. We have worked out a system that for every X minutes of learning he does with me he gets X minutes of computer gaming time. What kind of learning exercises could help him be a better programmer when he becomes an adult? Should I focus on him doing lots of coding or, for example, would he be better served by learning additional math?
For those of you who are adult computer programmers (and please identify yourself as such in your response) what, if anything, could you have done at a young age that you think would have caused you to now be a better programmer?
I’m a hobbyist computer programmer considering a career in it.
When I was 6, I met a friend who was into star-trek and science and such. We used to talk about science stuff and dig up “dinosaurs” and attempt to build spaceships. I think a lot of my intellectual personality came from being socialized by him. The rest came from my dad, who used to teach me things about electricity and physics and microeconomics (expected value and whatnot).
I learned to program when someone introduced it to me and I realized I could make video games. (I was 18) I absorbed a lot of knowledge quickly, and didn’t get much done. I would find some little problem, and then go and absorb all the relevant knowledge I could to get it exactly right. Even tho I didn’t accomplish much, now I know a lot about computer science, which is helpful. Having some thing I was trying to do put a powerful drive behind my learning, even if I didn’t actually act in a strategic or effective way.
My dad occasonally told me the importance of finishing the last project before beginning the next, but I don’t think it properly transferred. I still have lots of trouble shipping.
One thing that bit me a lot was regressing into the deep wizardry tech instead of focusing on the end product. Architecture and tech are a lot more interesting than the mere surface of the product, but what matters is getting the thing done. The tech side is the dark side. Lots of interesting insight on this on prog21.dadgum.com (a blog)
I wish I’d encountered Paul Graham’s essays a lot earlier. They have a lot of good advice about programming and growing up in general. I caught a lot of my ambition from there. The wider hacker news community is great too. Really inspiring and helpful community.
Overall (TL;DR:) Teach him to ship. This is important. Start with trivially small things if you have to, but make sure stuff gets to version 0.1 (releasable) at least. Do what you can to encourage friendships with other smart kids who are into science. Find something he’s interested in and wants to build, or the rest of it will be directionless. Focus on the creative output, not on the tech. Get him reading interesting and inspiring battle-wisdom like paul graham and prog21. Don’t make him hate it.
Of all my flaws, I currently consider my bias to thought (and study, research, etc.) over action my greatest. I suspect that LessWrong attracts many (a disproportionate number of) such people.
I am a software developer, and have glimpsed over many similar questions. To summarize: There are enormous individual differences in how one can become a better programmer, and even more so on the opinions on it. It is not even easy to agree on what basic skills should be there at the “end” (i.e., the beginning, after your first two years real experience), much less on how to get those skills.
That said, most commonplace advice is valid here:
there is with high probability no really significant innate aptitude for programming (intelligence has a carry-over into many domains, however) (edit: seems I am wrong about that: See “Has “Not everyone can be a programmer” been studied?” at Programmers.StackExchange
don’t expect too much skill carry-over: mathematical thinking and programming are related, but different activities
being able to concentrate for some time is good (a.k.a.: conscientiousness helps)
as a kid, liking the task probably also helps
playing the trumpet—not that much (though it can be fun)
On skill-set:
The practical coding skills are always important. (Except if you want to earn more than a dev.)
Algorithmic knowledge is rarely helpful, but you will stumble at least once if you don’t have it (but nobody will notice).
Mathematics is necessary only in very small areas.
What should I have done? Training self-discipline would have helped (if something like that is possible). Knowing/Having somebody who is actually significantly better than me, and pushing me, would have helped (fuckarounditis on “learning” is too easy to do).
My Opinion: In professional software development there is very little time to broaden your knowledge—it goes into obscure platform and domain knowledge quite quickly, and Jobs where you do what is actually interesting are in very short supply. However, exactly this broader knowledge is what can keep you afloat even if you happen to be neurotic, unreliable, slow worker*. So: Let him do what is most interesting, but gently guide him to do it just a bit better, and a little bit more diverse than he would otherwise. About interest: Many people say kids usually like somewhat quick results, and things that crawl. Maybe?
Preparatory learning exercises: Sorry, no opinion and idea here. I always liked to take things apart, and sometimes also to put them together (as in Lego Technik models, or—almost always unsuccessful—attempts to construct my own). Actually, I think constructing Lego models (or of course anything that is “more real”) is great. But then there is the initial caveat of individual differences.
*: I might exaggerate a bit, but not too much.
One thing I have observed about people who are better programmers than me is that many play musical instruments. (I don’t.) I have no idea what sort of causal structure is involved here.
Learn off-sequence math: logic puzzles, geometric constructions, number theory (primes, modular arithmetic) that are not represented in the standard school math sequence.
Learn something of electronics, digital logic, etc.
Use different languages: maybe Python and Pygame for animations and games, and HTML and JavaScript for web pages. Don’t allow the idea to develop that there is one “normal” way for code to look, e.g. “normal languages have curly braces; ones that don’t are gratuitously weird.”
I’m an adult professional programmer. The gaming machine of choice when I was a kid was C-64, not NES, so I knew programming your own stuff was a thing at elementary school age. The obvious interesting thing with the computer was game programming. The (generally correct back then) received wisdom also was that any serious game programming effort with the 8-bit home computers involved assembly languages, but I wasn’t able to find any manuals or software I could understand to teach myself assembly, so I never ended up learning it.
A few years later the PC was the top gaming box, and assembly had given way to C (and Turbo Pascal, which was a big thing on DOS back then for some reason), I managed to learn C after a false start or two, and went off happily coding many stupid things I did not finish with it. So not much of a lesson here, not learning assembly at age 10 didn’t seem to slow me down much later, and it also turned out that I never did need to learn to program 8-bit microcomputers right down to metal to make games. Still, I’m sure it would’ve been interesting to learn that.
The big thing that made me learn programming was the intrinsic drive to want to program computer games. Any sort of achievement-endorsing authority figures were generally entirely indifferent to this.
The hard things in programming for me are also ones which I suspect are inherently boring. Working with legacy codebases, working on uninteresting features that are needed for business reasons, finishing the countless little things like documentation, ports and packaging so that something can be released, and in general going from the 80 % solution to the 100 % one. I guess I could echo nyan_sandwich’s admonition to teach shipping here.
I did waste some time writing unnecessarily bad C++ before I read Stroustrup’s book on the language, so I guess hitting the books early could help. I also crashed, burned and never recovered enough to have any degree of academic success with university level maths after basically coasting all the way through high school, but as far as I can tell, this hasn’t had much any impact with my programming skill. It did keep me from ending up in any kind of grad school, which I thought I would end up in when going to university.
So I guess my first choice of an experiment for 10-year-old me would be to hook him up to the present-day internet and teach him to download lots of textbooks on programming. I might worry a bit about a parental authority figure pushing the stuff extremely hard, since that might kill off the intrinsic drive which has been pretty important for me, but having some sort of mentor who knows the stuff and who you can bounce things off might also have sped things up a lot back then.
I do miss never learning how to make tracker music and not getting into the demoscene as a a teenager, so there are those. Tracker music is kinda programmy and could exercise the hypothetical music and programming skill connection. The demoscene thing is a general programmatic art competitive thing that will teach someone a lot about how to make a computer do tricky things if they get into it. The demoscene seems to be pretty much an European phenomenon, for some reason, and also a dying one, since fewer people who know about computers nowadays consider making them do intricate moving colors and sounds to be an impressive achievement.
IMO, definitely lots of coding. Lots and lots of coding. There’s a big aspect of craftsmanship in being a good programmer, and at least for now, solid craftsmanship and weak theory seems to beat solid theory and weak craftsmanship most of the time.
I’m a computer programmer who started at age 12. At that time, by far the coolest thing about programming for me was being able to write my own game. I was also motivated by math and algorithms, but more weakly, at least initially.
I would recommend balancing two things. First, settle on a simple framework that lets you do simple graphics in a simple language with minimum boilerplate. Maybe pygame (never tried it), or processing.js (good because it works right there in your browser), or some learning-oriented language (when I was a kid, Logo was popular, though I quickly moved on to BASIC; is there an analog of Logo for the 2010s?). Show him how he can draw something with three lines of code, get him fascinated, move the goalposts, iterate.
Second, more math but I would especially advise math puzzles of all kinds. Tricks with numbers, geometric constructions, logical puzzles. It’s great if you can find material of this kind for your son that he’ll want to consume on his own and not just because of the time-sharing scheme. Martin Gardner’s books may be useful, though probably a bit later on; and other material of such kind.
Note that I haven’t answered your last question because while the things I listed were helpful to me, I did them, and I don’t know what other, different things would’ve caused me to be a better programmer. I don’t even know if starting at age 7 would’ve caused that; I suspect it’s true, but don’t have a solid argument.
You might try getting him a shell account and have him learn to use tmux (or screen) and vim (or emacs).