Each field contains several rows with the columns ‘2n’, ‘n2’, ‘n’, and ‘log(n)’. I rank myself in each field by the lowest score attained (the chain is only as strong as its weakest link cliché), but note where I am generally strong.
Fields: data structures, algorithms, systems programming
Overall score: n2
Assessment: I am very weak on algorithms; this is partly due to the fact that my computer science education only went through the basic data structures class, but also my focus to date on systems programming. I grok the basic data structures (linked lists, trees, etc…) and I understand basic sorting, but I’ve never had a reason to learn the more complex side. This is definitely something I would like to fix.
Fields: version control, build automation, automated testing
Overall score: n (leaning towards log(n))
Assessment: Software engineering is a field I’m fairly strong at. The weakest link in this case is automated testing, and in that case I’m held back by UI testing. I’ve not done much code that has a real UI, so testing that component is not something I’m very strong at. Build automation is a solved problem, and I’m strong with Makefiles, autotools, shell scripting, and in general not doing things by hand. I’ve got a strong background in both Git and Mercurial, so that helps out with the source control aspect.
Plan to improve: this isn’t a field I that I’m going to prioritise right now. Once some of the other fields have been dealt with, I can move forward here.
Fields: problem decomposition, systems decomposition, communication, code organisation in a file, code organisation across files, source tree organisation, code readability, defensive coding, error handling, IDE, API, frameworks, requirements, scripting, databases
Overall score: n2 (strongly leaning towards n or better)
Assessment: In general, I rank mostly n or log(n); databases are the one n2 element that is holding me back in this assessment, as the systems work I’ve done hasn’t require much in the way of database work. Functional programming has greatly boosted my problem and systems decomposition skills, and my background has also taught me how to communicate well. As for code organisation, I write clean code. Thanks to Lawrence Teo, I make sure to license all of my code; one of the first things I do when starting new projects is to create a README. I’ve written a Python library to help with defensive coding, and part of my unit tests involves testing to ensure that exceptional states are checked. I do need more work on my error handling skills and devising better strategies. As for the IDE, I use vim and emacs, and have written both vimscripts and elisp code to extend my editor. I generalised the API portion; I’ve written API interfaces to simplify access to various APIs and I’m working on a Common Lisp REST API toolkit now to facilitate quickly interfacing to new REST APIs. I don’t generally use frameworks much (as a systems programmer), so that is a weaker skill for me. The closest I’ve come is using the noir web framework for Clojure, and I haven’t done enough with that to really get good at it. I’m very adept at scripting - I script almost anything I find myself doing more than once, and have even written a static site generator in POSIX Bourne shell, and live by the Unix command line tools.
Plan to improve: I need to start using databases more. Some of the projects I have in the works will help with this. I think much of this will come with experience.
Fields: languages with professional experience, platforms with professional experience, years of professional experience, domain knowledge
Overall score: n2
Assessment: I need more experience.
Plan to improve: Stay in the field. Learn, code, hack more.
Fields: total knowledge, languages exposed to, codebase knowledge, knowledge of upcoming technologies, platform internals, books, blogs
Overall score: n
Assessment: I’ve got a fair amount of knowledge. I keep finding, as the saying goes, the more I learn, the more I learn I have yet to learn. As for platform internals, I have a fairly solid in-depth knowledge on the internals of the CPython platform and the C language. The little bit of reversing I have done has given me a fairly in-depth understanding of how C programs are compiled and what the resulting assembly looks like.
Plan to improve: One strategy for improving that I think offers a high payout is to read more books aimed at core skills, rather than books aimed a specific skill or language.
If I score the top-level fields the same way I scored the subfields, it turns out I am an n2 programmer. I have a lot of work to do. My priority right now is to brush up on algorithms and data structures, and work on gaining a deeper knowledge of that field.