Followers

Tuesday, March 24, 2009

The four stages of programming competence


One of the basic pillars of the study of human psychology is the analysis of the subconscious and conscious mind. Sigmund Freud was one of the first to clearly identify and characterize the ‘areas’ where our psychic energy flows. During the first part of his notable life he stated that these were the ’subconscious’, ‘preconscious’ and ‘conscious’ mind.

If we wanted to get an idea of how each of them is involved in our ideas, feelings, thoughts, decisions and motivation (which are key in our daily and professional lives), we should picture ourselves as an iceberg. The tip of the iceberg, the only part we see from the surface, is the conscious mind. It’s logical, organized, and we can control it, but still small. The vast and voluminous underlying mass is the unconscious mind. It’s disorganized, illogical, irrational, but defining in how we act.

Modern psychology has attempted to classify how good we are at a certain skill by observing how deep it perforates that iceberg. It thus describes four stages of competence an individual can achieve. In this article I’ll try to apply this simple scheme to the skill we practice everyday: programming.

Stage 1: Unconscious incompetence

John is a young web developer. He used to be a law student, but he thought that wasn’t where the money’s at, so in the blink of an eye he made the switch. He was always good at fixing his buddies computers, so he figured it would be easy. He quickly looked up a few places (near his home, naturally) where he could learn the job. After six months he claims to be a Web Development expert, and his resume lists every programming language, software application and platform known to man.

John, in reality, is a ruthless copypaster. He thinks succeeding at displaying an alert window is all there’s to Javascript. PHP? Piece of cake: he installed Wordpress. Linux? He booted an Ubuntu LiveCD, he could surely set up a cluster of load-balanced Apache web servers. His knowledge knows no frontiers.

The problem here is that John is unaware of all he could learn, so he simply doesn’t. He’s in a bubble that no one at the online forums or mailing lists he usually visits can burst, when they try to gently explain the root of his problems is his superficial knowledge. And sadly, his hourly rate is bigger than yours and mine combined.

John is unconsciously incompetent.

Stage 2: Conscious incompetence

Mark is a math teacher. He works at a small downtown university which he wishes had at least five times the resources it currently has. He believes they’re a few steps back from other institutions when it comes to technology, so he decides to get hands to work. He wants to build an online platform to share the material of the courses with the community.

Mark has a naturally logical mind. He knows that in order to execute that task he’ll need to do his research, get information. His quest starts in Wikipedia, but at the end of a long browsing session, he’s learned that a few groups of people around the world offer Open Source solutions to his problem.

He picks the project he thinks best suits his needs. He proceeds to read the documentation and tutorials he finds on the website, and finally downloads the program. All his excitement fades away when he sees that ‘Database connection error’ issue. He tries and tries, even triple-checks his steps, to no avail. Mark is not irritated, he knows it’s not his field of expertise.

He heads to the mailing list and describes his solution with all the exactitude his knowledge allows, which is little. He warns everyone that he’s not exactly sure of what he’s doing, so he’ll welcome more documentation to read, or any tips people can spare. He won’t have to wait long for a solution, because he’s doing the right thing.

Mark is consciously incompetent.

Stage 3: Conscious competence

It’s been two years since Adrian picked up his first HTML book. It clearly has been a one-way ride, for all Adrian thinks about every day is how to improve at what he loves. A few months ago he picked up his first freelance jobs in a website, which he executes passionately despite how low the pay and how basic the task is, even to him.

Of one thing he’s convinced: the best way to learn is to persevere, try and fail, and try again. He always researches how to best execute a task, since it doesn’t come naturally to him. He has to try hard to produce secure code, so he audits it time after time. He fixes it time after time.

The other day he wrote 30 or 40 lines of code for a personal project of his. He can’t help but feel a little disappointed when, browsing the net a few days later, he sees an effortless and much more elegant execution in half as many lines. He wonders when he’ll be able to write solutions of that quality on his own, straightforwardly. However, after a bit of thought, he’s searching his files. He knows he has to rewrite that piece or he won’t sleep well that night. He won’t be copypasting it.

Adrian’s on his way to become an excellent professional, but he’s not giving himself titles, he can wait.
Adrian is consciously competent.

Stage 4: Unconscious competence

This is the ultimate stage of programming mastery. It’s not only the result of accumulated knowledge, but the result of a set of logic rules that have been slowly imprinted on the individual’s mind through the years.

We know we’re dealing with such a person when one cannot help but admire the ease with which extremely complex solutions are provided. This type of programmer seems to smell, not think, his way to a solution.

Writing optimized, maintainable and secure code, applying design patterns and picking the right set of tools he’ll be working with come naturally. This guy can work with ease on multiple languages and platforms.

Closing thoughts

After reading these examples I hope you’re as convinced as me of the validity of applying this model of thought to this particular field.

It’s worth mentioning that some authors suggest a fifth stage, which is reflective competence, described as the ability to teach and convey that what was learned and now is known unconsciously. We may see this in talented individuals who can teach and explain (even in front of crowds) as an apparent second-nature (John Resig quickly comes to mind).

Original here

No comments: