"A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects." - Robert A. Heinlein

Friday, December 30, 2005

I definitely suggest reading it, but in case you are too lazy, here's the one sentence synopsis: The trend of CS programs in schools to move to all-java programs, under the guise of being able to spend more time on software design principles and such, is dangerous because it fails to weed out those that will ultimately make poor programmers.

Relevant quote:"All the kids who did great in high school writing pong games in BASIC for their Apple II would get to college, take CompSci 101, a data structures course, and when they hit the pointers business their brains would just totally explode, and the next thing you knew, they were majoring in Political Science because law school seemed like a better idea. "

Amen!

For what it's worth, it's been my experience that this is absolutely the case. During my time managing people at Intel (I managed about 20 different people over the course of 5 years), ran into this twice: I 'inherited' (i.e. I didn't screen them) employees that had CS degrees from a Java-based program. In both cases they had taken some elementary C courses, but then the bulk of the program had been taught in Java. In both cases, when they had to pick up more complicated principles involving pointers and such, it just did not click. When you are doing low-level optimization work, you need to understand things like memory alignment, packing bits into registers in different arrangements, the cost of indirection, etc. (Both these people ended up in non-technical roles at Intel. They were great workers, and smart people, they just didn't belong in a programming role).

Due to my current role, I no longer hire programmers now, but if I did, I'd (a) test applicants from schools like this a lot more heavily, and (b) only consider them after I'd run out of other options.

Another quote from the article caught my eye:"... there are two things traditionally taught in universities as a part of a computer science curriculum which many people just never really fully comprehend: pointers and recursion."

I thought about this a bit and realized that there's a corollary to this: An automatic qualifier of geek is anyone who is ecstatic after learning about pointers and recursion. And that includes me.

I've witnessed and exhibited many geeky things in my 36 years on this earth, but I can think of four that really stand out:

Learning long division: I think it was the 2nd or 3rd grade. When I learned how to do it, I became so enthralled that I started writing down the biggest problems I could (e.g. divide this random 4 digit number into this random 25 digit number). Eventually they wouldn't fit on the paper, so I was asking my mom for some of her sewing pattern paper because it was 36 inches across, and THAT could fit some serious long division problems.

Making my own gun powder: In the 7th grade, a friend showed me how, and how varying the ratio of sulphur/charcoal/saltpeter you could make smokebombs, stinkbombs, etc. Now this was chemistry with RESULTS!

Seeing BASIC for the first time. Also 7th grade. TRS80 model 4 in the school 'computer room'. I saw some guy type in a bunch of stuff I didn't understand, he hit enter, and a game (variant of snake, I guess you could say it was) popped up on the screen. I thought it was magic and I was hooked.

Learning and applying recursion. It wasn't till much later in life that I learned C (in night school while working at Matrox). The college I'd gone to, because it was an EE-type program taught all it's programming in assembly, since it wasn't about SW design, it was about understanding how the HW ticked. Anyhow, in this C course, we learned about recursion and I went right home and wrote an asteroids clone which used a recursive routine to render all the asteroids (which were stored in a tree structure). The idea that I could call a draw routine with a pointer to the root node was, as they say, da bomb!

3 comments:

Bah. I have a huge bias against Joel because I think he is a fucking idiot...

"Instead what I'd like to claim is that Java is not, generally, a hard enough programming language that it can be used to discriminate between great programmers and mediocre programmers."

What the fuck? Who gives a shit about how "hard" a language is. A language is a tool. Tools are supposed to help you get the job done.

The future has lots of programming problems to solve. Most of them are trivial, (Like the software Joel makes). While it would be nice if everyone was hot shit, that wouldn't reflect the way it is in any other field.

Hmm... I haven't read a lot of Joel's other stuff, so I won't defend him. Perhaps a lot of what he writes is crap but that doesn't make this one post wrong. Just as a lot of your posts are very angry, but that doesn't make this particular one right or wrong :-)

Yes, a programming language is a tool, but if it's used to dumb down a curriculum it's debatable that this might be a bad thing.

I used to have a rant that every programmer should - at one time in his life - wire-wrap together his own little 8 bit computer, program it in assembly, and debug the thing with an oscilloscope. Tedious? You bet! But that person will forever have a more instinctive feel for what happens inside the machine.

I still agree with him though, in that a CS degree should teach a wide variety of skills, and that some of those should be more low-level tricky stuff. Graduates will be better off even if they don't use it.

I suppose you could say the same for math, right? Many people never use the calculus they learned in school as part of their every day life, but understanding the basic principles comes in handy, and they are better off than if they'd said "well, chances are you'll never need this, so we're going to just do basic algebra".

Back to the topic at hand though: If you were interviewing someone for a job at your game company (should you own one), and that person said they wrote a 3D game in Java, vs in C++, would you be a little more wary and probe a little more in your interview?