Today I am revisiting the topic of my January 21st post Learning from Children, in which I talked about the possibility of Universal Programming Literacy (UPL). But today, rather than talk about how to achieve such a thing, I’d like to talk about whether it’s a good idea at all.
It is clear that we live in a world in which, even in the most literate and computer savvy of societies, only a small percentage of the population programs computers. It is reasonable to ask the question “Is there a scenario in which pretty much everyone in society programs computers?” I don’t think it comes down to ability. Just about anybody can understand how to program, if taught the right way. I know this from first-hand experience. I think the more salient issue is utility, and therefore motivation.
One argument against UPL posits that programming is like carpentry: We all sit on chairs, yet a society only needs a relatively small percentage of its population to be able to build chairs. Some people may learn carpentry as a hobby, but it’s not necessary for your child to be able to build furniture in order to succeed in society. Therefore there is no compelling pressure from parents and communities to make sure every child learns how to be a functional carpenter.
A counter-argument in favor of UPL – and this is very hard to make in the context of most of today’s programming languages (C++, Java, Python, C#, etc) – is that programming can evolve to something more like written language: A communicative tool that helps provide the glue by which people form into communities. This has been the role served by written literacy since the Web took off in the mid ’90s: The fact that millions of people can read and write has allowed the Web to enable a grass roots kind of communication, in which communities can form themselves around common goals and interests, rather than needing to depend upon trained experts.
Those of us who program know that our skill provides us with an enormous increase in our ability to take advantage of the power of computers – the computer becomes a fantastically powerful and extremely protean servant. We are able to instruct the computer to do things for us that require millions of custom operations. For example: go off and search through millions of items, see which ones match what I want, combine them in this particular way with these other items, and bring me back the best result. Very powerful stuff indeed.
And yet, if it turns out that the number of people who would benefit from directly wielding such power is small, then programming is indeed akin to carpentry, and then there is no point in trying to promote UPL. On the other hand, if it turns out that such power can be fruitfully applied by people in such diverse fields as sociology, economics, community activism, literature, politics, music, poetry, and so on, then we’re talking about something that is more like written literacy, and then there is a reason to pursue UPL.
My current sense is that the problem is still ill-posed, because the kind of programming language that would empower most people to do the things that matter to them does not currently exist. Most existing programming languages are rather brittle and are quite focused on relatively mathematical operations. Those kinds of operations are very useful for those of us who do things like computer graphics, physics, statistical analysis, and other tasks related to mainstream computer science, but are not really useful for modeling the sorts of problems that come up when you’re looking at history, community activism, or the works of Charlotte Bronte.
A small number of special purpose programming languages are widely adopted by people who don’t think of themselves as programmers. In each case (unlike C#, Java, C++, etc), the programming environment is not brittle – mistakes don’t take down the whole system – and the visual representation of the language itself maps well to the problem being tackled. Some examples of this are Excel and similar spreadsheet languages for modeling finance problems, and Max MSP and similar visual data-flow languages for building procedural music.
My sense is that if any programming language is going to succeed in the broader arena of human endeavor, it’s going to have some important qualities in common with these special purpose languages: (i) The programming environment is very forgiving of mistakes: Whatever fool thing you choose to do, you can’t crash the program; (ii) Things are “always running”: There won’t be the sort of compile/run cycle that traditional programs rely on now. Rather, you will be making continual interventions into a world that continues to exist at all times; (iii) The program itself appears to model the problem you’re solving: In some sense, the “code” appears to be intuitively superimposed upon, or even identified with, the problem space that is being modeled (think Excel).
It could be that even with all these qualities, it simply doesn’t make sense for many millions of people to be interacting with computers by programming them – maybe programming is really carpentry and that’s that. But I think that in order to do experiments that aim to find out one way or another, we need to be developing and testing these sorts of guiding principles.
A problem with making programming languages more accessible to people, is that very high level concepts mask too much of the underlying workings of the hardware and this in turn reduces what we can do with it. To take your carpentry analogy, a carpenter can produce beautiful furniture but I can also put together flat pack furniture made from chipboard from IKEA! The results however are not comparable.
Perhaps this is a bit of a paradox, if we want to make programming as natural as our day to day communication then we might have to compromise too much on the programmability of the hardware. In doing so, do we empower or take away power? Current hardware lends itself to algorithms that do not map very well to natural language. Perhaps it is both the hardware, and the programming paradigms that must change?
Having said that, I am of-course very much in favour of experiments, Alice also shows that with the right choice of semantics, it is possible to make programming pretty inclusive.
I think of James Surowiecki’s book, “The Wisdom of Crowds”. In it he argues convincingly that a crowd is almost always smarter than any individual within it – under certain circumstances ALWAYS smarter than smartest individual. If some form of UPL equipped very large groups of people the ability to create algorithms that ran on some form of ubiquitous computing platform, which would be processed and corralled in ways such as Surowiecki describes, we might very surprised to learn that we get some very robust and efficient programs.
I also think of John Brunner’s seminal proto-cyberpunk novel “Stand On Zanzibar”, which neatly anticipated Surowiecki’s book by nearly 40 years. In it a nearly omniscient computer, Shalmaneser, acts as an oddsmaker – the entire world is allowed to bet on the answers to important questions of all kinds. The computer than analyzes the parimutuel odds to come up with an answer. Incidentally also anticipating ‘crowd-sourcing’.
That’s where I think a real benefit to UPL would come from – crowd-sourced/crowd-optimized/crowd-DEBUGGED algorithmic applets.
PS if there are sci-fi fans out there who haven’t read John Brunner, “Stand On Zanzibar” and “Shockwave Rider” are must-reads.
You might be interested in this article by Marc Prensky, “Programming: The New Literacy”
http://www.edutopia.org/literacy-computer-programming
My favorite arguments for universal programming literacy come from the 1961 Sloan School convocation about “Computing in the Modern World” that Martin Greeberger published in ’62. Two examples:
– Alan Perlis, the first ACM Turing Award winner, argued that *everyone* should take a course in programming, that it should be considered part of a general, liberal education. He said that computer science is the study of process, which effects everyone. Automated execution of process changes everything. He gives the example of economics, which previously wasn’t an experimental science (“Hey! Let’s devalue the dollar tomorrow and see what happens!”) but which can be with simulation.
– C.P. Snow (famously author of “The Two Cultures”) suggests that everyone should learn programming, in order to understand the world we live in. If you don’t understand programming, how can you really understand how your credit score is computed (e.g., what default values are used?) or how the Google page rank algorithm works (don’t think that impacts your life?). Snow threatens that those knowing programming, when others don’t, will be: “A handful of people, having no relation to the will of the society, having no communication with the rest of society will be taking decisions in secret which are going to affect our lives in the deepest sense.” Prescient, no?
(I’ve been to come read your blog after hearing you speak about it on the Cruise, Ken!)
(i) The programming environment is very forgiving
(ii) Things are “always running”
These two wish list items remind me of the iconic languages, Gamemaker, Scratch and Squeak/etoys. The environment is forgiving, they are syntax free, no lost time because you typed 0 instead of O or substituted a . for a ,
Squeak/etoys has late binding, you can inspect and alter the program while it is executing