Introduction
This is a question that has concerned me for a while as it does most programmers. What exactly does it mean to be a good programmer?
There are obviously many different answers that can be given. Yet most of these answers don’t really satisfy me. If you define being good in relation to others then you run into the problem of how people are fundamentally different.
People have different capacities, time, commitments and are at different stages in their lives. If you are competing with someone else who has these things in abundance while you are restricted you will be miserable and you will probably fail to be a better programmer then them.
Thus I prefer having the definition of a good programmer be something that is controllable by you and is thus achievable rather then something external. This increases personal power and creates a sense of satisfaction and internal harmony.
The answer to the question for me is composed of two parts. A good programmer understand what they are doing. They are also capable in terms of capacity to do.
What Is Understanding?
Understanding means you are able to correctly model something in your mind. When you understand something your internal map of the object of the understand is accurate you can manipulate that model well.
The understand is first and foremost internal and something that exists in your mind. It isn’t something other people have direct access to. However you can share it through communication.
This is why it is wonderful to have friends that you can engage with and share your ideas with. It is a dialectic that a greater collective understanding is achieved and bad ideas are pruned.
What Is Capability?
To be capable means that you can do something. This is directly practical and is seen in the actions that you take. When you are capable you have the capacity to build or do something. When you are incapable you don’t have this capacity.
As programmers the two most common things that we are tested on and payed for is 1) Capacity To Build Programs 2) Capacity To Fix Bugs In Programs 3) Capacity To Understand And Improve Complex Abstract Systems
All of this falls under capability. It is measurable, trackable and directly affects the program you are working on.
(There are other things that a Software Developer does but these things aren’t as central to being a programmer)
Bringing It Together
A good programmer has a good model of what he is working on and has the capability to produce and improve programs. This is the core of what a good programmer means to me and this is the ideal I think others should pursuit in seeking to master their craft.