What if I went to a Java school Joel?
thinkingdigitally.com
thinkingdigitally.com
Unfortunately, he doesn't understand the goals of most American schools. The goal is not to give the students a well-rounded education to serve as a foundation of lifelong achievement. The goal is to get paid.
A lot of schools used C because it was popular, and because the industry would support a system that produced C programmers. Now Java is popular and the industry supports schools that produce Java programmers.
If Haskell becomes the next big trend in enterprise development, then kids will start getting good CS educations again.
At some point [I'm assuming based on legend and claims it once was] the american "higher" education system became a business, rather than a true academic institution. The purpose has nothing to do with giving students a solid education: it has entirely to do with getting their money, and giving them a good "social" experience that convinces them to convince friends, family and offspring to go to the school.
In some cases, I suspect there is genuine "let's use Java because it's heavily used in industry." But in most cases, it's "Let's use Java because Java is EASY, and our students don't want to take hard classes with things like pointer math and C".
I have never even heard of fixed point theory either. Instead of blaming my college I'm going to take charge and learn about it myself. We are truly fortunate to be living in a time where information is available at the touch of a button.
As a side note, the ability to learn by teaching yourself is much more valuable than the ability to learn in a classroom. Getting practice now will put you ahead in the future.
Short version: pick a systems programming project to learn C. I think implementing a memory allocator is a good one. You can code a brain-dead simple memory allocator in less than a few dozen lines. It will perform horribly and waste resources, but it's still functionally complete. As you learn more, you can make the allocator more sophisticated.
(Although I'm biased since memory allocation was a research project of mine.)
http://moodle.cs.huji.ac.il/course/view.php?id=66
Workshop In Computer Construction - From Nand to Tetris
(book page: http://www1.idc.ac.il/tecs/)
CS students need to be exposed to the lowest possible level of how computers work at least once, just to know that it exists. After that, it depends on each individual's curiosity.
That being said, the threshold for just passing the classes never seemed very high. The education was there if you wanted it, but most students didn't seem to, and were happy to get by with a barely passing grade. This is obviously a problem, but different from the one discussed in the Spolsky article.
That's what I did, anyways. Now I'm an embedded software engineer, writing in C++, and able to handle pointers and memory and such.
My issue is how to learn functional programming. Can't learn it on the job, as this is a C++/Java/C# shop. And I haven't found a decent way to learn it as a hobby.
Hobbies are for scratching an itch, which usually means Python frankenscripts to make some mundane piece of work easier, or quick one-offs in PHP to amuse friends, or python/html/css projects that'll never be finished but seemed cool when I started.
Maybe someday the dirt cheap shared web hosting space will have RoR or Erland or Arc...
First, why is C nearly always required for writing compilers? I've written one in C and a few in higher-level languages, and the HLL ones were easier due largely to garbage collection.
Second, those two things, if learned, would teach him vastly more about computer science than just learning C. For a better understanding why, Steve Yegge's essay "Rich Programmer Food" is what you want to read.
Because the author is clueless. Sure, you might want to compile your language down to C, but there's no point in writing the compiler in C, unless you want to make your life difficult for no good reason. Nobody cares how fast your compiler runs. (What I should say is, tokenizing the input, building the AST, and traversing the AST is going to be just as fast implemented in Lisp/ML/Perl/Ruby as it is implemented in C. Except you'll get a more correct compiler in less time. "malloc" is for chumps.)
But, these days, there's no point in compiling down to C. It's much easier (and yields a potentially faster runtime) to compile to LLVM or the JVM or Parrot.
I take it you've never written a C++ program which depends on heavy template metaprogramming.