How to best teach programming—a comment from Hacker News
This comment from slashdot bubbled up on Hacker news a few days ago:
Re:Depends on who is hiring (Score:5, Insightful)
by wrook (134116) on Tuesday May 31, @01:44AM (#36293622) Homepage
A bit off topic, but you triggered something I’ve been thinking about for a couple of years. That “spark” is fluency.
I swtiched jobs from being a computer programmer to being an ESL teacher in Japan. Japan is somewhat famous for churning out students who know a lot *about* English, but can’t order a drink at Mac Donald’s. We used to have a name for those kinds of people with regard to programming languages: language laywers. They can answer any question you put to them *about* a programming language, but couldn’t program to save their life. These people often make it past job interviews easily, but then turn out to be huge disappointments when they actually get down to work. I’ve read a lot about this problem, but the more I look at it, the more I realise that these disabled programmers are just like my students. They have a vocabulary of 5000 words, know every grammar rule in the book but just can’t speak.
My current theory is that programming is quite literally writing. The vast majority of programming is not conceptually difficult (contrary to what a lot of people would have you believe). We only make it difficult because we suck at writing. The vast majority of programmers aren’t fluent, and don’t even have a desire to be fluent. They don’t read other people’s code. They don’t recognise or use idioms. They don’t think *in the programming language*. Most code sucks because we have the fluency equivalent of 3 year olds trying to write a novel. And so our programs are needlessly complex.
Those programmers with a “spark” are programmers who have an innate talent for the language. Or they are people who have read and read and read code. Or both. We teach programming wrong. We teach it the way Japanese teachers have been teaching English. We teach about programming and expect that students will spontaneously learn to write from this collection of facts.
In language acquisition there is a hypothesis called the “Input Hypothesis”. It states that *all* language acquisition comes from “comprehensible input”. That is, if you hear or read language that you can understand based on what you already know and from context, you will acquire it. Explanation does not help you acquire language. I believe the same is true of programming. We should be immersing students in good code. We should be burying them in idiom after idiom after idiom, allowing them to acquire the ability to program without explanation.
I’m not sure these are the most profound thoughts ever written about teaching computer science, and it’s been a while since I tried to formally teach the subject myself. But it does seem like a good idea to spend more time having students read and interpret good code, rather than just throwing them into to write their own code. As I’m starting to develop this curriculum for teaching computational modeling, I’m very interested in helping students to understand not just physics, but also computational thinking and good practices in computer science.
I know there are a number of great computer scientists out there who occasionally read this blog, so I’d appreciate any feedback in how to proceed.