When people think of computer programming, they generally also think of math and engineering – equations, numeric variables, arrays of numbers. Both programmers and non-programmers share this association. To people who program, this mindset generally means that programming becomes associated with engineering tasks – things like running plumbing lines through a house, or building a bridge, or designing an integrated circuit.
To people who don’t program (that is, most people), this association generally has them running as fast as they can for the nearest exit. The whole conversation taps into the deep well of math-phobia that pervades much of our society.
Most people who talk seriously about “universal programming literacy” are the same folks who have no problem with math and engineering. They often wonder why it’s so difficult to get the rest of the population on board.
But I’ve been wondering recently, maybe programming has been misunderstood, abused even, the product of a dysfunctional childhood. Perhaps the same people who lovingly birthed it and raised it – the mathematicians and engineers – have also doomed it to a marginal existence within society, by declaring it to be a sub-branch of math and engineering.
In its most general form, computer programming has nothing at all to do with math and engineering. It’s really all about explaining a cooking recipe to a computer, and then having the computer go ahead and follow that recipe. The computer is rather stupid, but it’s incredibly fast, so if it manages to understand your recipe, it can finish cooking you up a batch of a million or a billion cookies around the time you’d be taking the first dozen out of the oven.
When you start talking not about cookies but about searching for a particular size LCD TV in your price range, or finding references to your favorite author in a library, or putting together a new musical passage by looking at all the songs that were ever in the top ten charts, or locating the best Indian restaurant in Pittsburgh within walking distance of an ATM, things start to get interesting. None of these tasks, or countless other tasks that might require a computer program, is inherently about math or engineering.
Rather, they are about getting the computer to follow through on making the decisions that you would have made, except the computer can do it millions of times faster than you ever could.
I would argue that programming without math has been sadly neglected – the concept of sequential logic, things like “if this is true, then try that”, or “look through all of these things, and as soon as I have found the one I want, send a message to my friend”. We shouldn’t be trying to teach kids programming as a special case of math and engineering. We should be teaching them languages that let them get computers to do the things they want computers to do for them.
And that will require us, in our teaching, to move away from the “math/engineering” mindset, and toward a new way of thinking that is centered on what is truly essential about computer programming.