Fall 2022 Course Reviews

April 30, 2023

Overview

This semester was probably my favorite semester so far, despite being one of the heavier ones. Overall, the I would rate the workload for this semester to be moderate. 18-240 and 15-251 were the biggest time consumers of the schedule, 21-260 was average, and 33-124 was the least workload. The classes I’ve felt like I’ve learned the most from (and enjoyed the most) are 15-251 and 18-240 (unsurprisingly). These two classes gave me very different perspectives on computer science as a whole, with 15-251 being much more theoretical (concerning computability and algorithms), and 18-240 being much more practical and low-level (concerning hardware and how computers actually compute).

18-240 Structure and Design of Digital Systems

This course mainly focuses on how digital components (logic gates, flip-flops, etc.) culminate into computers. Graded assignments mainly consist of homeworks, labs, and exams. 18-240 is highly cumulative, as you will use principles and components that you have learned in the weeks prior often. The first half of this course focuses on combinational logic, while the second half focuses of sequential logic. Labs and coding potions of HWs are in SystemVerilog, which you will be introduced to in the course gradually.

I thought that this course was well organized, yet a little harsh. Lectures were great; Nace thoroughly explains concepts, and has a great teaching personality. His grading policies, however, I thought were a bit questionable. Homeworks, despite being extremely helpful for grounding information, felt like busy work (especially in the first half). These were also graded relatively strictly, meaning I found it difficult to achieve close to full points on. Some labs (again, especially those in the first half) also felt repetitive, with code eventually devolving into massive blocks of logic statements. The course does get better in the second half, where you learn about FSMs, datapaths, and hardware threads, as its focus shifts from “how do we use and build basic logical components” to “how can we design systems that can perform computations.” My favorite lab by far was lab 4, where my partner and I had to design Breakout, which was displayed on a screen using a hardware VGA driver. This lab is generally considered to be the most challenging, as it used almost all the concepts learned so far in the course and was a nightmare to debug if the wrong design choices were made. By the time my partner and I were finished, I was amazed at how relatively simple digital components can culminate into a fully-featured game with logic.

Although in retrospect I thought this class was fun, the rather repetitive and hair-pulling nature of this class has cemented by decision to focus more on the software side of ECE. Some tips for prospective students of this course are to start labs early, allocate a lot of time for HWs as they are time-consuming, and to attend the practice midterm sessions.

15-251 Great Theoretical Ideas in Computer Science

Probably my favorite class this semester, 15-251 focuses on various topics in CS theory: DFAs, Turing machines, complexity classes (mainly P and NP), graph theory, randomized algorithms, and cryptography. This class is very much a breadth course, with each topic being covered for up to two or three weeks. Graded assignments mainly consist of homeworks (in the form of writing sessions) and midterms. Expect to write a lot of proofs. Review induction.

Although this class wasn’t the biggest timesink this semester, it was the hardest class I’ve ever taken at CMU when I was taking it. Unlike most courses at CMU, homeworks are in the form of weekly writing sessions, where you write up your solutions, in-person, to the problem set in a limited timeframe. This is similar to a midterm, the only difference being that you have access to the problems beforehand. I found this method to be effective, because a student has to know their solutions very well in order to do well. The topics in covered in lecture are fairly digestible; Ada is a great lecturer and is rather enjoyable to talk to during office hours. The textbook on the website is also very well written, and I encourage anyone who takes this course to read through it thoroughly.

Overall, I thought this course was very well structured, and changed my perspective on how I think about computer science and associated fields in general. However, I wish I spent more time on this class. Most of my problem sets were done the night before, due to how much time my other courses took and general laziness. The problems, in retrospect, were very enjoyable to solve; it’s just that sometimes I ran out of time and/or energy trying to come up with fully fleshed out solutions. If you want this class to be very rewarding, plan to spend several days per week solving these problems.

21-260 Differential Equations

A fairly normal differential equations class. Handron is a good lecturer, with enjoyable “real world” examples (videos he makes with his son(s)). Standard topics were covered, such as solving separable differential equations, linear second order ordinary differential equations, Laplace transforms, and systems of linear differential equations. This class is very much plug-and-chug without many proofs. Overall, this course was good but I wish I took 21-259 or 21-268 instead, as it is a prerequisite to more classes that I want to take compared to 21-260.

33-124 Introduction to Astronomy

A fun gen-ed. You cover cool topics (that I particularly don’t remember too much), providing for a very gentle introduction to topics in astronomy. Don’t expect too much work. Go to in-person lectures, as Croft usually has silly activities that you can do in class to get participation points in.