?

Log in

No account? Create an account
Adventures in Engineering
The wanderings of a modern ronin.

Ben Cantrick
  Date: 2006-07-14 16:07
  Subject:   [Digg] "High IQ" does not imply "good programmer."
Public

Programming teachers, being programmers and therefore formalists, are particularly prone to the ‘deductive fallacy’, the notion that there is a rational way in which knowledge can be laid out, through which students should be led step-by-step. One of us even wrote a book which attempted to teach programming via formal reasoning. Expert programmers can justify their programs, he argued, so let’s teach novices to do the same! The novices protested that they didn’t know what counted as a justification, and Bornat was pushed further and further into formal reasoning. After seventeen years or so of futile effort, he was set free by a casual remark of Thomas Green’s, who observed "people don’t learn like that", introducing him to the notion of inductive, exploratory learning.

There is a vast quantity of literature describing different tools, or as they are known today Interactive Development Environments (IDEs). Programmers, who on the whole like to point and click, often expect that if you make programming point-and-click, then novices will find it easier. The entire field can be summarised as saying "no, they don’t."


http://www.cs.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf


This paper starts out with the amusing factoid that normal measures of intelligence and motivation are absolutely lousy predictors of computer programming ability.

Good programmers, this paper says, are good because they have a deep understanding of how their language and machine work. They have a "mental model" of how the compiler and CPU work, and can test potential code in their head against this model, before writing it. And when it doesn't work, they know what assumptions they made about the compiler and the machine, so they can check those assumptions and see where they went wrong.

Apparently natural language aptitude helps you be a good programmer too. It's hardly surprising to hear that someone who's good at translating their thoughts to verbal language is also good at translating their thoughts to more formal, structured programming languages. Also, good programmers often tend to think "bottom up" - considering the individual problems that need to be solved first, before thinking about the overall structure of the program.

I haven't had time to read the whole paper, but to me these conclusions suggest that perhaps we need to start programmers learning by teaching them (at a high level) how a CPU works, then moving on to some kind of ultra-simplified assembly language, then move to a very simple course on how a compiler works, and only then introduce them to some kind of more structured programming language. The aim of all this being to encourage them to develop that mental model of how things are working underneath the hood, and allowing them the necessary time to build up the layers of complexity while still having a good understanding of each layer. Also, a more scientific style "identify assumption - test assumption - check result" method of debugging might be usefully taught.
Post A Comment | 12 Comments | | Link






Triggur
  User: triggur
  Date: 2006-07-14 17:18 (UTC)
  Subject:   (no subject)
+5 Insightful
Reply | Thread | Link



Ben Cantrick
  User: mackys
  Date: 2006-07-14 17:48 (UTC)
  Subject:   (no subject)
Digg is the new Slashdot!
Reply | Parent | Thread | Link



Triggur
  User: triggur
  Date: 2006-07-14 17:55 (UTC)
  Subject:   (no subject)
Honestly, I could never stomach /.
Reply | Parent | Thread | Link



Ben Cantrick
  User: mackys
  Date: 2006-07-14 17:58 (UTC)
  Subject:   (no subject)
They find a good story once in a while. Stopped clock being right for two minutes of any given day and all that.
Reply | Parent | Thread | Link



Kyle Hamilton
  User: aerowolf
  Date: 2006-07-14 17:22 (UTC)
  Subject:   (no subject)
Programming teachers, being programmers and therefore formalists, are particularly prone to the ‘deductive fallacy’, the notion that there is a rational way in which knowledge can be laid out, through which students should be led step-by-step.
...
I haven't had time to read the whole paper, but to me these conclusions suggest that perhaps we need to start programmers learning by teaching them (at a high level) how a CPU works, then moving on to some kind of ultra-simplified assembly language, then move to a very simple course on how a compiler works, and only then introduce them to some kind of more structured programming language.

+5 Hilariously Hypocritical
Reply | Thread | Link



Ben Cantrick
  User: mackys
  Date: 2006-07-14 17:51 (UTC)
  Subject:   (no subject)
Yeah, I figured that someone was going to ding me for that...

Basically what trying to say is use more of a cookbook approach. Try a little of this, a little of that. Make people broad before you make them deep.

I'm not trying to reduce learning to a set of memorized rules. Exactly the opposite, in fact.
Reply | Parent | Thread | Link



Kyle Hamilton
  User: aerowolf
  Date: 2006-07-14 18:18 (UTC)
  Subject:   (no subject)
Basically, instead of expecting people to be Julia Child, expose them to Alton Brown? :)
Reply | Parent | Thread | Link



Ben Cantrick
  User: mackys
  Date: 2006-07-14 18:47 (UTC)
  Subject:   (no subject)
I think that's a good analogy, yeah.
Reply | Parent | Thread | Link



MegaZone
  User: zonereyrie
  Date: 2006-07-14 23:57 (UTC)
  Subject:   (no subject)
Seems bloody obvious to me.

In my experience those with an understanding of the fundamentals are the best developers. They're flexible and can switch languages, platforms, etc. They learn how to apply the concepts to the particulars of whichever environment they're in.

Those who learn one way to do things, especially just one language's way to do things, and have little to no understanding of how the magical incantations translate into real work, are worthless when they have to do anything outside of their training.
Reply | Thread | Link



Ben Cantrick
  User: mackys
  Date: 2006-07-15 00:07 (UTC)
  Subject:   (no subject)
Just not obvious enough to hammer through the skulls of most Computer Science professors at many major universities...
Reply | Parent | Thread | Link



MegaZone
  User: zonereyrie
  Date: 2006-07-15 00:11 (UTC)
  Subject:   (no subject)
Those who can, do.
Those who can't, teach.

(I know, there are always exceptions.)
Reply | Parent | Thread | Link



Alex Belits
  User: abelits
  Date: 2006-07-16 06:58 (UTC)
  Subject:   (no subject)
I think, it all reflects a more basic idea -- inconsistent knowledge is worthless for anything but the most trivial skills. Application of knowledge usually involves extending it, and that requires understanding its relationships with things beyond the narrow domain in which it was obtained.

So understanding a full path from hardware level to mechanisms used by the OS and languages, and from low-level implementation of software to algorithms and concepts used in its design, allows a person not only to see whatever parts of the big pictures are relevant for his particular part of work, but to also get a better understanding how and why they work like they do, and what can be changed to accomplish some externally defined goal.

Of course, "math is hard" approach of teaching tiny isolated pieces of knowledge describing particular software products that happen to include compilers, and then calling a mental cripple produced by such a process a programmer, is about as far from that goal as would be banging the student's head against a brick wall.
Reply | Thread | Link



browse
May 2015