I’ve been following the podcasts that Jeff Atwood and Joel Spolsky have been doing for StackOverflow. The podcasts are not really technical in nature, in fact they really do not have anything to do with what will ultimately be the purpose of the site they are building. They are more documenting the discussions and decisions they are making while creating the site.
I’ve only been through the first few so far, but an interesting discussion has come up in both podcasts about whether or not programmers should know the C programming language. Jeff does not know C and seems to come down on the side of the argument that this knowledge is not necessary. Jeff hasn’t specifically said this out loud, that I’ve heard, but I gather this is his opinion based on how the conversation seems to flow. Joel, on the other hand, is of the opinion that programmers should have knowledge of the lower levels of programming even though it is not part of their daily job. His thinking on this is that the lower level knowledge gives programmers an edge even when programming with the higher level popular programming languages of today.
I have to agree with Joel on this. In my experience working with programmers in both categories, those who have a background of knowledge of the lower level programming languages always seem to be quicker at solving more complicated problems. Of course, there are exceptions to this rule but I would say 98% of the time this is true.
It is interesting also that when this topic comes up with colleagues, it is almost split right down the line in opinion with those who do not know C believing it is not necessary and those who do have experience with C believing this sort of experience and knowledge makes them a much better developer.
One good example supporting my argument (actually Joel’s argument) is garbage collection related issues. I’ve seen programmers spend a huge amount of time attempting to understand why the runtime memory size of their program is continuing to grow when, in their minds, the garbage collector should be coming to the rescue. Of course, the problem is usually that they somehow have a reachable reference to a huge collection of objects or something of this nature (usually several in fact). Programmers with the lower level knowledge seem to pick up on these sorts of problems much quicker.
Another area I have seen many issues with is threading. Languages like C# and Java make threading a reachable concept for the programming masses. This is a good thing unless you do not understand the underlying concepts of threading. I cannot begin to calculate how many conversations I have had with programmers concerning the thread safety of their methods. I also cannot count the number of blank stares I have received when I ask about the concept of thread safety in interviews.
I know that most will say that I am bringing up edge case problems that are not normal in business programming. I am willing to concede that. However, I also agree with Joel’s approach in that I tend not to hire programmers that do not have this knowledge because it happens often enough to be a problem. There are exceptions, but those programmers are “exceptional”.