Your browser may have trouble rendering this page. See supported browsers for more information.

This page shows the source for this entry, with WebCore formatting language tags and attributes highlighted.

Title

Joel "Blowhard" Spolsky Sounds Off

Description

Hey, I know he's well-read in the industry and he often has some interesting topics, but his latest article, <a href="http://www.joelonsoftware.com/articles/CollegeAdvice.html">Advice for Computer Science College Students</a>, is way more over the top than it needs to be. Maybe he thinks that, since he's addressing people about to go to college (or those already in college that have not yet chosen a major), he needs to go all MTV on us and "get all up in our faces", not missing a single opportunity to "dis the man". Whatever; it's annoying. He takes needless potshots at all majors not immediately important to building a successful IT business, deriding anything that's not immediately applicable or <iq>useful</iq> as a waste of time. <iq>What are you going to do, major in History?</iq> is one such throwaway comment that's probably supposed to incite a snigger of contempt for anyone who can't use a computer, but, yeah, actually it would be nice if some Americans learned history. Americans not knowing history causes a lot more problems in the world than Americans not knowing how to program. He also disguises ad hominem arguments as legitimate critiques of subject matter --- discarding entire subjects because he got a shitty teacher. I too took cultural anthropology and I had a <i>great</i> teacher (Doug Raybeck at Hamilton College). I liked the course; a good teacher makes a big difference. Getting to know how other people tick and learning about other cultures is another one of those things that might help build a little bit of empathy and understanding in this world, which is so sorely lacking in the upper middle class that is his essay's target. Computer geeks are already smug and superior enough, for God's sake. Encouraging them to listen to their worst instincts is a terrible idea. I did notice that he encourages people to take the course anyway, but in the way that your dad encourages you to eat vegetables when you know that he hates eating them too. Kind of a grin, grin, wink, wink, just do it to please your mom, we'll go eat cookies in the basement later kind of way. So you're not supposed to learn computer science, but you're supposed to <iq>[l]earn C before graduating</iq> because it <iq>it is still the lingua franca of working programmers</iq>. <iq>Java ... Python [are] trendy junk</iq> that are being taught to deliberately mislead you. Don't be fooled by high-level abstraction; listen to uncle Joel and start right off from the beginning. Standing on the shoulders of giants is for those idiot <iq>scientists</iq>. Sure, I also think you should have a passing knowledge of C, but knowing how the machine processes instructions is unnecessary for most of the software being written today. I mean, Joel's company's main product is a web application, for Christ's sake. Just how close does he think that runs to the processor? I hope all of his developers are properly optimizing the stack in all of their routines. He compares a programmer who doesn't know C with a <iq>medical doctor who doesn't know basic anatomy</iq>. I think it's much closer to a medical doctor who doesn't know how mitochrondria exchange food and oxygen across a cell membrane. Despite that massive gap in her knowledge, my doctor can probably still tell me if my leg's broken (and set it). Despite that diatribe, may I offer a few corollaries to the rule about learning C before you graduate: <ol> Learn C if you think you can, but don't bother if you're not that good because if you apply C code design to other higher level languages you learn which address a different problem domain, you'll write crappy code in every language instead of just in C. If you're going to learn it, make sure it's neither the first nor second programming language you learn. If you think HTML is a programming language, don't learn C. </ol> The advice to get an internship is good, though. Internships are an ad-hoc replacement for the fact that there is no apprenticeship program in the US. He should be using his advocacy position to push for better education in the first place, instead of being happy to hire people out of a system in which <iq> elite schools</iq> that cost <iq>$160,000</iq> don't even teach you how to program. The main problem is that you do spend time programming in computer science (in most of the courses I took) ... you just don't spend any time <i>designing</i>. Writing the code for a design is pretty much incidental in most cases. Designing good code is what takes practice, experience and guidance. <h>Homo Superior --- Rise of the Geek</h> Mostly, though, he feels that the contempt that programmers feel for the part of the world that can't (or doesn't want to) write <iq>while loops</iq> is completely justified. After all, computer scientists are useless because, even he, a mere developer, <iq>found a mistake in [dynamic logician] Dr. Zuck's original proof</iq> after only <iq>a couple of hours</iq> and he <iq>got an A</iq> in a Cultural Anthropoly class he found less exciting than <iq>watching grass grow</iq>. I think he sums it up well enough himself with: <bq>The moral of the story is that computer science is not the same as software development.</bq> His implication is that it is far, far worse than software development and just slows development down. Think Bush's attitude toward all forms of science and you'll get the idea. Personally, I think we could do with more computer science in development, especially for tools and libraries that we all have to live with for years and years and years. Take the newest buzzword now, <i>Generics</i>, for which we can thank Microsoft for inventing. Generics are an extremely useful mechanism for specifying a design very precisely while at the same time reducing the code required by at least a third. C# shipped initially without this feature, as did Java. Generics were not new when these languages were introduced (despite my sarcasm above). Eiffel has (and had) an extremely well thought-out and well-built implementation and C++ had a poor man's preprocessor that didn't fit into its existing type system at all. Eiffel is a language designed by a computer scientist for practical use. C++ is an object-oriented version of C, <iq>the lingua franca of working programmers</iq>. Guess which version C# copied? You'd be wrong if you guessed either one. C# copied Java's generics, which use the semantics and type compatibility rules of the much weaker system used in C++. Expressiveness of the language has been lost because a compiler-friendly solution was chosen instead of a programmer-, or even computer scientist-friendly one. Maybe Sun and Microsoft's marketing departments had something to do with it as well. Maybe my point is that developers and computer scientists shouldn't fight, but instead unite against the common foe: marketers. <h>A paucity of computer science</h> Java provides numerous examples where a language seems to have completely lost its way --- it's proponents aren't even qualified to discuss the basic tenets of programming languages. Take a look at these <a href="http://java.sun.com/developer/JDCTechTips/2005/tt0104.html">Tech Tips from the 2005-01-05</a>. The first one, about VarArgs, spends seven whole pages describing and providing pedantic examples for a feature that provides poor-man's support for tuples in one specific, limited case (where the arguments are all of the same expanded type). A look at Eiffel's tuple support (snobby, ivory tower, CS bullshit language) and you'll be wishing Java had done its homework. The second tech tip is about <iq>covariant parameter types</iq>. They start off by saying that: <bq>The intent is to demonstrate that although there are good reasons for implementing covariant return types, implementing covariant method parameters is unsound.</bq> They do nothing of the sort, proving only that <i>Java</i> can't do them, so they must not be useful. They provide a solution using generics that ends up using a syntax that leaves you yearning for covariant parameter support, so the message is, to say the least, somewhat confused. I'm sure a previous Tech Tip similarly disproved multiple inheritance's usefulness by showing that: <bq><code>class A extends B, C {}</code></bq> fails to compile under Java. I wonder whether the contempt for computer science has anything to do with the level of sophistication found in the new languages being trundled out for us today. Computer science can be useful ... it's the way new programming methods are developed and new algorithms are designed (yeah, hackers can find them too, but you can't get lucky all of the time). Don't trash the whole subject as ivory tower bullshit just because it doesn't involve enough development. The best developers I've met are the ones that actually <i>read</i> computer science papers, not those that just scan the latest software development magazines for the latest toolbar screenshots.