The camel has two humps. A test for programming aptitude.
scribd.com
scribd.com
Maybe colleges would stop forcing people to take intro programming courses if they believed that and just skip to the more interesting language design courses.
Oh, and the pdf link: http://www.cs.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf
In physics, now, we know better. We can teach it. I'm sure they'll figure it out in programming, too.
We were planning to use grades as a better way to evaluate teaching quality. When it didn't work, the professors (1) decided to go back to student evaluations rather than admit their job didn't matter.
(1) The people in charge of undergrad teaching were faculty not actively doing research, but who did have an interest in teaching well.
- assignment and sequence
- recursion / iteration
- concurrency
I don't know about the rest of the paper, but I can anecdotally but strongly confirm these observations from trying to help a bunch of people through programming courses at university - luckily "only" maths & physics students, not future programmers. A lot of people were just completely baffled by assignment and iteration. (I don't think they got as far as recursion, and concurrency would have broken their brains; presumably not for lack of intelligence, these were people who were doing well in maths & physics)
I wonder if programming courses would be better if they were sufficiently built around those hurdles, taking them one at a time? Courses I've attended (had to attend) or observed always struck me as wrong, as they confused people about syntax and semantics, and rushed assignment operations. Presumably because "it's only an equals sign". If you don't understand assignment, a 'for' loop must make no sense at all.
I don't know, maybe courses elsewhere are better. Maybe I'm not a good judge of course quality, as I attended all of them when I was already a competent programmer. (damn you, compulsory modules!)
Of course I understood the concept of doing something x times with increasing counter, but I couldn't see the clear relation between what I wrote and what it did. It seemed a bit magic and I wanted to "truly understand" it before mapping the concept to syntax. It seemed too arbitrary to me to rely in my thinking on such magic.
My strategy was to unloop every loop I saw. It was ridiculous, I didn't have enough resources to keep even smaller loops in mind and I quickly forgot them. After few days I just gave up and committed it to my memory. Only then I felt that I truly understand.
I think I tried programming skipping this step but I just got irritated and really unsure if what I'm doing makes any sense. I remember it being the same with recursion, except a bit more mind-boggling. Now every time I try to understand something similar I try to reduce it to simplest case and just commit it.
I suppose other people may be unaware of what is actually keeping them from understanding and never get that far.
I had a similar transition of just writing all my code in one big block for a while, versus factoring stuff out into functions. And then putting stuff into data structures rather than primitive variables and arrays. Then, fully understanding the stack. And pointers.
Oddly enough I never had any trouble with recursion, although I have to say I probably encountered it somewhat later than iteration, at which point I was already very comfortable with the basics. (I only had access to very basic programming books and tools early on - internet? forget it) I guess I had the freedom of having no direction whatsoever and learning this stuff really slowly, something you don't have when taking a course at university. The optimal path is somewhere in between, for sure. I've done a fair bit of un-learning.
I wonder if this is harder today - the temptation of copy & paste coding is there. I've never been especially fast at typing, so typing more than a couple of lines from a book was probably harder than figuring out how the code in the book worked and how to adapt it without much trial and error. Cue comment from someone who learned to program with punch cards. (or twiddling switches...in the freezing cold...at the top of a mountain)
At least I know I'm not alone in thinking that best programmers are those who simply love what they are doing. However sentimental this may sound, there's nothing else that distinguishes outstanding engineers from good ones; there's nothing else that can predict the most important career dilemma in every programmer's life: to be a coder forever or to abandon coding for management and... UML.
And thanks for the post, enjoyed reading it very much.
Are we really going to state, as educators, that some people just aren't cut out for thinking rationally?
This doesn't mean that they can't learn programming. It means that they would be much better off focusing on their strengths instead. There's a difference between "can't do it" and "fails course" as you rightly suggest.
Sarcasm?
Speaking as a sometime educator, I think you can afford to lose the last word.
Citation - Second comment by the blog's author Mark Guzdial: http://www.amazon.com/gp/blog/post/PLNK3LAWVXC1EE119
I guess I must have just been "born rational", if you're going to equate programming ability with rationality.
But what makes you think that the "programming gear" I had - the quality of a born hacker, by which the first time we look at any piece of code, anywhere, any time in our life, at any age, we instantly know how to program - is equivalent to "rationality"? Or even "intelligence"?
There are physicists who cannot learn to program, apparently. This shocks me. But if I can learn to program at age five without instruction, and a physicist cannot learn to program with instruction, that makes it pretty darn plausible to me that yes, there is a "programming gear".
PS: How the hell can you be a physicist and not be able to write computer programs? WTF, human brain?