Crowley Code! 
 (Take 12)

College courses I should have taken 2009/04/09

Yesterday, I read through A List Apart’s 2008 Survey and the Relevance of Education [1] 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™.

Since yes-or-no questions are kind of boring, I reflected further on what my college education lacked — courses I wish I’d taken.  While I was working for Flickr and recruiting for Yahoo!, I spent a part of each visit to Wash U encouraging the Computer Science department to get serious about web programming.  The result was an ostensibly senior-level course that guided students through LAMP, Rails, databases and JavaScript plus the protocols/standards they build upon: HTTP, HTML and CSS.  It was a great addition to the program and I hope it’s still around.  Though I’ve not kept up my course-list evangelism, I now have several more courses I wish I’d taken.

Network algorithms

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 [2], 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 iowait.

Lock-less data structures

I’m not certain this doesn’t exist at Wash U.  The Drizzle mailing list [3] 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 [4].  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?

OS kernels

I took Wash U’s senior-level Operating Systems course but never got around to taking the graduate-level version.  The former focused on 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.

More econ

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.


Richard Crowley?  Kentuckian engineer who cooks and eats in between bicycling and beering.

I blog mostly about programming and databases.  Browse by month or tag.

To blame for...

© 2009 Richard Crowley.  Managed by Bashpress.