Programming could be much much easier most of the time. This unnecessary difficulty wastes the effort of professional programmers, but worse, prevents many people from programming at all. The problem is a nasty hairball of culture and technology and money that is not easily untangled. I’ll try to address this essay to a general audience.
Programming today is exactly what you’d expect to get by paying an isolated subculture of nerdy young men to entertain themselves for fifty years. You get a cross between Dungeons & Dragons and Rubik’s Cube, elaborated a thousand-fold. I’m serious: Dungeons & Dragons requires mastery of an encyclopedia of minutiae; Rubik’s Cube is a puzzle requiring abstract mathematical thinking. That is programming in a nutshell. As a bonus you also get a toxic culture of intellectual one-upmanship.
There is something unique about software that exacerbates these problems. Unlike every other technology, software doesn’t wear out. The traditional cycle of replacement and renewal is halted; there is no evolution. Once a software technology gets adopted it lives forever, enshrining every mistake and obsolete design decision. It is always more expedient to layer more software on top of the obsolete than to redesign and replace it, and so our Tower of Babel grows ever higher. At this point to be a “full stack” developer you must master the content of something like a hundred thousand pages of documentation. Can we keep adding more layers forever? When do we start throwing obsolete things away? Whose responsibility is this?
I don’t blame the kids. Ultimately the problem is a failure of our institutions. We need senior leaders to band together to invest in the long term health of the field. We lack such institutions to a shocking extent. Why is there no American Programmers Association, like what all the other professions have? Instead we have only the Association for Computing Machinery, which is run by and for academic computer scientists, paying only lip service to practitioners. Compounding this bias, academic computer science has become estranged from practice. The stereotypical attitude is that professional programming is such a mess because programmers are stupid. There is some truth to this — most people are stupid compared to computer science professors. But apart from eugenics, isn’t the solution to design technology that doesn’t require a PhD? And maybe it would help if those computer scientists had more actual experience of professional programming. Unfortunately there is no path for practitioners to enter computer science more than a couple of years post graduation. Why is there no Professor of Practice as in other fields? The studied irrelevancy of computer science is a big obstacle to progress, because it absorbs and dissipates the funding from policy makers and philanthropists trying to help.
What of the #CSForAll movement? I have mixed feelings. The name itself betrays confusion — what we really want is #ProgrammingForAll. Computer science is not a prerequisite for most programming, and may in fact be more of a barrier to many. The confusion of computer science with programming is actually part of the problem, which seems invisible to this movement. Instead they are focused on education and social engineering, which has a bad track record for solving knotty cultural problems. I hear talk of equity and fighting toxic culture and offering nurturing learning environments. These are all good things, but I don’t think they are enough, because the cultural problems have become baked into the technology itself. No amount of coaching and cheerleading is going to make most people enjoy spending their lives playing Dungeons & Dragons and Rubik’s Cube. Why is making the technology itself more humane off the agenda? Because that would be too hard or too disruptive? This movement wants to believe we can quickly fix the problem without upsetting any apple carts by just throwing more money at the entrenched institutions that should have prevented the problem in the first place. Good luck with that.
What reason is there to believe we can improve programming technology to be vastly easier and more accessible? To start with, spreadsheets. Spreadsheets are by far the most popular programming tool, used by far more people than “real” programming. Surely it must be possible to carve out other domains like that of spreadsheets without taking on the full complexity of programming. In fact HyperCard was just that, enabling millions of novices to build simple applications. We can also look to the many incarnations of Basic, designed for ease of learning, and particularly Visual Basic, which was a serious business programming language. Visual Basic was an example of “application programming”: using languages and tools designed for simplicity of learning and use in solving relatively pedestrian problems. I recall that application programmers had a more welcoming and supportive culture than the “systems programmers” that looked down upon them. Unfortunately application programming got trampled in the internet gold rush. Suddenly all that mattered was building large-scale systems as fast as possible, and money was no object, so the focus shifted to “rock star” programmers and the sophisticated high-powered tools they preferred. As a result the internet age has seen an exponential increase in the complexity of programming, as well as its exclusivity. It is long past time to return to designing tools not just for rock stars at Google but the vast majority of programmers and laypeople with simple small-scale problems. We’ve done it before so we can do it again, even better this time. The problem is funding. Academic computer science doesn’t reward the kind of work required to build high quality tools (it’s “just” design and engineering). The big internet companies aren’t interested because it doesn’t give them lots more eyeballs. The venture capitalists aren’t interested because there is no hyper-growth play. Open source development has succeeded mostly at solving the problems of expert programmers. This funding barrier is a big reason we need new institutions whose interests are aligned with that of all programmers, expert and casual, present and future.
In conclusion, to bring programming to everyone we need to fix both our culture and our technology. This is best done in fresh institutions outside of computer science, institutions dedicated to improving the practice of programming, but even more dedicated to bringing the power of programming to everyone. At long last society at large is awakening to the inequities caused by the problems of programming. The time is now ripe to fix programming.
Alan Kay. The inventor of object-oriented programming and grandfather of software contrarians.
Bret Victor, Dynamicland. A new human interface to software.
Chris Granger, Eve. A moonshot to make programming accessible to everyone.
Evan Czaplicki, Elm. A humane programming language and community.
Adam Chilapala, MIT. Another point of view: math for the win.
Agenda of a Programming Institute
The myth of essential complexity.
The limits of “no code” and “low code” application generators.
The siren call of dataflow.
Tear down this wall: the cost of specialized software components/domains.
The great schism: do specs exist?
Making computer science weird again.
Thanks to Tomas Petricek for helpful comments.