A challenge I have encountered as I progress in my work is trying to find the right value to place on knowledge. Software developers are in the class of workers referred to as “knowledge workers”, and the culture certainly places a premium on practical knowledge. Job postings list languages and systems that you need to be an expert in, and news sites like Hacker News fixate on the growth, continuing relevance, and decline of particular technologies.
In my experience, though, raw knowledge seems to be only one of many valuable traits in a developer, and in many cases it is less useful than others. In no particular order, the best developers I have worked with exhibit the following qualities.
They are resourceful and flexible in the tools they use, while still being forthright and assertive when the tools available fall short. This applies to hardware, to development tools, to languages, to deployment environments, to everything. A great programmer might be able to make do with an eeePC with dialup in a broom closet, but they won’t fall prey to the macho inclination (or managerial pressure) to pretend that it doesn’t cut into their productivity.
A great developer has to be socially competent. As a person who suffers from social anxiety, I am painfully aware of how often I fall short in this regard. It is tempting to attempt to hide in the dark back room, sheltered by layers of code and the social expectation that a programmer is terse, grumpy, and avoidant. The genuinely brilliant can get away with this to a certain extent — we all know this type of person, famous and obscure — but it is ultimately limiting, and it is not a path many can follow.
The best developers I have known have been able to maintain friendly, open communication both within and without their teams. They are willing and able to explain, promote, and defend their ideas both in pure technical terms and on a practical basis to management and other stakeholders. They don’t rely on the expectation that a programmer’s voice is the Word of God. Someone who relies on nobody else in the room having any idea what it is they do is ultimately in for a rude awakening.
When the necessity arises, a great programmer is knowledgeable, but is because they have refined the process of learning and investigation. When faced with a new tool, they are good at training themselves to use it. When they encounter a new system, they are unafraid to investigate and discover how it works. Nobody can read unreadable code, but given enough time it is possible to at least discover what the code does, which is sometimes more useful than knowing what it is supposed to do.
Knowledge of tools is useful, but tools rust. Knowledge of systems is indispensable, but systems change. The best programmers I have worked with have not been the ones who write the cleanest, fastest, or cleverest code. They’re the ones who can land in a situation with imperfect tools, imperfect requirements, and imperfect people and make them all a little better. As I struggle to refine and improve myself professionally, I try to keep in mind that my limited technical ability is only one of the many factors that may contribute to my success in the long term.