What makes a good programmer? A misleading question.
Tags: fundamentals, abstraction, learning
Published: 2021-11-24 12:50:05

*This is a response to "Cargo cult programming is killing the (Sri Lankan) software industry"* *([direct link](https://link.medium.com/KH0Hiu1jglb), [Readup link](https://readup.com/comments/hliyanmediumcom/cargo-cult-programming-is-killing-the-sri-lankan-software-industry)). I was writing a comment on Readup, but it became its own blog post!*

As a person who programs for a living, I think it's easy to have an opinion and personal bagage related to the skills and knowledge you need to succeed in your job. The topic of the article speaks to all of us, it plays on the question: what should a good programmer know, and what should they be able to do?

It's a misleading question however. I don't think there is, and there should not be, one single kind of programmer.

First of all, the genius programming nerd with all the right skills in computing doesn't exist anymore. They might have existed a few decennia ago, when computing was an offline niche with very few applications. But today's computing world is too diversified for this human to exist.

Intimately knowing networking fundamentals, and how the Linux kernel interacts with networking hardware, doesn't automatically make you the good front-end web developer that can learn Svelte quickly after having built web apps in React for five years. In fact, you might not know much about the DOM at all.

Computer systems in the hands of end-users are massive contraptions where millions of people and brains had a hand in: from the person who assembled a website, to the people who designed the HTTP protocol, to the admins of the cloud service that serves the web server container, and many more. I'd argue that since computing is "eating up" much of the global economy, the incomprehensible complexity of the economy becomes the complexity of computing too. That complexity is timelessly illustrated by the essay [I, Pencil](https://readup.com/read/foundation-for-economic-education/i-pencil) (a recommended read!). 

A good point of the author though, is that we need to be able to distinguish different jobs in computing. "Programmer" or "Engineer" doesn't cut it. A "WordPress Technician", as the writer would call them, who knows all the best WP plugins and understands a little bit of PHP, can assemble a website fit for an indie magazine much faster, cheaper and better than a "cloud engineer" at Google who's creating algorithms for efficient load distribution of incoming network requests. They're people with totally different jobs doing totally different things.

Another good point is that for many jobs in computing, it's a good idea to dig a little deeper down the levels of abstraction than would seem strictly necessary. But depending on your career goals and interests, you could constrain that effort to what *might* be useful for you. A React front-end developer that entered programming through a one-month bootcamp would be wise to understand how React interfaces with the DOM, because that will indeed make understanding Svelte easier when React goes out of fashion (hypothetically). Learning sorting algorithms might be useful too, if they are trying to remix a big dataset for some purpose, with a triple for-loop in JS that makes their laptop overheat. Soon they will also need to adapt their jobs to be able to build front-end apps for the VR internet in 10 years. But is it essential for them to know how heaps and stacks work? Not really. That's why we have abstraction: to manage complexity. You only need dig deeper if you want to do something that would require that knowledge, or if you're just curious.

This reminds me too of [a self-deprecating twitter thread](https://twitter.com/seldo/status/1453094314439942149?s=20) of Lauri Voss, one of the NPM founders:

> "I am, at best, a developer of average ability. [...] I have come to accept that I'm never going to invent some brand-new algorithm that changes the world."
> 

But he comes to terms with this own assessment of his abilities in developing algorithms:

> If there's a thing I'm above-average at, it's spotting patterns and weaving a narrative around them to explain what's going on. I *explain*. [...] Given that's my deal, being a mediocre developer is weirdly kind of helpful. I tend to see things the way most developers do.


In the capacity as a teacher, he has likely made a massive contribution to the computing economy. And that's just fine.

*The point of this blog post response was to illustrate that there are different skillsets in programming, and that this is just fine. The article it responds to however also talks about  a "brain drain" in relation to tech workers in Sri Lanka. It's another issue which [I assume is related to late-stage colonialism and outsourcing](https://readup.com/comments/hliyanmediumcom/cargo-cult-programming-is-killing-the-sri-lankan-software-industry/zKyZl5).*