I've read this article before, and I somewhat agree with it. However, java is a much more practical language to program in than c unless you're doing work where c is absolutely necessary. Programming speed is usually preferable.
What I don't agree with is pointers and recursion making people's heads explode. Pointers are just another language construct and with enough practice anyone will get used to them. Recursion is a mathematical concept. Thus, for all its elegance and simplicity, people still find it difficult in the same way they find mathematics difficult.
The real weeder classes that I've seen are generally theory and discrete math classes. The truly challenging systems and programming related classes usually aren't offered until the latter years of a student's CS career (such as OS, Distributed Systems, etc).
Disclaimer: My experiences come only with my university - Carnegie Mellon, and chatting with friends from others
To be fair, Joel makes that point. He claims that:
"It may be a fine language to work in, but that's not today's topic. I would even go so far as to say that the fact that Java is not hard enough is a feature..."
In my experience at UVa, the weeder class is where they introduce pointers, re-introduce recursion, and do basic data structures, and start people with a language other than Java (C++ and x86 assembly; there is also an option to do the first class in Scheme, but that is only open to some people). Someone here was obviously listening to Joel.
-----
I think that the perils of a "Java school" are reasonably similar to the perils of a "C School" or a "Lisp school", though: you are only learning one programming language. As a CS student who has written nontrivial programs in 5-6 languages, I do not believe you can produce even reasonably competent computer scientists who are limited by the one language they know and cannot think outside of that limitation on their conceptualizing of problems. Although the individual issues with, say, C might be different (you -will- understand pointers), your thought processes are still limited to the one language that you know.
Disclaimer: I don't claim to be exceptionally experienced in those languages, but enough to have hit the "I get how to do basic things in this language" point. I'm reasonable with really 2 languages, and nowhere near mastery of programming.
Recursion in C++ is really cool until you add threads or too many items and blow the stack and start getting random seg faults. I speak from experience. I tend to avoid it now and iterate instead.
"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."
I'd like to clarify that doing a bunch of pointer arithmetic and manual memory management does not necessarily make someone a great programmer. In many cases, it distinguishes them as a "midgrade and needs to learn something about premature optimization" programmer.
Great programmers write solutions that make hard problems look easy, and mediocre programmers write solutions that make medium problems look very hard. Java makes it easy to do either of those -- anyone who's reviewed a decent quantity of Java code can attest to this (compare the code style in, say, Guava or Lucene with your typical J2EE app).
The real problem with JavaSchools is the lack of higher-level concept exposure... things like higher mathematics, machine learning, combinatorics, really deep algorithm analysis, etc.
We all have supercomputers on our desks and we're using them to do stupid stuff because most programmers don't know enough real theory to make them do better.
Programming languages are more of a pragmatic choice. You can do cool stuff in C, Java, C++, Python, etc. I care more about what you do than what language it's in.
What is sad that all the cool hardcore C programming jobs are going oversees - unless you're a computer engineer and deal with hardware. Everyone is looking for php, ajax, python, etc, basically C-based type-less languages which anyone competent in C can pick up in a matter of days. But try to apply to those companies with C, C++ and x86 assembler on your resume, no one will get back to you.
Microsoft still requires C++ from their applicants. Nvidia and Intel both require C and C++. Google also heavily uses C/C++. I believe you're confusing "web companies" with "companies." It makes sense for web companies to use other languages, but C, C++, and assembler are things that should be on your resume.
If someone claimed to be a competent programmer, but didn't know how asm related to C, I would seriously question the merit of their statements.
I still remember this about-face, makes me chuckle every time: "Now, don't get me wrong: there's nothing wrong with Java as an implementation language.
Wait a minute, I want to modify that statement. I'm not claiming, in this particular article, that there's anything wrong with Java as an implementation language. There are lots of things wrong with it but those will have to wait for a different article."
Java has pointers. What it doesn't have is pointers overloaded as arrays and iterators, pointers to stack objects, pointers to pointers, or pointers with undefined values.
Point being, there's nothing wrong with pointers but there may be something wrong with the way memory is used in C.
What I don't agree with is pointers and recursion making people's heads explode. Pointers are just another language construct and with enough practice anyone will get used to them. Recursion is a mathematical concept. Thus, for all its elegance and simplicity, people still find it difficult in the same way they find mathematics difficult.
The real weeder classes that I've seen are generally theory and discrete math classes. The truly challenging systems and programming related classes usually aren't offered until the latter years of a student's CS career (such as OS, Distributed Systems, etc).
Disclaimer: My experiences come only with my university - Carnegie Mellon, and chatting with friends from others