Building World Class Software at uptime

Friday, May 23, 2008

Learning C is important, but you can still get a job without it

In the second Stackoverflow podcast, Joel Spolsky argues that all developers should know C, and Jeff Atwood disagrees. Bloggers are up in arms; most of them agree with Joel, and Alastair Rankine even uses it to argue that Jeff has jumped the shark.

Here's my take: No, Virginia, you don't have to know C to be a professional programmer, but it definitely helps. You don't have to know Ruby, Java, Prolog, C# or Lisp either, but they will all teach you things that you can apply to whatever you happen to be doing for your day job.

Here's a random list of things a well rounded programmer should be comfortable with:
  • Macros (C- and Lisp-style) and their pros and cons.
  • At least two assembly languages (x86 and SPARC for preference): pipelines, caches, scheduling and calling conventions.
  • At least one dynamic language such as Ruby or Lisp
  • Data structures: hash tables, red-black trees, B-trees, graphs, linked lists.
  • Complexity theory: O(n) notations and how to reason about algorithmic efficiency.
  • NP-complete problems and methods for solving them (branch-and-bound search; simulated annealing; genetic algorithms)
  • Memory management: C-style (malloc/free), garbage collection (mark and sweep, and generational)
  • Running a business - if you've founded a startup, even if it failed, you'll have learned a lot from it.
  • Compilers (to machine code and to bytecode). You should definitely implement an optimizing compiler at least once. Extra points if you bootstrap it.
  • Efficient bytecode interpretation and Just-in-time compilation (plus specific bytecode languages for at least 2 languages).
  • Relational database theory and practice: data normalization, optimizers and ORM.
  • Threads in Java and in C; patterns for synchronization and locking.
  • Game development - sprites, 3D rendering; maze generation and search; game AI. A good place to start is Geoff Howland's article on GameDev.net.
  • Web site development: HTML, HTTP and forms of RPC such as SOAP, REST, XML-RPC.
    • Server-side web frameworks such as Ruby on Rails, Django, PHP and Struts, and their pros and cons.
  • Data presentation and techniques for communicating trends. Edward Tufte is the undisputed king of the realm.
  • Unix internals: inodes, memory management, disk management, kernel-space versus user-space. Ideally, you should implement a miniature operating system at least once in your life.
  • Linux: at least make your own distro from scratch.
  • Network protocols: SMTP, HTTP, and Bittorrent at minimum.
Is anything above necessary for being a professional programmer? Absolutely not. But the insights you get from learning them are important in ways you won't appreciate until you try.

Labels: ,