I want to write about teaching CS170 (Intro to CS Theory), but I don’t know how I feel about students reading my thoughts quiet yet, so maybe I’ll make these posts available later on. So that means that for now I can say anything. 🙂
EDIT (2016-07-10): Made the post public!
Here’s what I tried today.
Let the students know that I’m on their side
I introduced myself, told them that I was a ugrad not too long ago, almost went into industry but then got sucked back into school. I told them that this is my first time teaching at Berkeley, and I’ll try to infer how they learn best, but please tell me and give me feedback on how to help better.
Learn my audience
This is a continued lesson from my 6.UAT class on technical communication — always know who you are speaking to. My first class is about 1/2 sophomores and the rest is split among the other class years. My second section is split evenly among sophomores, juniors, and seniors. I asked if anyone is taking the class in preparation for more theory classes — there were no definitive hand raises in either of my sections. And about 60-70% of the students are interested in being more prepared for their technical interviews through this class.
Get them talking
At the same time that I was learning my audience, I took this as an opportunity to get them all participating from the very beginning. It’s fairly innocuous — all they had to do was raise their arm. And then I asked them some more easy questions: How did you like yesterday’s lecture? (That was the first lecture of the semester.) I got some nods. What did you learn? Some noted the history of the word “algorithm” (named after Al Khwarizmi) and some noted a new way to multiply numbers. Did you enjoy the streaming algorithm example? (Umesh started the lecture right off with a concrete streaming problem.) Students nodded and a student exclaimed that he was asked the exact question during an interview. Then, an amazing thing happened. Another student agreed. A student followed saying that he enjoyed the applications of algorithms in the first lecture. Another student agreed, several more nodded in unison. Now they are in deep, they’re already participating in full! 🙂
If this doesn’t sound amazing… well, it was to me. I have a stark memory of the first recitation I taught of 6.004 (“Computational Structures”) back in 2012. It was a blank wall of stares. Expressionless, voiceless. I vaguely recall taking weeks to get the students participating at the same level that my students already are here. Not only is it sort of scary, it’s also impossible to get feedback with a class that doesn’t respond.
Let the students learn themselves
One of the other instructors brought up that even though the students want you to lecture at them as much as possible, it’s really best for them to be doing problems. Doing problems is what prepares them for the homework. I tried this out, and the students really taught themselves. They defined BigO notation and gave every answer and every explanation (with small exceptions). And I learned from them too. (Though to be fair, this might not be the best gauge, since the material was review of prerequisite material.)
This was not my approach when teaching 6.004. Instead, I covered a small fraction of the problems piece by piece — sometimes actively participating with me on the board, sometimes in small groups — and I spend a good chunk of the recitation storytelling. I call it storytelling, but it was basically a more interactive lecture, because my goal was to tie the super high level and abstract concepts presented in lecture to the very concrete and nitty gritty problems we were doing in recitation. I felt that it was possible to succeed in 6.004 without making the tie, but in doing so, the students may lose out on a lifetime of understanding (ok, maybe an exaggeration). I tried my best to show why we are doing something, rather than how we are doing it. I forewent most of the “recommended” problems, hoping that if the students had some tangible understanding of the lecture material after I tied up some loose ends, then they would be more able and engaged in tackling the remaining problems.
I can already see some opportunity for augmenting the lectures with a bit more content in recitation. Only time will tell, but I suspect that the lectures will be fairly well tied to the problems. I believe the opportunity this time around is in taking the time to make precise some material from lecture, instilling mathematical understanding in a bite-sized way, and perhaps filling in the gaps where the lecture glosses over motivation. Reduce the hand-waving, tie some knots. Prepare these kids for definitely rocking those interviews. Perhaps inspire them to take more theoretical and mathematical courses.
Well, I’m still on the fence for now. These approaches aren’t necessarily conflicting, but there is a trade-off in preparation time.
Get the students comfortable..?
Too comfortable, perhaps? One of the students came up at the end and apologized for falling asleep and then asked a question. And then I learned that this is probably a tiring day for them all because it’s the day of the Spring career fair!
One thought on “Teaching Algorithms: Part 1”
“Let the students learn themselves” <3! I would also add to the list, purposefully leading the students to fail. I sometimes can anticipate misconceptions and give them a problem I know they will get wrong. Then I challenge to figure out where they went wrong and what the correct solution is. This way it's a lot more memorable than if I spoonfed them the correct answer and where their misunderstanding is.
This setup also normalizes failure to understand as a healthy part of the learning process and not something to be anxious or ashamed about 🙂 If you feel that there is enough mutual respect, you can also give them examples or pretend to fail (or really fail) as well in front of them :3