The three hurdles the article describes are variable assignment, recursion, and concurrency. I don’t think you can program at all without those three elements.
Programming is interesting in that the difference between good programmers and bad programmers seems to be far more pronounced than the difference between people who are good and bad at other tasks—I recently observed about ten smart friends of mine trying to learn Haskell for a introduction to algorithms course. Some of them got it immediately and intuitively, and some just didn’t.
Also. I suspect that some people will find learning to program a bit easier with functional programming languages like Haskell. When learning Haskell, I wrote lots of simple functions, and acheived more complex results by stringing together lots of simple functions. In imperative languages, it’s a bit harder to test all the individual pieces as you’re going.
It’s to Saeed Dehnadi’s research. In 2006, Dehnadi and Bornat put out a paper purporting to “have discovered a test which divides programming sheep from non-programming goats. This test predicts ability to program with very high accuracy before the subjects have ever seen a program or a programming language.” The Coding Horror article, which was heavily linked and discussed in various forums, seems to have popularized this research quite well.
In 2008, the followup research on a much larger and more diverse set of students failed to confirm the effect.
And a 2009 followup showed mixed results.
These followups received substantially less widespread discussion than the original claim. My sneaking suspicion is that this may reflect not only the usual bias in favor of positive results, but a preference on the part of the programming community for the notion that programmers are a special class of people.
(Or it may just be that Coding Horror didn’t cover them.)
My suspicion is that such results reflect a failure of teaching.
Imagine that you are teaching people mathematics, and you skip some beginner lessons, and start with the more advanced ones. Some people will have the necessary knowledge (from home, books, internet, etc.), so they can follow you and improve their knowledge. Most people simply don’t understand what you are talking about. At the end of the year the test will show that there are two separate groups—those who know a lot, and those who have no clue.
Please note that the failure of teaching is not necessarily at the level where the problem was discovered. It may be a failure from previous levels. For example a university teacher may expect some really simple knowledge, but many high schools fail to teach it.
Also. I suspect that some people will find learning to program a bit easier with functional programming languages like Haskell. When learning Haskell, I wrote lots of simple functions, and acheived more complex results by stringing together lots of simple functions. In imperative languages, it’s a bit harder to test all the individual pieces as you’re going.
The type system of Haskell is quite restrictive for beginners (it’s a little annoying to not be able to debug by putting a print anywhere, or read user input wherever you want) and the laziness can be a little unintuitive, especially for people who haven’t done much mathematics (e.g. ones = 1:ones… “I’m defining something in terms of itself, aghafghfg”).
But, I do agree that functional languages might be easier to teach to certain groups of people, like those who have done a fair bit of maths, and that Haskell has some very neat features for learning to program (GHCi and Hoogle are awesome!).
The three hurdles the article describes are variable assignment, recursion, and concurrency. I don’t think you can program at all without those three elements.
Well, depending on what platform you’re using, you don’t necessarily need concurrency.
I don’t think you can program at all without at least one of the first two elements, but you can get by with only one or the other if you restrict your choice of languages.
That’s just for learning how to code, though; you’ll never get through first-semester CS with that kind of limitation.
This article suggests that something like 30% to 60% of people cannot learn to code. I think that’s interesting. EDIT: This also might be wrong; see child comment.
The three hurdles the article describes are variable assignment, recursion, and concurrency. I don’t think you can program at all without those three elements.
Programming is interesting in that the difference between good programmers and bad programmers seems to be far more pronounced than the difference between people who are good and bad at other tasks—I recently observed about ten smart friends of mine trying to learn Haskell for a introduction to algorithms course. Some of them got it immediately and intuitively, and some just didn’t.
Also. I suspect that some people will find learning to program a bit easier with functional programming languages like Haskell. When learning Haskell, I wrote lots of simple functions, and acheived more complex results by stringing together lots of simple functions. In imperative languages, it’s a bit harder to test all the individual pieces as you’re going.
This is the top link which the 2006 Coding Horror article is based on:
http://www.eis.mdx.ac.uk/research/PhDArea/saeed/
It’s to Saeed Dehnadi’s research. In 2006, Dehnadi and Bornat put out a paper purporting to “have discovered a test which divides programming sheep from non-programming goats. This test predicts ability to program with very high accuracy before the subjects have ever seen a program or a programming language.” The Coding Horror article, which was heavily linked and discussed in various forums, seems to have popularized this research quite well.
In 2008, the followup research on a much larger and more diverse set of students failed to confirm the effect.
And a 2009 followup showed mixed results.
These followups received substantially less widespread discussion than the original claim. My sneaking suspicion is that this may reflect not only the usual bias in favor of positive results, but a preference on the part of the programming community for the notion that programmers are a special class of people.
(Or it may just be that Coding Horror didn’t cover them.)
My suspicion is that such results reflect a failure of teaching.
Imagine that you are teaching people mathematics, and you skip some beginner lessons, and start with the more advanced ones. Some people will have the necessary knowledge (from home, books, internet, etc.), so they can follow you and improve their knowledge. Most people simply don’t understand what you are talking about. At the end of the year the test will show that there are two separate groups—those who know a lot, and those who have no clue.
Please note that the failure of teaching is not necessarily at the level where the problem was discovered. It may be a failure from previous levels. For example a university teacher may expect some really simple knowledge, but many high schools fail to teach it.
The type system of Haskell is quite restrictive for beginners (it’s a little annoying to not be able to debug by putting a print anywhere, or read user input wherever you want) and the laziness can be a little unintuitive, especially for people who haven’t done much mathematics (e.g.
ones = 1:ones
… “I’m defining something in terms of itself, aghafghfg”).But, I do agree that functional languages might be easier to teach to certain groups of people, like those who have done a fair bit of maths, and that Haskell has some very neat features for learning to program (GHCi and Hoogle are awesome!).
There’s unsafePerformIO :: IO a → a
Or, er,
Debug.Trace.trace
…I agree.
Well, depending on what platform you’re using, you don’t necessarily need concurrency.
I don’t think you can program at all without at least one of the first two elements, but you can get by with only one or the other if you restrict your choice of languages.
That’s just for learning how to code, though; you’ll never get through first-semester CS with that kind of limitation.