The Alan J. Perlis SCS Student Teaching Award
School of Computer Science, Carnegie Mellon University
Pittsburgh PA 15213-3891
(412)268-8525 . (412)268-5576 (fax)


Jonah C. Sherman, 2008

When I initially came to CMU, I planned to focus on Operating Systems. I spent most of my high-school years programming games, and slowly began teaching myself about systems, eventually reading the Linux kernel mailing list regularly. I didn't know anything about abstract mathematics, or even what "theoretical computer science" was.

Like all new incoming freshman, I had been told by upper-classmen about a course I would have to take my second semester: 15-251: Great Theoretical Ideas in Computer Science. I was warned during orientation that it would be useless, hard, take up all my time, ruin my grades, and just generally be miserable. Prepared for the worst, I took the course my second semester here. I was surprised to find my experience was very different from what I was expecting. The homeworks were indeed hard, but they didn't feel hard, because I liked doing them – each problem I solved made me feel smarter. The CS presented in 251 was very different from anything I learned in high-school. I was amazed to see how changes in representation could lead to very different ways of looking at things, and how abstracting away details could leave one with simple and elegant primitives. I was particularly amazed at the almost paradoxical idea of proving that computer's can't solve certain problems. By the middle of the semester, I decided to shift my focus to theory.

After four years as a CS undergrad, I've developed a few strategies that I've found very helpful for learning. Some are the obvious ones: take clear notes, read any relevant course materials, etc. However, for me, that is never enough. I remember I once tried to teach myself a new programming language (Python). I read through an entire book, cover to cover, and didn't bother to type in or try any of the examples in the book. After I finished the book, I tried to start writing code - and realized I couldn't even write hello world! I re-read the book a second time, doing all the examples, and by then I could actually program.

That experience made me realize that homeworks/ projects are by far the most important part of learning. Here are some of the strategies I've developed for doing homework/projects efficiently:

1. Start early. Read through the homework as soon as it's out and try to at least understand the questions; don't worry about immediately finding the solutions. By reading them early, you can think about them whenever you have a few minutes of free time. I found that spending ten minutes every day thinking about the problem was far more productive than sitting down and banging my head over it for hours straight. I thought of most of my solutions to homework problems while waiting for buses, walking to class, etc.

2. When you do find the solution, stop immediately and try to retrace your path as to how you got there. Imagine you could go back in time and give yourself a hint. What would you say? Often, such hints are useful for other, unrelated problems. Try to rewind to the precise moment where you had the Aha!, and determine what led you to it.

3. Don't stop once you've come up with a solution. Try to come up with a better one. Keep trying to improve your solution until you're convinced it's as simple and clear as possible. This is probably the most important trick to getting good at solving problems.

4. Practice. The easiest way to do this is, after you've done all of the above, change the problem slightly. See if you can solve the changed version. Practice is key to being able to think quickly. There seems to be a tendency, particularly for the more theoretical topics, to equate the ability to solve problems quickly with intelligence. I don't think that is true at all. I remember when I took 251 as a freshman, the problems took quite a while for me to solve. Now, the same types of problems are relatively easy. I don't think I became smarter in three years–I think I just got a lot of practice.

In my junior year, I decided to try teaching. I think that teaching has probably, more than anything else, helped me really learn the subjects. It's one thing to learn enough to pass an exam–it's quite another to develop an understanding of a subject deep enough to explain it clearly to others. The first and most important thing I would suggest to a new TA is practice, and don't give up. I remember the first time I was a TA for 21-127: Concepts of Math, the students did early evaluations about four weeks into the course. Mine were terrible. All of them said the same things–I spoke too softly and unclearly, my handwriting was hard to read, I went over things too fast, and I wasn't good at explaining hard-to-grasp things. It was very depressing to read those comments. I showed them to the professor, and said "maybe I'm just not a good teacher; maybe this isn't for me". He told me to go back and try again, and not to give up. Before the next recitation, I practiced speaking louder, practiced writing on the board, and tried to come up with alternative explanations for each thing I would present. I figured I would give it one more chance. The next recitation, I put every last effort into doing as well as I could. A few hours later, I got e-mails from three students saying "wow, recitation today was amazing!". I felt a lot better, and tried to keep it up. A few weeks later I gave out evaluations again. This time, they were great. I think that teaching, even more so than learning, requires a lot of practice. So, if you decide to TA, and your first evals are bad, don't give up–they are probably better than my first ones! Just try again, and try harder. Some other advice I would give to TAs:

1. Prepare. Know the material you're going to present very well. Ideally, you should know more about it than is taught in the class. While preparing, try to think of multiple ways to explain things. A key part of preparing is try to anticipate any questions that might get asked. This can be hard at first, but after teaching for a bit, you'll be able to guess exactly what questions you're going to be asked before the recitation.

2. Try to make the HW fun. This can be hard, but it can't hurt to try. In 251, we typically embed the problems in humorous scenarios, rather than just asking cut-and-dry math questions. The scenarios are usually more funny out of pure ridiculousness rather than actually being funny, but that doesn't matter–it makes the problems seem less serious and intimidating.

3. Try to give hints to students without giving away the answers. Think about the general hints you've learned to tell yourself when solving problems, and pass them on to students. Try to explain alternate representations or ways of looking at problems.

4. Think about the best professors you've had, and try to emulate their teaching style. Try to think about what made them so great, and what made it so easy to learn from them. It can be a bit easier to do this while you're actually in a class – try to simultaneously learn what the professor is teaching and take note of how they are teaching it. At CMU, I've had many great professors, so I've had many opportunities to do this.

Looking back over my time at CMU, I think the accomplishments I am most proud of came from my teaching. The feedback I got from my students means far more to me than any grade I received. I am very happy I had the chance to share the knowledge I've acquired and am so passionate about with others.

Return to: SCS Student Awards