What Makes Great Programmers Different?
This has been reformatted for legibility from the original article
The keys to being a good programmer are well known. Greatness, however, requires something else altogether.
Generally have a small skill and are unaware of its limitations.
The Dim, the Reckless, and the Jerks
The Good Guys
- The Dim, those that avoid deep technical conversations, but often overreach in the estimation of what they're capable of doing or what they know
- The Reckless, are those who have the skills but do not have the discipline, the cowboy programmers of yore. They code according to their own desires, do nothing to integrate their work with that of others, scrimp on basic discipline, and cause work for other team members
- The Jerks, are those that wield their roles so poorly that they drag down the entire team. They often come from one of the other two previous groups, but have been given enough responsibility that they can make life miserable for others. The only solution when faced with them is to hope that they eventually are let go or to leave yourself
- The competent desire the right outcomes, and strive to contribute to the team.
- They frequently have well-defined skills, a good understanding of development disciplines, and are open to new approaches as long as the material can be integrated with what they already know.
- They write solid code, although only occasionally does it show a truly imaginative solution.
- More commonly, when faced with a difficult problem, they will lapse into quick and dirty hacking.
- They block themselves from greatness by not having the curiosity or knowledge at their command to be more than they are. That is, they refine their skills principally by continued application, not by learning new technologies — unless required to do so by job demands.
- Such programmers are at risk of slipping into the lower grouping by letting their skills atrophy. I discussed several examples of this in my previous editorial on coding from within the echo chamber.
Really good programmers, in addition to the above:
- They carry an abiding passion for programming.
- They like to solve challenging problems and they like to solve them well.
- They are not satisfied with writing one more CRUD app.
- They want the magical work that is hard and requires extended effort to bring to fruition.
- If they cannot find this satisfaction in the workplace, they find it in personal projects or by contributing to open-source projects.
- They frequently test new technologies, try out new languages, explore new tools, and read about programming.
- These developers are interested, consume programming books, and hide out in developer forums as well.
- They revel in challenge and have a constant sense of searching.
- They are looking for the best answer to a problem, or the most elegant.
The next tier up — the final tier — consists of great programmers who have supernormal gifts that enable them to do easily what good programmers find difficult. To my eye, the traits that most stand out are three in number:
- An excellent memory
- Conspicuously wide knowledge of programming techniques and the judgment to know when to apply which
- A deep ability to relate details to the larger picture
The last trait — being capable of quickly shifting registers from the large picture to small details and back again — relies on the strong memory and operates on an almost automatic basis. There is an effortlessness to it, which makes them particularly good architects.
There's one discipline they all share as well, which appears only in varying degrees in the earlier levels: Without exception, they possess a very deep and intimate knowledge of their tools. Be it the editor, the compiler, or the framework, they know the ins and outs of its features and they navigate efficiently. They use a much wider array of features because they know exactly how the tools work.
Knowledge of tools, coupled with an extensive, tested palette of programming techniques, and the ability to remember large amounts of the code base, while relating low-level details to the whole with unconscious ease — these are the traits I see most often in great programmers. And they're the skills I continue to aspire to in my work.