How to be a great (CS) teacher

Earlier this year, some of the organizers of the ICSE 2017 conference (a premier software engineering research conferences) asked me to speak at the New Faculty Symposium, where newly hired tenure-track faculty receive mentorship and wisdom from more senior faculty like myself. It’s a great event and something all academic communities should do.

They asked me to talk about teaching, and specifically, how to be a great teacher. Now, I think I’m a good teacher, but I don’t know if I’m great. They probably asked because of some of my earlierwritings on teaching, and finding anyone in higher education that cares enough to write about teaching would at least be motivated to come talk about it.

But I digress. What a wonderful opportunity to create content that might improve instruction in college computer science classes! And to share that content in a (rare) learning setting in which new faculty are motivated to learn about learning! I said yes immediately.

To prepare, I framed a talk around deliberate practice, which is widely considered to be the best account of how people acquire expertise. It’s grounded both in a large body of empirical evidence and a strong theoretical framing of the cognitive and social processes underlying learning. The talk goes through each element of deliberate practice, gives advice on how to implement it in classrooms, and then discusses some of the challenges of doing it in higher education institutions.

If students are failing a CS class, it’s because of one or more of the following: 1) they didn’t have the prior knowledge you expected them to have, 2) they aren’t sufficiently motivated by you or themselves, 3) your class lacks sufficient practice to help them learn what you’re teaching. Corollary: just because they’re passing your class doesn’t mean you’re doing a great job teaching: they may already know everything you’re teaching, they may be incredibly motivated, they may be finding other ways to practice you aren’t aware of, or they may be cheating.

Motivation. You have to believe students can learn and students have to believe they can learn. Students also have to see relevance of the content to their interests, goals, and identity. If they don’t believe they can learn or don’t see relevance, they won’t be motivated, and therefore won’t learn.

Tasks have to build on individual’s prior knowledge, which means you must know their prior knowledge somehow, design tasks that accommodate different levels of prior knowledge, and ensure the tasks students choose align with their prior knowledge, scaffolding the parts they haven’t learned yet.

Feedback should immediate and should explain an individual’s mistakes, helping students incrementally master the knowledge. Summative feedback like exams is delayed (making it less useful for mastery) and discouraging (because the only feedback it provides is that the student has failed to achieve perfection).

Repetition. Find ways of allowing students to practice everything more than once until they get it right.

I then go on to explain the numerous reasons why this is hard in higher education:

It is hard to scale personalized feedback.

It is hard to know every students’ interests, goals, and identities.

It is hard to design for widely varying prior knowledge.

Required courses will always contain some students that do not want to learn what you’re teaching.

Quarters and semesters constrain the amount of time students have to master knowledge.

Students obsess over grades instead of learning because our institutions use grades for access to important resources (financial aid, admissions, etc.). This would be fine if grades accurately measured learning, but they generally don’t.

Tenure-track faculty are expected to prioritize research over teaching, disincentivizing improvements in teaching.

Its hard to know when students aren’t learning because it’s hard to measure learning.

When students don’t learn, faculty still keep their jobs, partly because it’s hard to know when students aren’t learning, but also because learning through research is valued more than learning through teaching.

Students take multiple courses, have jobs, and have lives, all of which might take their attention or motivation away from learning.

Of course, not all is lost. One way around these challenges is to leverage all of the hard work others have done to solve the problems above, by reading research in computing education or adapting successful course designs. Better yet, some active learning methods that promote deliberate practice actually take less time to prepare and maintain than conventional lectures and exams, meaning faculty can save time while improving learning. All of these strategies are about teaching smarter not harder by leveraging what we know about learning (science is useful, who knew!).

I won’t pretend to be an expert on learning science. But I am a well-read fan of the field, and increasingly versed in its application to teaching computer science. And what I’ve learned in both my research and my practice is that by simply being reflective on teaching and using some of the foundational research discoveries on learning, it’s not that hard to be a good, if not great teacher.

And there’s good reason to be, even if one’s first priority is research: educating people, unlike research, is a guaranteed way to have significant impact on the world. After all, our students are the ones envisioning, building, and maintaining the world, and they’re doing it using our ideas. What better way to change the world than to optimally train an army of minions with our best ideas?

This is the blog for the Code & Cognition lab, directed by professor Andy Ko, Ph.D. at the University of Washington. Here we reflect on what software is, what effects it's having on the world, and our role as public intellectuals in help civilization make sense of code.