Two courses seem to strike fear in my students’ hearts. One of them is algorithms. I hear about this dingdang class every quarter.
So I decided to try it myself. I’m like an adventurer who gets FOMO when people talk about a dragon I haven’t fought. I hope to find ways to help students better internalize the material. I also hope to learn how to replicate the core functionality of my favorite programming languages.
To do this, I chose a lecture series from MIT Open CourseWare. I watched about twenty algorithms lectures and pored over a book on the subject. By that point I realized that I’d find the material easier if I started with a prerequisite. The prerequisite: discrete math. This is the other class that seems to strike fear in my students’ hearts.
I loved math in school. Then I got a disappointing score on my AP Calc exam. That score, I’m now embarrassed to admit, subdued my spirit for math. My remaining enthusiasm met its gruesome end a few months later from the prodigy at the podium of my Math 104 class in college. This dude arrived wholly unprepared for the possibility that anyone would need clarification of anything he said beyond “It’s seriously trivial.” (He is, by himself, much of the reason that I believe prodigies are inherently unqualified to teach introductory courses). I did not have the tools at the time to help myself overcome my perceived lack of talent.
Nowadays I have more of those tools, but I find myself slowing down like a four wheeler through mud anytime a paper breaks out mathematical notation. I currently can’t read this notation as smoothly as I read English, Spanish, or Arabic. For each of those languages, someone explicitly spent time teaching me what the written symbols meant. By contrast, for mathematical notation (and also for musical notation, by the way), my teachers have begrudgingly sped through an improvised explanation of the symbology on their way toward whatever shiny thing they really wanted to talk about.1
I also have personal experience with failing to understand something, then going back and studying something else, and later returning to the original topic and watching it “click”—immediately followed by “why didn’t I understand that the first time?” Although I believe that this click can, in the absence of an awareness of it, disqualify a person from teaching the subject, it might be necessary (in the presence of awareness of course) to teach the subject really well.
I’ll document both my re-introduction to algorithms and my re-introduction to math for computer science. But before I do that, I’ll use them as examples to talk about learning from academic materials online.
Why did I pause my algorithms study in favor of discrete math?
This gets into a topic we’ll discuss later in this piece: what to do if you don’t understand a lecture. In my case, I had reached an algorithms lecture that discussed recurrences, and I could make neither heads nor tails of the instructor’s explanations. So I went to Google to find another explanation. Tom Leighton popped up, and his two lectures on the topic (14 and 15) made more sense to me than the other ones.
A skim of the lecture titles further convinced me: How to do proofs? Sums and asymptotics? They echoed concepts that Charles Leiserson identified as prerequisites to his algorithms lectures. I had been looking these up ad-hoc as he mentioned them, but Dr. Leighton lectures well enough that committing to his videos seemed like a better bet than the ad-hoc method.
Dr. Leighton stops to point out notation as he lectures, but I still wanted to do some independent review. For this, I chose a thin book called Introduction to Mathematical Thinking by Keith Devlin.
I took a portion of Dr .Devlin’s Coursera course years ago before dropping out, and I remembered being impressed. His book is only 90 pages, with large print and large margins. I figured I could get through that faster than my enthusiasm for Dr. Leighton’s videos would run out.
Dr. Devlin’s book took me about three evenings to finish. I read the material and then chose an exercise or two from each section according to what I thought sounded interesting, and I also stopped to do the ones where he makes a federal case about “STOP AND DO THIS OR YOU WILL REGRET IT” (there are maybe four of these in the whole book).
That investment paid off immediately when I watched the first of Dr. Leighton’s lectures, in part because I now understood the notation, and in part because many of the exemplary problems he mentions are also examples in the book (in particular, the unproven conjecture that any even number is the sum of two primes). I know that, at this point, Hillel Wayne would ask me whether those examples are good examples or are just canonical ones. I don’t know yet, Hillel, but I’d like to come back to this question later.
What I’ve noticed while watching lectures on YouTube
For any given lecture on YouTube, particularly in undergraduate and graduate-level STEM classes, I notice two types of comments:
- “This lecture is amazing and I wish I had had this professor in school”
- “Is this professor speaking an alien language, or am I just too stupid for this video?”
It suuuuper doesn’t help the reputation of STEM education that plenty of teachers are perfectly happy to be like “Yep, the answer is you’re too stupid”:
They include me in that “too stupid” designation, by the way:
Contrary to fringe (I hope) beliefs in the instructor community, “the students are too stupid” is never the reason that I have seen a lecture on YouTube not work.
Students sometimes riposte that, in fact, instructors aren’t trying. This is also never the reason that I have seen a lecture on YouTube not work. Sure, maybe some instructors don’t prepare for lecture or care about their students, but those aren’t the instructors getting their lectures onto YouTube. Just to bother with the YouTube step demonstrates some level of concern for making education more accessible.
However, I have noticed two other reasons that a YouTube lecture might not work. I want to address them so that, when you see a lecture on YouTube and you don’t get it:
- You don’t blame yourself,
- You don’t (unduly) blame the instructor, and most importantly
- You know how to solve the disconnect so you can understand the material.
So these are the two things I’ve noticed that make a lecture by a caring, prepared instructor unintelligible to an audience:
- Timing issues.
- Scaling issues.
I’ll address these in turn. Let’s start with timing because that one is a lot faster to address.
Issue #1: Running out of time
It’s not uncommon for an instructor to start out on the right foot, do fine for 80% of the lecture, and then run out of time and rush the ending in a way that crashes the entire knowledge transfer.
Seriously. Four times I have watched the SAME instructor teach the SAME material in different years—one year where each session was 50 minutes and one where each session was 80 minutes. In all four cases, the two versions were ALMOST identical for the first 35-40 minutes. After that, in the 50 minute version, the shit hits the absolute fan. In the 80 minute version, by contrast, the instructor confidently and capably finishes the proof or whatever. The order of the years has not mattered.
This is not always the instructors’ fault. Sometimes they’re handed a syllabus and told “You have to teach this material in this lecture. The homework covers it so you can’t push anything.” This isn’t the lecturer being bad at their job. This is academia expecting too much.
My heuristic for whether this is going to happen has become “how often is the instructor checking their watch.” I’ve noticed, anecdotally, that instructors who check their watch several times BEFORE the 30 minute mark aren’t generally having this happen to them.
In any case, if it does happen, go back to YouTube and look for a similar lecture with a longer runtime. It can be the same institution, the same class in a different year, and even the same instructor. It’s the time domain that matters here.
Now let’s talk about the other thing: scaling.
Issue #2: Scaling
A lecture might not work because it is not the appropriate scaling for the audience. What is scaling? I’m borrowing the word from, of all places, fitness instruction. Fitness instruction (well, GOOD fitness instruction anyway) does not target a specific movement or weight. Instead, it targets a specific STIMULUS. The appropriate scaling for a given athlete is the one where they achieve the desired stimulus.
For example, the target stimulus of a push up is to develop upper body pushing strength. If an athlete cannot yet perform a push up, no amount of trying to do a normal push up will get them one—nor will it get them much upper body pushing strength. So the instructor might have them do the push up on their knees rather than their toes, so they can build their upper body pushing strength rather than struggling around on the floor trying to do something they can’t do, to very minimal productive muscle stimulus effect. Working on sets of push ups from the knees will develop the strength faster to do a push up from the toes than floor-flailing while trying to do a push up from the toes.
One of my most memorable introductions to scaling happened, in fact, at a programming unconference called Ruby DCamp. That event starts with pair programming speed dating. For 6 consecutive 45 min sessions, you write Conway’s Game of Life with test driven development. To make things interesting, each session has unique restrictions on how you write the game.
It was my first year as a programmer; I had a lot of enthusiasm, but that was about it. For session 4, I got paired up with this Santa Clausy character and we were told to be “adversarial.” “Adversarial” test-driven development is when one pair writes a test specifying some system behavior, and the other person tries to write code that makes the test pass while specifically NOT doing what the system is supposed to do.
Santa Claus immediately assigned me the role of test writer and asked me “Is it okay with you if we try this rule with something simpler than Conway’s Game of Life?” I had already failed to write that damn game 3 times by then, so I was stoked about this development. Santa Claus then proceeded to have me write a method checking that two inputs (a dividend and a divisor), when divided, produced the appropriate quotient and remainder. I did what you’d expect: I wrote a method that checked that quotient * divisor + remainder == dividend.
SO THEN THIS JERK calls my method with, like, 40, 9, 5, and -5.
9 * 5 is 45, which, with 5 subtracted, produces 40 (yes, dear readers—it DID turn out that he was a cryptographer).
His inputs passed my test…and were CLEARLY NOT what I expected as input. From that session, I got a better understanding of adversarial testing because my pair chose a problem that was SCALED appropriately to my experience level. If we had done Game of Life I’d have been hopelessly lost and counting down the minutes for the session to end.
Back to lectures. When the instructor cares and prepares and nails the timing and the lecture still “doesn’t work,” it’s often a scaling mismatch. Either I don’t have the prerequisites to understand the material and so the lecture is too dense for me, or it’s too basic.
Easy solution, right? “The instructor should have scaled down the lecture to somebody with less prerequisite knowledge.” The thing is, you can’t get very far at all if you always assume everyone walking into your class has zero background. It also wouldn’t make sense to do that if the students really are supposed to have taken certain prerequisite courses to be there. To always assume students know nothing is, ultimately, to patronize to them and fail to make their effort worthwhile to attend a multi-year degree program.
And that’s the part I want YouTube lecture watchers to understand. The students in that classroom are not necessarily smarter than you. Instead, though the instructors don’t always mention this, it’s likely that they have taken prerequisite courses that make some of this information not as new to them as it is to you. And, with that prerequisite knowledge, you, too, would find this lecture easier to digest.
So, if this happens:
- Go to the course page (find this by checking the video description for a link or googling the name of the institution plus the name of the course).
- Look for a mention of any prerequisite courses.
- Google the name of the prerequisite course. Often there is a video lecture series available for that, either from the same institution or a different institution.
- Find a lecture in that list whose title addresses the first thing you struggled with in the original lecture.
- Watch that video and then come back to the original one.
Sometimes, other viewers provide a shortcut to this step by commenting under the original video “if you are struggling with this material, go watch [link to video] first.” This kind of thing is why I say that strangers on the internet have saved me at least as many gray hairs as they have caused me.
On that note, if you end up doing steps 1-5 above and it works, I recommend leaving a comment under the video with the link to the prerequisite lecture you watched, to save others the gray hairs.
The Point: All is not lost if you come across a lecture you don’t understand.
You’re not too stupid to get it. But the teacher also isn’t out to get you (at least, not if you found the lecture on YouTube). And there are steps you can take to fix it!
I’ll do a follow-up post where I map out exactly which lectures I watched in which order, including prerequisite ones. So look out for that in the coming weeks. In the meantime, this post is getting quite long :).
- Now you understand why I pursue pedagogical effectiveness with such ferocity. It’s personal. I believe several of my college instructors and mentors failed me, not just by teaching poorly, but also by habitually blaming the consequences of their poor teaching on students’ intellect. This is one of the reasons I rarely talk about my alma mater. It’s also probably the reason I took such umbrage at that unsuspecting Twitter reply guy who, in retrospect, I realize cannot possibly have known what he was stepping in.
If you liked this piece, you might also like:
The rest of the teaching category (I talk quite a bit about teaching in a CS program)
The debugging posts (a toolkit to help you respond to problems in software)
Exploring Numpy Vectorization (tracing through code is another technique I use to level up!)