If a baseball hitter succeeds at least 30% of the time in getting a hit they are considered good. If a golfer routinely plays under par they are considered good. A shooter should hit the center of the target. A banker I suppose should roll in money.
All of these are relatively easy to measure as to whether they are good or bad or at least compare them to others in the same field.
Measuring the qualities of a programmer is much more difficult. Even describing what those qualities are is almost impossible. Yet there are clearly programmers who are good and those who suck terribly and a lot of average ones.
As I've been doing this since 1981, I've worked with a lot of programmers in many different environments, industries and technologies. Over those years I've seen every kind and although I can tell who I think is good it's still not easy to define why.
Programming is such a complicated industry. So many languages and technologies and environments and industries; so many different types of applications and targets; so many different ways to write the code. It makes comparing people very hard. It makes hiring people hard as well as trying to figure out if someone's background and apparent ability meets the needs of the hiring company.
In a specific type of engineering like civil you have complex exams and are required to have specific knowledge and experience before you get a P.E. which I assume means you have demonstrated the basis of your knowledge. But civil engineering is based on concepts dating back thousands of years and deals with the real world in things like gravity, wind, temperature and the like. You live in that world.
Programming on the other hand is often completely a world of our own creation. We can write code running in a virtual machine on a virtual processor on an unknown hardware device in the cloud somewhere. Our programs may never touch the real world at all. We may write in hundreds of different languages and operating systems, on vastly different scales, on clients and servers and in between, in real time and really long time. Every application may be unrelated to any previous work. Yet all of it is considered programming and those who do it are called programmers.
I can still remember many of the programmers I have worked with over those many years and recall who amazed me with their skill, and those who made we wish I could run far away. What was it about the former that distinguished them from the latter?
There is no way to easily describe the difference. It's not a simple description or measurement like hitting a baseball well or dunking a basketball.
I guess I have to come up with a list but it's probably not enough to convince anyone I have all the answers. If I did I'd make a great recruiter!
- Good programmers want to ship yet can recognize when it's ready.
- Good programmers accept failure happens but do everything to make it only happen once.
- Good programmers know when to learn something new and when to stick with the old.
- Good programmers are willing to say what needs to be said, do what needs to be done and fix what needs to be fixed.
- Good programmers make those around them better.
- Good programmers deliver a program that does what it should do, never does what it shouldn't do, and never surprises anyone.
- Good programmers know when to plan for the future, when to abandon the plan; they know when to imagine a solution ahead of time and when to see what will present itself; they know when to follow the path but also keep their eyes open to see the path is going over a cliff.
- Good programmers know that the moment they are satisfied with their knowledge they are toast.
- Good programmers can admit they were wrong.
- Good programmers will do everything in their power to avoid shipping garbage.
It's a reasonable list but of course it's highly subjective. I tried to describe the qualities that the great programmers I have worked with had, and those that I keep trying to do as well. It has to be a little fuzzy since programmers all do such different things which makes it tough to get very specific.
I don't want to make a list for what is a bad programmer as that's even harder but I imagine if they do the opposite of that list, they they probably aren't very good. An average programmer might do some of the list but fail in others.
Can you tell who might nail this list from an interview? Of course not, it take time to work alongside someone for months to really tell how effective they are, or not. Many of these qualities only present over time, maybe over many projects or even years until you realize that person is really good. I've been blessed working with really sharp people who I'd hire in a minute if I was hiring people. I've also been cursed by people who failed every item!
Each of us of course imagines ourselves to be really good but in reality you can only discover who you are in the eyes of those you work with. As people we naturally think highly of our abilities even if we really aren't very good. To work with a great team where everyone is high on this list makes it no longer seem like work but often we don't get that opportunity and in my career I've seen both extremes and a lot of the middle ground.
In the end all you can do is try to be the best you can be and hope those around you appreciate what you contribute. Of course sometimes you just have to quit and go elsewhere until you find that great team to work with.