College courses I should have taken 2009/04/09
Yesterday, I read through A List Apart’s 2008 Survey and the Relevance of Education  section tricked me into reflecting on my time at Wash U. My professors taught me all about performance and time complexity, data structures, operating systems, circuits and hardware architecture (I am a hardware designer by education). All of this, save the direct design of new hardware, has been immensely helpful in my first two years as a Real Boy™.
The algorithms course that I took focused on efficient computation on a single node. Wash U offered an Advanced Algorithms course that, in retrospect, I should have taken. I hope such a course covers network-aware algorithms like map/reduce, gossip and P2P protocols, queuing and distributed hash tables (Chord , etc.). These topics become required knowledge when you start talking about “Internet scale” anything.
Managing disk I/O
This course definitely doesn’t exist. Academics are big fans
of pretending they have infinite I/O capacity but they do students a
disservice by hand-waving one of the largest time-sinks in all of
computing. I have learned a lot by reading papers and blog posts
produced by my more experienced peers and even more by
trial-and-error. Topics for such a course include write-ahead logs
(and all of the other things InnoDB does),
aio and its effect
on performance plus some time to address concurrency as it pertains to
disk performance. Engineering school should prepare people for reality
and I can’t thing of anything more real than
Lock-less data structures
I’m not certain this doesn’t exist at Wash U. The
Drizzle mailing list 
made mention of lock-free data structures, a topic I haven’t given
much thought to beyond using
concurrent_hash_map from the
Intel TBB . Not
surprisingly, the design of these libraries is difficult and
theoretical — you have to prove correctness since so
much is left to chance. Academics love proofs, right?
I took Wash U’s senior-level Operating Systems course but never
got around to taking the graduate-level version. The former focused
libc, system calls, threading and writing programs that
behave like UNIX programs. The latter dives into the Linux kernel
itself. I don’t anticipate becoming a kernel hacker anytime
soon but having deep knowledge on the design of the Linux kernel would
definitely make me a better software architect.
I took up through intermediate microeconomics and wish I had learned more. I don’t have the solutions to the world’s problems and I still wouldn’t even if I knew more but I would understand the expert’s opinions more thoroughly.
Anything I’m missing? I’m curious what others wish they’d taken in college, especially those who have been at it professionally for more than two years.