A blog post by Andy Firth, an Engineer Architect at Bungie, called The demise of the low level Programmer is getting some attention lately. In the post he lists some things that low level programmers (or perhaps he should have said high performance programmers) should know. He bemoans that all too many programmers today don’t have knowledge of low level programming. He says that “so much of what I consider to be essential is simply not being taught anymore.” They include:
- Floating Point Numbers
- Fixed Point Numbers
- Bit shifting
- Processor Cache Behavior / Memory
I’m not so convinced that these things are not being taught anymore. Oh to be sure they are not all covered in the first several courses. Except for sorting which is of course covered in Advanced Placement Computer Science and I hope most first year college CS courses. As someone said in the comments to Adam’s post “If you weren’t taught this list and you have a "Computer Science" degree, I would argue that you don’t really have a Computer Science degree.” If you look at the ACM/IEEE curriculum documents (start with Computer Science Curriculum 2008 final report (CS2008) and you will find these items, either explicitly or implicitly, listed as part of the core knowledge that students must be taught as part of a CS degree. Now some programs may go into more or less depth in these areas. And students are not always great at retaining everything they learn. There are more then enough good programming jobs that don’t actually require low level programming so some students will move past it and forget it once a course is finished. But saying these things are not taught is just not the case.
Someone else pointed out that many game developers do not have CS degrees. That, I believe, highlights the problem with teaching oneself computer science. CS faculty know that students should have these knowledge items but if you are learning on your own how would you know? It is pretty easy to find shortcuts that are not “low level programming” but get the job done after a fashion. For most applications that is enough. On the other hand a lot of game code, and other important real-time applications, do require the sort of performance that low level programming enables. Where are you going to learn it? Oh sure once you know that you need to know it you can learn it on your own. And many successful game developers no doubt have done so. It’s probably not the easiest or the best way to learn these things though. This is one of the reasons that I recommend a degree in computer science for people who want to be serious developers.