Steve Lacey points us to a great read: Joel on Software - The Perils of Java Schools.
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.
"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. "
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!
Umm... I think I've said too much now. Geek number one signing out!