Live data from Hacker News

Coding Horror: Separating Programming Sheep from Non-Programming Goats

codinghorror.com

131–140 of 140 posts

Re: Coding Horror: Separating Programming Sheep from Non-Programming Goats

#131
post #130

Earlier quoted context omitted.

I completely disagree. I firmly believe that either you are born with the ability to be a programmer or you're not. That's not saying that it's good or bad, but I believe a lot of it is just how your brain is configured. It's as innate as the ability to shoot baskets, or throw a football, or as innate as gaining energy when interacting with people (extrovert) vs losing energy when interacting with people (introvert).…

I'm curious how this 'born programmer' thing works. So you are basically saying there is a gene (or sequence of genes) that predisposes you to programming. Could you elaborate on how that might work? Twin studies have shown a lot about personality being more genetic that was thought before. But I don't know of any brain studies that have linked knowledge/intellectual capacity to genetics... Do you have a reference? O…

Abstract thought. Many people have real problems going from "A is X" to "A is a reference pointing to X" or "A is of class X".

Whether that is genetic is unknown to me, but it strikes me as something that coders have to be good at.

Re: Coding Horror: Separating Programming Sheep from Non-Programming Goats

#132
post #111

Earlier quoted context omitted.

In my experience, the people who "get" programming took it up as a kid. If your first program was written in CS 101, then you will not be a good programmer. I've yet to meet anyone who bucks this trend.

Could you elaborate on why you would think this? Because it seems a bit hard to believe. I mean, the oldest students in your average CS 101 class will be, what, 22? Maybe older if they're non-traditional? The human brain's frontal lobe isn't even completely myelinated at 22. I'm not saying they have the same potential as someone who started at 10, but you make it seem like there's no hope for anyone who didn't start…

My comment was perhaps a bit harsh and poorly worded, but I do generally stand by it. The article itself is rather harsh as well, it flat out says "there are those who can program, and those who cannot". In my experience, the people who "can" program, almost always discover it on their own through their own curiosity.

For sure, someone may not discover programming until later in life and my anecdotal evidence can't possibly be all encompassing. But I do find if they haven't discovered programming on their own before taking their first CS course, that is very often a sign that they fall into the "cannot program" category that the article puts forward.

EDIT: even the fourth comment on Jeff's blog basically says what I said: "When I was in college, I remember the students in my classes who had trouble were ones who were entirely new to programming. The rest of us had either been in programming classes previously or had been coding for fun since we were kids."

Re: Coding Horror: Separating Programming Sheep from Non-Programming Goats

#133
post #130

Earlier quoted context omitted.

I completely disagree. I firmly believe that either you are born with the ability to be a programmer or you're not. That's not saying that it's good or bad, but I believe a lot of it is just how your brain is configured. It's as innate as the ability to shoot baskets, or throw a football, or as innate as gaining energy when interacting with people (extrovert) vs losing energy when interacting with people (introvert).…

I'm curious how this 'born programmer' thing works. So you are basically saying there is a gene (or sequence of genes) that predisposes you to programming. Could you elaborate on how that might work? Twin studies have shown a lot about personality being more genetic that was thought before. But I don't know of any brain studies that have linked knowledge/intellectual capacity to genetics... Do you have a reference? O…

There are many components to cognitive ability. For example, there's the Cattell-Horn-Carroll theory that has several different abilities:

  Crystallized Intelligence 
  Fluid Intelligence
  Quantitative Reasoning
  Reading & Writing Ability
  Short-Term Memory
  Long-Term Storage and Retrieval
  Visual Processing
  Auditory Processing
  Processing Speed
This was cut and pasted from wikipedia (http://en.wikipedia.org/wiki/Cattell-Horn-Carroll_theory). If you've taken an IQ test, you'll see that they test various types of cognitive abilities, not just math or logic, but also the ability to rotate objects in your head and visualize them.

I know plenty of people who are "smart" who have a very hard time with that. In addition, I know plenty of people who aren't academically smart, but who are great visualizers. There are many different components to cognitive ability. I have a friend and both he and his father are exceedingly intelligent. My friend's son also is also a gifted child. However, when the son took some cognitive tests, his spacial/visualization scores were average, whereas the verbal and math were off the charts. I don't think that affects whether or not the kid is smart, it's just interesting how cognitive ability is broken up into different measurable areas.

Is it so hard to imagine that computer programming takes a certain subset of cognitive ability that some people, who are considered smart, just don't have? I know a lot of very intelligent people who wouldn't be able to program at all. It's not because they're "dumb", but as I've said, but the way they process information is completely different. You most definitely could develop the skills, however, if their brains are wired a certain way that causes them to be predisposed AGAINST programming, then they won't enjoy it very much at all.

Re: Coding Horror: Separating Programming Sheep from Non-Programming Goats

#134
I alluded to this (believing it was true) and was rebuffed: http://news.ycombinator.com/item?id=3434582 . Doesn't seem to be the case.

I think that many more people can learn how to program, and become good programmers at that. It's true now that the majority (at least 80%) of programmers are incompetent, but I think that has more to do with environment, tooling, economics, and the short half-life (5-6 years) of a software developer, than intrinsic limitations on ability. I wrote about this here: http://michaelochurch.wordpress.com/2012/01/26/the-trajector... . The tools and freedom that a developer needs to become good (1.5+) are simply not available in average software jobs.

I think the big problem is that we teach programming using languages like Java, which are actually very complicated. There's a lot of information in "public static void main(String[] args)" that just seems like line noise to a novice, and that people shouldn't even be exposed to until they develop the taste to know when to use OOP and when not (and that takes years, IMO). In teaching, we should start with simple languages like Scheme so we aren't requiring people to lex and parse and generate .class files in their heads before they even know what those terms mean.

Scheme and Python are better starting languages, in my opinion, and we should be starting programming education around age 6. We can (and should) expose growing programmers to C, Scala, Clojure, and Haskell later.

Also, starting with complex languages and tools (Java-style) means we have to teach in an inverted way. In your first Java exercise, you don't write a program, you write a class. Why? No good reason. There's no intrinsic reason a program has to be a class. This sort of botched, improperly-coupled teaching produces a generation of programmers who think every program must be a class, and who produce shitty AbstractVisitorHandlerFactory programs as a result.

This is one thing that annoys me especially in the teaching of Scala-- one of the most exciting languages to come out of the past 10 years, but one that is poorly understood and generally taught quite badly. What angers me especially (I'm writing a Scala tutorial to fix some of these mistakes, probably making others in the process) is when case classes are taught after classes. For example, the O'Reilly book (which is generally quite good) covers traits (a very powerful and highly nuanced advanced OOP feature) in Chapter 4 and case classes in Chapter 6. Case classes, for the uninitiated, are immutable records (data objects) and provide a lot of niceties (automatic .equals and .hashCode, class name as constructor) for free. Since case classes are simpler than full-featured classes, they should be taught first.

The right way to teach programming is to teach the simple stuff (immutable records, referentially-transparent functions, mutable state in simple data structures) first, and then provide some insight into when and why you might want to use the more complicated stuff (OOP, type classes in Haskell, functors in OCaml).

This is the reason why people who start in functional programming usually become top-5% programmers within ~3 years and people who drink the OOP Kool-Aid almost never do. Mutable state isn't evil, and good "functional" programmers use it all the time, but if you don't start with the right (simple) default abstractions-- immutable records and referentially-transparent functions-- you are not learning how to write clean, simple, maintainable code. Not only is this an important engineering skill on its own, but it's also important for the purpose of growth, because reading good code (one's own and others') is a great way to improve as a programmer.

Re: Coding Horror: Separating Programming Sheep from Non-Programming Goats

#135
This makes sense. I majored in Japanese in college. There were 3 kinds of students in our language classes:

1. Students for whom it came naturally 2. Students who could be competent if they worked really hard 3. Students who, no matter how hard they tried, weren't going to learn to speak Japanese. Wasn't gonna happen.

Bad teaching methods might result in some #2 types being mischaracterized as hopeless #3's, but I think no amount of pedagogical innovation can overcome the fact that some people just can't do certain things. (Of course, it could be a function of age and brain wiring, since all citizens of Japan, even the stupid ones, have no trouble learning Japanese.)

Re: Coding Horror: Separating Programming Sheep from Non-Programming Goats

#136
"Two years ago we appeared to have discovered an exciting and enigmatic new predictor of success in a first programming course. We now report that after six experiments, involving more than 500 students at six institutions in three countries, the predictive effect of our test has failed to live up to that early promise. We discuss the strength of the effects that have been observed and the reasons for some apparent failures of prediction."

http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper3.pdf

More:

http://www.eis.mdx.ac.uk/research/PhDArea/saeed/

Re: Coding Horror: Separating Programming Sheep from Non-Programming Goats

#137
if I had never had any exposure to programming, and you told me that a equals ten, b equals twenty, and a equals b, I would say that one of these three equations is obviously false (the system of three equations has no solution), you're full of shit, and probably made a mistake and expect me to put 0,0 for a and b respectively. Or I would guess randomly or ignore the question.

IF I HAD NEVER HAD ANY EXPOSURE TO PROGRAMMING.

Re: Coding Horror: Separating Programming Sheep from Non-Programming Goats

#138
post #96

It's interesting that this gets highlighted as an example that baffles the 'non-programmers': int a = 10; int b = 20; a = b; This looks obvious to an experienced developer, but it is a clear-cut case of horrible notation. The first two uses of '=' are mere variable bindings, whereas the third is a mutation . Using '=' for bindings is dubious but defensible, since int a = 10 does indeed guarantee that a = 10 in a math…

The pinnacle of confusion can be seen in the following abomination: x = x + 1

Bill Wadge invented the dataflow language Lucid in the early 1970s by pondering this very paradox. He wrote a nice series of blog posts about it that begins at http://billwadge.wordpress.com/2011/03/23/lucid-the-origins.

His insight was that x = x + 1 isn't contradictory once you recognize that the two x's have implicit temporal subscripts. That is, "the value of x at time t+1 = the value of x at time t, plus 1". Make that temporal dimension explicit in the language and you can go back to having a nice equational semantics.

It's interesting, though, and perhaps germane to your point, that this insight turned out to lead far away from mainstream languages.

I've come to the conclusion that math and programming are very different things because math isn't executable. Programs have to run on a physical machine, math doesn't. The "physical" part changes everything. As someone pointed out in a blog post recently, even programs written in the purest most side-effect-free languages have side-effects when they run. I suspect that functional programming ultimately runs aground on this discrepancy - i.e. on the intrinsic imperativeness of the machine. The "x = x+1" paradox can be seen as a distillation of this imperativeness.

Perhaps we should teach programming not as math but as a kind of mechanics.

Re: Coding Horror: Separating Programming Sheep from Non-Programming Goats

#139
post #59

Earlier quoted context omitted.

> The example of "mental model of assignment" is ridiculous. a=b can mean whatever. It means something totally different to a mathematician than a programmer. Say: That's why the first group (the predicted to be successful group) is defined as forming a consistent mental model and not necessarily the correct one: > 44% of students formed a consistent mental model of how assignment works (even if incorrect!)

How about students who reason like this: I don't know what the notation means and there is no way for me to know what it means. Therefore I'm going to use a different interpretation in each question to minimize the variance in my grade.

That gave me a good laugh. The funny thing is I've actually used this strategy on a few occasions. It's a completely legit critique.

Re: Coding Horror: Separating Programming Sheep from Non-Programming Goats

#140
post #130

Earlier quoted context omitted.

I'm curious how this 'born programmer' thing works. So you are basically saying there is a gene (or sequence of genes) that predisposes you to programming. Could you elaborate on how that might work? Twin studies have shown a lot about personality being more genetic that was thought before. But I don't know of any brain studies that have linked knowledge/intellectual capacity to genetics... Do you have a reference? O…

There are many components to cognitive ability. For example, there's the Cattell-Horn-Carroll theory that has several different abilities: Crystallized Intelligence Fluid Intelligence Quantitative Reasoning Reading & Writing Ability Short-Term Memory Long-Term Storage and Retrieval Visual Processing Auditory Processing Processing Speed This was cut and pasted from wikipedia ( http://en.wikipedia.org/wiki/Cattell-Horn…

So there is a logical jump in your reasoning.

- Some brain visualisation skills are innate

- Programming (probably?) requires some of those traits.

- JUMP

- "either you are born with the ability to be a programmer or you're not."

What you haven't demonstrated (beyond some weak anecdotes), is that those innate skills can't be taught.

Even if you proved that, you'd then have to prove that developing software, will always involve those skills. E.G. programming in the 60s required a different set of skills to programming now (with some overlap).

Post reply on HN