Code and Computation for Humans: A syllabus sketch

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.

Acknowledgements

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.

132

13 comments

For folks interested, the Triangle Linux User's Group is having a talk on the Raspberry Pi in Raleigh in January. It's going to be led by the friendly hackers of Splat Space, a hackerspace in Durham where geeks get together to learn, socialize, and build fun things together.

There's a Raspberry Pi-based from-scratch OS course that starts with assembly language and doesn't assume prior knowledge of anything, offered online via Cambridge. I sat next to a guy at a recent TriLUG meeting who spoke highly of this course. However he was the opposite of a beginning 16 year old. :-)

But I think this approach is a cop-out, since any decent syllabus would start with relay logic and proceed from there to gates, combinatorial and sequential logic, and so on, synthasizing a multi-pipelined, out-of-order execution machine from a CAD model as the final project. JUST KIDDING!

Actually, I believe that as a techie who programmed in assembly language with punched cards and witnessed a big chunk of the computing age, I think any approach I would prefer should be sign-flipped when thinking about non-techie brains (and this is my interpretation of what you mean by "humanistic brains." I figure you don't mean non-humanistic brains as an opposite).

So, applying this backward-logic I think the right starting point is something like Scratch.

One of my hypotheses is that the details of how computers work aren't just details when it comes to learning. For the 'non-techie' brain as much as the 'techie' brain, they're crucial to understanding both why and how computers work. I think there needs to be a conceptual path from GUI to an actual bit flip. Building one that's not strange and confusing will not be easy.

I've played around a little with Scratch and, to me, I'm not sure its the right path: it allows creation, but doesn't demand much learning from the student. But I do think you're exactly right (in your joking paragraph) that a decent syllabus would start with the basics of digital logic. Understanding that digital computers can be implemented with gears, or paper, or whatever else you want actually made me understand how computers were connected to the physical world. Otherwise, it seems like there's some 'magic' that's been discovered and has to be just-so. In fact, there are many different ways to compute, design a processor, etc. All of this is like showing a map of the world before, say, discussing a particular continent or country (this is somewhat crappy inverse metaphor: bit = map of the world). It's crucial context that can't be skipped but shuoldn't be dwelled upon too much.

That said, I'm not sure that many non-engineers really know much of this material. I'm at about the edge of what I know. I'd be interested to hear your thoughts on how to introduce it to 'non techies'. Provided that my hypothesis is, of course, not disproven.

This is awesome! I'm really interested in learning more about this class and seeing how the syllabus develops. As an undergraduate student at MSU, I would be really interested in taking a course like this. I study Professional Writing at MSU, and many of my classes focus on digital humanities. A course like this would be a really excellent compliment to students who are studying in my program.

I've recently learned more about Raspberry Pi and how they can be used as a teaching tools. I was really excited to see your email about this course from HASTAC.

Absolutely. Glad to have you involved!
I'd love to hear more about what specificly you'd like to learn in a course like this. For instance, would you want digital humanities content in the course? Or would you see the course as more foundational, giving you tools to use elsewhere? I think there's a lot of flexibility in terms of what 'creativity' means here. Any ideas for what a final project might look like if you could invent it from scratch?

Never got into writing programs in the course, but whatever understanding of hardware components, binary code, OS, files, file sytems, etc. that I have (i.e., not a lot) comes from here. Check it out, and talk to Cal if you haven't yet. Good luck, and have fun!

I think for me, or another student in my Professional Writing Program with a Technical Writing focus, this course would be interesting with digital humanities content. Particularly, I really like that you would be highlighting that, "computers are cultural products....but we also tend to treat them as cultural entities, things to be reasoned with or, at least, reacted to."

In our digital writing courses, we think a lot about how websites and writing online is involved in rhetorical practices, but we don't often think about computers and technology in relation to rhetoric and culture in the same ways.

I think this would really help students to question ways computers are used rhetorically in our culture, as well as how they are used differently in other cultures. It would also lead students to start questioning the roles of technology in culture, and how it shapes or changes the rhetorical practices of communities.

Aside from these humanities lessons, I also think this class would offer really great technical skills to students. These skills would help students to continue to explore outside of the classroom, and become more fluent and comfortable with technology. I can see students using this course as a springboard for personal research or further courses, and they will leave with technical skills they can apply outside of class.

I'm not sure about what a final project for a course like this might look like. I'll think more about that and get back to you!

You mention developing "empathy with the many software and hardware designers" involved in bringing a computing platform to fruition, yet ignore the people on the other end: users. This asymmetrical approach, I think, will leave your students lacking as far as the full picture goes.

Otherwise, I think this is a brilliant approach to introducing more complex aspects of information technology to non-technical students (or, perhaps more correctly, less-technical students). In the future, it would be great if it were integrated into humanities and computer science curricula. Plus classes will be much more interesting than a more traditional approach!

I like your point, and you're exactly right. Understanding the context in which software 9or hardware) will be used is key to successful design. In my department we have such a focus on the user-centric perspective, I might have de-emphasized this point too much. I certainly won't in the class itself.

What I'm really trying to develop here is a focus on who the makers of these devices are. In reflecting on your comment, I guess I'd call this 'maker-centric learning'. It works very complementarily with user-centered design by providing inroads into how and why technologies are they way they are. A combination of the two is required to effectively control what users experience.

Thanks for your comments and encouragement! I'd love to see some of this material proliferate into aspects of a more general university computing curriculum, so I'm going to be open sourcing all my course materials. More on this in a later post...

Love the idea. I am a PhD student in Rhetoric and Writing, and I, too, have had the idea to use the Raspberry Pi as a replacement for textbooks.

/********************

* myDreamCourse

*********************\

With a constructionist mindset, I'd like to conduct a interdisciplinary tech writing class, where students generate instructions by first finding a RPi project to create throughout the semester; take those instructions found online to do it; complete the project from the original instructions, while also critiquing it; then, improve upon the instructions and make it more robust with additional revisions and options for users. Finally, the task would be to send their instructions back downstream, so the RPi community can benefit from an increased set of documentation.

The interdiscipinary part would also involve some paired teaching days with both a RW instructor, like myself, and someone from the computing field, so we can collaborate and design the best parameters for the assignment together.

/********************

* additional RPi costs

*********************\

I, too, received a RPi this last Xmas, and I was wondering if you thought about the additional costs that students and teachers need to consider when taking on the RPi, whether a power USB Hub, HDMI cables, other peripherals, etc.

Also, perhaps you know about this, but the screen issue is one to consider. Were you planning on having students use their own laptop (making the assumption that they have one)? If so, I found this great tutorial on how to setup a VNC, so a person can use their laptop as a monitor for their Pi: http://interlockroc.org/2012/12/06/raspberry-pi-macgyver/

/********************

* wrapping up

*********************\

Allthistosay, great work thus far. I'd love to keep in touch throughout your project, as I am just starting to pitch the idea to my writing director. FYI, I also joined your Google group. :-)

Great to hear you've been thinking about the Pi for a course. I'll definitely keep in touch. And welcome to the group :). Your idea of getting students to improve and interact with existing community resources is great. A goal I have for my class is to get each student to submit a pull request, no matter how small, to an existing open source project.

Logistics: I'll hold my class in our dept's computer lab, and have cleared with our IT guys that students can just unplug-plug monitors, keyboras, etc for class. Combo that with an inverted classroom and many students may not need their own setup. They'll have class time and free lab time to work with their Pis.

What about those who want or need to use the Pi at home but have no monitor? I ran two focus groups a few weeks ago and they we're split in terms of who had access to monitors etc. I've been looking for a good VNC tutorial and setup to include in my readings ever since, so thanks! The one you sent looks great. Using the laptop to share Ethernet is better than how Adafruit's tutorial has you sshing in and such. I plan to pre load all the software they'll need and make a custom .iso for all students to run, so it'll be no or low config.

That all said, students will been USB cables, and various other things. But this is all Sill less than the price of a textbook.

Looking forward to hearing more of your ideas! You sohuld consider doing a full length post on them some time.