Spring 2021 Reflections

So it’s official: I’m halfway done with my undergraduate career! (And I’m still no closer to deciding what I want to do afterward…) Anyway, here’s the traditional course reflection post.

I took fewer courses this semester, although most of them were nontrivial. Like many people, taking courses over Zoom has left me fairly unmotivated, so piling on the academic load seemed like a bad idea. My sleep schedule did become truly atrocious at one point during the semester; I always think that it can’t possibly get any worse, but it tends to surprise me. Socially, I’ve also been on the more cautious side—perhaps too much so—with respect to the pandemic. A bright spot was that I’ve gotten to go on many more cycling trips than I probably would have been able to do in a regular semester, although I’ll focus this post on the academics.

15-354 (Computational Discrete Math)

This was a pretty cool class. It is admittedly somewhat niche—at one point, we were down to four or five students in lecture. The difficulty of the homework did not stand out as particularly nightmarish, and oddly enough some of the “easier” parts of our problem sets had also been given as problems in 15-251.1 The course description mentions using computational environments, but you can probably get by without them. I do recall that there were a few problems where a Mathematica or Standard ML program came in handy, and I wrote a Haskell program for my final project.

What I thought was nice about this class is that it takes a lot of topics that you’ve already seen (I think this was the fourth pure theoretical CS class I’ve taken, and you have to at least take 15-251 as a prerequisite) and manages to still teach you new and interesting things about them. Some good examples are the algebraic structure of regular languages and a deeper dive into computability (e.g. primitive recursion).

Klaus is also a great professor. He has lots of opinions on mathematical topics, which are often insightful (or at least fun). The course also reflects his firm belief in the usefulness of abstract algebra in tackling problems in the computational universe.2 It is true that lectures can be quite dense: typically anywhere from 50 to 90 slides, and we’re talking slides full of math, with no animations pushing up the page count. However, I don’t think that this is entirely a bad thing.

This is also a pretty good class to take if you’re interested in more theoretical-leaning CS research, partially because of the final project. In fact, the potential projects list includes a few open problems, if you fancy trying your luck at them. Just…don’t be me and do most of the project the weekend before it’s due.

15-259 (Probability and Computing)

I feel like I really learned a lot from PnC, and it has finally dispelled my fear of probability. Its combination of rigor and breadth means that it definitely deserves its reputation for being the best of the probability options in the CS curriculum. That being said, it’s probably a little over-hyped; it’s not the end of the world if you decide not to take it.

There were a couple of things that I didn’t really agree with:

One thing that I appreciated was the extraordinarily prompt grading. In general, the course infrastructure seemed very smooth and well-run, which was really impressive considering the remote semester. On that note, this is a class famed for its lectures, so my experience taking it remotely might not be the best one.

I probably should have sought out other people to do homework with, but I ended up just going solo. I don’t think that the class is hard enough that you actually need to collaborate to do well, but it would probably have made it a little more enjoyable. Also, apparently Mor is extremely generous with her help at office hours, although I always started the homework much too late for that.

As other people have said, it may be a good idea to make sure you’re comfortable with taking double integrals, doing integration by parts, etc. before taking PnC. Otherwise, you will find yourself losing many points everywhere.

Finally, for reasons unrelated to the course itself, I do have to admit that I started caring less and less about it toward the end of the semester. (This applies to academics in general, but PnC seems to have suffered the worst of it.) For instance, I started doing homework literally hours before it was due, and my exam averages show a pretty sharp downward trend. I think this is probably due to Zoom fatigue; the class itself wasn’t too bad.

15-210 (Parallel and Sequential Data Structures and Algorithms)

I think 15-210 is sometimes treated a bit unfairly. Yes, it’s most certainly the least interesting of the core intermediate-level classes in the CS curriculum, but that’s only because it’s up against 15-213 and 15-251, which are arguably two of the best mid-level CS classes offered at any university, anywhere.3 And in all fairness, I have heard that 15-251 made some interesting changes the past two semesters due to online learning, so maybe it isn’t very fun during the pandemic either.

I did have a lot of gripes about the online exams; Diderot was ridiculously slow on my end, and there was an enormous lag between typing text into the answer box and seeing it show up. This didn’t affect my performance very much, since most answers are pretty short, but it made the experience really bad. Luckily, the pandemic is subsiding and classes will be offered in-person again next semester, so any future students probably won’t have to suffer with online exams.

Like other people have said, I think the “parallel” part of this course is a little overstated; it mostly just means analyzing the span as well as the work of all the algorithms. But although it felt like the least informative intermediate-level CS core class, I must say that as someone with little competitive programming experience, I did learn a trick or two, and the seam carving lab was really awesome.

I’m also not ashamed to admit that I used the 15-210 Standard ML library to run computations for several CDM homework problems, though the TA did take off some points for solving those problems using “brute force,” which is fair.

Of course, at the end of the day, we all know that 15-210 isn’t a real CS core class4

73-102 (Principles of Microeconomics)

I guess I can’t bad-mouth this class too much, since my friend is a TA, but for the most part it wasn’t that interesting; I mostly took it as a general education requirement. I actually thought that some of the stuff we covered toward the end of the semester was kind of cool, like basic game theory and the “market for lemons”; I wish we had spent more time talking about them.

I’ve actually never had any sort of economics experience before, so I’m glad that I was at least able to get some exposure to it. As a funny story: my attendance was so atrocious that I didn’t even realize that we had recitations until we were almost done with the course!

15-150 (Principles of Functional Programming, as a TA)

This was very different from my TA experience in the math department last semester. The course staff for 15-150 is much larger (30+ strong), so it has a different feel to it. On the other hand, the smaller course staff for 21-241 meant that each individual TA had a lot of flexibility in how office hours and recitations were run. I did like the sense of organization in 15-150, and the ability to do content development was neat. Neither style really stands out as “better”; they’re just two different ways to run a course.

I did find the constant Slack threads for people’s birthdays somewhat annoying, but I guess it was nice to foster some sort of camaraderie, given that everything was online.

In terms of the course itself, I’m still not a huge fan of the humor in the homework writeups (I was one of the “flavor text-allergic” students), but I can appreciate some of it more now, with a longer-term view of the course and its contents. I will admit that our grading is pretty pedantic, but I’ve also come to understand that you sort of have to be pedantic in a large introductory-level course; we get a lot of less-than-correct proofs. Also, having learned a little more about some of the topics in more advanced classes, I’m more receptive of the way they’re introduced in 15-150.

At the end of the day, it sounds cheesy, but by far the best parts of being a TA are:

  1. Being able to help students. You’ll obviously get negative student reviews no matter what you do, but I recall one particularly nice review really making my day.
  2. Being able to meet and learn from other TAs. The course staff is really awesome, and many of them are deeply versed in arcane areas like type theory and category theory that I’ve barely touched.

It is a little sad that I didn’t get to realize the other best part of being a TA, the privileged access to conference rooms in Gates, due to the pandemic.

Looking Ahead

Registration is really late this semester, since the university wanted to wait for more clarity on what the COVID situation would be in the fall, so I actually haven’t registered for classes yet. I want to take a bit of a lighter semester to ease back in to in-person learning (and in particular, actually attending class). I have some thoughts on what I’d like to take, but there are some schedule conflicts, so we’ll see how it works out.

Also, of course Gary Miller has to retire this semester, right before I wanted to take his spectral graph theory class.


  1. Perhaps this is not too surprising, given that Klaus occasionally teaches 15-251 as well.

  2. It’s worth noting that you don’t need any particular background in algebra to take the course. I had never taken an algebra course beyond introductory linear algebra, although I did have to spend some time “meditating” on some of the slides before they made sense.

  3. For instance, many other universities base their systems courses off of CMU’s 15-213.

  4. Chuang, G. and Wu, B. “What Lothar Collatz Thinks of the CMU Computer Science Curriculum”, SIGBOVIK 2021, 282-284.