I enjoyed breaking the world up into two kinds of developers so much, I thought I’d do it again.
The problems that we ask developers to solve are many and varied, but they all contain some mixture of the known and the unknown (sorry to come over all Rumsfeld this early in the post). A new project, the kind of which the company has never undertaken before, is riddled with the unknown to start with, whereas rewriting the legacy system in another language with a team who know the system and both the old and new languages is a pretty solid slab of known nastiness.
The kind of person you need for each type of problem differs. I used to think of them as “Starters” and “Finishers”, but those terms are anodyne and lack the opportunity to be grossly misinterpreted. I call them “Pioneers” and “Settlers” now.
A pioneer is the kind of person you want to tackle a problem rife with the unknown. They’re undaunted by the lack of a map, and positively enjoy the uncertainty. They tend to operate on their own, or in very small groups, and explore a problem with gusto. There’s a strong chance code will be written, discarded, and written again, many times over. They might stand at a whiteboard and argue about design, covering it with boxes, arrows and misleading labels, before deciding the best thing to do is to build both approaches and see which one works.
But they get the job done. And once they know that the unknowns have been worked on, reduced to a manageable level and understood, they lose interest. The thing that drives them is taking a challenge that no-one else has overcome and showing that it’s not really _that_ hard.
A pioneer is just the kind of person you want to get a project off the ground. And then you probably want them off the team. They’ve served their purpose, and now they’re going to look for trouble.
What you want after the original skeleton is in place are Settlers. They take the rough trial laid out, and they make it habitable, maintainable and a Nice Place To Be. The problems that they solve tend not to be the “what the heck are we trying to do?” ones, but the “how the heck are we going to make this work?” ones. They’re qualitatively different types of question, with very different challenges.
It’s entirely possible that the pioneer, hotshot iconoclast that they were, has blazed a trial through the least pleasant route. They were only interested in getting things working, not doing it the best way possible. The settlers may be forced to throw out everything that the pioneer has done, leaving just the faint whiff of the original scheme in the air. I suspect that they do this more than most teams would like to admit.
It is vital to note that the challenges and design question a settler faces are no less taxing than those faced by pioneers, they’re just different.
The pioneer finds “what” satisfying, and the process of solving “how” an anathema once there’s working code. A settler finds iterating on the “how” a deeply rewarding experience, but the “what” may not hold much interest at all.
Of course, it depends on the project to determine what the correct mix of pioneers to settlers is. Sometimes, you just need a small team of pioneers. Sometimes you need a room full of settlers. Sometimes you need to start with pioneers, and then replace them with settlers. It’s okay. The types of problems that need to be solved on a project vary over time. If they didn’t, software development wouldn’t be this much fun.
If you ever work with me, the chances are that you’ll find I like the pioneer work an awful lot. I like to go shooting off into the darkness, meandering with glee into rough edges and emerging, triumphant and bleeding into the light having shown that, yes, yes it is possible to do something crazy. It takes a force of will for me to be a settler, and I rapidly get uneasy and unhappy when I try it.