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.