Programmer Competency Matrix: This page presents a matrix of programmer skills and what it requires to be at different levels, 1-4, from novice to master.
For instance, for “data structures,” it outlines the following levels:
- Doesn’t know the difference between Array and LinkedList
- Able to explain and use Arrays, LinkedLists, Dictionaries etc in practical programming tasks
- Knows space and time tradeoffs of the basic data structures, Arrays vs LinkedLists, Able to explain how hashtables can be implemented and can handle collisions, Priority queues and ways to implement them etc.
- Knowledge of advanced data structures like B-trees, binomial and fibonacci heaps, AVL/Red Black trees, Splay Trees, Skip Lists, tries etc.
I picked “data structures” specifically for good reason: I still don’t know what a LinkedList is. I’ve always wondered, but I truly do not know. I’ve talked to Joe about it, and he claims I do actually know what they are and have used them, but since I have no formal training in computer science (I was going to be a lawyer, after all), I just don’t know one when I see it.
I looked through the entire list, and I average about the second level (level 1, because the levels are 0-based). That was a little humbling, but there are two points that are important to acknowledge here:
I score much higher on some things than others. For instance, I’m probably at level 3 for “version control,” level 4 for “communication,” and level 3-4 for “code organization.”
Thankfully, besides than one blip on “data structures, ” I don’t think I’m a complete novice for anything else (maybe “systems programming,” just because I’m not 100% clear on the difference between a “linker” and an “interpreter”).
This list is designed for pure programmers. If it was designed around Web development, I’d score much differently. Web development encompasses a wider variety of skills (both code and human-oriented), and it keeps you more superficial inside them. The reason I don’t know what a LinkedList is, for instance, is because I’m abstracted far enough away from C that I haven’t had to use them — there are usually three or four layers between me and the core implementation.
Even if these lists are totally arbitrary and just one guy’s opinion, they’re still valuable because they help you learn what you don’t know. If I really want to bone up on some aspects of programming, this matrix gives me a good roadmap of where to go.