A useful proficiency matrix has been produced that could be used to track your own progress when learning to program or to advertise your skillset to prospective employers.
The Programming skills self-assessment matrix is a table that has been made available under a Creative Commons Attribution-ShareAlike 4.0 International License. It was drawn up by Raphael 'kena' Poss, a researcher in the Computer Systems Architecture Group of the University of Amsterdam.
In his post, How good are you at programming?, Poss explains that the initial idea of an assessment matrix appeared during discussions about average programmer skills in online forums and that he used the structure of the CEFR (Common European Framework of Reference for Languages) relating to proficiency in foreign languages as the basis for measuring proficiency in programming languages.
The matrix can be applied to any language and identifies three broad levels:
A - Basic
B - Intermediate
C - Proficient
The levels are the columns of the table and each is subdivided into two with a testable milestone for each sub-level.
The rows are for different programming activities in three groups:
Embedding in a larger system
Mastery of the environment
Poss gives the following suggestions of how to use the matrix.
row by row, to assess one's own level per activity (different skill levels for different activities are possible);
column by column from left to right, to determine one's own minimum level for a programming language (the rightmost level where all requirements in the column and all columns to the left are matched);
column by column from right to left, to determine one's most developed skill (the rightmost level where any requirement in the column is matched);
language per language, to assess one's own relative proficiency in different programming languages.
and suggests several scenarios in which it might be useful:
to track one's own progress while learning how to program;
for example: this year, I transitioned from A2 to B2 in C++.For Java, I am B1 for understanding but still A2 for writing.
to advertise the educational goals of a programming course;
for example: this Java introductory course will bring you to level A1 or A2 for all activities.
to advertise one's own skillset to peers or prospective employers;
for example: I am C1 in Python, B2 in O'Caml and A2 in Haskell.
to set basic level requirements for courses or professional activities:
for example: This course requires A2 proficiency with a language in the C family.
to select a programming course that best matches one's skill level;
for example: My current level is A2 but this course requires B1, so I will need some extra work before starting.
to coordinate the teaching objectives of successive programming courses in a curriculum;
for example: Our introductory course brings students to A2 in Java, but our follow-up program requires B1 or B2, so we need to propose a supplementary course for that level.
Having this type of standard seems a great idea - but of course it needs people to use it and to share it with others so that it catches on.