Recently, I have been reflecting on the fact that I’m a self-taught coder†, and not only that, I also worked alone in a cupboard for many years. I realised that I have a tip for others in the same boat: there’s a broader horizon.
It’s great being a solitary coder: there’s safety in not being part of other people’s things; safety in knowing that the critique your code receives isn’t unjust; safety in knowing that you-and-you-alone in your team-of-one know the best way of coding.
And hell, running code is good code. Mostly.
But that’s code, and there’s so much more to software development than code: the development process, creating maintainable, useful software without unforeseen errors and doing this in accordance with what was requested.
Of course, no-one willingly writes code that doesn’t do something useful — unless they’re trying to prove a point. But, there are many ways to achieve running code. There are bloody pragmatists that smash their way through the code, creating unmaintainable spaghetti on the way. There are code perfectionists who never finish a project, getting lost in academic exercises at once.
I have fallen into both of the categories I outlined above, and without pretending that I have any great insight, I’m pretty sure that I’m in a new category right now and will be wiser and in another category not long from now.
The reason I’m thinking about this is that I was talking to some folks at a seminar the other day, and I realised in the course of our discussion how differently I think and work these days. My coding is better, but it’s not better because of spending more time coding alone, it’s better from coding with other people, being exposed to different ideas and understandings — being forced to question my own understandings and ideas and argue for or abandon these as necessary.
There’s a lot to be said from being open to criticism (no, really!) and accepting this; there’s a lot to be said for encountering other opinions and escaping the tyranny of your own. It’s no secret that arrogance is the currency of the lone wolf — and crappy software the price we pay.
At the same time, I’m now pretty sure that there are no hard problems in software beyond people, and adding more people to a situation can make for exponentially more problems. Maybe “Personality is great, but it might be better if you didn’t have one” is a thing after all! Never to have experienced working closely with people who have profoundly different personalities and ways of doing things leaves you unable to cope with the at-odds stuff people do and say — and consequently you get out of practice arguing coherently for your own ideas.
Sometimes teams just work. I wish I had a pattern for the kind of personality you need to work well in a team and produce good code, but I’m afraid it isn’t one personality; it’s rather the combination of personalities in the team. And maybe having worked in different teams has made it easier to be one of the necessary personalities in a team. Yes, you can be different in different roles.
I know great programmers who have shown themselves to be awful in teams of equally strong programmers and the replacement of strong players with on-paper weaker players with less strong personalities has proven highly successful. There’s more success when people don’t trample people with different ideas; when stronger personality doesn’t trump better ideas.
It turns out having feelers out for the situation — a difficult task for the programmer who boasts of their anti-social behaviours — makes you maybe not a better programmer, but certainly a more useful one. This isn’t a thing you can teach yourself in a cupboard on your own, which is why staying in the cupboard dooms you to never leaving it.
What brought on this hand-wringing anguish and introspection? A question on Quora, something akin to “At what point in your career do you know you’re a good programmer?” I suspect I will never be a good programmer, but I want to be one — which is maybe an attitude I want to see in those around me. I also know really excellent programmers, but I also know more useful team members. I rather hope that I’m beginning to fall into the latter category.
† A slight modification here: I have attended many courses in computer science and worked with many intelligent, willing teachers.