19

A few years back I stumbled across the code on the cob series of articles over at www.gamedev.net.

One article that particularly intrigued me was the one relating to programming 'stages'.
In it, the author (Chris Hargrove), describes how he believes that there are specific moments throughout a programmers career where they fundamentally alter their understanding (of programming) at a conceptual level.

"I could tell I had grown as a programmer between the time I joined [Raven] and the time I left, but I couldn't really explain how. At some time during my experience there, something in my head "clicked" that I couldn't describe. I was talking to a friend sometime afterward (who was also an employee there at the time), and he could relate to the feeling, which he'd had at one point as well. He could only describe it as "finding your code style". Although that term didn't quite grasp what I was thinking, it did make me wonder. Sometime afterward I began thinking about this "stages of a programmer" thing, and talked about it with a couple of my current coworkers here. Then I realized that the "click" I felt was me hitting one of those stages, and I started thinking about the other stages I've inadvertantly hit over the past few years... and which ones still remain."

The stages that he outlines are as follows:

Stage 1 - Fundamental. A programmer's first exposure to programming, learning basic logical and structural concepts, and so forth. Here one is capable of writing programs to solve certain problems, such as those assigned in school or with similar complexity. Programmers at this stage often don't have any real "drive" to program, but do so out of necessity or supplemental desires (i.e. it'll help them find a job).

Stage 2 - Exploratory. A large stage beginning with a realization that there are more possibilities in programming than once thought, usually marking the start of a programmer's motivational drive. Programmers here begin learning a wide variety of programming topics, languages, and paradigms, often in a random and self-taught order based on current interest and any information accessible.

Stage 3 - Concrete. A second "exploratory" stage where the programmer becomes comfortable with his/her current knowledge and methods of acquiring new information. Research mechanisms become more disciplined, and the programmer finds themself answering more questions amongst peers than asking them.

Stage 4 - Analytical. The programmer begins focusing less on implementation details of specific topics and more on problem analysis, including self-analysis of one's coding conventions and design methodologies. Large-scale construction issues become dominant over smaller-scale programming problems, which can now be solved as needed.

Stage 5 - Holistic. Programmers at this stage attempt to see projects from all angles, before and during construction. Software engineering decisions become disciplined, and a project's implementation becomes a mere manifestation of its design, not the controlling force. Construction details and related problems are increasingly seen before they happen, with the programmer capable of focusing on multiple levels of a design simultaneously.

Stage 6 - Dynamic. The programmer ceases to consider project design as the primary programming factor, and begins to focus on design of a design itself, turning the concept of a project into a completely abstract conceptual entity.

Stage 7 - ???

Now, normally I'm not one for psychological mumbo jumbo. But the idea presented by Chris really struck a chord with me. I can really relate to some of the 'key moments' he described. For example (although not really a stage) think back to when you first truly grasped OOP, and began to be able to leverage it in designs and patterns.

So, my questions are these:

1) Which stage do you feel you fall under?
2) Do you think the model is wrong? Prepose additional stages or retractions.
3) Do you think the whole idea is wrong? And that developers cannot by 'pigeon holed'
4) Can you remember any 'clicks' that you have noticed?

EDIT
I reckon I'm at stage 4. Looking at stage 5 :-)

20

I'm surprised there is no negative number stage in this scale. So I'll suggest the following:

Stage -1 - Net Negative Producing Programmer. A programmer that either can't write any code or spend their days cutting and pasting snippets of code. Essentially at this stage the programmer is a non-programmer who have no idea what they're doing. Instead they rely on their buzzword vocabulary to get through any job interview with HR. Their drive is to get their ranks up quickly and make lots of money while doing it. In summary they have no real drive to program and whenever they do it won't be any good.

I hope I won't run into one of those?

16

Stage 42 - Jon Skeet

14

Stage 7 - management

Stage 8 - realizing that other programmers on the team have become hardware components (often flakey) in a more holistic view of the projects than in stages 5 and 6 and looking for ways to design systems encompassing these entities with their specific issues

Stage 9 - replacing co-workers one by one with little Perl scripts

Stage 10 - Transcendence - replacing yourself with a Perl script

(I am between 8 and 9)

11

I'm at 3, will probably just stop at 5.

10

Sometimes I feel like I'm going from 1 to 7 and back to 1 regularly.

10

Do you think the whole idea is wrong? And that developers cannot by 'pigeon holed'

There are too many unaccounted-for factors. For example, lets say we had the following individuals:

  • A PHP guru. This is the only langauge she knows, and while she's only ever written CRUD-type web applications, she happens to be fantastic at it.

    • This person is a Level 6 according to the programming stages chart. I would personally classify this person as a beginner, since the amount of skill a person can develop plateaus very quickly if all you know how to do is write CRUD apps. This person may know when to use a hashtable, but be incapable of implementing one from scratch.
  • A jack-of-all trades: a programmer with broad and adequate experience with variety of languages, programming paradigms, and technologies. Experience includes Python, C#, OCaml, Lisp, Haskell, a variety of databases etc.

    • Its tempting to put this person at Level 2 (Exploratory), but a person with broad exposure to a lot of languages can approach problems from a number of angles. I'd probably say a person with broad, but shallow exposure to a lot of technologies is orders of magnitude above and beyond a person with narrow, deep exposure to one way of thinking.
  • A PhD in Comp Sci who writes lengthy papers on abstract algebra and its relation to formal logic.

    • Its tempting to put this person at the highest, conceptual level. However, I've interviewed people with doctorates in computer science who can talk at length about abstract concepts I've never heard before, yet have no capacity to write a for loop in any language. Would it make any difference if the PhD's research is purely conceptual, with no applications anywhere in the real programming world?

I'm going to say that the programming stages idea pigeon-holes programmers without consideration of their actual technical capacity and breadth of skills.

7

Stage 7 - cynical old coot :-)

5

I'm not sure that those later stages are universal- I'm somewhere past the analytical stage but I don't really see the Holistic and Dynamic stages in the way that they are described as places I need to be going. I wonder whether different pathways diverge at around that point as someone gets to the point where perhaps they have completed their apprenticeship as a programmer and are ready to start exploring their own directions.

Having read The Pragmatic Programmer and found it really resonated with me I understand our profession as a craft in the traditional sense, where the apprentice-journeyman-master course is described. As an apprentice you are learning what tools are available and how to use them to meet your ends, ideally with the support of more experienced artisans, as a Journeyman you are starting to develop your own style of working with those tools and become insightful and practical in their use, as a Master you have deep experience and expertise and you are probably developing new tools and creating more extraordinary work. Very few people reach a master status- most of us find a niche we are comfortable with somewhere in the Journeyman range - but to my mind once you have completed your apprenticeship ( which isn't the same as school by the way, in fact I would say it doesn't really start until you are programming professionally ) different people's paths diverge and the stages as described above are no longer universally applicable.

4

I'll be bold enough to say Stage 5, trying to transition to Stage 6. I'll also observe that no one is good at self-analysis; that is for other people to judge.

I've designed and built software for about 20 years and one thing really strikes me: experience is only of very limited usefulness in getting better at software development. Indeed, I've known lots of very experienced developers who really were pretty bad.

There is a book on this topic that I highly recommend to anyone who wants to get better at anything: Talent Is Overrated: What Really Separates World-Class Performers from Everybody Else by Geoff Colvin.

In this book, Colvin points out studies that show that Physicians with many years of experience are often no better (as measured by patient outcomes) and sometimes worse than those with just a few years experience. He goes on to posit that experience has little effect - only purposeful practice and a dedication to being better will make you better. This is profound advice and I've followed it relentlessly in both my work (software) and my sport (Sporting Clays) in order to improve. Buy the book though - there's a lot more in there.

3

5 on a good day, 3 on a bad one. I could just be arrogant and delusional though.

3

Great question.

I think if you start by doing projects (rather than taking courses) you skip the boring phase 1.

I guess I'm around 5, maybe.

Somehow I think I made a transition off to the side. With classical engineering training, studying CS in grad school, with years in AI in the presence of folks like Marvin Minsky, Pat Winston, Terry Winograd, Richard Greenblatt, Tom Knight, Seymour Papert, etc., somehow I came to a place in programming that is a bit lonely.

Since in AI the problems are so far out-there, the goal was to get the maximum insight into hard problems with the minimum programming effort. This works a lot with symbolic manipulation and leads to a coding style in which defining domain-specific-languages is a central technique.

I am often mystified at the extent to which data structure and events play a central role in most people's programming. And I see them running willy-nilly after a succession of bandwagons and acronyms, without having a central unifying idea of what software is really about.

I wrote a book about this, but I'm afraid I didn't do it very well. Anyway, it's out of print.

3

What stage is it when you're proud of yourself for having learned so much but more than a little worried that really you still don't know anything much?

2

I think I'm at 5, but probably a junior 5 since I have to make quite an effort to live up to it's description.

That said, I would be really dissapointed if I only have one (known) stage left.

Regarding "clicks", I think I only had one substantial click so far, which probably lies in the transition between 3 and 4, starting to see the code as an underlying form of design, and really being able to "code" on a much more abstract level before even touching a keyboard.

1

I relate to stages 1 to 4, so i think i am at stage 4 :)

The only thing i have to had is that not every programmer follows that path, and some never pass Stage 3

1

Somewhere between 2 and 4, depending on the day.

1

I'm at Stage 5 - Holistic, Approaching 6. :o)

1

Stage 7 - Given up on a thing you once loved, given up caring about the project. Now just doing it for the money.

(That's not me though.. probably like most senior dev's between 4 and 5)

1

I think 4. Trying to improve my code as I ... "code" :)

1

I'm pretty sure one of the stages should be related to "lunch"... (hmm... it swallows my link to Hitchhiker's Guide on WikiQuote; chapter 35 of book 1 should help you understand the reference...)

At least in most career paths I've noted, stages 1-2 would be the "grunt labor" at which most fundamental programming is done, stages 3-4 would be the "senior labor" at which strategic programming is done, and stages 5-6 would be either "architect" or "manager", at which almost no programming is done as most of your day is involved in getting stages 1-4 to produce.

1

>=2 && <= 3

1

Most of these scales need to be taken with an entire teaspoon of salt. In this case, I would say that often the lines of distinction between the first four stages are blurry at best. I'd imagine that many programmers will feel as if they have reached level four in one language, but only level one or two in another. Individual psychology has something to do with everything as well. Some people actually like spending a good deal of time on the minute, searching for the smallest bug and squashing it. Others do not.

I am definitely somewhere between two and four, though I suspect that this also has to do with personality type. I thrive on the increase of data. The more I know, the better, perpetually. On the other hand, my natural disposition (according to psychological/ability testing), is much more future-oriented. I am much more likely to conceive of the entire structure of a thing, by nature, than I am likely to spend a copious amount of time on the details — I would prefer to start learning a language by learning how to extend a class than by going through the basic tutorials (assuming I have a grasp of the data types). To me, tutorials have to do with learning libraries. OOP has to do with actually building structures.

0

"Stage 6 - Dynamic. The programmer ceases to consider project design as the primary programming factor, and begins to focus on design of a design itself, turning the concept of a project into a completely abstract conceptual entity."

Scarily I think I know where he's coming from by that,but it seems a poor way to put it. I'm not sure I can do better but to have a go:

Stage 6 = When it seems like you reached Stage 5 a long,long time ago and you've been doing it so long it comes as easy as breathing.

0

Somewhere between 2 and 3. I'm a Senior in a Computer Engineering BS program. I find myself wanting to branch at times, but I feel as though I am the go to guy for some of my peers, especially at my old job.

0

I am 2, trying to get to 3.

0

I am most definitely at Stage 2. I have TONS to learn. I feel constantly and continuously overwhelmed by the sheer volume of things I still need to learn. I'm strictly focused on .NET development right now, and STILL don't feel as though I can keep up.

At 38, I'm somwhat old to be at that stage, but I think it's both an asset as well as a liability. It's an asset in that I bring other skills (as an IT pro) to the table. It's a liability in that I simply don't have as much time to invest to exploration as I had at a younger age. I now have a wife, two young daughters and am attending college all at once. It eats away at my time.

OK, so enough venting from the old junior developer. We all have to start somewhere and I'm thrilled that I was able to make the transition. I think I just need to be satisfied to be at stage 2 for a while yet.

Cheers,

Steve

0

You forgot stage 0 - GDLK

casperOne <- GDLK

0

"Stage 10 - Transcendence - replacing yourself with a Perl script"

I almost did this once. I didn't quite replace myself with a Perl script though. It was a shell script.

(It's one way to escape from a job.)

0

I think I'm firmly anchored at stage 3 visiting all other stages as needed. Stage 6 I visited once briefly and decided never to go back.

0

Degree of modularity: of needing to create a more modular design, at the cost of efficiency. I'm familiar with modular techniques, design patterns and so on, but I haven't really needed them (or been convinced that I needed them) til now.

I think it's less a stage of my own development than a function of program size/complexity.

0

Stage 7 - Architecture Astronaut. When the programmer has transcended all design and implementation concerns and has discovered the one solution to end all problems.

0

-1 after years of practice i can confidently call myself a mindless noob

0

I'm of the opinion that it's impossible to define stages above your own understanding. Those at higher-levels can define them, and the lower-level ones read the definitions, but without the "click", it's just empty words. It is even very difficult to recognize others who have attained higher stages than yourself, which is why it is often difficult for a bad development team or manager to find good programmers to hire. Often they can recognize when someone is better, but not how much better they are. This is why a software startup with clueless people will only incrementally, if ever, get a better development team.

Since Stage 6 doesn't make much sense to me, I conclude that I'm at Stage 5. I think that stage and the others below it make sense. Because the OP self-reports as a 4 or 5, I think 6 and above are probably meaningless creations... It would be interesting to have someone who has attained such levels provide more meaningful definitions, but still we mere mortals probably wouldn't be able to understand fully. The only way to go up the ladder is to make mistakes that cause you to realize something new and big, which requires practice. Hence, practice makes perfect.

0

Stage 12? I'm no long concerned about just writing the code, it's the attributes of the code that have become important. So, I'm more interested in:

  • How can I fully encapsulate a problem to ensure that I will only need to revisit it an absolute minimum number of times?

  • How can I write the code so that it will get easier and easier to leverage over time?

  • How can I keep other people from messing up these initial attributes?

  • How can I communicate these issues to other programmers, so that they can get quickly beyond the initial stages themselves?

and then finally:

  • How can I get the freedom (financing?) to allow me to explore more ways of getting beyond these issues, instead of just having to constantly rebuild things in defective technologies that will probably get replaced in five years (and every five years thereafter)?

Paul.

0

Anyone actually thinking about which stage they're on are already at least at stage 2, otherwise they wouldn't care.

0

Stage = (number of languages + number of projects)(reusable code^2) / (projects over budget)(projects off time) : )

0

I actually am a ksh script.

Actually, I'd locate myself in stage 3, though I believe I interact with stages 4-6 as well. My current employer (like many of yours, I'm sure) is quite self-conscious about design and meta-design, and while I think on those things, I don't feel I've internalized them yet. Getting there, hopefully.

Perhaps one can exist on multiple levels or jump around the list depending on the nature of their job/role at a given time?

0

I'm somewhere between stages 5 and 6, I think. I sort of understand what stage 6 is discussing but it is too much of a rabbit hole for me at this point. I understand most of what is said up until that point though. Perhaps I'm slightly divergent looking at systems rather than a single program. So, I could have a web service here, a web application there, console application in another place all part of the same codebase used as part of a solution for something. I can look at how big this CMS project is that I have and ponder, "Gee, how big can a codebase get?"

-1

Interesting scale. Seems more or less accurate/useful. I believe I am at stage 5 and have no plans to move to stage 6 any time soon. Perhaps this indicates that there may be forks in this scale? Indeed, a more complex shape (tree? mesh?) might be more accurate for this.