There’s much ado about Joel Spolsky’s The Perils of JavaSchools. I think that Joel’s largely right, in that I don’t think that you can really appreciate why Java is a good language unless you’re proficient in C, and programmers who don’t really appreciate Java won’t get the most out of it. But Joel is half wrong in claiming that Java bypasses pointers and recursion; I use recursion all the time in Java! If you learn programming via Java but remain ignorant of recursion, you’ve been poorly taught. Also, Bill de hÓra has a point when he says that the other really hard thing that good programmers need to have thought about is concurrency. My guess is that Java is actually a good language for teaching concurrency, because the parts of the problem it sweeps under the rug are not essential to deep understanding and anyhow aren’t the really hard bits. Having said all that, if I were developing a difficult, mission-critical piece of infrastructure, I might develop in Java but I’d be leery of hiring anyone who hadn’t been to the mat with C. My experience differs from Joel’s in another respect: Recursion is mildly hard. Closures and continuations are hard. Concurrency is very hard. I never found pointers hard at all.