Software Development is a Strange Profession

Software development is similar to other creative professions in many ways. For example, working with buildings as an architect involves planning, recognition and application of well-known patterns, problem solving and so forth. But software development is different from most other professions in one very important way.

Imagine you are a painter, an architect or a musician looking for a job. What kind of information would you supply in your job application? Obviously, you would show proof of your skills (photographs of paintings or buildings or recordings of music). As a software developer, what do you show? An application?

Assume it’s a very nice application (or a very bad one). Sure, you can draw some conclusions from the externally observable quality and behavior of an application. But development is normally a team effort, your code might be perfect while other’s isn’t and vice versa… Showing an application also assumes it can be shown. Your stuff might be a deeply integrated in a backend server somewhere, or worse.

A friend of mine brought up the example of an electrician. After a job well done, the wiring is normally not visible, somewhat like the programmer’s. Nevertheless, the electrician can still take photos before walls cover up their work. Unfortunately, the code you write is normally a well-kept secret of the company you work for (and might be off-limits in terms of photography :). The problem is, as a software developer you have nothing to show! This is not only a problem for you, but also for people trying to hire you.

As I’ve said before, your CV does not say much, since experience is not really an indicator of quality code. Admittedly, there are ways to prove your skills: doing a test task, participating in open source software development, creating a portfolio of sample code to show etc. But this doesn’t change the fact that software development is a strange profession. Can you think of a profession that has the same problem?

Correlation Between Experience and Programming Skills

In my daily work, I have the privilege to work with talented people. But finding these people in the first place is not always that easy, it seems. I’ve conducted lots of interviews with potential hires over the last five years. Preferably, you would like to learn from the CV whether or not a programmer is good, but this proves to be a tough challenge. Maybe I’ve just had a skewed set of samples, but I’ve made a few observations:

  • There seems to be little correlation between experience and programming skills. In my experience, you are as likely to find an experienced developer (10+ years of experience) with poor skills as you are finding one with excellent skills. On the bright side (and further “evidence”), I’ve come across lots of very talented newly graduated students. It seems some people “get it” right away, while some struggle.
  • Also, there seems to be little correlation between education and programming skills. I’ve seen self-taught programmers that really humbled me, as well as PhDs with poor skills. (On this topic, check out self-taught James Bach’s book “Secrets of a Buccaneer Scholar“.)

If my experiences are not just due to bad luck, it seems programming skills correlate neither with education nor experience. Then what does correlate with good programming skills?

To be honest, I have no answer. But research published in the article “The Camel Has Two Humps” presents an interesting observation. Maybe there’s a correlation between between consistency and programming skills. True or not, it is an appealing idea: it’s easy to imagine that a consistent person (i.e. a person that repeatedly makes the same decisions in similar situations) should be able to become a good programmer. Correct his flawed thinking once, and he will use his newly found knowledge in many places. An inconsistent person would need correction on a case-by-case basis.

Now if (big if) consistency is key, the question is just how do we device a test for it? I’m not sure how revealing the tests from “The Camel Has Two Humps” would be on real programmers.  (They are on the form “int a = 10; int b = 20; int c = 30; a = b; b = a; c = b; What are the values of variables a, b and c?” :))

“We Train You to Be the Best Programmer You Can Be”

What could a company do to differentiate itself in order to attract talents? Many companies take pride in their innovative work environment. Benefits and salaries might be another way. But we are yet to see a company with an official policy saying “Come work for us. We will train you to become the best programmer you can be.“? You know of such a company? I would be happy to be proven wrong.

I’m not talking about having the employees take courses or read books all day long. I would rather see a collaborative effort to improve (yourself and the organization), such as a dedicated mentor for everyone, expert brain picking sessions, study circles (discuss a book, a bug, a piece of code or a paper together), knowledge transfer (weekly presentations of interesting topics), pair programming with an expert, software architects to discuss your design with, cross-functional training, panel discussions, required reading, you name it. All in the context of your current work assignment. Your personal development would be part of the company targets.

Many companies train their staff, but I would like to see it as an official policy. Such a company would certainly be able to attract talented people. The collaborative effort to improve would also benefit the company (e.g. improved co-operation, better code, fewer bugs, increased knowledge transfer). For the individual, working there would be a sign of quality.

I had the pleasure to have a coffee break discussion about this with James Coplien the other day. He said he both loved and hated the idea. It might be a bad idea since it does not bring any business value. But that aside, we both agreed it would be a fantastic place to work in.


Update (May 7, 2011): In the book “Implementing Lean Software Development” (see post), the authors talk about river companies: “The purpose of a river company, […] is to keep on flowing, that is, to stay in business and provide jobs over the long term.” and “The individual will deliver care and commitment in exchange for the fact that the company will try to develop each individual’s potential to the maximum.” This actually sounds a lot like what I described above. The term seems to have been defined in this article.