All teachers of programming find that their results display a 'double hump'. It is as if there are two populations: those who can [program], and those who cannot [program], each with its own independent bell curve.

Almost all research into programming teaching and learning have concentrated on teaching: change the language, change the application area, use an IDE and work on motivation. None of it works, and the double hump persists.

We have a test which picks out the population that can program, before the course begins. We can pick apart the double hump. You probably don't believe this, but you will after you hear the talk. We don't know exactly how/why it works, but we have some good theories.

Despite the enormous changes which have taken place since electronic computing was invented in the 1950s, some things remain stubbornly the same. In particular, most people can't learn to program: between 30% and 60% of every university computer science department's intake fail the first programming course.

Experienced teachers are weary but never oblivious of this fact; brighteyed beginners who believe that the old ones must have been doing it wrong learn the truth from bitter experience; and so it has been for almost two generations, ever since the subject began in the 1960s.

Answer: Another Study (41 Votes)

This paper describes an investigation into the viability of mental models used by novice programmers at the end of a first year Java programming course. The qualitative findings identify the range of mental models of value and reference assignment held by the participants. The quantitative analysis reveals that approximately one third of students held non-viable mental models of value assignment and only 17% of students held a viable mental model of reference assignment. Further, in terms of a comparison between the participants' mental models and their performance in in-course assessments and final examination, it was found that students with viable mental models performed significantly better than those with non-viable models. These findings are used to propose a more "constructivist" approach to teaching programming based on the integration of "cognitive conflict" and program visualisation.

A test was designed that apparently examined a student's knowledge of assignment and sequence before a first course in programming but in fact was designed to capture their reasoning strategies. An experiment found two distinct populations of students: one could build and consistently apply a mental model of program execution; the other appeared either unable to build a model or to apply one consistently. The first group performed very much better in their end-of-course examination than the second in terms of success or failure. The test does not very accurately predict levels of performance, but by combining the result of six replications of the experiment, five in UK and one in Australia, we show that consistency does have a strong effect on success in early learning to program—but background programming experience, on the other hand, has little or no effect.

Answer: Anyone can be a Programmer (7 Votes)

Consider how easily people grasp spreadsheets. Consider how readily Alan Kay introduces children to programming by means of experiment and exploration in a programmable environment.

People may study success in college-level courses and conclude "some people aren't fit to learn programming". However, such a conclusion severely oversteps the bounds of the observed evidence. How much failure could instead be attributed to how the programming is taught (too abstract?), or which style of programming is taught (too imperative?), or the programming environment (compilation, no immediate feedback?).

It is well understood that people grasp abstractions most readily after they've already worked with multiple concrete instances—i.e. that we cannot learn something until we almost already know it. Starting with the abstract, therefore, is an entirely foolish way to teach programming. Many people who stumble over premisconceived "mental models" would thrive if taught in a more concrete environment with real-time feedback (e.g. as in the Kahn Academy for CS) then encouraged to climb the ladder of abstraction when they are ready for it.

In some cases, it is the students that fail their classes. Intellectual laziness and willful ignorance will exist in any large group of humans. Smart folk are no exception, as anyone who has argued with a brilliant crank can attest. But, especially for programming and maths, it is often the classes that are failing the students.

Promoted Comments

Hmm... When I was working at a computer lab at my last college, I never failed to teach the "unteachable" students from the beginning CS classes. They were supposed to be learning Java, but there were always at least three students who didn't "get it."

My solution was simple; get them as far away from the computer as possible (since programing is not dependent of computers), and have them "program" a group of people by giving one instruction at a time to do things like pace a room, or throw a ball. I'd teach them loops and the like by doing this for about fifteen minutes. It was fun and simple.

After that, they'd be ready to Pseudocode, which meant they were ready to use Python. I'd have them write a working version of their homework in Python, THEN I would have them translate it to Java. Java was just too much as a first step (I will never understand the reasoning of teachers who introduce students to programming on anything other than Python). The problem was always that the class needed to be broken into smaller pieces that could be conquered, which in turn encouraged the once failing students. Victory is addictive.

A few weeks back I bumped into one of the students who I had helped a semester ago, and he had changed his major to Computer Science with an emphases in programing. He was loving it.

However, I feel that there really is a set of people who cannot learn programming. I'm a CS major, and some of my smartest friends just couldn't grasp the ideas of programming, no matter how many different ways I or the teacher would explain something, and our teacher was a really good one. He would go line by line for every example, which made it rather easy for people to grasp.

And on that note, I'm thoroughly glad that I am one of the people that learned to program. Its my passion and I can't think of me doing anything else with my life.

I am an artist and am very good at technical support. I can build a computer and mess with any kind of hardware any day of the week. I can 3D model in Maya which is very technical. I have tried to program in Java and the various C languages. I even tried MEL scripting. All of it confounds me and makes my brain hurt. I can draw almost anything but coding is so far beyond me it makes me sad. Such is life I guess. Some are made for it and some are not. The results of these studies do not surprise me at all. This is the reason that good programmers are head hunted straight out of college by any company that can get their hands on them. The competition is fierce to get them and it is fierce to keep them. And damn do they make the loot! More than 99% or artists that is for sure. I salute you coders. You rock.

Hmm... When I was working at a computer lab at my last college, I never failed to teach the "unteachable" students from the beginning CS classes. They were supposed to be learning Java, but there were always at least three students who didn't "get it."

My solution was simple; get them as far away from the computer as possible (since programing is not dependent of computers), and have them "program" a group of people by giving one instruction at a time to do things like pace a room, or throw a ball. I'd teach them loops and the like by doing this for about fifteen minutes. It was fun and simple.

After that, they'd be ready to Pseudocode, which meant they were ready to use Python. I'd have them write a working version of their homework in Python, THEN I would have them translate it to Java. Java was just too much as a first step (I will never understand the reasoning of teachers who introduce students to programming on anything other than Python). The problem was always that the class needed to be broken into smaller pieces that could be conquered, which in turn encouraged the once failing students. Victory is addictive.

A few weeks back I bumped into one of the students who I had helped a semester ago, and he had changed his major to Computer Science with an emphases in programing. He was loving it.

I struggled during my first year of Computer Science and to be honest I put that down partly to the way it was taught. Being taught abstract concepts during lectures, then being expected to apply those concepts in practical classes later did not really work.

I think the only way to properly teach programming is to teach the theory along with practical examples *at the same time*. It keeps students engaged, and allows them to relate the theory to real-life application right there and then. Teaching theory and practice separate is not the best method, in my opinion. It takes much longer to get your head around the fundamentals of programming, I believe.

I think that incompetent professors have a vested interest in believing that there are people incapable of learning how to program, rather than face the reality: that they, and their current methods of teaching programming, are terrible.

I know how to program, and I can tell you from reading programming textbooks, even introductory ones, that almost all of them suck.

Its probably true that there are people too stupid to learn how to program, but I'm pretty sure the actual problem, especially at the college level, isn't that people are too stupid to program, but that the teachers are too incompetent to teach.

Its like artists who believe that art is an inborn talent rather than a learnable skill.

Programming is very logical. If you can't think logically, you can program. But not everyone can think logically.

What bugs me about CS is the ever new introduction of languages. It seems like work for the sake of work. Of course, I'm the same person who is also baffled why they need to make new porno. Basically it has all been done. Write your apps, but let's cut out the new languages please.

I've met a number of electrical engineers who have ended up bit jockies. Again, it is a matter of being able to think logically. In many ways the physical sciences are simpler since the laws of physics are established. EE, ChemE, CivilE, etc. Get better with age. CS is much more dynamics since there are no physical laws to limit the scope.

Two more important factors are passion and determination. The rate at which individuals learn and their skill ceiling may vary but I believe the same thing. Have enough of the pieces on your side and anything can be learned.

I came into programming very late. I wouldn’t say I’m very skilled but considering how bad I am at math and my failed early education, I’m surprise I can write anything at all.

I think anybody can, at least those with the slight technical mind (non programmers) like me. Thing is most of it has to do with passion, no passion means no effort and no intuitiveness to learn it. I'm no proggy but I sure admire those who pump out apps and stuff in the masses up to the point where they are hired by the gov. Of course I wasn't targeting non power users or techies, those are way behind on this.

Anyone can program, not anyone can become a good programmer. Takes a certain kind of mind. Same with many of the work that is out there. I say it sometimes when I have spent hours of my days on people who just can't get the logical connections, some people just aren't cut out for X kind of work. Some people are people persons, I am not ... I don't care enough, but give me problems to solve and I am tenacious and can be brilliant. Remember someone's name....well I suck at that. My brother likes to smooze and remembers everyones name and will introduce and talk himself into all kinds of situations but he can't organize himself out of a paper bag.

This is like saying "anyone can sing". Which is roughly true, but doesn't change the fact that there are people who are enormously better than the average - and those folks are the only ones you'd ever hire as a singer.

I've been in meetings where a programmer is handed a 100+ page sheaf of pages for a code base he's never seen - and in the 15 minutes before the meeting starts, he's able to identify the race condition that's been bedeviling the other engineers for weeks. I've seen guys who glance over someone else's shoulder and can instantly pinpoint the code flaw they're unable to find.

And they're not once-in-a-lifetime geniuses. They're all over the place. They just 'get' the idea of programming in a way that everyone else doesn't seem to master. In a very real sense, the 'abstractions' you struggle over aren't even abstractions to them - they're just part of how the world works.

I am an artist and am very good at technical support. I can build a computer and mess with any kind of hardware any day of the week. I can 3D model in Maya which is very technical. I have tried to program in Java and the various C languages. I even tried MEL scripting. All of it confounds me and makes my brain hurt. I can draw almost anything but coding is so far beyond me it makes me sad. Such is life I guess. Some are made for it and some are not. The results of these studies do not surprise me at all. This is the reason that good programmers are head hunted straight out of college by any company that can get their hands on them. The competition is fierce to get them and it is fierce to keep them. And damn do they make the loot! More than 99% or artists that is for sure. I salute you coders. You rock.

I'm a programmer and fully understand that I have absolutely no artistic ability.

Oh man. I am a senior software engineer, so saying that everyone can be a programmer grinds my gears to say the least. Many people think that the beginner coding sights like Code academy or simplistic languages(which are not actually programming languages) like HTML, CSS, XML, even javascript (which even explains that it is a scripting language in the name ) and the like are not all that programming is. Even excluding assembly, which is rarely used by commercial purposes, higher level languages are very complex and include thousands of methods and even the most experienced programmer knows that there is always a better way of doing things.

There are some things the CS backgrounds will excel at and some that math backgrounds will. This alone should support the fact that not everyone can be a programmer. Hell, a debugger sometimes cant program worth a damn but are able to find mistakes that a experienced programmer would not.

To sum my rant up, just because something looks like programming does not mean it is. This is why web developers are called DEVELOPERS and not web programmers. (No offense intended with that statement, you guys are in fact artists, which I could never do.)

"The Camel Has Two Humps" idea has been pretty thoroughly discredited among educators in this area.

It isn't so much "can anyone program?" as it is simply that people have different talents in different areas. Programming is very similar to art or music, in that you can have an aptitude for it, but you can also be trained to the extent that you can do such things -- even if you'll never be world class at it.

From personal experience, I can definitely tell you that some people just do NOT get it, no matter how many different approaches, teachers, and tutors to which they are exposed. Is it that they can't program? I guess it depends on how you define "program".

If programming means using python to write simple scripts (with no flow control or logic), or creating spreadsheets with formulas, then yes, anyone can program.

If programming requires the use of flow control, logical constructions, and the use of data structures (C, java, python, whatever), then I have definitely observed that some people just don't get it. That doesn't mean they are stupid, it simply means their talents lie in other areas.

I teach programming, from introductory C/C++ and python to kernel programming, and regardless of experience, you see a huge gap in abilities. At this point in my career, I simply ascribe that to natural talent.

Programming is very logical. If you [del]can’t[/del] can think logically, you can program. But not everyone can think logically.

Analytical thinking can be learned as well. The real question is motivation. Individuals who think they can’t learn something is because they don’t really care enough to stick to it and give up early.

Probably this ^^

I'm probably not a good programmer(not claiming great) because I was born this way, but because I was born interested in problem solving. Constantly exercising the brain by reading of problems and making up hypothetical ones makes me better than someone who has no interest.

People do tend to be good at what they enjoy, but not everyone can get what they enjoy to line up with their work.

Programming is very logical. If you can't think logically, you can program. But not everyone can think logically.<...>

Amen to that. It's true even for people who otherwise pass as smart.

I don't buy the arguments about poor teaching. A couple of books should be enough. Nowadays there are quite useful courses for beginners (Codecademy springs to mind). If you cannot learn how to program by yourself, there's no point in anyone teaching you (teaching would speed up and steer the process otherwise, so I do see its advantages).

No doubt there are prodigies, people wired to think about things differently or more quickly than others.

But programming isn't just one discipline. Saying a person "can't program" is like saying he can't build a house. There is a lot of foundation skill and knowledge that goes into being able to successfully build a house. I would think the only way forward is to identify a more specific deficiency than "unable to build a house" and correct that with appropriate study and training. I suspect that applies to programming as well, and that most people can at least achieve competency. By definition any prodigal programmer is going to necessarily be well above average in capability, but thankfully one doesn't have to be a prodigy to find work.

Do you also believe that anyone can be a medical doctor or a baseball player (I intentionally picked a sport that doesn't require bulk or height)?

Some people's brains just don't function in the way required for programming of any sort (computer science, statistical analysis, etc.). You can give them all the quality training in the world but there's a subset of people who won't succeed at it--same as being a doctor or baseball player. For me, I'll never be a good painter or singer, no matter how hard I try at it.

I'm probably not a good programmer(not claiming great) because I was born this way, but because I was born interested in problem solving. Constantly exercising the brain by reading of problems and making up hypothetical ones makes me better than someone who has no interest.

People do tend to be good at what they enjoy, but not everyone can get what they enjoy to line up with their work.

I think this is true of a lot of fields - people who are interested in the field do better than many others because they spend more time working at it.

One reason Asian and some eastern European countries produce a lot more people trained in higher math is because this is assumed to be something that every educated people can learn and consequently their schools spend a lot more time teaching it...and most students tend to believe that they can learn it if they just put in enough hours. Which turns out to be true.

In the US and other western countries, people are sorted pretty quickly by aptitude and beyond a certain point can avoid learning too much math. Or have to do too much writing. Or can avoid learning foreign languages.

Programming is very logical. If you [del]can’t[/del] can think logically, you can program. But not everyone can think logically.

Analytical thinking can be learned as well. The real question is motivation. Individuals who think they can’t learn something is because they don’t really care enough to stick to it and give up early.

Probably this ^^

I'm probably not a good programmer(not claiming great) because I was born this way, but because I was born interested in problem solving. Constantly exercising the brain by reading of problems and making up hypothetical makes me better than someone who has no interest.

People do tend to be good at what they enjoy, but not everyone can get what they enjoy to line up with their work.

You probably enjoy it because that is how your brain works. Having trained many many people and analysed the pattern. Watch how people work and how they get connections. Motivations is a BS answer to this by anyone who has actually trained people. I understand myself and how my brain works and know that I am not as good as my wife at many things, my brothers are better at many things than me but at certain things I am far superior...I can simplify things down to very simple levels and rebuild things from there making adjustments and keep things coherent. This is probably my greatest gift as few people can do this. You can't train someone to be able to do this. It is how my brain is laid out, I can remember minutia about so much, I have a place to put it in context made by rules and understandings...but remember the words to a song I have heard a hundred times...not much of a chance, but I have a friend that is very good at remembering from one or two hearings.

I agree. I think anyone who it relatively mentally competent can learn the basics of programming, although they may need special kinds of instruction and may have to be taught the mental pattern to apply first.

But the aptitude for logically thinking to produce effective code in a reasonable amount of time 40+ hours a week for years on end? No, I don't think anyone can just do that. You have to naturally think in extremely logical forms and enjoy the mental process on some level to do it.

On the reverse side, I've learned to switch gears and rearrange my mental patterns to solve a non-programming problem, but it's tiring, and left on my own my brain slides back into it's normal groove. I couldn't be an artist day-in-and-day out, for example.

Granted, I've known several "professional" programmers who couldn't "produce effective code in a reasonable amount of time" at all, but they were good at faking it and getting other people do so their work and made a lot of money... which is an entirely different skillset.

Antone who can hold down a job can programming. These days, doing a job is performing the procedures some manager has laid down for you. If you can follow a procedure, that is, do your job, you can program. Programming is nothing more than writing down procedures.

I suspect that the human brain is very malleable, especially by its owner. I think that it takes a certain kind of mind to program, and most people don't have what it takes. However, I think they could get it if they wanted to and had the resources available.

I think we just don't know how people learn to program. Once we understand how it's learned we can start to teach it.

I'm conflicted about this one. Clearly, there appears to be two populations, but I'm not at all sure enough different educational strategies have been tried to conclude that one of them can't really learn it. All other learning strategies could fail... right up until one succeeds.

There well may be an intrinsic difference, but I think there is possibly just a mistake or lack in people's initial mental model of computation that isn't corrected well. For example, often I hear about people saying that the problem is that programming is taught at too low of a level at first, but my experience has been the opposite: I think perhaps the problem is that it is often taught at too high a level at first, especially to those who are not CS majors.

Specifically, I attribute a lot of my personal programming success to the fact that one of my earliest programming experiences was in machine code on an 8-bit processor with 2k of memory (a Cosmac VIP, if anyone has ever heard of one of those). An 8-bit computer with 2k of memory is capable of being almost completely understood by a student, so they can see what is really going in an entire computer system, and that model helps massively in all future learning, as you slowly learn how higher levels are built upon the lower levels (wider buses, virtual memory, I/O etc).

The reason I think this is so critical is that the semantics (especially passing conventions, like value vs. reference) of *all* high-level languages are carefully constructed at some level to be efficiently executable on actual hardware, and many confounding and subtle language features depend on understanding that model, and thus to some extent how the code is executed by the hardware.

For example, the fact that most common data types and their passing semantics are chosen based on the concept that the underlying computer has a natural word size that can be copied as a constant, minimum-time atomic primitive affects many language's semantics in profound ways. We assume that small integers and pointers etc can be manipulated and copied in small constant, atomic time, but that larger structures like arrays cannot, and that affects default passing semantics in many, many languages. If you don't understand how those data structures are laid out in memory and manipulated, you will never really "get it".

So I think the difference between the two populations is the difference between the ones that have at least an approximate, simplified model for how the code is actually being executed by the hardware, and those who aren't really aware of the underlying computational model and try to take the high-level language for what it is worth on its own terms (which in my experience is a laudable goal but a large mistake).

Antone who can hold down a job can programming. These days, doing a job is performing the procedures some manager has laid down for you. If you can follow a procedure, that is, do your job, you can program. Programming is nothing more than writing down procedures.

If that is what you are doing for a living, I've got some bad news for you: you aren't a real programmer.

However, I feel that there really is a set of people who cannot learn programming. I'm a CS major, and some of my smartest friends just couldn't grasp the ideas of programming, no matter how many different ways I or the teacher would explain something, and our teacher was a really good one. He would go line by line for every example, which made it rather easy for people to grasp.

And on that note, I'm thoroughly glad that I am one of the people that learned to program. Its my passion and I can't think of me doing anything else with my life.

I still laugh a bit when reading it knowing some don't get it...

And when it comes to programing everyone can program but not everyone can be a great programmer due to several reasons one of the basic ones is lack of interest...But then there is some other ones like lack of any grasp of logic (know a few of those) and grabbing things like what you actually can do, like writing massive things like an OS etc...

Myself I'm not anywhere near a good programmer I just grasp the basic, however I started late and have so far not found any direct interest in programing either, I prefer use of programs and "hippie" things like drawing witch I'm at least somewhat better at

No doubt there are prodigies, people wired to think about things differently or more quickly than others.

But programming isn't just one discipline. Saying a person "can't program" is like saying he can't build a house. There is a lot of foundation skill and knowledge that goes into being able to successfully build a house. I would think the only way forward is to identify a more specific deficiency than "unable to build a house" and correct that with appropriate study and training. I suspect that applies to programming as well, and that most people can at least achieve competency. By definition any prodigal programmer is going to necessarily be well above average in capability, but thankfully one doesn't have to be a prodigy to find work.

Anyone can get knowledge, but a good "programmer" knows how to apply knowledge. This applies to any skill, even house building.

I know many people who are book smart, have every thing memorized, and can replicate anything discussed in the book; but they have no ability to solve a problem that is not already solved in a book.

I'm not a very book smart person when it comes to technical terms or exactness, but I can apply ideas and work with abstracts very well. I don't think myself "smarter" than someone who is book smart. Instead I find myself wanting to work with book smart people as we complement each other.

I suspect that the human brain is very malleable, especially by its owner. I think that it takes a certain kind of mind to program, and most people don't have what it takes. However, I think they could get it if they wanted to and had the resources available.

I think we just don't know how people learn to program. Once we understand how it's learned we can start to teach it.

In "The Real World", there are people (at work, etc.) who will say "Show me how to..." and as soon as you begin explaining by example, they will either: 1, walk away and talk to someone in another part of the building. 2, Go to the bathroom, or breakroom. 3, Walk outside and smoke a cigarette. 4, Call a spouse, child or other relation on the cellphone. I stop and walk away as soon as they are out of sight. When they return later and ask "Did you finish that?" I reply "No, I was waiting for you to return so I could finish explaining what you asked me to show you." (I really enjoy the totally pissed expression on their face!)Then there are people who say: "I want to understand how to..." THEY are the people who are intelligent enough to learn programming/electrical theory/chemistry/financial derivatives (whatever the hell they are)/etc./etc.The "Show Me How's" just want to know what buttons to push to impress their friends, relatives, boss, whatever.The "I Want To Learn" really, really want to learn.

Not everyone can be a violinist or a mechanic or singer or ballet dancer or mathematician ... Why do people insist that somehow programming is different? It's another discipline like any other and you have the knack for it or you don't.

Personally I don't think it's as black and white as you can program or you can't. It's more likely that pretty much everyone could learn to program, but that some people are better suited to it either because they're better at visualising the problems that a program might be used to solve, better that finding the algorithms involved, and so-on.

i.e - you could teach nearly anyone how a for-loop works, variables etc. And they could probably construct solutions to most anything you give them given that they understand the problem and have learned enough of a language/platform. The real distinction is in how someone solves a problem, or more specifically, how well they solve it, which requires breaking the problem down, reducing it to algorithms and simplifying into the best solution, that kind of thing. A bit of a dirty summary, but you get the idea.

Even then, I expect most people can follow any well established process for that, so even that distinction is a bit vague. I'd say though that for some people the processes are going to be more intuitive or even, sort of, instinctive, while for others they may have to work harder at it. This doesn't necessarily mean the latter type will be worse, or aren't true programmers, but more that they're less likely to find it something they want to do, and I think that wanting to program is far more important than being able to, as a programmer can have all the skill in the world, but if they're not enthusiastic about something then the result may be technically proficient, but may not be arrived at quickly, or be the best that it can be.

I mean, it's nearly impossible to teach someone something they're not interested in, and even once it's learned, if you don't have the motivation then proficiency won't make it all that much easier. But someone with no skill but a project they care about can learn, and often will provided they have access to the resources they need such as a language that suits them, and methodologies that fit their style of working, both of which aren't hard to find given the number of each out there today.

Not everyone can be a violinist or a mechanic or singer or ballet dancer or mathematician ... Why do people insist that somehow programming is different? It's another discipline like any other and you have the knack for it or you don't.

Anyone who can cook, can program. But that's not to say that everyone can be a great cook, er, programmer. And yes, anyone can be a violinist or a mechanic or singer or ballet dancer or mathematician.

The main reason there are two bumps in the population of students learning programming is that one group likes to program and the other doesn't think they can. If you think you're going to failure, you are correct; you will.