What Makes a Good Programmer?
Four qualities I think make a good programmer, why each matters, and how you could test for them.

Here are the four qualities I think make a good programmer, with ideas for how to test each one.
For me, it is important to be able to answer this question. I want to know where I stand as a programmer, and what I lack and what I have.
Many articles try to answer it. Most of the search results I came across (here, here, here, here) stress attitude, communication, understanding of the business and personal interests. Those are the traits of a good professional in general, not only of a good programmer. So I’ll narrow the scope.
Programmers are, in essence, problem solvers whose main tool is writing code. With that in mind, here are the four qualities I’ve come up with so far.
4. Prefers abstractions over details, yet can turn abstract ideas into concrete code
This shows the ability to focus on what is necessary, and deep understanding.
A good programmer can easily switch between fundamentally similar technologies. A good Java programmer can quickly switch to C#, and the other way round. Someone who works in AWS can switch to Google Cloud. It’s a potato/potahto situation, and this is just the most obvious example.
A good programmer relies on understanding rather than memory. If you were good at math or science in school, you know those subjects were often easier than the others. If you understood the foundations, you could reason your way to the answer quickly, without rote memorization. In programming, you often need to know just enough to be dangerous, and that “enough” should let you understand the domain deeply.
A good programmer has rock-solid foundational knowledge and reasoning skills, and can infer the details. A programmer’s knowledge is compact, yet through reasoning, search and play they can infer the details they need.
A good programmer can filter out the noise and focus on the signal. Noise is the details, and signal is the foundation. It’s easy to get lost in details and forget what matters. As a software developer, you sit through endless meetings where people get into the most boring and needless details. A programmer sifts information like a good encoder: a lossy compression that works as well as a lossless one.
A good programmer doesn’t need detailed instructions on how to build something, only the specification of the end result. This is where inference comes in. A good programmer thrives on the freedom of ambiguity in the in-between, but needs the end result to be concrete.
A good programmer is good at black-box testing. Black-box testing checks the end goal and doesn’t worry about implementation details. A programmer who thinks in abstractions should be good at this, because they can refactor their implementation as they go.
How can this quality be tested? You want to make sure a person is good with abstractions and reasoning. These are the exact qualities AI is tested for today: summarizing a given text, completing a sequence, creating something from desired attributes. You can also use an open-book question that relies heavily on reasoning. For a “control”, or reference frame, one way could be to compete with AI summarizers.
3. Can work independently, yet gets the feedback they need quickly
This shows flexibility, adaptability, determination and focus.
A good programmer tries hard to get things done alone before asking for help. Some people prefer to ask rather than try. That may show good communication skills, but in programming you have to try on your own and fail many times before reaching out. It can be painful when you start, but in the long run you become resilient and don’t get blocked as easily.
A good programmer knows how not to get lost in the sea of information. Google is powerful, but its results can add to the confusion. A good programmer knows how to search, how to sift through the results and how to get what they want. Googling is a skill of its own.
A good programmer knows how to experiment. Trial and error stimulate learning. With computers it is much easier than, say, in a biology lab, because the feedback loop between your question and the result is so much quicker. You run your program, it crashes, you look at the error, you fix it. If only lab experiments were that easy.
As with the previous quality, you can test this with an open-book question that relies heavily on reasoning.
2. Can get things done and fix things, in a reasonable time, even amid chaos
This shows the ability to focus, solve problems and perform.
A good programmer gets from point A to point B. A programmer who knows the ins and outs of a language and its technologies but can’t get from A to B is not as good as one who lacks those details yet covers the path.
A good programmer doesn’t let perfectionism get in the way. Every programmer secretly dreams of a perfect project: an app implemented to perfection with the right tools and patterns. Some people get caught in this trap when they start a project. They think everything must be perfect, get stuck early and lose motivation fast. Implementation details are just details, and as I said above, a good programmer is good at refactoring and black-box testing.
A good programmer can get distractions and hurdles out of the way. A programmer’s work has many of them. A good programmer can live in a world where everything tries to pull them off track.
You can test this by asking a person to finish a task in a given time while you try to distract them.
1. Can keep focus and motivation for a very, very long time
This shows the ability to focus.
A good programmer needs to understand why they do something. An effective programmer does things in order of necessity. If something isn’t needed or stimulating, they just won’t do it, and that’s great.
A good programmer is good at staying focused. ADHD is an enemy of a good programmer, and so is multitasking. Being able to work uninterrupted, even for 15 to 20 minutes, is a fantastic quality.
A good programmer is good at goal-oriented activities. JIRA and agile are great for this. You have a task with acceptance criteria, you check out a branch and solve that specific task. It’s like a quest in an RPG: when you finish it, you get a small dopamine rush.
A good programmer is good in the long term, not necessarily the short term. Getting things done is more of a marathon than a sprint. It’s not about spinning your wheels at maximum speed, but about sticking with the task until it’s finished.
As with the previous quality, you can test this by asking a person to finish a task in a given time while trying to distract them.
Conclusion
I believe these qualities are necessary for a good programmer. I might have missed something, but I’m fairly confident in the ones I chose.
As for evaluating myself on these criteria, I can say there is room to grow, but I’m not disappointed with where I stand at the moment.
最初发表于: 原文