Expert and Novice Programmers
May 10th, 2005An article on Java World, Hiring the phantom Java architect, sparked an interesting debate at the server side regarding what it means to be a developer versus an architect. I very much dislike the term architect and like to think of this instead in terms of programming skill level.
Cognitive science research on problem solving tries to examine the difference between experts and novices in a domain. Rather than distinguish between developers and architects, I think it is better to distinguish between experts and novices at programming. The Dreyfus model of skill acquisition details five skill levels to help in this task. Here is a summary from Coding Horror:
Level 1: Beginner
- Little or no previous experience
- Doesn’t want to learn: wants to accomplish a goal
- No discretionary judgement
- Rigid adherence to rules
Level 2: Advanced Beginner
- Starts trying tasks on their own
- Has difficulty troubleshooting
- Wants information fast
- Can place some advice in context required
- Uses guidelines, but without holisitic understanding
Level 3: Competent
- Develops conceptual models
- Troubleshoots on their own
- Seeks out expert advice
- Sees actions at least partially in terms of long-term plans and goals
Level 4: Proficient
- Guided by maxims applied to the current situation
- Sees situations holistically
- Will self-correct based on previous performance
- Learns from the experience of others
- Frustrated by oversimplified information
Level 5: Expert
- No longer relies on rules, guidelines, or maxims
- Works primarily from intuition
- Analytic approaches only used in novel situations or when problems occur
- When forced to follow set rules, performance is degraded
The Java World article laments about companies that advertise for experts, but don’t interview for it. I have to say this struck a nerve with me. Multiple choice tests like the Zend Certification disappoint me. Tests like this don’t measure skill on this scale at all, they measure exposure.
In the past, I’ve used a coding sample as an interview question. The code, about 250 lines, was distilled from an existing system and is horribly bad in so very many ways, but functional. By showing the code to an interviewee and asking them what they would do to improve it, I found I could get a good idea of their skill level. Novices simply had no idea what to do with it and would just move code around. Sometimes they would insert comments, trying to make the code “better.” Some candidates only found and fixed one problem (there were several major ones.) No one fixed all the problems. The one person that I interviewed and didn’t have look at the code (for time reasons), we had to let go. He simply fooled us at his interview about his skill level. The thing is that I am certain he could have passed a Delphi certification test. (like the one I took at Brain Bench.)
Moving from novice to expert programmer takes a very long time. From Teach Yourself Programming in Ten Years:
Researchers (Hayes, Bloom) have shown it takes about ten years to develop expertise in any of a wide variety of areas, including chess playing, music composition, painting, piano playing, swimming, tennis, and research in neuropsychology and topology. There appear to be no real shortcuts: even Mozart, who was a musical prodigy at age 4, took 13 more years before he began to produce world-class music. In another genre, the Beatles seemed to burst onto the scene with a string of #1 hits and an appearance on the Ed Sullivan show in 1964. But they had been playing small clubs in Liverpool and Hamburg since 1957, and while they had mass appeal early on, their first great critical success, Sgt. Peppers, was released in 1967. Samuel Johnson thought it took longer than ten years: “Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.” And Chaucer complained “the lyf so short, the craft so long to lerne.”
So you can’t become an expert without experience. However, you can have experience without becoming an expert. Some people just put in their time and never develop themselves. So these people may have the answers to the certification trivia question for their specific environment and be able to get past the HR resume screeners with their buzzword detectors, but they will not have the impact that a true expert would have in the same situation. Just like our Delphi Dud.
May 10th, 2005 at 10:26 pm
Excelent point of view, you are so so so right !
May 11th, 2005 at 7:05 am
one of the better php blog posts i’ve seen in a while. well done.
May 11th, 2005 at 7:06 am
one of the better php blog posts i’ve seen in a while. well done.
May 11th, 2005 at 7:06 am
not that it’s specifically geared toward php, of course, just that you’re on the php blogrolls.
May 11th, 2005 at 7:44 am
That was a good one! Unlike you, I like the term ‘Architect’ and use it, but more for marketing than accuracy reasons. Folks not in the business tend to think of programming as a mechanical process without artistic or intuitive aspects; ‘architect’ shifts the paradigm.
R.
May 11th, 2005 at 12:04 pm
amazing, we’re sharing the same Ideas. Especially that you can have experience without being an expert. I see many people programming for 5 years and not advancing at all.
May 12th, 2005 at 3:12 am
Good point about measuring the difference between skills and exposure. A heavily management oriented design processes can feel like a multi-choice test for producing social outcomes, with the resulting chaos often due to the lack of leadership, resulting from the inability of people to adapt their working style to deal with novel situations.
The code test sounds like an interesting way to quickly get a solid qualitative assessment of how well someone understands what they are doing. I totally agree that experts and novices is a far more relevant distinction - the notion of architecture seems grossly misused these days, both in the enterprise software and web/user-interface design industries.
The title “Architecture” is often used as a substitute for what could better be described as “Management Driven Design”, where practicioners often fail to comprehend the essential spatial skills required to solve informational and social problems (ironically, this is the actual meaning of the term architecture - it involves a spatial design context, and is usually the domain of intuitive experts).
May 12th, 2005 at 4:50 pm
Hi.
For more research on expertise check out the (awfully titled) “Sources of Power” by Gary Klein. It’s a fun read as well.
yours, Marcus
May 13th, 2005 at 11:52 am
Very Interesting. After looking at the 5 skill levels, It makes me wonder where I fit. I’d like to see the 250ln code sample to see how i fare.
May 13th, 2005 at 3:05 pm
This reminds me of arguments between Physicists and Engineers at University, myself from the former camp. My path through education was defined by “what requires least use of memory” and Physics is a great subject if you regard facts (or conclusions) as worthless mental burden which can be looked up vs. actually understanding the underlying principle, which is alot easy to remember and allows you to derive the conclusions again should you need to.
December 27th, 2006 at 4:18 am
Awesome tips and points regarding rating a good programmer. But 10 years seem to be a long time to master a programming language.
January 8th, 2007 at 11:09 am
I dunno. Learning a programming language should essentially be a matter of days or weeks, depending on its complexity. Most languages just use different syntax for various constructs - consts, variables, functions, classes, packages, templates and pointers. I think this pretty much sums up all there is in any programming language. It should not take years to get used to a new syntax.
Syntax in most languages is pretty intuitive. However, groking templates is a lot more difficult than understanding variables or consts, for example, so most time you spend when you first encounter a new language construct, not a new syntax (for example switching from the Pascal or Basic
Forto the C/C++/Javaforintroduces you to a slightly different and more complex language construct, not to a new syntax for exactly the same construct, and this is the kind of difference that generates learning effort.Also, it really takes a lot of effort to learn a complex library (like the std C lib or the std C++ lib, or STL, or just java.lang).
But neither learning generic programming constructs nor learning a lib have anything to do with actually learning a language, IMO.
It also can be at least nerving to switch from desktop programming to server-side scripting, due to the restrictions imposed by a not so interactive user interaction. But this also has nothing to do with actually learning a language. It doesn’t matter whether you script server-side in php or VBScript, once you got it right you can easily switch, and just spend some more time on learning the different libs, mastering the new language itself should be almost no effort.
Also, learning a language or even fully mastering the ins and outs of a language does not make one a programmer. A seasoned programmer should only take days to fully grok a new language, no matter how complex. But to become an expert programmer, you surely need ten years of programming with more advanced concepts, like classes or templates. And to become productive in a new environment, you surely must spend a lot of time learning a new lib. But the language switch should be the easiest part of it.
(Also, IMO, after going through a few libs, learning new libs should become easy, since you usually find similar or almost similar patterns of how libs are organized and what is available in different libs, specific to various languages. Some not so basic libs are even maintained in various languages, so you don’t really ahve to re-learn them.)
May 15th, 2008 at 4:50 pm
To those that said they disagree that it takes ten years to learn a programming language. First of all I know this post is old but I need set folks straight. The title Teach Yourself Programming in Ten Years has nothing to do with what language you write in.
Whether
in order to become a proficient programmer and write decent code it does take TEN+ years. Anything less your not considered a professional/seasoned programmer but rather an enthusiast!
When you have ten solid years of programming no mater what the language is, it should only take a few weeks to learn syntax and write decent software without making stupid mistakes.