tl;dr: I'm building a technical class for the humanistic brain: an on-ramp to computing that isn't scared of coding but never looses sight of the history, theory, and culture of the computer; the textbook will be a Raspberry Pi.
What follows in this post is a sketch of ideas that I’ve been gathering in preparation for teaching a class tentatively titled ‘Code and Computation for Humans’ at UNC Chapel Hill. The textbook will be a Raspberry Pi. It’s the class I always wanted to take but could never find: a broad and deep introduction to the history, theory, and techniques of computers designed to teach skills, yes, but most of all understanding. I wanted to learn to code, but with more context and nuance than ‘this is how it’s done’. I wanted a guide through the sea of proper nouns and acronyms that confront anyone trying to peer inside software or hardware to see how they work. I'm a UNC PhD student in information science and have a masters degree in the same, also from UNC. The programs are excellent but I haven’t been able to find the courses I was looking for either within or outside higher education. But after grad school and several months intensely focused on finding this knowledge I think I’m at the point where I could develop and teach (most of) this class and so I’d like to make it the centerpiece of my teaching practice. In addition, projects such as the Raspberry Pi computer are putting excellent educational tools within reach of modest budgets. There seems to me to be a groundswell of need for this course. I heard this firsthand from many at the Code on the Classroom panel discussion in October (writeup here) and I’m hoping that what I’ve said so far and what I describe below will be of interest to you as well. If so, I’d love to hear your thoughts. If you’re interested in staying up to date with this lesson plan as I and interested others grow it, consider joining our google group.
The course content I’m envisioning falls into three categories, each with a specific aim. First, it’s crucial that computers and computation be situated in history, with the goal of enabling contextual understanding. Next, it’s critical that the theory and design of computers are understood thoroughly, so that students can develop empathy with the many software and hardware designers that they are indirectly interacting with when using a computer. And finally, coding techniques are essential to developing a lasting interest and ability in coding. The goal of this final module, and the class more generally, is to ignite excitement, encourage ownership, and celebrate the creativity that computers enable. I’ll now elaborate on each of these three in turn.
History & Context
In evolutionary biology there is a saying that “ontogeny recapitulates phylogeny.” This refers to how each individual organism experiences a rough replay of the history of its entire species as it develops. This strikes me an excellent metaphor for the process of learning an suggests a new way to teach. Revised, the dictum would read “each student’s learning process should trace the outlines of the intellectual history of the topic.” This approach is particularly suited to subjects like Art History where art in any period was often a reaction to that of a prior period.
What does all of this have to do with Computers?
Everything, in my eyes.
I have a longstanding interest in biology and physics, but I’ve found my undergraduate experience with art history and philosophy to be the most important guide as I’ve waded into computation. In fact, the field I’m most reminded of as I’ve learned to code is philosophy. Everywhere you turn there are new proper nouns (e.g. Java, Haskell, Clojure, C++, or Erlang, to name a few programming languages) or strange concepts (e.g. tail recursion, software transactional memory, functional programming, heaps, and stacks). It’s difficult to know how to begin bootstrapping a knowledge of the field when many of the resources you find will mention yet more concepts or names you don’t understand! It feels like a rabbit warren of Wikipedia links sometimes. And even when you do feel comfortable with the terms in one area, there will always be others. Where does this complexity come from? I’d argue it’s an inescapable result of accretive cultural production. The webs of reference and meaning become difficult to disentangle and almost impossible to understand without the cultural context provided by a historical account of the field's development.
Just like literature, art, music, or philosophy, what we’ve done to make computers the way they are is uncoordinated, interconnected, and highly historically contingent. The goal of my focus on history and context is to help students trace the outline of how computers came to be the way they are, deepening their understanding, interest, and fluency.
Alan Turing, a key figure in the history of the digital computer.
Theory & Empathy
How are computers made? How is it even possible that they can do so much? Understanding computation at a high level has always been important to me. In fact, it was perhaps the greatest barrier to my learning in the beginning. I felt like someone asked to draw a map of the country, or a diagram of how the earth, sun, and moon revolve around each other and realizing I didn’t actually have a great understanding or knowledge of the things I thought I did. I’ve had to construct this schematic understanding myself.
But beyond understanding the theory and architecture of computers, I have always wanted something more like intuition about them. But intuition isn’t easy to develop here. Computers are cultural products, as I’ve described above, but we also tend to treat them as cultural entities, things to be reasoned with or, at least, reacted to. In the guts of our laptops and at the root of the software are strange codes <codes: fsck man grep & some hex addressing> that make the device seem foreign, even alien. I imagine we’ve all had these feelings at one time or another, and we’re tempted to think ‘what is it doing?’ This implies a personification of the computer. We unconsciously empathize with it. One of the most striking characteristics of expert programmers I’ve noticed is that the computer itself is practically transparent to them, and thus functions as a medium. Instead of empathizing with the device as if it were an entity, they consciously and unconsciously empathize with the other coders, often nameless, who contributed to making the computer what it is. Like a skilled reader of literature, they can simultaneously evaluate the content of code and engage with its author and her intentions. It’s interesting to think of the success of social media as the triumph of empathetic computing, and that most students will be comfortable with the computer as a medium. The purpose of my focus on Empathy in this course will be to cultivate this ability, shifting the target of their unconscious empathizing from the computer or their social media mediated relationships to the many others who have made it what it is.
From binary to assembly to processors to networking to displays, there are too many black boxes inside computers. Understanding these concepts has been crucial for me and will help students develop intuition about why computers were designed the way they are and behave the way they do.
Binary computer code. I want my students to understand how binary code relates to other more familiar digital codes like text, audio or images.
Technique & Creation
The historical and theoretical understandings we’ve been discussing are important foundations for the Technique and Creation material, which I envision occurring throughout the course. I mentioned above that I see similarities between computers and literature, fine art, music and philosophy. And, just like those other fields, actual practice does not require a knowledge of what came before. Nor does a knowledge of their history require practice. But the most effective path to mastery in these fields and computers is a combination of history and practice together. The goal of my focus on technique and creativity is to activate and strengthen students' understanding of coding and computation. The computer can become a medium for excellence in any discipline.
The tools for delivering this education are effective and readily available. My wife bought me a Raspberry Pi for my birthday and the experience is changing how I’m thinking about technical education. The Pi combined with excellent and free open source software are the perfect ways to give students hands- on experience while building real, tangible systems. Imagine this: instead of a textbook, each student buys a Pi. The instructor provides SD cards pre-loaded with software for different modules. The students get to see the wide range of expressiveness of this tiny computer as they get hands-on with historical computing environments like BASIC interpreters or the RISC OS on the way to installing and modifying modern systems like Debian Linux. As they physically manipulate the tiny box during the course, I hope they’ll gain a newfound excitement for what possibilities it allows. And, ideally, a large majority of the students will continue to program and play with not only the Pi but the many other computers they will encounter during their lifetimes, but with newfound context, empathy, and creativity.
Card sorting, an important technique in design.
Work to be done
There’s still lots of work left on this lesson plan, as I’m sure you can see, and I estimate it’ll be at least a year before I’ll be teaching at UNC. So what will I be up to? How can you get involved?
I run a Duke-UNC group called Semaphore focused on media and technology with Whitney Trettien and Adam Rottinghaus. We’ve been generously supported by a Kenan-Biddle grant and plan on using some of that money to purchase Raspberry Pis. This means we should be able to start teaching workshops on this at UNC, Duke, and maybe elsewhere in the spring, testing out bite-sized pieces of the grander vision I’ve tried to lay out in this post. Would you attend such a workshop? What would you want it to be about? Could you teach such a workshop? Why aren’t you signed up on the Computational Core google group? :) Please feel free to email me directly if you’d like to chat; otherwise, hope to see you in the comments.
There are many people in the Duke and UNC communities who are helping me evolve these ideas. Thank you all, and I look forward to continuing our work. I’d like to thank one of those people in particular, John Martin, for reading and commenting on a draft of this post.