What makes a good programmer

What makes a good programmer   programming

Disclaimer: this is just based on my personal experience programming, and knowing one or two other decent programmers, as well as a few people who bounced off programming entirely. This is not based on extensive industry experience, nor any kind of science. If you're interested in the opinions of someone with much more exprience "in the industry" than I, I recommend checking out "The 10x Programmer Myth" which, despite the clickbait headline, doesn't deny the fact that there are some programmers that are much more productive than others, but just seeks to explain why that may be the case, and some confounding factors that may make people think someone is more productive than they really are.

To be a good programmer, in my opinion:

  1. You have to be the kind of person that enjoys thinking about the complex technical details and minutiae of a topic…
  2. …while at the same time being able to keep the bigger picture in mind, not getting lost in technical details while forgetting what your overall goals are, or what the actual practical consequences or real world applicability of those technical details are…
  3. …and also having a sense of good taste, style, craft, beauty, and symmetry.
  4. You can't just think of what you're creating as a one-and-done object like a scientist, mathematician, or formal methods person might think about their code; you need to be able to think about how your code will need to change over time, or how the complex environment will change around it over time, and write something with the flexibility to deal with that.
  5. You need to be able to think in terms of preconditions, postconditions, invariants, and unknowns, but also understand that not everything can be known, and how to pragmatically focus on acting on what is known and prepare for the unknown, instead of trying to know everything up front.
  6. You have to be the kind of person that, when presented with a problem or mistake in their or other people's code, no matter how small, annoying, or minor, sees it in one of three ways:

    1. As a chance to improve – improve the code, improve your understanding of things, or improve your knowledge of things to avoid
    2. As an affront to the quality and craftsmanship of what you've created that you become obsessed with needing to buff out
    3. As an interesting or funny puzzle to solve
  7. You also need to be relentlessly, if grimly or ironically, optimistic: you should be able to see ruling out explanations for a bug, or getting a different error message, and other similar kinds of failure, as forms of progress.
  8. You also have to have the sort of mind that's extremely good at applied ontology: figuring out how best to describe a domain, a behavior, a problem, an idea, or whatever, in a way that can get to some kind of useful core and set of relations to other ideas, without getting bogged down in trying to find absolute eternal essences or perfect hierarchical taxonomies.
  9. You also have to be very good at breaking down a problem into smaller problems, using various strategies.
  10. You also have to be the sort of person that can really enjoy and become invested in somewhat abstract and immaterial objects and things and can get extremely interested in and enjoy reading very highly technical articles and/or studies.

Many of these are personality traits that will be difficult to change once they're locked in during childhood based on your culture, surroundings, parenting, etc, but many of them are skills that absolutely can be improved dramatically with regular, focused practice. Being smart will help you get good at these things faster, and be better at them in the very long run, but it can also blind you to the forest in favor of the trees or help you get lost in abstractions and categories without wisdom and other personality traits, and that doesn't mean someone who isn't as smart can't learn these things and get good enough at them with some extra time or effort.