Vous êtes sur la page 1sur 1

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

Vous aimerez peut-être aussi