An interesting semi-related follow up from the former Fog Creek VP of Eng (now at Khan Academy): <a href="http://bjk5.com/post/3340326040/in-any-language-you-want-khan-academy-interviews" rel="nofollow">http://bjk5.com/post/3340326040/in-any-language-you-want-kha...</a><p>Not understanding the underlying fundamentals when programming in high level languages can be really dangerous, but generally it's not. I kind of view the ongoing development of Compilers, VMs, JITs, etc. as being somewhat parallel to that of processors. At one point, optimizing with machine code was crucial to obtain performant code, but with crazy-ridiculous superscalar processors and all of the things that come with it, all you can really do is code C, compile with -O2, and then guess and check on optimizations. I wouldn't be surprised if this was the case in most high-level languages before long.<p>Don't get me wrong, I first read this in High School and this was the essay that made me love C, and made me want to try to get an internship at Fog Creek. I just think it's starting to show its age.
"... churning out quite a few CS graduates who are simply not smart enough to work as programmers on anything more sophisticated than Yet Another Java Accounting Application, although they did manage to squeak through the newly-dumbed-down coursework."<p>From a guy whose company isn't creating accounting applications but Yet Another Bug-Tracking Application, Yet Another Source Control Application, and Yet Another Remote Desktop Application. I generally like Spolsky's articles about software but this one is a little too pot-kettle for my taste.<p>The plain fact is that the time of low-level languages where pointers are king is over. You can get great performance without them, more specifically without messing with memory at all. Of course, pointers still have their place and if you want to go that route feel free, but you can do a lot without them.<p>As a disclaimer, I went to school where C was our weed out course and Java was the new-hotness. On graduation I was in a university focus group that specifically asked us if they should change from C to Java for the intro course (I voted against the change). I like pointers and recursion but do not see understanding those as defining a great developer. I've seen plenty of people who were way more adept at pointers that couldn't design a fuctional system if they tried.
This is a relatively old article; I think it misses one more rather important point: functional programming is becoming increasingly more popular right now, and Java is a language that seems to actually <i>discourage</i> using a functional programming style.<p>If you only ever use Java not only will you not know how to functionally program (this can be learned on your own anyhow), but also, and more importantly, you won't know when it's best to.
It's somewhat amusing to read this essay while sitting in Yale's CS 323 class.<p>I do wonder, though, how much of this essay is Spolsky's investment bias (Ie, It must be worthwhile, because if not I suffered for nothing.)
To preface my comment, my background is not in CS. I majored in biomedical engineering at UT Austin, where I chose a track that required a fair amount of programming.<p>In my curriculum, I was required to first take 2 courses using assembly language, then another course in C, and then a data structures course using Java. Is the growing standard nowadays to teach with Java from the get-go?
The problem with this post has always been it starts out from the outset with a title that implicitly puts down a large segment of students.<p>Had Joel dug deeper into how someone could solve this problem for themselves, rather than brush off those who learned in this environment, this post would have been great. Instead, it comes off elitist and dogmatic.
I've seen this article before, and on one hand, I get it. On the other, I think it's a dangerous trap to automatically think that people (in any profession) should know how to build something in detail from the ground up just to make it work.<p>Let's take a really great, experienced physician. Does he need to know how to make an X-Ray machine in order to perform neurosurgery? At what point does something, once required, become commonplace so that technology and expertise can evolve?
I think the real peril is that sub-optimal technology has become standard because "it's easy to hire people that know it". What's worse is that this is a positive feedback loop, since Java is the most popular language "in industry", students demand that they be taught it. This makes it more popular in industry, and the cycle continues.<p>I'm glad Java introduced automatic memory management to the average workaday programmer. I'm not glad that one of the better languages hasn't replaced it yet.
"And thus, the ability to understand pointers and recursion is directly correlated with the ability to be a great programmer."<p>Wouldnt a few decades ago the statement have been:<p>Recursion an pointers are not enough, to be a great programmer you absolutely need to understand X,Y.