Home About The Codist RSS Feed

Programming Great Programmers
Feb 27, 2007 09:36 perm link Readers: 2353

I enjoyed reading the recent article Why Can't Programmers..Program?. This leads to the question, if 199 out of 200 programmers can't write code at all, how are we going to find enough decent programmers around to do all the work?

Personally I think the 99.5% useless rate is a bit exaggerated. People can write code for years and only learn a small set of coding skills, just enough to get by in whatever environment they are in. If this is sufficient to stay employed and nothing much changes, and though they have little motivation in expanding their skills for the future, how can they be considered useless? From a management perspective they are good enough to not be fired (or at least adept at avoiding anyone finding out).

Now take these same people out of their comfy environment in an interview, give them something new to do, and watch them fail horribly. Suddenly they are no longer considered programmers and are unemployable. Funny how a change in location creates a broken programmer instance. You go from being a somewhat useful programmer to being lost among the 199.

If 1 out of 200 programmers can actually program, and an even smaller percentage can be considered great, how do any projects ever succeed? The answer is probably "most fail". Even that might require explanation, as their are many modes of failure. The software might work but be slow, unusable, inaccurate, hard to maintain, buggy, unstable, ugly or not meet the needs of the customer, yet still be considered a success. Among the reasons for the lame nature of the success could be that the programmers really didn't have a clue but there are many others such as poor leadership, impossible schedules, bad architecture, terrible technology choices and a host of other ills. It's possible that the programmers actually did a heroic effort in the face of all these obstacles to even get a lame success. Yet sit these same folks down to solve a new problem and they look stupid.

Yes of course they could all actually be stupid, but the inability to excel outside their comfort area might not only be their fault. I've known people who worked for a long time in one company who excel in the environment, know everything that is going on, can solve a host of problems, yet rarely have time to write any code much less learn new things. Yet take them out of the company and they might fail one interview after another. Their value to their current employer simply fails to translate easily to a new one. 199? It's not always that simple.

I am very comfortable with new technologies, environments, challenges, whatever. After 25 professional years writing code (and being a programmer) and another 6 as an amateur) I find it's all the same just different rules. Yet I can't simply switch gears from one major language to another at the drop of a hat. I volunteer to work on the Mac client of an online game WWIIOnline which is written in C, Objective-C and C++. Now I did spend a few years writing in each of those languages, yet jumping into a unfamiliar codebase, in languages I have mostly ignored for years (Java dude since 1998) is a hard switch. Yes I could write FizzBizz but something more meaningful would take more time. I wrote the sound code for the Mac client in C++ (calling openal) but it took much longer than I would have liked as I had to remember all the C++ features and patterns my brain refused to recall.

On the other hand, most programmers are not very good, and that's where telling them apart in a short interview is so hard sometimes. How can you determine if someone would be a good contributor to your team by some simple coding tests? I have interviewed a lot of people, and sometimes they don't have the coding experiences you are using in your company but you can tell they have the passion, curiosity and interest to adapt and learn. Then again you can hire someone instead with a deep resume, who could write FizzBizz in 12 languages, knows every JSR spec by heart, and then delivered nothing in 18 months (I worked with such a guy). I would argue he was 199 despite the other evidence.

So how do we get enough people to deliver successful projects (assuming you can define successful)? For one thing you need a balance of great programmers who are willing mentors and teachers, eager programmers who want to excel, and a slew of programmers who can at least follow directions and recipes. Some people like pair programmers, tying people together with different abilities together. Personally I find even basic mentoring on a regular basis (where the less experienced programmer asks lots of questions) works well. Of course lots of people won't listen, don't care and just keep screwing up. Those are the folks I don't want to see on my project. Everyone can learn from other's experiences, mistakes, blog reading and even code reviews. It's how every great programmer got started.

I am not a big fan of classes and reading books as ways to improve a programming team, especially if they don't immediately translate into using whatever was learned. You learn coding by coding. You learn great coding by working with great coders. You learn to be stupid by working with stupid people (if you are smart, leave these kinds of environments!).

Nothing in this industry is black and white, great programmers might be useless and poor programmers might be useful in the right environment. No one interview technique is infallible in discerning who might add value to your team. Passion, curiosity and interest in learning might in the end be the best sign of a prospective great programmer.

We were all bad programmers to start with.

My Tags:

  • John: Feb 27, 2007 19:57

    I believe that to become a skilled code writer; one must study "good" code. This is no differently than for literary writing. It is the primary way overall skill level increases, from generation to generation.

    Also, this type of code is found neither in "scholarly," nor "visionary" texts, typically.

    A major advantage GNU programmers have, or example; is a huge body of peer-endorsed examples, of "highly proficient" code, and an active community discussing it.

    Without this, developers must start anew; and there will be no progression from lessons learnt, and the mistakes of the past will be repeated, again and again.

  • rajatm: Feb 27, 2007 20:14

    Reginald says "199 out of 200 applicants for every programming job" which is different from 199 out of 200 programmers. I guess most of these people are fresh graduates out of school.

    So the real problem is schools (Comp Sci departments) not making sure that students do some coding themselves. Just a little bit of Googling helps anybody complete his programming assignments.

  • Rob: Feb 28, 2007 01:14

    rajatm said "So the real problem is schools (Comp Sci departments) not making sure that students do some coding themselves"

    I disagree with that statement -- by far the best programmers I have come across are not the ones who studied the entire course at school/university/college. They are the ones who used the facilities available to enhance their knowledge of particular areas, but went away and used that knowledge to code in their *own* projects, because they were interested in it.

    Frequently I am asked by my boss if we could make use of a high school student looking for work experience, but who has no experience in programming. I ask them of their interests and they often say 'engineering' or 'electronics'. That's a no -- if you aren't interested enough to have taught yourself by the end of school, you're unlikely to be a good programmer.

  • Tom: Feb 28, 2007 04:50

    Insightful post, I especially love this comment; "You learn to be stupid by working with stupid people (if you are smart, leave these kinds of environments!)"

    It rings true with one of my own blog entries; http://whatimean.wordpress.com/2007/01/09/good-advice/

  • Chris: Mar 01, 2007 19:16

    I think you can learn equally well from both good and bad code. Maintainability is one of the things which is difficult to learn except via the hard way through experience. One of the differences between a new a and seasoned programmer is how clever ones tries to get with the language and libraries.

  • MikeJ: Mar 02, 2007 04:00

    I broadly agree with codist. I sense a frustration in that all of the hard learned skills over the years, from the lowest level upwards are rendered apparently obsolete when moving into a new company in a new environment. Maybe I'm misinterpreting here, but the code and the language are never as important as being able to use whatever trendy framework the current employer is using. When looking for work a couple of years ago I interviewed for Java jobs happily waving my recently acquired programmer certification (not literally of course:) only to find the interviewer contemptuous of the value of the qualification on the basis that it does not prove engineering competency. That's why it's easy to put down an experienced and demonstrably adaptable programmer in an interview as useless because they cannot converse in the terminology of the framework. And conversely the employer may well prefer a candidate who only knows that framework and does not care about their background or ability to adapt. The fun starts when the framework 'misbehaves' and there is noone there with the understanding of the lower levels upon which it is built.

  • Add Comment

Name:


Optional URL:


Comment:


Save Cancel

Copyright © 2007 By Andrew Wulf