<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="pandoc" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  <meta name="dcterms.date" content="2024-12-13" />
  <title>Reflections of a CS251 TA</title>
  <style>
    html {
      color: #1a1a1a;
      background-color: #fdfdfd;
    }
    body {
      margin: 0 auto;
      max-width: 36em;
      padding-left: 50px;
      padding-right: 50px;
      padding-top: 50px;
      padding-bottom: 50px;
      hyphens: auto;
      overflow-wrap: break-word;
      text-rendering: optimizeLegibility;
      font-kerning: normal;
    }
    @media (max-width: 600px) {
      body {
        font-size: 0.9em;
        padding: 12px;
      }
      h1 {
        font-size: 1.8em;
      }
    }
    @media print {
      html {
        background-color: white;
      }
      body {
        background-color: transparent;
        color: black;
        font-size: 12pt;
      }
      p, h2, h3 {
        orphans: 3;
        widows: 3;
      }
      h2, h3, h4 {
        page-break-after: avoid;
      }
    }
    p {
      margin: 1em 0;
    }
    a {
      color: #1a1a1a;
    }
    a:visited {
      color: #1a1a1a;
    }
    img {
      max-width: 100%;
    }
    svg {
      height: auto;
      max-width: 100%;
    }
    h1, h2, h3, h4, h5, h6 {
      margin-top: 1.4em;
    }
    h5, h6 {
      font-size: 1em;
      font-style: italic;
    }
    h6 {
      font-weight: normal;
    }
    ol, ul {
      padding-left: 1.7em;
      margin-top: 1em;
    }
    li > ol, li > ul {
      margin-top: 0;
    }
    blockquote {
      margin: 1em 0 1em 1.7em;
      padding-left: 1em;
      border-left: 2px solid #e6e6e6;
      color: #606060;
    }
    code {
      font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
      font-size: 85%;
      margin: 0;
      hyphens: manual;
    }
    pre {
      margin: 1em 0;
      overflow: auto;
    }
    pre code {
      padding: 0;
      overflow: visible;
      overflow-wrap: normal;
    }
    .sourceCode {
     background-color: transparent;
     overflow: visible;
    }
    hr {
      border: none;
      border-top: 1px solid #1a1a1a;
      height: 1px;
      margin: 1em 0;
    }
    table {
      margin: 1em 0;
      border-collapse: collapse;
      width: 100%;
      overflow-x: auto;
      display: block;
      font-variant-numeric: lining-nums tabular-nums;
    }
    table caption {
      margin-bottom: 0.75em;
    }
    tbody {
      margin-top: 0.5em;
      border-top: 1px solid #1a1a1a;
      border-bottom: 1px solid #1a1a1a;
    }
    th {
      border-top: 1px solid #1a1a1a;
      padding: 0.25em 0.5em 0.25em 0.5em;
    }
    td {
      padding: 0.125em 0.5em 0.25em 0.5em;
    }
    header {
      margin-bottom: 4em;
      text-align: center;
    }
    #TOC li {
      list-style: none;
    }
    #TOC ul {
      padding-left: 1.3em;
    }
    #TOC > ul {
      padding-left: 0;
    }
    #TOC a:not(:hover) {
      text-decoration: none;
    }
    code{white-space: pre-wrap;}
    span.smallcaps{font-variant: small-caps;}
    div.columns{display: flex; gap: min(4vw, 1.5em);}
    div.column{flex: auto; overflow-x: auto;}
    div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
    /* The extra [class] is a hack that increases specificity enough to
       override a similar rule in reveal.js */
    ul.task-list[class]{list-style: none;}
    ul.task-list li input[type="checkbox"] {
      font-size: inherit;
      width: 0.8em;
      margin: 0 0.8em 0.2em -1.6em;
      vertical-align: middle;
    }
  </style>
</head>
<body>
<header id="title-block-header">
<h1 class="title">Reflections of a CS251 TA</h1>
<p class="date">2024-12-13</p>
</header>
<p><em>For context, CS 251 is a course at Carnegie Mellon about
theoretical computer science. Topics covered include DFAs, Turing
Machines, undecidability, P-NP, Cook and Karp reductions, and a bunch
more miscellany. Though the content of the course did impact my teaching
and my experience, I will try to steer away from actually discussing
mathematics here: my main goal is to focus on the “soft skills” side of
teaching.</em></p>
<p>I want to start off by saying that I am so grateful for the
opportunity to work with such wonderful students, fellow TAs, and an
amazing professor. It may sound cliche (and it <em>is</em>), but TAing
CS251 has genuinely been such a life-changing experience. I have made so
many new friends through TAing and deepened some connections with some
old friends, and I’m really excited to see what the next semester has in
store.</p>
<h2 id="expectations-and-surprises">Expectations and surprises</h2>
<p>Of course, the main impetus for me to TA the course was work with
students. And there were a lot of surprises in store for me in this
regard. Having selected quite a busy schedule this semester, I frankly
wanted to minimize the number of hours I could put in while still doing
a good job for my students.</p>
<p>To establish some background, there are three difficulty levels of
recitation that students can self-select in. Cantor is the slowest
recitation, meant to reinforce the definitions and emphasize the process
needed to solve common genres of problems in the course. Godel is the
fastest, with a heavy focus on developing intuition for the kinds of
arguments made in the course rather than working through some of the
more boring details. And Turing is somewhere in-between. (These are just
my interpretations of the roles each level should play. But I strongly
believe this is the correct perspective, even if it is not universally
understood.)</p>
<p>Obviously I picked the fastest level. This was for several
reasons:</p>
<ol type="1">
<li>I thought that Godel students would be more prepared, meaning I
would not have to spend as much time helping them out with mentor
meetings and reviewing the fundamentals of the course.</li>
<li>I hate going through boring details and trivial verifications, it is
far more interesting to emphasize the core ideas than to formally write
out “This transformation is polynomial time because adding a constant
number of vertices is polynomial time” on the board for every problem.
This is the kind of thing I think would be really helpful to explicitly
write out for Cantor students, but I do not think it is interesting. I
personally would rather not teach this way, though I can if the need
arises.</li>
<li>There are a few people every semester who are really mathematically
mature and take the time to learn interesting results outside of the
course syllabus, such as Rice’s Theorem. I find talking with these
students to be a delight, and the vast majority (if not all) of them
sign up for Godel.</li>
</ol>
<p>Having taught a semester, I want to look back at my initial
reasoning:</p>
<ol type="1">
<li><p>While this might be true on average (the jury is still out on
this one), it certainly was not the case for me. Without delving into
too much detail: I expected most of my students to find the course
either easy or at worst moderately difficult. I was kind of blindsided
to find out that, despite signing up for the most advanced recitation
section, many students still found the course somewhat difficult. In
retrospect, it should not have been that surprising. Two of my very
intelligent friends struggled in the course, one of them clinching a B
after a very intensive final review session I taught, and another one
dropping the course entirely to try again next semester. It is by no
means an easy course, no matter how well prepared you are.</p>
<p>In some part, my experience TAing a Godel section was a bit
anomalous. Most other TAs did not have as rough an initial start as I
did. But no TA had the easy-going experience that I hoped and expected
would be tied to Godel. Nobody will have an entire mentee class that
doesn’t struggle with the course, the laws of probability and the
difficulty of the course prevent that. So going forwards, this will not
be as much of a factor when deciding which level to teach. The
difference is not as dramatic as I expected or hoped for.</p>
<p>It goes without saying I am very proud of my students. Despite a
rough start (which is a very common experience in the first few weeks of
CS251, no matter what level of recitation), they worked hard to learn
the content and improved their performance dramatically. It is very
rewarding to see your students grow, to see negative trends turn into
positive ones, and I am glad that I got to experience it even while
teaching the fastest level of recitation.</p></li>
<li><p>Theoretically I should put more emphasis on the proof templates
for e.g. reductions in the course. But my co-TA (Sebastian) would go
through these verifications in what I found to be <em>excruciating</em>
detail, which is part of why I could get away with flying through the
problems and just paying homage to the various details. (Although to be
fair, the first time we introduced poly-time checks, I said “make sure
to check your transformation is poly-time, it is free points” about 7
times with great emphasis. So these homages are not at all
brief.)</p></li>
<li><p>This was the part of the course that went most as expected. I had
a student who really knew a lot about mathematical logic, and talking
about computation theory was quite refreshing.</p></li>
</ol>
<h2 id="depth-of-the-course">Depth of the course</h2>
<p>Segueing from Point 3, now I have to leverage my first criticism
against the course (and unfortunately will have to discuss a little bit
of mathematics here). The course is quite difficult because it has
difficult problems, but it has a shocking lack of depth. Many of my
conversations with these mathematically mature people were about this
issue. I understand and even agree with the perspective that the course
should not be too deep, since it is merely an introductory course. (It
is not CS251’s fault that we do not run a graduate level computation
theory course more often, and these students would have been much better
served taking such an unfortunately nonexistent course.)</p>
<p>It is quite a shame, because CS251 has such a good presentation of
the basics: DFAs, Turing Machines, undecidability, reductions. But very
often, we stop before discussing the really deep or interesting results.
We start with surface level definitions, and besides the fact that we
can show specifically that HALTs is undecidable, we do not prove many
shocking, interesting, or powerful results. And if the goal was to make
the course more approachable, then this would be an understandable
motive. But we throw away depth to make this course accessible, only to
haphazardly throw away accessibility for a few cool Putnam-flavored
problems.</p>
<p>Don’t get me wrong, I find the Putnam to be fun (even if I am quite
terrible at it). But I really do not see a good reason to put hard
homework problems that can take an upwards of two hours, when these
problems do not develop the core ideas of the course, and omit
fundamental results such as Rice’s Theorem. We could be making the
course <em>easier</em> and yet more cohesive by putting standard results
as homework exercises, rather than random miscellany.</p>
<p>This leads to CS251 being a very frustrating experience for people
already familiar with this kind of mathematics.<a href="#fn1"
class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a> A
lot of effort is spent to solve some admittedly cool problems, but very
little additional understanding of the core ideas of the course is
gained. (I actually have more mixed feelings about the last third of the
course just being random miscellany, since putting on filler means the
exams are easier to study for, something which makes a lot of sense for
a CS core.)</p>
<h2 id="content">Content</h2>
<p>Professor Ada loves to say that CS251 is about the people and not the
content. I think this rings doubly true for me, because frankly the
content is not my cup of tea. To be clear, I think it is very cool! But
it is like milk tea to me: I don’t really drink it. I’d rather enjoy a
nice cup of fruit tea with some lychee jelly.</p>
<p>But to continue the analogy, I’m not really drinking the milk tea
myself, I’m the one serving it. Of course, to serve good tea, I have to
taste it myself (which means I do spend a little bit of time thinking
about all the content of CS251). But it is a much different experience,
and it is very fun to see people acknowledge that boba tea is fire, even
if they’re drinking a very different kind of boba tea and won’t be
inhaling it every day in the quantities that I am.</p>
<p>You know, if I could magically shape the world to my every whim, I
would be teaching algebra rather than e.g. Karp reductions. But this is
just not the reality we live in, and frankly the difference in content
is not that important to me. It would be a much different story if God
decided to punish me and make me, say, a CS210 TA and I had to manually
grade code (ugh). But the content of CS251 is actually cool even if it’s
not literally my absolute favorite (algebra). I enjoy teaching it, and
the social benefits of TAing CS251 more than make up for the content of
an algebra course being slightly more interesting.</p>
<p>Speaking of…</p>
<h2 id="social">Social</h2>
<p>The social aspect is the best part of TAing a large intro-level CS
course. Hanging out with other TAs during socials and getting to be an
absolute menace on Slack are experiences that you just don’t get when
you’re the sole TA of an upper-div math or CS course. And getting to
know the students has also been really nice.</p>
<p>We’ve had houseparties, gone climbing, baked together,<a href="#fn2"
class="footnote-ref" id="fnref2" role="doc-noteref"><sup>2</sup></a> and
held a puzzlehunt.<a href="#fn3" class="footnote-ref" id="fnref3"
role="doc-noteref"><sup>3</sup></a> I’ve gotten to know so many cool
people and had so much fun over these events. There are a lot of funny
stories here, but perhaps I will share them at a different time.</p>
<h2 id="office-hours">Office Hours</h2>
<p>Teaching office hours was quite surprising. For context, I taught
Sunday office hours, the second earliest time after the homework
released that they were offered. So compared to (say) Tuesday, the night
right before the homework was due, there was a lot less traffic.</p>
<p>The first surprise was the regularity at which students showed up to
office hours. I’d have imagined people would irregularly show up once or
twice to office hours, popping in whenever convenient. However, quite
the opposite happened: most of the people at Sunday office hours were
regulars. As someone who uses office hours on a “as needed” basis<a
href="#fn4" class="footnote-ref" id="fnref4"
role="doc-noteref"><sup>4</sup></a> I found that quite surprising. But
objectively this is quite effective, because usually people like me only
realize they need help when they are beyond cooked for a class.<a
href="#fn5" class="footnote-ref" id="fnref5"
role="doc-noteref"><sup>5</sup></a></p>
<p>The second surprise was how hard the problems could be. Let me be
frank, when I took the course I did not find the problem sets to be
unreasonably hard. In retrospect this is because I was fed so many of
the solutions and the structure of the course meant that, even if I
couldn’t solve a problem, I would still be fine. And the point is that
the course is structured in a way where the problems are objectively
hard (I mean come on, what is a Putnam A6 doing here), but because of
the support systems they don’t feel impossible. But having TAed for a
semester, these problems are actually quite hard. Having to explain them
and also explain <em>how</em> I’d come up with this sort of solution is
quite a doozy.</p>
<p>And a lot of times, I’d have to engage with creative attempts at
solutions by students. Many times they didn’t work. Sometimes they
would’ve theoretically worked, but these approaches were overly
complicated and missed the key insights that the problem was trying to
deliver. Occasionally they would work and even be better than the
official solution. And having to tell these apart in maybe ten seconds
can be intellectually demanding.</p>
<p>On the flip side, I do not have to have the solution and all its
details in mind when I respond to a student. My students are very smart
people, after all. And sometimes it is just about saying the right
string of words to give a student the little push they need. I must
confess there were times I suggested ideas whose conclusions I did not
know (I hope I was clear about it when this was the case). But with such
talented students, sometimes a hint about the kind of ideas that might
work is enough. Sometimes, I deliberately do not give too much away and
suggest the conclusions of ideas when I think it would be more helpful
for the student’s growth.</p>
<p>And I really hope I have made the right judgment calls here. Giving
too much away can deprive students of valuable learning opportunities,
while giving too little detail or being too cryptic could cause a
student to waste an hour of their life. And these are split second
decisions: there is only so long I can say, “give me a second to think”,
before I have to give an answer.</p>
<p>Students I have talked to have universally come away with the
impression that I seem very confident in what I am saying when I teach
office hours (and recitation). I am glad that it looks like I know what
I am doing, but to be honest, I am never <em>too</em> sure. I’ve erred
on the side of giving too much away because I think the problems in this
course are particularly hard. But I think I should dispel this myth
<em>somewhere</em>, if only for my own self-satisfaction.</p>
<p>One final note about actually teaching the problems. I think the most
important trait of teaching is <em>empathy</em>, in the sense that for
some given problem, you should be able to imagine the first things a
student might try and common mistakes they might make. And working with
students during office hours, trying to predict where their approaches
might fail and responding to their insights on the fly, really helped me
develop this skill.</p>
<h2 id="grading">Grading</h2>
<p>Here is where my approach diverges from the average TA’s approach in
this course, and of course, I think my approach is better.</p>
<p>I firmly believe that people should be graded proportional to how
much of the problem they understood. In other words, “could someone
clueless have written the same thing as you?” If you are asked to show
some problem
<math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>L</mi><annotation encoding="application/x-tex">L</annotation></semantics></math>
is NP-Hard, and you just write “reduce
<math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>L</mi><annotation encoding="application/x-tex">L</annotation></semantics></math>
to
<math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>K</mi><annotation encoding="application/x-tex">K</annotation></semantics></math>”
for some NP-Hard
<math display="inline" xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mi>K</mi><annotation encoding="application/x-tex">K</annotation></semantics></math>
and nothing else, you clearly ran out of time to actually solve the
problem. This is clearly not a claim that you know how to do the
problem, it is just initial setup.</p>
<p>Yet we give e.g. 4 points out of 10 for writing the absolute trivial
“reduction” of the identity map. This does not show anything besides
that the student was conscious for at least 2 of the last 8 weeks of the
course, quite honestly. I would be much less inclined to give partial
like this for two reasons:</p>
<ol type="1">
<li>It rewards structural understanding over conceptual understanding
far too much. Our specific template of “how to solve a reduction
problem” should not matter, all that should matter is that the student
can correctly state a reduction and prove it. Yet here we are rewarding
students massively for knowing how <em>we</em> write reduction arguments
even if they have <em>little to no insight</em> on the actual reduction
required for this problem.</li>
<li>Actually realizing that the rubrics are designed this way would
change a student’s behavior a lot. It would lead to students trying to
game the rubric by making sure to write the right flavor of incorrect
solutions without the key insights. <strong>I think we should just
encourage students to solve as many questions as they can</strong>, and
not have them try to game the test for as much partial as they possibly
could. And the best way to do that is not to give large amounts of
partial.</li>
</ol>
<p>I will also say that having a rubric may even be antithetical to this
perspective of awarding a student based on how much of the solution they
understood. But with so many students and so many different graders, I
think a rubric is necessary for consistency. (But they are usually too
narrowly designed, in my opinion.)</p>
<p>On the other hand, I think we are far too liberal in handing out
deductions. Trivial off-by-one or similar errors, particularly those
easily fixable, should not be cause for <em>any</em> deductions in my
eyes. I am far more generous towards essentially correct solutions,
because exam stress can cause people to mix up small details they
wouldn’t otherwise. In these scenarios I think we ought to offer a
little more grace and leniency when the error does not actually affect
the proof.</p>
<p>However, I am only one TA among twenty-something. And in a course
staff where majority and precedent rule, all I can do is try to argue
for leniency on deductions. So of course, I do grade with the same
rubrics as the other TAs, because a TA who disagrees with a rubric is
fine, a TA who has gone rogue is not.</p>
<h2 id="conclusions">Conclusions</h2>
<p>TAing for CS251 was really fun. When I started, I expected this to be
something I only did for one semester just to see what it was like.
While I may have my disagreements with some parts of how the course is
run, I really respect the time and care put into it, and that people
with more experience than me have very good reasons for their
preferences and beliefs. (And I think it would be a shame if, after
TAing for an entire semester, I had no thoughts whatsoever about the way
the course was run.) All in all, the course is run very effectively. If
CS251 has gotten a lot of students to appreciate some of the ideas of
theoretical computer science and gotten some very strong students to
think deeply about the best way to teach it, then by every metric CS251
has been a huge success. The professor is great, my co-TAs are great,
and most importantly of all, the students are fantastic.</p>
<p>I’m really forward to TAing again in the spring! See you all next
semester!</p>
<section id="footnotes" class="footnotes footnotes-end-of-document"
role="doc-endnotes">
<hr />
<ol>
<li id="fn1"><p>This was my personal impression of the course, and I
have talked to a good number of people who feel exactly the same.<a
href="#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn2"><p>More accurately, a proper subset of us baked while the
rest of us just watched…<a href="#fnref2" class="footnote-back"
role="doc-backlink">↩︎</a></p></li>
<li id="fn3"><p>Where my friend Rohan was more helpful during setup than
I was.<a href="#fnref3" class="footnote-back"
role="doc-backlink">↩︎</a></p></li>
<li id="fn4"><p>Okay, “as needed” usually means never…<a href="#fnref4"
class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn5"><p>Model Theory my beloved…<a href="#fnref5"
class="footnote-back" role="doc-backlink">↩︎</a></p></li>
</ol>
</section>
</body>
</html>