I recently listened to Technology Round Table Podcast #3 and one of the topics was 'Should Developers Learn C?'. In it, Jon Galloway stated that there are much more important things developers could spend their time learning than C (such as learning their core platform in-depth - eg. .NET/SQL Server). Another voice (perhaps it was Scott Koon?) said that it is necessary for developers to learn about how their code is working 'under the hood' (memory and registers, etc.), and he gave a metaphore that developers who don't know how things are working at that level can only paint your car rather than making more substantive changes. Although all metaphores break down at some point, I think this is a particularly weak one. If someone can totally overhaul a system (such as one written in VB or on top of .NET) by making major changes to the code, that amounts to a heck of a lot more (metaphorically speaking) than just re-painting a car, even if they don't know how to interpret assembly or inspect the heap manually if they wind up having an unhandled error in unmanaged code. (I think a better analogy might be a mechanic who could replace your transmission versus a mechanic who could re-build your transmission.) Heck, I've taken two classes in assembly (one for x86 chips and one for Motorolla chips) and I normally don't even bother to try to interpret that generated assembly if I somehow get such an error. I probably could if I had too, but there's normally much more effective ways to debug a problem written in a higher level language than debugging the underlying assembly. Although I can't say it's NEVER necessary, it hasn't been necessary for me in the 8+ years I've been developing software professionally in high-level languages.
My first reaction to this discussion was to think: Well it's really not enough to just learn C, you really should learn assembly language first to understand things at a REALLY low level (invoking hardware interrupts, etc.), and then learn C. In reflecting on Jon's take on the issue, however, I realized that perhaps one size does not fit all. I wonder if people's opinion on this issue really just reflects their own personal background. I think I was certainly guilty of that in my first analysis of the question. (I, after all, learned assembly language and C and C++...) It seems to me now that this boils down to an issue of human nature. People that attain some degree of success in life commonly are inclined to encourge people to follow in their foot-steps. In other words, if I perceive myself as successful, then the path to success that I'm most familiar with is probably going to be my own. So if one never really had to learn C, but one still perceives oneself as successful, then one is probably going to advocate that it's not really necessary for developers to learn C. If one forged their software knowledge in the fires of assembly and C, however, one is likely to suggest that as much is necessary for developers to learn.
I think the more important question is: 'Who should learn C?' and furthermore 'Who should learn assembly?' I think the answer lies in what type of software the developer works on, and what direction they would like to take in their career. As I have previously blogged, I think there will be more distinct career paths within software development as the field matures. Like in medicine, we will have the equivelent of doctors/MDs (framework developers, language creators, AI specialists, etc.) and the equivelent of nurses/RNs (developers who work on small line-of-business applications and small web apps) and the equivlent of nursing assistants (junior developers, QA testers, etc.). Based on that belief, I think that the training necessary for a developer who works on embedded systems or large-scale web app frameworks is different than the training necessary for a developer who works on point-of-presence web sites, just as the training for an MD is entirely different than the training for RNs. MDs need to be able to diagnose rare, mysterious diseases and come up with a customized plan of treatment for a patient who may have multiple conditions, whereas an RN just needs to know how to diagnose and treat common problems, administer medication, talk to families, etc. Accordingly, MDs have to study the mechanics of the human body in a lot more detail, whereas RNs learn more about 'soft skills' and the like.
Should you learn C (or Erlang or Smalltalk)? That depends on what you want to do. If you want to work on massively scalable applications or complex embedded systems, then yes, you probably should learn C and also possibly assembly and/or IL. If you just want to continue creating line of business applications in VB.NET (which is not to say that you're not improving), then you would probably be better off spending your time on something else that will make you a better developer. (Do I even need to list the plethora of options?)