Spring 2020 Reflections

Well, I guess I’m officially no longer a freshman! Similar to my previous reflection post, I figured I should probably write some sort of reflection/course review about this semester. Actually, it will be less of a reflection and more of a course review, since I’m not too certain about putting up personal thoughts on a public blog.

Actually, I imagine that this will be even more useless that my first course review, since maybe my advice will be helpful to an incoming freshman. However, I doubt that anyone beyond a first-semester freshman will find anything I have to say very helpful at all.


This semester (spring 2020), my schedule ended up consisting of

I also started out taking 07-180 (Concepts in Artificial Intelligence), but I ended up dropping it. I also initially sat in on a few 16-865 (Space Robotics) lectures but also gave up on that.

15-251 (Great Ideas in Theoretical Computer Science)

To say that I loved this course would be an understatement. This is probably my favorite class that I have taken at CMU so far. The course content was extremely interesting, the structure was really well thought-out, and the staff were so incredible.

Content-wise, we covered a good deal of the basics of theoretical computer science—I guess the vocabulary that one would need to pursue more advanced courses in individual subjects. Roughly speaking, we started out with languages/encodings, talked about regular languages/DFAs, and then arrived at Turing machines/reductions. We touched upon some graph theory and talked about basic complexity classes, approximation algorithms, and randomized algorithms. Finally, we went into a bit of Markov chains, cryptography, and a smattering of miscellaneous topics (like communication complexity) in some one-off lectures at the end of the semester. If that doesn’t sound very interesting to you, that’s rather unfortunate, because 15-251 is a required course here. (And maybe the excellent teaching in 15-251 will change your mind!)

The course structure was pretty interesting. In general, I got the impression that everything was really structured in an attempt to aid student learning, although this led to some unusual course policies. For example, homeworks would not be written up and turned in; instead, we had “writing sessions” every Wednesday night where we would, on the spot, write up solutions to a randomly chosen subset of the problems. The problems themselves were also interesting; every week, there’d be some easier solo problems on this week’s material along with some harder group problems on last week’s material. These group problems would be solved in teams of four; some of my fondest (and most frustrating) memories from 15-251 involve late Tuesday nights in Gates with my group frantically trying to figure these problems out.

For the course staff, I cannot emphasize enough how awesome a lecturer Professor Ada is. Something that I vaguely regret about taking this course was not showing up to his office hours; even though I didn’t really have a question, it would be really cool just to talk to him. I also want to recognize how well he and the rest of the course staff handled the transition to remote learning—they communicated very transparently through the Diderot course forum, and it was clear that they were trying to do what would be best for the students.

15-252 (More Great Ideas in Theoretical Computer Science)

This was an optional supplement to 15-251 containing some more theory. I thought that the course was well-aligned with the main 15-251 course, and we often got to extend the results from 15-251 in interesting ways. For example, when we studied DFAs in 15-251, we studied NFAs in 15-252. I haven’t been around at CMU long enough to confirm this directly, but I’ve seen people on Reddit say that 15-251 isn’t quite as fearsome as it once was; some of the more in-depth material apparently got separated out into the 15-252 course. I’m not sure how true this is—and given the coronavirus situation, my 15-251 experience was hardly typical—but I felt that the two courses paired quite well together.

I will say that 15-252 caused me quite a bit of grief at some points during the semester. Personally, I felt that the homework assignments peaked in difficulty early on before becoming much more reasonable later on. I’d say that the advertised 5 units is very much an average; there were times when I spent less than this, and there were times I spent much more. I remember one problem from an earlier homework that I probably spent at least ten hours on. (I did not end up solving it.) On the other hand, there were quite a few homework problems that were fairly straightforward.

Parts of the reason for those extremes was my approach to the course; it’s designed as a pass/fail course to make it stress-free, but my high school experience has trained me so well to maximize grades that it’s difficult for me to break out of that mentality, so I often don’t know when to give up. Also, there is the option to do the homeworks with a partner, but I never sought out this option.

If you’re interested in theory, this is not a bad course to take, but please don’t take the approach that I did. Grades-wise I ended up doing very well (not that it matters in a pass/fail course), but I think my obsessive, solo focus on the homework problems definitely distracted me from being able to just sit back and enjoy cool topics in theoretical computer science.

21-268 (Multidimensional Calculus)

Ah, where do I begin with 21-268? This course was by far the greatest source of stress for me this semester, but I also really liked Professor Iyer and learned a ton. CMU actually has several different vector calculus courses; the three that will satisfy the CS major requirement are:

I’m glad that I got this kind of serious introduction to classical analysis-type math, since computer science leans more on discrete math. The course was certainly a struggle, but it’s definitely made me much stronger.

The nice thing about a place like CMU is that unless you’re literally an IMO medalist or Putnam winner, there will come a point during your four years here when you realize that you’re not the best. I don’t want to turn this into a self-help blog, but this moment can teach you a lot about not putting your self-worth in academics. Personally, taking 21-268 this semester was (one such) moment. The course had a lot of ups (getting my homework posted as a reference solution) and downs (doing not-so-well on my first midterm). Not that grades are the most important thing, but I think all the late nights I stayed up doing problem sets and the disappointment of early exams made doing well on the final exam that much sweeter of a conclusion to the semester.

15-150 (Principles of Functional Programming)

This was more or less your standard introductory programming class, this time focused on functional programming with hints of type theory thrown in. Academically it’s a fairly light course; the exams were always extremely reasonable, and homeworks were your standard “put X hours into this and you’ll get results” (i.e. not too much “deep thinking” involved). I guess the subject matter was pretty interesting, but for some reason I wasn’t terribly into the course staff’s sense of humor. (Homework writeups were always written with this annoyingly intentionally bad/self-aware humor, at least in my opinion.) I also thought that the proofs were kind of pedantic/formulaic, although I guess it was pretty good as introductory programming classes go.

Overall, this was not a bad class for what it was, but it wasn’t quite as interesting as, say, 15-251 or 15-151.

80-180 (Nature of Language)

This is not a programming language theory class (for that, maybe try 15-312); it’s an introductory linguistics class. I will admit that I sometimes “look down” on my non-technical classes for feeling less interesting and less rigorous (not that this is a good attitude to have). Linguistics is actually pretty interesting, but in all honestly I would often de-prioritize 80-180 next to my technical classes. (Maybe that’s to be expected, since those are core classes for my major, whereas this is a general education class.)

Anyway, in the beginning of the semester I actually quite enjoyed 80-180, but I definitely became much less engaged with the class once we moved to remote instruction following the novel coronavirus pandemic. Like it has for many other people, being remote has somewhat sapped my motivation to do work; for subjects that strongly interest me (e.g. 15-251) and/or require significant effort (e.g. 21-268), I was mostly able to keep focused. For classes like 80-180 (or honestly even 15-150) that didn’t require a lot of effort and weren’t as interesting (I mean that comparatively; linguistics is interesting, but not as interesting to me as theoretical computer science), I started to zone out toward the end of the semester.


Okay, I’m not going to put my deepest thoughts out onto the Internet for everyone to read (that’s what my personal journal is for, not this blog), but overall this was quite a different semester compared to fall 2019. Granted, the second half of the semester was highly disrupted by the personal changes wrought by the novel coronavirus (one positive one: I’ve been learning how to cook!), but even before that it was a pretty new experience. I guess part of it was personal (hanging out with different friends more due to different course overlap), but part of it was also that the courses were more challenging. I think it went okay, and I’m looking forward to what the next semester will bring.

Looking Ahead

There were times this semester when I definitely felt overwhelmed, so perhaps it would be wise to take a step back in terms of course load next semester. My current official schedule is

Honestly, 16-861 is a bit of a placeholder course; while the topic is extremely cool, my brief experience with the CMU MoonRanger project this semester wasn’t the most engaging. (I guess it’s just a little different from the “five guys in a basement” robotics projects that I remember so fondly from high school.) It wouldn’t be terrible to take it, but it sounds fairly time-consuming; I’m actually hoping to get off the waitlist and replace it with 11-411 (Natural Language Processing). I have high hopes for this, since I’m currently at spot #2 on the waitlist, and it’s a 70+ person class.

It’ll be a little weird not taking a formal math course, especially since my first two semesters were so dominated by math (15-151—which is the same as 21-128—for fall semester, and 21-268 for spring semester). Of course, complexity theory is a fairly math-y subject, so I won’t be missing out on too much. Actually, I was also recently offered the chance to be a TA for 21-241; I’m leaning toward accepting the offer, so maybe that will be more than enough math for a semester. Here’s to hoping that the COVID-19 situation settles down enough to hold classes on campus in the fall.