One thing that is becoming clear to me, as I play around with different implementations, is that universal programming literacy will require undoing the general perception of programming as an “off-line” activity — as opposed to, say, writing, which can easily function as an “on-line” activity.
By “off-line”, I mean something you can generally only do slowly and in solitude, when nobody else is around to disturb your concentration. It is certainly true that much writing of prose takes place off-line. I generally write these blog posts during some interstitial time of day, when no one else is about. On the other hand, we don’t need to write off-line. It is quite common now for people to engage in text chats or fire off quick emails in the middle of events or meetings. And of course the entire point of a tweet is that it is an emphatically on-line act. In fact, this single quality essentially defines the very ethos of the twitterati. To tweet is to twist the dictum of Ram Dass — “Be Here Now” — into an imperative to “Be There Now”.
And so I’ve reached the conclusion (at least for now) that the proper way to teach programming — if programming is to be a universally acquired skill — is to immerse the learner into an on-line community, via a synchronously shared game or activity, in which programming serves as a fundamentally conversational skill. In such a learning environment, communication between people should be an essential purpose of the act of programming.
In this scenario, programs are not heavy things, like most programs of today — creations of psychic bricks and mortar — but rather light and airy, quickly mutable, jotted musings that produce an instantaneous effect, which can be quickly changed and just as quickly discarded.
In other words, the very qualities that we expect from a language.