Programming Literacy Done Right: It’s About the Tools

1/8/13Follow @hirodusk

Bonnie Nardi is an anthropologist who studies interactions between humans and computers. In 1993, she published her first book, A Small Matter of Programming. The book’s thesis is bold and simple: every human being can, and should, learn to program computers.

The book didn’t get much attention outside of academia and is now long out of print. I picked up a secondhand copy in the summer of 2007, just as I was working on the initial prototype of Heroku. The ideas from this book have inspired and haunted me ever since.

Universal literacy

It challenges common assumptions to say that anyone can learn to program. Many assume a divide between “geeks,” who can program, and “normals,” whose use of computers is limited to using software created by the geeks. But is this the case? Let’s consider a parallel situation from history: the written word.

A thousand years ago, writing was a technology enjoyed by an elite few: rulers, clerics, scribes. This technology offered the power to store information with more permanence than human memory, to pass such information between people, and to archive it for future generations.

The invention of the printing press in the 1400s made books widely available, and literacy spread. Today, literacy rates exceed 90 percent in most of the world. Not everyone is a novelist or English professor, but almost everyone can read street signs, write down a grocery list, or send a text message.

Programming as literacy

We increasingly live in a computer-embroidered reality, and the ability to manipulate that reality is empowering. If we can find a way to bring that ability to a wide audience, it could have an impact comparable to the invention of the printing press.

This is end-user computing. “End user” means everyone: people like you, me, and your friends and family. We all use computers in our daily lives to accomplish both work and personal goals. When those end users can write and run their own programs, they will have fully harnessed the power of computing.

I’m far from the first to address the topic of programming as literacy; see Programming is the New Literacy and Computer Programming for All: A New Standard of Literacy for two recent examples. But while the interest in this topic is exciting, the methods proposed are often nothing but wishful thinking. The true challenges of programming literacy are rarely addressed.

A Small Matter of Programming, though two decades old, contains hard research on the real benefits and obstacles to end-user computing. And surprisingly, these findings remain just as relevant today as when they were written. Programming-as-literacy enthusiasts should take a close look.

The two comprehension gaps

The research presented in the book demonstrates two major gaps that block programming accessibility. These gaps are in the tools, not the teaching process. What we’re missing is 1) no-fuss setup, and 2) task-oriented tools.

Gap 1 – No-fuss setup

Professional software developers favor composable tools that can be combined in a customized stack according to the developer’s taste. Consider the number of tools in a web development environment: language runtime, code editor, revision control system, webserver, database, web framework, dependency management tool, templating language, test harness, and more. The bewildering array of choices often proves defeating to beginners.

The lengthy setup instructions for Ruby on OS X or PHP on Ubuntu illustrate this, each with many pages of error-prone manual steps and incomprehensible jargon. A newbie programmer cannot run even the simplest program without having invested many hours struggling through this setup process.

Even worse, the budding programmer is often pressed to make many choices: what IDE? what language? what database? Experts want choice; newbies want to be handed an integrated product where good choices have been made for them and they can dive straight into their task.

Beginners would be better off with a single integrated tool that they can install (or access on the web) and use to begin programming immediately.

Gap 2 – Task-oriented tools

I recently demonstrated the simplicity of programming to a friend of mine by showing her how to write a short Ruby script. “That’s cool,” she said. “But what would I use this for?”

Her response demonstrates the second gap in programming accessibility: too much focus on the technology (e.g., programming language) and too little focus on the user’s task.

Anyone who can program today probably learned because they find programming itself compelling. The first few chapters of nearly any introductory book on programming illustrate this mentality: they focus on topics like … Next Page »

Adam Wiggins is an entrepreneur, technologist, and product guy. He cofounded Heroku. Follow @hirodusk

Single PageCurrently on Page: 1 2

By posting a comment, you agree to our terms and conditions.

  • Joanne D

    Hi Adam: Great article! That’s what we at LearnStreet are trying to do — create coding lessons based on tasks that people want to accomplish. As a new coder myself, this is the mindset that I have as well.

  • gigaherz

    You may be interested in whatever may come out of: http://www.kickstarter.com/projects/ibdknox/light-table

  • iau

    Environments which are actually designed for beginners address many of your concerns about setup, complexity and task-focus. Look at Scratch, Alice, Greenfoot and AppInventor. Sure, a lot of them are focussed on kids, but that’s where most beginners are. Observing that Ruby is hard to set up for people who just want to learn to program is like saying that CNC machines are hard to set up for beginners in metalwork. It’s true, but why would you start from there?

  • http://www.facebook.com/people/Tim-Rue/100000846306529 Tim Rue
  • Boris Vassilev

    Good points made! However, you seem to ignore the elephant in the room: the easy problems have solutions already, and we are using them daily. You even mentioned some good examples: Excel spreadsheets, AutoCad. But I can’t write up this cool app idea I have in Excel, and I couldn’t use AutoCad just because I know nothing about design.

    It’s the messy problems that need not only a bit more complex tools, but also a deep understanding of the problem. Many people just don’t want to spend the time to translate their understanding of a problem from a common-sense, human point of view into a formal definition. Even recognizing that a problem can be solved with a computer (better than with a pen and paper) requires a deeper knowledge of computers than you seem to acknowledge.

    Of course, teaching kids and grown-ups about how computers work, and how they can solve problems that are beyond us (often simply because of practical reasons, like limited time) is definitely going to help more people use computers on that level. It is not going to make it easier, though…

  • Jamie Bryden

    Thanks for an interesting article!

    No doubt making it easier to get started with programming and making use of more practical examples will help increase the number of people who learn to program.

    However, as Boris mentioned below, there may be a much bigger stumbling block – many people really struggle to get their heads around any sort of formal system, even basic first order predicate logic.

    I suspect it’s hard for programmers to identify with people who have this difficulty. Fundamentally, many people never seem to quite get that “the computer does exactly what you tell it to do, which is not necessarily what you wanted”.

    There’s a very interesting academic paper called “The camel has two humps” which can be found here – http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf – which describes this problem in terms of whether people can form a consistent model for how a system works.

    I’d like to think that there is some method of teaching that can get people past this hurdle …

  • Lukša Kraljević

    Unfortunately Microsoft OS designers decided long ago that decent scripting capabilities are not required for a desktop PC. What you describe is exactly what should good desktop scripting system have looked like had they decided otherwise. Unix shell fulfils your 2 criteria – it is the environment you normally interact with your computer without any need to set things up and it is task oriented. Unfortunately Unix CLI environment is beyond grasp of “regular person”, and AFAIK in the last 20 years nobody bothered to bring the scripting to the desktop.

  • Horace

    The literacy analogy is invalid – most people can’t write more than a shopping list or a tweet – no program is that simple.

  • Daniel Wendel

    “Note that neither spreadsheets, nor Victor’s examples, attempt to hide logic creation behind a point-and-click interface. Purely visual programming is a red herring, and history is littered with the corpses of products that have attempted to offer programming without code.”

    Full disclosure: I am the developer of a blocks-based programming tool, so I am clearly biased! But I had to comment because this article is furthering a decades-old myth that the best way to use visual programming is to “hide logic creation behind a point-and-click interface.” I agree that attempting that is futile and even counter-productive. However, a well-designed visual programming language actually brings the logic to the foreground.

    To beginner programmers, programming is all about remembering the right keywords and where to put the braces and semi-colons. They ask each other “how many languages do you know?” as if memorizing syntax is a measure of programming ability. However, that is not what expert programmers see when they look at code; they see structure, logic, data, and process. So the goal of modern visual languages is simply to remove the distractions inherent in text-based languages, while making the interesting and important parts more immediately accessible and explicit.

    It may be true that nothing can beat text for expert programmers who are already able to see the logic hidden behind (<– note the irony) the code. And perhaps by following Bret Victor's suggestions, we will be able to annotate and animate text to make it even more useful. But for most people, visual programming interfaces (if well-made) can reveal the beauty and power of programming in a way that would take months or years with text.

    For reference, here are a few great visual programming languages for beginners:
    http://scratch.mit.edu/
    http://education.mit.edu/projects/starlogo-tng
    http://research.microsoft.com/en-us/projects/kodu/

    And I know there are many more!

  • James Simmons

    The One Laptop Per Child project has been interested in getting kids to program from the very beginning, and they provide Activities that can be easily installed (and removed). EToys, Pippy, and Turtle Art are the oldest Activities related to teaching programming but there are others:

    http://activities.sugarlabs.org/en-US/sugar/browse/type:1/cat:107?show=20&sort=popular

    An indication of the success of OLPC in this area is the large number of Activities written by young people. Projects for Sugar Labs have been a popular choice for Google Code-In contestants as well.

  • hermanradtke

    I have suggested http://ruby.learncodethehardway.org/ to a few friends/family that wanted to learn how to program. This basically solves Gap 1.

  • http://www.KoduGameLab.com Stephen Coy

    “I learned to program because I loved video games as a kid and wanted to make my own. How about a toolkit and learning resources targeted at kids who want to make games?”
    Check out Kodu Game Lab at KoduGameLab.com. It’s an integrated 3D game development environment based on a custom visual programming language that’s simple enough for a 9 year old.

  • http://www.KoduGameLab.com Stephen Coy

    “I learned to program because I loved video games as a kid and wanted to make my own. How about a toolkit and learning resources targeted at kids who want to make games?”
    Check out Kodu Game Lab at KoduGameLab.com. It’s a complete 3D game development environment with a bespoke visual language designed for kids as young as 8 or 9.

  • a

    I learned programming straight from reference sites and reference books for Perl/Python, but mostly C++. Self-taught is the way to go, none of this “child programming” bullshit that tries to soften the scene and make programming look ‘fun.’ A person should want to learn how to program because it is intriguing and they enjoy a challenge, among other things. They should learn by solving complex problems or trying out new things the way they want to implement it. They should want to find a better way to go around their solution. Having lessons shoved down their throat with no room to think or try to expand knowledge is a garbage way to learn.