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:
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.
Labels: personal development, programming




0 Comments:
Post a Comment
<< Home