Despite having programmed computers since before many graduate computer science students were born, no one ever actually taught me how to program. Being self-taught, I missed some of the fundamentals. Actually, I missed a lot of them, and every so often one of two things will happen: most commonly, I simply won't know how to do something that a first-year CompSci kid born during the administration of a President I voted against (or worse, voted for) picked up in her first class; less commonly, I will feel bad about this.
The category "things I don't know how to do" includes, for example, creating a linked list in C, or generating x86 Assembler code to index memory allocations on a heap. It comforts me to know that these fundamental questions have only affected my life once, when I interviewed at Microsoft in January 2005.
I've frequently thought about filling these gaps in my knowledge, not because I think it will help my business much, but because I hate not knowing stuff. So a couple of weeks ago I came across a recommendation to read Abelson's Structure and Interpretation of Computer Programming. (I thought I read this is Joel Spolsky's blog, but he has only one reference to Abelson in an entry I first read while trying to source this entry.)
I've started reading Abelson, with the consequence that at my advanced age I have also started learning a new programming language: Scheme. Abelson's book uses the language throughout, precisely because it has a simplicity that enables unbelievable complexity, not unlike the Latin alphabet. It comes out of an entirely different philosophy than does my primarly language, C#. I find it refreshing. And really cool. And I found a free interpreter that is also really cool, DrScheme.
Some readers may find this kind of amusing, as if a master mason had suddenly picked up a book on trowel design. But I think a thorough grounding in fundamentals makes anyone better at his or her profession, even if the knowledge is not strictly required. Learning how to create a linked list in C won't help me any more than learning how yeast cells reproduce would help a brewer.
Or, maybe, it will help me exactly as much, and make me a better programmer.