0% found this document useful (0 votes)
402 views1 page

Programming Skills Matrix

This document provides a self-assessment matrix for programming skills. It contains descriptions of increasing levels of proficiency across several dimensions of programming including writing code, understanding code, interacting with code, explaining/discussing code, self-learning, and mastering the development environment. The levels range from basic user to expert and provide examples of tasks and abilities at each level.

Uploaded by

Anonymous 782wi4
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
402 views1 page

Programming Skills Matrix

This document provides a self-assessment matrix for programming skills. It contains descriptions of increasing levels of proficiency across several dimensions of programming including writing code, understanding code, interacting with code, explaining/discussing code, self-learning, and mastering the development environment. The levels range from basic user to expert and provide examples of tasks and abilities at each level.

Uploaded by

Anonymous 782wi4
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Programming skills self-assessment matrix

W
r
i
t
i
n
g
Writing code
Refactoring
U
n
d
e
r
s
t
a
n
d
i
n
gReusing code
I
n
t
e
r
a
c
t
i
n
g
Troubleshooting

A1
Basic User
A2
Basic User
B1
Intermediate User
B2
Intermediate User
C1
Proficient User
C2
Proficient User
I can produce a correct implementation for a
simple function gi!en a "ell#defined
specification of desired beha!ior and
interface "ithout help from others$
I can determine a suitable interface and
produce a correct implementation gi!en a
loose specification for a simple function
"ithout help from others$ I can brea% do"n a
comple& function specification in smaller
functions$
I can estimate the space and time costs of
m' code during e&ecution$ I can empiricall'
compare different implementations of the
same function specification using "ell#
defined metrics including e&ecution time and
memor' footprint$ I e&press in!ariants in m'
code using preconditions assertions and
post#conditions$ I use stubs to gain fle&ibilit'
on implementation order$
I use t'ping and interfaces deliberatel' and
producti!el' to structure and plan ahead m'
coding acti!it'$ I can design and implement
entire programs m'self gi!en "ell#defined
specifications on e&ternal input and output$ I
s'stematicall' attempt to generali(e functions
to increase their reusabilit'$
I can s'stematicall' recogni(e inconsistent or
conflicting re)uirements in specifications$ I
can brea% do"n a comple& program
architecture in smaller components that can
be implemented separatel' including b'
other people$ I can us e&isting *+,-./s or
metaprogramming patterns to increase m'
producti!it'$
I can reliabl' recogni(e "hen under#
specification is intentional or not$ I can e&ploit
under#specification to increase m'
producti!it' in non#tri!ial "a's$ I can de!ise
ne" *+,-./s or create ne"
metaprogramming patterns to increase m'
producti!it' and that of other programmers$
I can adapt m' code "hen I recei!e small
changes in its specification "ithout re"riting it
entirel' pro!ided I %no" the change is
incremental$ I can change m' o"n code
gi!en detailed instructions from a more
e&perienced programmer$
I can determine m'self "hether a small
change in specification is incremental or
re)uires a large refactoring$ I can change m'
o"n code gi!en loose instructions from a
more e&perienced programmer$
I can deri!e a refactoring strateg' on m' o"n
code gi!en relati!el' small changes in
specifications$ I can change other people0s
code gi!en precise instructions from a person
alread' familiar "ith the code$
I can predict accuratel' the effort needed to
adapt m' o"n code base to a ne"
specification$ I can follo" an e&isting
refactoring strateg' on someone else0s code$
I can ta%e full responsibilit' for the integration
of someone else0s patch onto m' o"n code$
I can re!erse#engineer someone else0s code
base "ith help from the original specification
and predict accuratel' the effort needed to
adapt it to a ne" specification$
I can re!erse#engineer someone else0s code
base "ithout original specification and
predict accuratel' the effort needed to adapt
it to a ne" specification$
+mbedding in a
larger s'stem
I %no" the entr' and termination points in the
code I "rite$ I can use the main I12 channels
of m' language to input and print simple te&t
and numbers$
I am familiar "ith recommended mechanisms
to accept program options1parameters from
the e&ecution en!ironment and signal errors
and use them in the code I "rite$
I can delegate functions to an e&ternal
process at run#time$ I %no" ho" to
producti!el' use streaming and buffering to
"or% on large data sets and use them in m'
code$ I am familiar "ith the notion of localit'
and use it to tailor m' implementations$
I am familiar "ith at least one API for bi#
directional communication "ith other run#time
processes$ I can "rite client code for simple
Internet protocols$ I am familiar "ith the most
common pac%aging and redistribution
re)uirements of at least one platform and use
them in m' o"n pro3ects$ I can use
predetermined programming patterns to
e&ploit platform parallelism producti!el' in m'
code$
I can implement both client and ser!er
soft"are for arbitrar' protocol specifications$ I
can )uantif' accuratel' the time and space
o!erheads of different communication
mechanisms *e$g$ s'scalls pipes soc%ets,$ I
am familiar "ith hard"are architectures and
can predict ho" se)uential programs "ill
beha!e "hen changing the underl'ing
hard"are$ I can estimate the scalabilit' of
parallel code fragments on a gi!en platform$
I am familiar "ith most soft"are architectures
in use "ith s'stems I de!elop for$ I can "or%
together "ith s'stem architects to mutuall'
optimi(e m' o"n soft"are architecture "ith
the o!erall s'stem architecture$ I am familiar
"ith most design and operational cost1benefit
trade#offs in s'stems that I de!elop for$
I can assemble program fragments b'
renaming !ariables until the "hole becomes
coherent and compatible "ith m' goal$
4i!en a librar' of mostl' pure functions and
detailed API documentation I can reuse this
librar' producti!el' in m' code$
I can recogni(e "hen e&isting code re)uires
a particular o!erall architecture for reuse *e$g$
an e!ent loop,$ I can adapt m' o"n code in
ad!ance to the re)uirements of multiple
separate libraries that I plan to reuse$
I can recogni(e and e&tract reusable
components from a larger code base for m'
o"n use e!en "hen the original author did
not en!ision reusabilit'$ I can pac%age
document and distribute a soft"are librar' for
others to reuse$ I can interface stateless
code from different programming languages$
I can s'stematicall' remo!e constraints from
e&isting code that are not mandated b'
specification to ma&imi(e its generalit'$ I can
read and understand code that uses APIs
most common in m' domain "ithout help
from their documentation$ I can interface
code from different programming languages
"ith distinct operational semantics$
I can disco!er and reliabl' e&ploit
undocumented1unintended beha!ior of an'
code "ritten in a language I understand
including code that I did not "rite m'self$
+&plaining 1
-iscussing code
I can read the code I "rote and e&plain "hat I
intend it to mean to someone more
e&perienced than me$
I can read code from someone of a similar or
lo"er le!el than me and e&plain "hat it
means$ I can recogni(e and e&plain simple
mismatches bet"een specification and
implementation in m' code or code from
someone at the same le!el as me or lo"er$
I can sho" and e&plain code fragments I
"rite in either imperati!e or declarati!e st'le
to someone else "ho %no"s a different
programming language "here the same
st'le is pre!alent so that this person can
reproduce the same functionalit' in their
language of choice$
I can e&plain m' data structures algorithms
and architecture patterns to someone else
using the standard terms in m' domain
"ithout reference to m' code$
I can gauge the e&pertise le!el of m'
audience and change the "a' I tal% to them
accordingl'$ I can recogni(e "hen an
e&planation is o!erl' or insufficientl' detailed
for a gi!en audience and gi!e feedbac%
accordingl'$
I can ta%e part effortlessl' in an'
con!ersation or discussion about the
language*s, I use and ha!e a good familiarit'
"ith idiomatic constructs$ I can come up
spontaneousl' "ith correct and
demonstrati!e code e&amples for all
concepts I need to share "ith others$
+&ploring self#
learning
I can distinguish bet"een a command prompt
at a shell and an input prompt for a program
run from this shell$ I can follo" online tutorials
"ithout help and reach the prescribed
outcome$ I can search for the te&t of common
error messages and adapt the e&perience of
other people to m' need$
I can distinguish bet"een features general to
a language and features specific to a
particular language implementation$ I can
read the te&t of error messages and
understand "hat the' mean "ithout e&ternal
help$
I can read the reference documentation for
the language*s, or API I use and refer to it
to clarif' m' understanding of arbitrar' code
fragments$ I can understand the general
concepts in articles or presentations b'
e&perts$ I can trac% and determine "ho is
responsible for an arbitrar' code fragment in
a s'stem I use or de!elop for$
I can infer the abstract operating model of an
API or librar' from its interface "ithout
access to documentation and "rite small test
programs to test if m' model is accurate$ I
can recogni(e "hen a reference
documentation for a language or API is
incomplete or contradictor' "ith a reference
implementation$
I am able to read and understand most
e&pert literature applicable to the languages I
use$ I am able to recogni(e "hen an
academic inno!ation is applicable to m'
domain and adapt it for use in m' pro3ects$
I can recogni(e and e&pose tacit
assumptions in e&pert literature in m'
domain$ I can reliabl' recogni(e "hen the
narrati!e or description of a programming
achie!ement is false or misleading "ithout
testing e&plicitl'$
5aster' of the
en!ironment
I can use a common programming
en!ironment and follo" common "or%flo"s
step#b'#step to test1run a program$
I can integrate m' source files in a
programming en!ironment that automates
large portions of m' programming "or%flo"$ I
use !ersion control to trac% m' progress and
roll bac% from unsuccessful changes$
I e&press and use dependenc' trac%ing in m'
programming en!ironment to a!oid
unnecessar' *re,processing in m'
de!elopment c'cles$ I can use different
de!elopment branches in !ersion control for
different programming tas%s$
I use different "or%flo"s for different
programming assignments "ith different
trade#offs bet"een initial set#up o!erhead
and long#term maintenance o!erhead$ I can
enter the en!ironment of someone else at m'
le!el or belo" and ma%e code contributions
there "ith minimal training$
I modif' m' programming en!ironment to
tailor it to m' personal st'le and can )uantif'
ho" these changes impact m' producti!it'$ I
can producti!el' use the preferred
programming en!ironments of at least 678 of
all programmers at m' le!el or belo"$
I can reliabl' recogni(e and )uantif' friction
bet"een other programmers and their
programming en!ironment$ I can measurabl'
impro!e the producti!it' of m' peers b'
helping them tailor their en!ironment to their
personal st'le$
I can distinguish bet"een correct and
incorrect output in m' o"n programs$ I am
familiar "ith the eti)uette for as%ing help from
e&perts in m' domain$
I can reliabl' distinguish bet"een incorrect
output due to incorrect input from incorrect
output due to program error$ I can narro"
do"n the location of a program error in a
comple& program to a single module or
function$ I can isolate and fi& Bohr bugs in m'
o"n code$
I can translate human %no"ledge or
specifications about in!ariants into assertions
or t'pe constraints in m' o"n code$ I can
inspect the run#time state of a program to
chec% it matches %no"n in!ariant$ I "rite and
use unit tests "here applicable$
Ican reduce a program error to the simplest
program that demonstrates the same error$ I
ha!e one or more "or%ing strateg' to trac%
and fi& heisenbugs in code that I can
understand$ I "rite and use regression tests
for code that I "or% "ith directl'$
I can de!ise s'stematic strategies to trac%
and fi& mandelbugs in code that I can
understand$ I can recogni(e a hard"are bug
in a s'stem dri!en mostl' b' soft"are I
designed$
I can trac% and attribute responsibilit'
accuratel' for most une&pected1undesired
beha!iors in s'stems that I de!elop for$ I can
trac% and isolate hard"are bugs in s'stems
"here I ha!e access to all soft"are sources$
Cop'right 9 271: Raphael ;%ena< Poss$ Permission is granted to distribute reuse and modif' this table according to the terms of the Creati!e Commons#.hareAli%e :$7 International /icense$
+&planator' notes are a!ailable online at= http=11science$raphael$poss$name1programming#le!els$html

You might also like