Camille Fournier has a great article on How do Individual Contributors Get Stuck?, but I’d like to focus today on the opposite question: How do programmers get into flow?
My theory is that there are three different idealized programmer personality types, each with its own strengths and weaknesses. Before you can get into flow, you have to know what kind of programmer you are, so that you know what kinds of things put you into the flow. Not everyone has the same strengths, and that’s okay. In fact, for a good team the more diverse your strengths the better_!_ If everyone on the team has the same strengths, that means they have the same weaknesses and the company may have major blindspots as a result. So what are some strengths and weakness of different kinds of programmers?
Programmers who just want to get things done
Some programmers are happiest when they can see concrete results of their work. Sure, the code they end up producing has some rough edges, but they made something you can see and touch today. These programmers get frustrated when their work has no visible output and seems like it’s just rearranging code that already works.
- Pros: Work fast
- Cons: Work can be sloppy and hard to extend
- Bored when: Refactoring or stuck on a hard problem
- Best use: Getting the prototype 90% done in one week (the other 90% will take a team of a dozen six months)
Programmers who just want to solve hard problems
For some programmers, the harder the problem is, the harder it is to resist. Sure, they were supposed to change all the borders from light grey to dark grey two weeks ago, but they got a little distracted by implementing a ground up rewrite of the rendering engine in OCaml and assembly language, so that will have to wait.
- Pros: Will solve a problem you never thought possible to solve
- Cons: What they produce can be hard for anyone else to grok
- Bored when: Tediously gluing bits of code together
- Best use: Creating the core algorithm that no one else on the team understands but gives your company the edge
- Spirit Languages: Haskell, Clojure
Programmers who just want to create the perfect thing
Some programmers are obsessed with beautiful code. They can’t believe that the code base uses CamelCase and snake_case in the same project. They’re personally offended that a method call runs in O(N2) time instead of O(N log N). They’ve started a secret branch of the repo to fix all the whitespace problems and rewrite the API, but they have to do it on their lunch break because the client just wants to ship a new feature.
- Pros: Create maintainable, performant code
- Cons: Prone to bikeshedding and wheelspinning redesigns; suffer from fear of a blank canvas
- Bored when: The inherited codebase is ugly but there’s no time to fix it
- Best use: Refactoring work done by the other kinds of programmers; bug hunts
- Spirit Languages: Python, Go
Of course, in reality, no one is really just one kind of programmer. We all mix and match different personality elements on different days. But it could be helpful to know yourself and know what kind of programmer you tend to be the closest to in order to utilize your talents best.
So… what kind of programmer are you?