We have a problem.
As it stands now the present and near future of economic, social and cultural development primarily derives from computers and programming. The algorithms already dominate our society – they run our politics, they run our financial system, they run our education, they run our entertainment, they run our healthcare. The ubiquitous tracking of everything that can possible be tracked determined this current situation. We must have programs to make things, to sell things, to exchange things.
The problem is not necessarily the algorithms or the computers themselves but the fact that so few people can program. And why? Programming Sucks.
Oh sure, for those that do program and enjoy it, it doesn’t suck. As Much. But for the 99%+ of the world’s population that doesn’t program a computer to earn a living it’s a terrible endeavour.
Programming involves a complete abstraction away from the world and all surroundings. Programming is disembodied – it is mostly a thought exercise mixed with some of the worst aspects of engineering. Mathematics, especially the higher order really crazy stuff was long ago unapproachable and completely disembodied requiring no physical engineering or representation at all. Programming, in most of its modern instances, consequences very far away from its creative behavior. That is, in most modern system it takes days, weeks, months years to personally feel the results deeply of what you’ve built. Programming is ruthless. It’s unpredictable. It’s 95% or more reinventing the wheel and configuring environments to even run the most basic program. It’s all set up, not a lot of creation. So few others understand it they can’t appreciate the craft during the act (only the output is appreciated counted in users and downloads).
There are a couple of reasons why this is the case – a few theoretical/natural limits and a few self-imposed, engineering and cultural issues.
First the engineering and cultural issues. Programming languages and computers evolved rather clumsily built mostly by programmers for other programmers – not for the majority of humans. There’s never been a requirement to make programming itself more humanistic, more embodied. Looking back on the history of computers computing was done always in support of something else, not for its own sake. It was done to Solve Problems. As long as the computing device and program solved the problem the objective was met. Even the early computer companies famously thought it was silly to think everyone one day might actually use a personal computer. And now we’re at a potentially more devastating standstill – it’s absurd to most people to think everyone might actually need to program. I’ll return to these issues.
Second the natural limits of computation make for a very severe situation. There are simply things that are non-computable. That is, we can’t solve them. Sometimes we can PROVE we can’t solve them but that doesn’t get us any closer to solving some things. This is sometimes called the Halting Problem. The idea is basically that for a sufficiently complex program you can’t predict whether the program will halt or not. The implication is simply you must run the program and see if it halts. Again, complexity is the key here. If these are relatively small, fast programs with a less than infinite number of possible outcomes then you can simply run the program across all possible inputs and outputs. Problem is… very few programs are that simple and certainly not any of the ones that recommend products to you, trade your money on wall street, or help doctors figure out what’s going on in your body.
This is a VERY BIG DEAL. Think about it. We deploy millions of programs a day with completely non-deterministic, unpredictable outcomes. Sure we do lots of quality assurance and we test everything we can and we simulate and we have lots of mathematics and experience that helps us grow confident… but when you get down to it, we simply don’t know if any given complex program has some horrible bug in it.
This issue rears its head an infinite number of times a day. If you’ve ever been mad at MS Word for screwing up your bullet points or your browser stops rendering a page or your internet doesn’t work or your computer freezes… this is what’s going on. All of these things are complex programs interacting with other programs and all of them have millions (give or take millions) of bugs in them. Add to it that all of these things are mutable bits on your computer that viruses or hardware issues can manipulate (you can’t be sure the program you bought is the program you currently run) and you can see how things quickly escape our abilities to control.
This is devastating for the exercise of programming. Computer scientists have invented a myriad of ways to temper the reality of the halting problem. Most of these management techniques makes programming even more mysteries and challenging due to the imposition of even more rules that must be learned and maintained. Unlike music and writing and art and furniture making and fashion we EXPECT and NEED computers to do exactly what we program them to do. Most of the other stuff humans do and create is just fine if it sort of works. It still has value. Programs that are too erratic or worse, catastrophic, are not only not valuable we want to eliminate them from the earth. We probably destroy some 95%+ of the programs we write.
The craft of programming is at odds with its natural limits. Our expectations and thus the tools we craft to perform program conflict with the actuality. Our use of programs exceeds their possibilities.
And this really isn’t due to computers or programming, but something more fundamental: complexity and prediction. Even as our science shows us more and more that prediction is an illusion our demands of technology and business and media run counter. This fundamental clash manifests itself in programming, programming languages, the hardware of computers, the culture of programming. It is at odds with itself and in being so conflicted is unapproachable to those that don’t have ability to stare maddeningly into a screen flickering with millions of unknown rules and bugs. Mastery is barely achievable except for a rare few. And without mastery enjoyment rarely comes – the sort of enjoyment that can sustain someones attention long enough to do something significant.
I’ve thought long and hard about how to improve the craft of programming. I’ve programmed a lot, lead a lot of programming efforts, delivered a lot of software, scrapped a lot more. I’ve worked in 10+ languages. I’ve studied mathematics and logic and computer science and philosophy. I’ve worked with the greatest computer scientists. I’ve worked with amazing business people and artists and mathematicians. I’ve built systems large and small in many different categories. In short, I’ve yet to find a situation in which programming wasn’t a major barrier to progress and thinking.
The solution isn’t in programming languages and in our computers. It’s not about Code.org and trying to get more kids into our existing paradigm. This isn’t an awareness or interest problem. The solution involves our goals and expectations.
We must stop trying to solve every problem perfectly. We must stop trying to predict everything. We must stop pursuing The Answer, as if it actually exists. We must stop trying to optimize everything for speed and precision and accuracy. And we must stop applying computerized techniques to every single category of activity – at least in a way where we expect the computer to forever to the work.
We must create art. Programming is art. It is full of accidents and confusions and inconsistencies. We must turn it back to an analog experience rather than a conflicted digital. Use programming to explore and narrate and experiment rather than answer and define and calculate.
The tools that spring from those objectives will be more human. More people will be able to participate. We will make more approachable programs and languages and businesses.
In the end our problem with programming is one of relation – we’re either relating more or less to the world around us and as computers grow in numbers and integration we need to be able to commune, shape and relate to them.