I’ve been thinking for a while now about how software engineers can help their communities. Lawyers have pro bono work. Engineers and contractors can help build houses for people. But computer programming is really specialized; most people don’t need custom computer programs. This spring, though, I found a rewarding way to use my computer science skills: teaching kids how to program. I did this though the Citizen Schools program, which encourages members of the community to share what they know with middle school students. It is a really neat idea: the kids get to learn things their school probably doesn’t have the expertise (or time) to teach, and the “citizen teachers” get a chance to help the community and work with some fun kids. The topics which people teach vary widely. For example, here are some of the topics other people were teaching during this last semester:

Digital photography. The kids presented a gallery of their photos at a local coffee shop.

The science (and math) of baseball. 10 teenage boys happily doing statistics for an hour. Awesome.

Make a text adventure game in Javascript. You can play the game they made right now.

Cooking and nutrition with a chef from one of Google’s famed cafeterias.

So what did I teach?

I showed the kids in my class how to use Python to create a drum machine program which plays various drum sounds when you hit different keys on the keyboard. For example, pressing S played the snare drum, C played the cowbell, and B was the bass drum. The finished version of the program had about 20 different drum sounds which the user could play. There were some colorful graphics (drawn by one of the students) showing which drums were being hit. The program could record drum loops, letting the user layer more beats on top of the original beat, and could save and load the sequences of beats. The kids ended up being much better at laying down beats than I was. At the end of the class, the kids presented the program to their parents & teachers, plus had a field trip to a local cafe to demo their work to the community.

What’s it like teaching a class?

Citizen Schools took care of most of the logistics, provided some training on effective ways to teach, and paired us with advisors who helped us work with the children every week. This was really helpful for me, because I was a bit lost figuring out how to present computer programming in a way that middle school students would enjoy. Arturo, my advisor, was super helpful. He worked with the kids every day so he knew them all, plus he had lots of great ideas for ways to present the material and keep the students’ attention.

The semester I taught was a one hour class per week, for ten weeks. That’s not very much time, so I had to work really hard to keep the material short and simple so the kids could learn it. Code is like essays: being terse takes a lot more effort than being verbose. I definitely spent more time preparing for class than I did teaching it.

The kids all knew how to use computers, thanks to myspace, youtube, etc. but none of them had ever written a computer program before. For the first several classes, I would project some simple code and have them type it in and run it. Then I would have them change it or write some similar code. For example, one week we were making the program play different sounds. I showed them how to make it play a snare drum sound, then had them figure out how to make it play a bass drum sound, cymbal sound, etc. They got very good at the repetitive code. There were some one-off lines of code that I don’t think they ever did understand (a function definition, for example).

It was interesting to watch as they learned how to make the computer do what they wanted it to do. I was a little worried a few weeks before the final presentation because the kids weren’t able to explain how to make the program play a new sound. However, when I asked them to code it they knew exactly how to do it. It turns out they just didn’t know the right jargon to explain what they were doing. By the end of the semester, they could make simple modifications to the program to change the way it behaved, or to fix bugs in the code.

Would I do it again?

Will I teach another semester? Yes, I think so. Although it turned out to be a pretty big time commitment this time, I should be able to reuse my lesson plans the next time around so it should be much easier. Like I said at the beginning, it is a really good way to use software engineering skills to help the community and it was really cool to see the students figuring out how to modify their programs on their own. I think that’s reason enough to do it again.