My post from last week that asked "Is programming easy to learn?" has generated a bit of discussion both in the comments and offline. I've had some discussions with a number of college computer science faculty recently in face to face meetings where the subject came up. OK I brought it up. But I am really interested in hearing what people who teach programming really think about natural programming ability.
The thing is that I really want to think that everyone can learn how to program. Others I have talked to think that programming is a gift, a talent, something that one either has the natural ability to learn programming or they don't. One manager I worked for many years ago claimed that he could teach "any monkey" how to program. Perhaps the truth lies somewhere in the middle.
One professor I talked to said that she believes that some people have a natural ability to learn programming. Some people have something in their makeup that makes it almost impossible to learn programming. The great majority, she believes, are teachable and can learn how to program. She may be on to something there.
Some people really do take to programming. One explanation and they "have it." They quickly grasp the most complicated aspects of programming and soar past even their instructors. A natural mental gift? Perhaps. Some people really struggle with the concepts. They may be very smart and knowledgeable (or not) in other areas but somehow they really struggle with the concepts. And then there is the great majority in the middle.
I want to believe that everyone is teachable. I guess it must be the teacher in me. I think that if we just find the right way to explain things people will "get it." If someone doesn't get it I want to ask "what did we do wrong in the teaching?" Of course students have to do their part. You can't make people learn something if they don't want to learn it. Incentive and motivation are something teachers can't always control. Well not as much as we'd like.
On the other hand I have run into more than a few programmers who like the exclusive "I'm special" feeling that they get by believing that programming requires a special talent - an ability that most people don't have and only a few people are gifted with. This is a pretty elitist attitude that brings back memories of the early days when computers lived in closed in raised floor environmentally controlled "temples" and were served by "high priests" of technology whose behavior was uncontrolled and unquestioned. Some people call those the good old days and wish for a return to that era.
I think that the days when the naturally gifted programming elite were enough to get us by are long gone. These days we have to train as many people are possible and help them progress as far as possible. Programming is a lot of fun, it is a great way to make a difference in the world. Working on different and better ways to train the majority of people who can learn is something we really need to do.
I'm not sure it's as simple as "you get it" or you won't ever.
I have tried on and off for about 14 years to learn to write code. I've tried Java, C (Plain/++/#), Pascal, Cobol, Basic (Plain/Quick/Visual) and even Assembler once.
I can't "get it."
However, none of those efforts was what one could or should consider a concerted effort. I didn't take any classes for those languages. I didn't get into a specific study course to try to make it happen. It was more just haphazard fits of misguided attempts.
I think I could "get it" if I took classes or specific courses.
But I don't think I'd ever be that good.
I have a couple good friends who are both developers. I think they "get it."
I tend to agree with the professor that it is somehwere in between. I've met many people who have never programmed before who on first exposure seem to just "get it". I've met others who have been coders for years that still don't "get it".
As to the question of nature vs nurture, who knows. I will say that in some of these cases the experienced coder has had formal "training" wheras the newbie has not. This of course raises the question of how effective the training was, but that's another story.
From personal experience, I tend to think that class distribution is like a bell-curve. One student really "gets it", two are beyond all hope, and the rest are in the middle.
Though to counter that, I also know of one highschool (Massey, in Windsor, Canada) that has a phenominal number of "get it" students in comparision. I think it has to do with the fact that the teacher is very involved with his students, to the point of frequently visiting an online forum on related programming discussions, and helping his students out after school hours. Go figure.
My personal theory is that programming is very logical in theory, but has to be expressed creativly in practise. Such a cognitive mix might make a select few more capable of "getting it" faster.
Though with the above example, it shows that with enough interest even the regular masses can excell.
I believe it takes two things to learn any skill -- innate ability and will. There are some things, such as music, where having little innate ability but a great deal of will, will allow someone to be competent.
It's the innate ability that brings someone past competent to brilliance. But you still have to have the desire to become brilliant.