Sam Gentle.com

The many faces of code

A masquerade mask with angle brackets

One thing that makes conversations around programming difficult is that there isn't really one kind of programming. It'd be like saying "everyone should learn how to make buildings". What does that mean? Architecture? Civil engineering? Interior design? Construction management? Crane operation? Plastering? You might even find yourself saying ludicrous things like "you don't really know buildings unless you know how to wire a light fixture". Which makes perfect sense if you think of making buildings as a trade, but not at all if you think of it as engineering.

I think we're often led astray by the way that most programming skills look the same. Ultimately, you type symbols into a black window on a computer. Hopefully that won't always be the case, but for now at least that's where everything ends up. But let's not forget the vast number of skills that end with "and then you type words into a document or an email". Sure, typing words is a big deal if you don't know how to do it, but just being able to construct sentences isn't going to give you a law degree, or teach you how to run a business.

In recent years there's been a big uptick in what are essentially programming trade schools. They don't teach the foundational theory of computer science, they teach how to build a website, or how to make an app. You learn how to use particular tools and frameworks, but not the theory that unites them all. You come out with the skills to make stuff, but not the exhaustive knowledge that lets you think new thoughts in computing.

So is that a bad thing? I don't think so. If what you want is to build a website, just learning the tools is the hardest part. More importantly, I think that a single-minded focus on theoretical computer science is actually a distraction for people who only want to make websites. Not every builder needs to be an engineer, a construction manager, an architect and an HVAC expert. And realistically, most good programmers I know started by just writing whatever code worked and learned the theory behind it later.

I don't even think the trade/theory divide is enough. Programming can be art, a purely creative exercise in the space of code. It can be design, using code to creatively satisfy goals and constraints. It can be engineering, structuring code to be efficient and tolerant to failure. It can be a trade, with specialists in particular technologies and tools. It can even be a craft, something you do mostly for yourself for fun or to satisfy your particular needs.

Ironically, one of the few things that software really isn't is a science. What we call computer science would maybe better be described as a kind of mathematics or philosophy, concerned with constructing and describing theoretical spaces and their characteristics. That exception aside, programming is a big tent, and the less we worry about everyone being able to do everything the easier it's going to be to fill it.