It seems that Joel's article about Java in the Universities has made quite a bit of noise. I think that I will add my two cents to the mix.
Two things pissed me about the article. The first was the claim that CS should weed the bad from the good, and the second was his treatment for OOP (agonizing over has-a & is-a is so not OO).
I completely disagree with the claim that CS* classes should function as discriminators between good and mediocre programmers. That is his problem, as a potential employer, to weed out the great from the mediocre. And if he can't do that in about a week, regardless of technology or project that they use, then the fault is with him, not with the graduate. Being proud because you were up until 4:00 AM chasing a null pointer dereference and broken stack is not the sign of a productive developer. I wrote all the linked lists and hash tables that I ever intend to write. Hell, I even spent some time writing a sparse matrix in C++ that was multi dimensional and efficient. I see zero need in them outside of the class room.
I will walk out of a job interview where the test is being able to write a linked list in C or C++. I have done so before where the questions where at about this level. You want me to deal with pointers, give me a job that requires that I will deal with them. That has better not be a bug tracking software in ASP 3.0 (what Joel sells).
The second part, about OO design being "spending countless hours rewriting your code to rejiggle your object hierarchy, or you fret about faux 'problems' like has-a vs. is-a" is just bull. I'm programming since I was ~14 years old or so (if you don't count making a turtle dance in Logo), I started in Pascal & VB 3.0, I later moved to C & C++, and then to C#. The last time I thought about has-a vs. is-a was when I was learning C++ and was very new to OO. Since then, I didn't touch this stuff, and I produce good OO code. Most of it is online, and you can check it out.
Then there is the whole premise of the article, which seems to be that you need to find a Segmentation fault [sic] and fix it in order to be Real Programmer. Been there, done that, boring. I consider good design much better than knowing how to handle naked pointers. You know what, show me a good C++ coder that still go on to do that, when all the best practices for C++ are full of RAII and safe pointer wrappers.
Now, that said, he does have some points that I agree with. Recursion is a good, clean, way to solve a certain set of problems, and understanding pointers is very helpful in understanding how computers think. And understanding functional programming is very good for being able to write clean code later on.
* I'm currently studying for a CS degree (just started), but I know about 85% of what the degree will teach me because I wanted to learn and a university wasn't a possibility at the time. I've a job, which I like, and I got it because I like what I'm doing, not because I had a degree or a certification.