The skill matrix which I'm going to show makes for a fair and transparent snapshot of your skills for all parties: you and your (future) employer.
When applying for a job, beside the regular documents, I also attach a skill matrix structured like this:
I always got good feedback about its structure, after getting a job, because:
- it shows in a compressed format what I am able to do
- it gives an indication of how well I can do it,
- as well as how fast I can catch up with skills I haven't used in a while,
- and gives an indication of how fast and well I can acquire new skills.
By the end of the article, you'll have:
- a frame of mind
- a template file to edit
- a new item in your toolbox to get your next technical job
My skill matrix is split in the following sections:
- Programming Languages
- Methodologies, Processes, Principles and Practices
- Libraries and Frameworks
- Tools and extended software
- Other Skills
- Various Languages and APIs
Of course, you can invent and tweak your own sections. Here are some examples of what could go into each of them.
- Programming Languages: Assembler, C++, Java, PHP, Groovy, Python
- Methodologies, Processes, Principles and Practices: OOP, SOLID, SAFe, scrum, BPMN
- Libraries and Frameworks: Doctrine, hibernate, spring boot, jdbc
- Tools and extended software: git, haproxy, ansible, jenkins, magento2
- Other Skills: DevOps, networking, fundamental data structures and algorithms
- Various Languages and APIs: SQL, CSS, OAuth, Amazon Web Services
As you're probably not equally well-trained in all of these items, it's useful to also give them a level. I use a scale of 1 to 5.
Obviously, it's a self-assessment, but here are some ideas:
- levels between sections cannot be compared to one another
- levels within the same section should be relative to each other
- make a clear definition of the level 1, 3 and 5 per section
- use levels 2 and 4 for what feels like “in-between levels” and like a refinement of the previous level
Example definitions for the section “Programming Languages”:
- Level 1: all of the following apply
- I have written at least 5k lines of code with it
- I have read at least 10k lines of code
- I have dealt with the language consistently for at least 1 month
- I know the formal specification of the language and what is possible, even though I haven't fully digested all its idiosyncrasies
- I can navigate with ease the documentation of the standard library and possibly other important libraries
- I can use a basic toolset to get a smallish project done (including, if applicable: a compiler, a build system, a documentation system, a dependency management system, a testing system, a profiling system and a debugger)
- Level 3: level 1, plus the following
- I can program idiomatically in the language
- I know at least 90% of the darker corners of the language from an user point of view
- I am fully aware of 75% of the ecosystem and how it works
- I know the core terminology of the top 10-20 libraries/frameworks
- I am fully aware of all the modules/subsystems of the standard library and the core terminology
- Level 5: at least one of the following applies
- I know the strengths and weaknesses of all important libraries/frameworks
- I have contributed to the language
- I know how a major compiler/interpreter works internally
- I have written a module, a plugin, etc, for the compiler, if possible
- I have contributed to at least one major framework or to a couple libraries
Some things to keep in mind:
- the more languages/idioms you know, the easier it is to learn new ones. I know enough languages that I probably cover as much ground as a novice could cover while learning his second language in 3-6 months, if I just read the wikipedia article of the language and the formal specification of the language
- the amount of code you read and write, counted in LOCs, is a better measurement of the experience with the language than “time studied” or cyclomatic complexity, because we're really measuring your interaction with the language
- if you already know a bunch of languages, you can probably halve the amount of code you need to write in order to “pass level 1”, by targeting more unique features of the language or idiosyncrasies
- within level 5, the more you have under your belt, the stronger you stand within level 5, but it's totally ok to start forming your “T-shape” w.r.t. the language, without accomplishing all the points I have listed there
The last aspect of my skill matrix template is time. It serves more as orientation for others, and for yourself.
There are two colums in the template below regarding time: “years” and “last used”.
“Years” is a total accumulation of time, no matter the intensity (for “intensity” we already have the level as a measurement).
“Last used” is another useful aspect. As you use different technologies, you have to leave others aside. As time passes and the technology advances, you grow out-of-touch with that technology.
“Last used” allows you to make this clear, without losing level: I was at level 2 in assembler in year 2011 when I last used it. It makes the whole thing transparent and fair to everyone.
Final words and template
It's important to emphasize that the skill matrix is not only about technologies. Mine includes also soft skills like managing people, interviewing programmers, agile frameworks, but also algorithms and mathematics.
If many of your skills are in one area, let's say machine learning, it might be worth creating a new section dedicated for it. It helps you also market yourself better, but also to track your skills in a more targeted manner in that specific area.
Usually, you'll be adding new skills to your matrix, and bump up levels and years. So reserve at least one hour per year to take care of it.
As you'll use this template throughout your career, you'll notice a few things:
- as a beginner, you're glad to add new skills and improve old ones
- as you advance, you're glad to demote your level in some skills
My insight at this point is:
A senior developer is someone who is glad to demote his skills and content when he promotes skills or adds new ones.
Attached, you can find an editable template, and here is how it looks: