CMU Courses

Reviews and Thoughts on CMU's Computer Science Courses

Preamble 📜

Here you will find my opinions on all the courses I have taken since joining CMU. I will continually update this page as I progress through my master's degree.

I evaluate each course on a 5-star 🌟 rating system, assigning 1 star for the lowest grade (i.e., to be avoided at all costs), 3 for a passing grade, and 5 for courses I strongly recommend.

You can explore an unofficial but comprehensive list of CMU's courses here, along with detailed content descriptions and highlighted prerequisites. I'd recommend that website if you want to build your curriculum.

Please be aware that, while I have endeavored to provide a balanced perspective, I do hold rather strong opinions. I encourage you to explore other blogs online to gain a more holistic view. You can find great reviews on Abigale Kim, Fan Pu, and Wan Shen Lim's blogs, all of whom inspired mine. Keep in mind that they did their undergrad at CMU, so they probably have a more intimate knowledge of the university, whereas I bring more of an outsider's perspective.

Summary 📝

You can find a recap of the courses I took each semester, along with hyperlinks for direct access to their content, to facilitate navigation.

Fall 2024  
10-601: Introduction to Machine Learning  
15-659: Probability and Computing II  
98-008: Intro to Rust Lang  
Spring 2024
15-744: Advanced Computer Networks (PhD-level)
15-721: Advanced Database Systems (PhD-level)
15-689: Independent Study in Computer Science
Fall 2023
15-441: Computer Networks
15-445: Database Systems
15-440: Distributed Systems
15-604: Immigration Course
Summer 2023
15-213: Introduction to Computer Systems


Courses 📚

I joined CMU in the summer of 2023 and am expected to graduate in the fall of 2024. Below, you can find a comprehensive list of all the courses I have taken, organized by semester in reverse chronological order.

Fall 🍁 2024

Coming into my last semester, I narrowed down my focus to two main things: landing a job and getting my degree. Since I only needed one theory class and one AI class to graduate, I decided not to load up on extra courses - paying more tuition just didn't make sense at this point. Instead, I threw myself into interview prep, which ended up being way more intense than I expected. I dove into a marathon of over 40 interviews and hopped around different cities across the States. Having never really done serious interview prep before, I basically had to learn the whole process from scratch and went pretty hardcore with the preparation. Looking back, keeping my course load light was the right call!

10-601: Introduction to Machine Learning

4/5 🌟 Nicolas Flamel would be proud: turning data into gold since 2024!

This class accomplishes exactly what it sets out to do: provide a surface-level introduction to ML without requiring extensive mathematical background. It succeeds admirably at this goal, so if that's what you're looking for, this class is definitely for you. However, I should note that the class often feels like a trivia collection - you learn a little about everything but master nothing. If you're serious about ML, you'd probably be better served by taking 10-701, 10-715, or to be completely frank... a proper statistics class.

From a practical standpoint, 10-601 required about 5-10 hours of work per week, and its exams are quite manageable if you have some mathematical maturity. If you need a quick and easy ML class to satisfy a requirement (which was exactly my situation), this fits the bill perfectly. Both instructors are incredibly enthusiastic and explain concepts clearly. In fact, this might be the best-organized class I've taken at either CMU or EPFL. The projects and homework assignments are exceptionally well-written and provide a streamlined experience - no bugs, no need for office hours. Despite the large class size, lectures remain surprisingly intimate - you can still ask questions, and it maintains a personal feel.

Aside: As you've probably guessed, I'm not the biggest fan of ML, primarily because I prefer understanding systems thoroughly. ML often feels like alchemy: you clean vast oceans of data, tune countless model parameters, and hope that magic eventually emerges after extensive training. And while I'm genuinely grateful that some brilliant minds are doing this modern-day alchemy (after all, even medieval alchemists eventually gave us chemistry!), it's just not my cup of tea. The field churns out an absolutely staggering amount of research - nearly 10,000 papers submitted to ICML '24 alone, potentially over 100,000 pages in a single year between ICML and NeurIPS. One has to wonder about the practical utility of it all. That said, I deeply appreciate mathematics and statistics - anything with a comprehensible theoretical foundation. In computer science, I believe ML is most interesting when viewed through the lens of systems: how do we build efficient ML infrastructure? That's where things get truly fascinating.

15-659: Probability and Computing II

2/5 🌟 Skill issue with high probability

I was beyond excited to take this class, as missing out on a stochastics model class at EPFL was a big regret of mine. I originally planned to take the previous 15-659 class, which satisfied the program's theory requirement. However, the class was split into two sections (15-559 and 15-659) just before the semester started, with our program advisor determining that only the second part would qualify as a theory requirement. Determined to take this class, I self-studied the first part over the summer to meet the prerequisites.

This turned out to be one of my most challenging academic experiences. Despite the professors being very kind and supportive, I found myself struggling to keep up with the pace and structure of the class. The course seemed to attract students with strong competitive mathematics backgrounds, which created a particularly intense learning environment. This was especially challenging for me, as I hadn't taken any mathematics exam in three years!

The course structure raised some questions for me. We spent 14 weeks focusing primarily on Chernoff-derived concentration bounds (with various applications, including some really cool Monte Carlo algorithms) and Markov chains. While both topics are undoubtedly important, the depth of focus on these specific areas felt somewhat imbalanced for a general probability course.

On a brighter note, the intense preparation I did for this class unexpectedly proved valuable during quantitative interviews! The countless hours spent mastering concentration bounds ended up being a surprising asset. Sometimes the most challenging experiences lead to unexpected benefits - I can now practically solve these problems in my sleep, which is quite the silver lining.

98-008: Intro to Rust Lang

5/5 🌟 🦀 A rustacean’s emergency landing pad!

DISCLAIMER: I only took this class after realizing (one week into the semester!) that I was missing 3 units to graduate. I had falsely assumed the 3 units from Immigration Course counted toward the degree requirements - future MSCS students, don't make this mistake! I took this class in panic mode, despite already knowing Rust, mainly because I personally knew two of that year's instructors: Benjamin Owad and Connor Tsui - huge shoutout to them for doing a great job!

For a student-taught class, the organization was surprisingly better than many "real" CS programming courses. The projects were exceptionally well-written and genuinely fun to complete. Content-wise? I have no idea, as I admittedly paid zero attention in class besides enjoying the amazing show and irresistible charisma of the instructors!

While I'm no hardcore Rust evangelist, and I'd still pick C/C++ for any substantial systems project (I just feel more at home there and less constrained), I do think it's valuable to get a taste of Rust. At minimum, you'll understand what all the hype is about and be ready if it does become more mainstream.

Spring 🌱 2024

For my second semester, I decided to go all-in on system classes, taking three advanced courses that built on the ones I took in my first semester. I also served as a TA for 15-445 Database Systems with Prof. Jignesh Patel.

The workload was much heavier than I anticipated due to the open-ended research aspects of these courses. I was constantly juggling three research projects while reading six or more 12-page papers weekly. Unlike regular classes where you finish projects every few weeks, research requires accepting that you're never truly finished. Answering one question often leads to more questions, and there's a lot of backtracking as the research evolves. This process, while challenging, is incredibly enriching and humbling.

Despite the intense workload, I learned a lot and gained confidence in dealing with complex systems and research papers. However, I wouldn’t recommend taking on so much at once, even if you're passionate about systems. By the end of the semester, I was completely drained from academic research, paper reading and writing, and coding. Going forward, I wouldn’t focus on more than one research project at a time, but I’m glad I did it as it opened many doors.

Each course included a significant research project focused on building high-performance, low-latency systems, which is my current area of interest. These projects were all fascinating, and through them, I had the opportunity to collaborate with some exceptional individuals. While not all projects resulted in immediate paper submissions (2 out of 3 did), they laid the groundwork for exciting future publications (see my blog for more details).

15-744: Advanced Computer Networks (PhD-level)

5/5 🌟 Papers, Please. Glory to Networtzka!

This class is virtually unknown among undergraduate CSD students and MSCS master's students. I was the only one from my program to take it; almost everyone there was a professional researchers (i.e., 2nd-3rd year PhD student). I chose it because it was taught by Prof. Justine Sherry, whose class I had thoroughly enjoyed in the previous semester (15-441 Computer Networks).

While I found this graduate-level class somewhat less engaging than its well-established undergraduate counterpart, it still offered valuable learning experiences. The course deepened my understanding of advanced networking concepts and introduced me to robust research methodologies. A highlight for me was the opportunity to work on an interesting research project in distributed systems, in collaboration with Jane Street Capital.

The structure of the class is likely to change in the future, but when I took it, it was divided into three equal parts. The first part covered the control plane in networking research (i.e., routing), from Baran's foundational paper on packet switching to modern data center scheduling routing algorithms like Hedera, DCTCP, and the foundations of software-defined networking (SDN). The second part tackled congestion control: how to set the sender window to avoid collapsing the shared medium while ensuring fairness among participants. Finally, the most interesting part, in my opinion, was the data plane: how to design software and hardware to achieve line-rate switching/middlebox functionality (100 Gbps+). I appreciated this depth-first structure, as it minimized overlap and allowed for a deep understanding in these subjects.

Each section lasted four weeks and began with an introductory lecture by the professor. However, I felt these introductions were slightly insufficient for a solid grasp of state-of-the-art networking research. Fortunately, my background in networking helped me, but otherwise, the paper readings would have been much harder to understand. Each class assigned two papers to read, and someone would present one in a 15-minute presentation, followed by a class discussion.

I presented the Reconfigurable Match Table (RMT) paper, which I found extremely interesting. It discusses how to achieve line-rate data plane functionality while remaining flexible in hardware (e.g., creating a fast, flexible firewall + switch + router), which synergizes well with SDN. If you've heard of the P4 programming language, it configures these so-called "match tables" to support pseudo-arbitrary packet processing on hardware. While not widely used in the industry today, I found it a very cool topic that I believe will become a promising tool for accelerating data processing (as CPUs are not getting faster, the CPU will become a coordinator between peripherals like GPUs, TPUs, and FPGAs, so any processing that can be done in hardware should be done there).

While I didn't learn as much in this class quantitatively compared to 15-441, I believe I became wiserIt made me realize I didn't understand some previous concepts as well as I thought, which was a humbling experience, and I now understand them much better. It makes you appreciate those who choose a PhD as a career option more. Additionally, Justine does a wonderful job teaching research, particularly how to write good system papers. The class includes one big research project that you choose and requires submitting a 6-page paper to a mock conference. I had the opportunity to work with an engineer from Jane Street Capital on an exciting telemetry project.

Overall, I would recommend this class if either (1) you are really passionate about networks like me, or (2) you want to learn how real research gets done.

15-721: Advanced Database Systems (PhD-level)

6/5 🌟 Quack, quack! 🦆 Deutsche Qualität in der Datenbankforschung!

Taking this class might have been one of the best decisions I've made since coming to CMU. This class teaches you all the ins and outs of becoming a cutting-edge systems researcher. After this class, nothing will scare you anymore when building complex systems. I think it's a class like no other that will truly give you an edge in your future career.

As a matter of fact, I think I gained the most knowledge here out of any other class, and it's way more about diving into the latest innovations than learning how to do research. As such, this class is pretty different from 15-744, which, although also a 7xx level course, is way more research-focused. To give you an idea, I don't believe any PhDs actually take Andy's class; it was mostly packed with master's students. As usual, Andy is a really good lecturer - his slides are amazing - and he focuses on concepts that actually matter.

The course delves into analytical OLAP databases, with materials available on the official website. Weekly, we read and reviewed two research papers for class discussion. We covered OLAP systems from the ground up: data storage, columnar execution (including vectorized processing, SIMD operations, and cache-conscious algorithms), query compilation, query optimization, UDFs, and network performance. Much of this cutting-edge research originates from German labs, with Prof. Thomas Neumann being a standout researcher. The course concludes by examining real-world systems like Databricks, Redshift, BigQuery, and Snowflake, demonstrating how these concepts apply in practice.

That said, the core highlight of 15-721 was undoubtedly its semester-long research project, which consumed most of our time and effort. I had the fortune to work on optd, CMU-DB's open-source query optimizer written in Rust. Specifically, our team developed Gungnir, a high-performance cost model using accurate sketches to predict query plan costs before execution. I consider the project to be a resounding success - our results were impressive, and I can't praise my teammates Patrick Wang and David Guo enough. They were among the best teammates I have ever had: anyone reading this should seriously consider hiring them immediately if given the chance! If you're interested in the nitty-gritty details of our work, check out my dedicated blog post.

Taking this class is a no-brainer if you're interested in systems. In the industry, database experts are highly valued and well-compensated due to their irreplaceable skills. You might even become indispensable if you're the go-to person for the company's core architecture. This level of expertise gives you real ownership over what you build and influence over product direction. As Andy says: "All problems in your life can be solved with databases."

That said, don't expect this knowledge to make job hunting easier. In my experience, CS hiring is fundamentally flawed (I'll dive into this in a future blog post). Even at prestigious companies, I've encountered recruiters and SWEs who prioritize meaningless Leetcode pattern-matching over genuine systems expertise - which is surprisingly rare, even among CMU graduates.

However, this class will help you work smarter and create more impact. Companies often follow the 80/20 rule: 20% of people generate 80% of the value. Taking 15-721 is a step towards joining that crucial 20%.

15-689: Independent Study in Computer Science

4/5 🌟 ‘Prudentia’-ly pursuing research with a ‘fair’ amount of challenges!

Although the MSCS program is not a research program per se, it does allow you to take up to 12 units for research. I thus decided to work on low-latency systems with Prof. Justine Sherry, Prof. Zili Meng (HKUST), and Ph.D. candidate Adithya Abraham Philip, following my interest in that topic developed while taking 15-441.

However, 15-689 doesn't have a standard course structure to review, and the experience can vary greatly depending on your advisors (as with any research). While I truly appreciated working with my team and learned a lot from them, I must admit it made me realize that I'm not particularly passionate about the intricate details involved in measuring Internet congestion. This kind of research requires immense patience, and the engineering feedback loop is much noisier compared to other areas of systems research.

Starting in Fall 2023, I had the opportunity to work on the Prudentia project, a watchdog system analyzing the winners and losers of live deployed services on the Internet. It essentially pairs two competing services over a bottleneck bandwidth link, investigating fairness outcomes when actual services compete against each other, rather than just pure congestion control algorithms. This work was published as a paper at SIGCOMM '24, which you can check out here.

I focused on integrating real-time communication (RTC) analytics, specifically examining quality of experience (QoE) degradation in video conferencing services. In Spring, we developed a technique to improve QoE during local/self-inflicted network congestion by prioritizing certain services like RTC over others. This collaboration-based approach significantly reduced video freezes. We published our preliminary results in a short paper at SIGCOMM '24. For more details on the problem and our solution, check out this blog post.

The highlight of this course was that both works were accepted at SIGCOMM, allowing me to attend the conference. I even had the opportunity to present in front of the entire audience as part of the student research competition, which was honestly a blast. As a bonus, Sydney turned out to be one of the most beautiful cities I've ever visited - I'd definitely recommend it to anyone! 🇦🇺

Fall 🍁 2023

This marked my first real semester at CMU. Having just moved to the United States, I wasn't entirely sure what to expect, so I aimed to take things lightly. Given the acclaim for CMU's systems courses, I opted to enroll in as many as my schedule allowed. My rationale was to tackle all system classes consecutively, minimizing context switching and capitalizing on any overlaps between them.

15-441: Computer Networks

6/5 🌟 A ‘packet’ of knowledge that truly ‘switches’ up your perspective!

Although surprisingly less popular among CMU Computer Science students compared to other system classes such as 15-445 Database Systems or 15-440 Distributed Systems, I found this class absolutely amazing—so much so that I don't even know where to start.

First and foremost, Prof. Justine Sherry is an incredible lecturer whose enthusiasm for networking shines through in every lecture. The sessions are highly interactive and entertaining, where complex networking principles are presented in simple, intuitive ways. The entire course staff is also extremely accessible, and the TAs were particularly friendly. Each of the Ph.D. TAs had the opportunity to present some lectures, showcasing their research areas.

The first half of the course presents the five layers of the Internet in a bottom-up approach, whereas the second half, which I found more interesting, is more philosophical and focuses on tradeoffs in system designs.

Unlike traditional system classes that instruct you in crafting systems where you have control over every aspect (Databases, Operating Systems, etc.), 15-441 introduces the dimension of social aspects. Some protocols may appear straightforward or unoptimized—enough to drive any traditional computer scientist crazy—yet they gained widespread use due to the simplicity they offer.

This is because the Internet is, in reality, a collection of diverse organizations utilizing different software, systems, and hardware. Deploying a complex protocol with poor interoperability or expecting widespread adoption of a fancier solution becomes impractical without clear financial incentives. 15-441 teaches an important lesson: sometimes, 'worse is better', as Richard P. Gabriel says. It's a valuable insight that goes beyond engineering, emphasizing the importance of practical outcomes over looking smart or using fancy technology.

The course features four low-stakes homework assignments every three weeks, offering an excellent opportunity to apply lecture concepts. Additionally, there are three system programming projects in C:

  • 1. OSFP and STP: The first project, focused on the link layer, challenged us to implement OSFP and STP along with source routing for an anonymity-preserving mixnet. This was the most challenging yet captivating project, giving us the satisfaction of creating a failure-resistant protocol designed to recover from even a nuclear breakdown, as the internet was intended.
  • 2. TCP on UDP: The second project involved implementing TCP on top of UDP, providing an in-depth understanding of TCP's intricate details and the transport layer in general. We also had the option to develop our own congestion control algorithm alongside Reno.
  • 3. HTTP Web Server: The final project required building an HTTP web server and client using the Berkeley socket API without blocking calls. Despite encountering debugging challenges in the starter code, the course staff provided excellent support, making the project less enjoyable but still very manageable.

For those considering just one system class, I recommend this course over 15-445 Database Systems, which is more technical, and especially over 15-440 Distributed Systems, where the material may fade shortly after the final exam.

15-445: Database Systems

5/5 🌟 “Flex your ‘dirty’ system programming skills!”—Andy Pavlo

I had already taken an introductory database course at EPFL, so I didn't expect this to be a hard class. However, it revealed how little I knew about databases and exposed the shortcomings of the instruction at EPFL.

15-445 stands out as possibly the most widely recognized openly-accessible database course, and it unquestionably lives up to its reputation. Even if you are outside of CMU, you can follow the lectures on YouTube and access the project's autograder on Gradescope.

This course has truly opened my eyes to the interdisciplinary nature of databases. Gaining proficiency in database system programming empowers you to confidently tackle any problem in your life. DBMS research delves into crucial areas such as storage, scheduling, execution, recovery, and concurrency control—all fields of the utmost importance in system programming.

The material covered in this course is truly extensive, making it easy to get lost, particularly if you have a limited systems background. However, I find both Prof. Andy Pavlo and Prof. Jignesh Patel to be highly efficient lecturers who focus on the essential concepts. Moreover, the course includes a DJ who mixes music at the beginning and end of every lecture (and stays throughout!), which is very cool.

The course is structured around five easy homeworks, and four increasingly complex programming assignements in C++, building upon each other:

  1. 1. Storage Layer: Develop your own buffer pool manager system with a corresponding replacement policy.
  2. 2. Hash Index: Implement an extendible hash table on your buffer pool manager to enable support for faster point queries.
  3. 3. Execution Engine: Utilize both your buffer pool manager and your index to support basic SQL queries (i.e. SELECT, UPDATE, INSERT, etc.).
  4. 4. Concurrency Control: Implement MVCC on top of your execution engine to enhance query throughput by increasing inter-query parallelism.

Each project provides ample extra credit opportunities for optimizing your solution and earning a spot on the course leaderboard. I highly recommend participation as it offers valuable insights into advanced C++ system coding, despite the time commitment.

Entering this class, C++ was uncharted territory for me, having only been well-versed in C. Wanting to avoid any unexpected challenges, I dedicated some time on the learncpp website. My focus was on grasping C++'s object-oriented features, with special attention given to move semantics, constructors, and destructors, especially within the context of smart pointers.

In the end, I found success at the top of the leaderboard every time. Don't worry if you're not familiar with C++ initially; a project at the course's start will evaluate your C++ programming skills. If you can handle it, you'll be well-prepared for the rest of the course.

Overall, 15-445 is an excellent opportunity to engage in more advanced system programming, not just by seeing, but by actually doing.

15-440: Distributed Systems

3/5 🌟 A pot-pourri of system concepts difficult to ingest.

Despite its popularity among system courses at CMU, I did not find this class to be particularly enjoyable. In hindsight, I regret taking it altogether, as I did not gain much from it aside from learning Go's concurrency model.

The course covers different topics to get future software engineers ready for real-world practices. But, it felt like the main goal was to excel in "system interviews" rather than truly understanding the material.

Although the course content is neither irrelevant nor uninteresting, it lacks a guiding thread or motivation behind the topics covered. Each lecture jumps from RAID to Paxos, Aries, Kafka, GFS, Hadoop, etc., without a clear connection. The class attempts to cover everything but only touches the very bright surface of each topic, making it challenging to retain and remember the information.

Furthermore, the slides used during the lectures were notably crowded with lengthy, small text, focusing on minute details while often neglecting to highlight the relevant and important information that should be remembered.

The class revolves around four somewhat long and occasionally confusing homework assignments, along with three Go projects. On the positive side, these projects were well-made, but they didn't necessarily connect closely with what was covered in the lectures. So, you could do well in the projects even if you didn't attend all the lectures:

  • 1. Bitcoin Miner: The first real project, which was also the most interesting, involved creating a decentralized Bitcoin miner architecture using a custom-implemented transport layer protocol built on top of UDP.
  • 2. Raft: The second project involved implementing the Raft consensus protocol.
  • 3. KV store: For the last project, we were tasked with building an eventually consistent distributed key-value database using the actor model.

In my opinion, all the projects were too easy, except maybe the second one. So, if you're looking for a technical challenge, this class might not be the best choice. I would recommend taking 15-445 Database Systems instead.

15-604: Immigration Course

4/5 🌟 A funny and occasionally enlightening comedy stand-up experience!

Each Monday, the entire MSCS program gathers to discuss a variety of topics, ranging from the mundane, like the "good food in Pittsburgh" and "learning the Pittsburgh dialect", to more serious and interesting subjects such as "what to expect in a PhD program" and "navigating the challenging 2023 job market".

Overall, I enjoyed these meetings; Prof. David Eckhardt's humor gives the course a stand-up comedy feel. Importantly, it serves as a way to connect with fellow MSCS first-year students since we don't have any mandatory courses to facilitate connections otherwise. Unfortunately, attendance tends to decline quickly, as some view this course as less valuable and have other obligations.

Summer ☀️ 2023

The advisor for the MSCS program, Prof. David Eckhardt, recommended that all of us take 15-513, Introduction to Computer Systems (ICS) over the summer to prepare for the upcoming semester and align our systems background with CMU's undergraduate requirements.

Although I could have had it waived, given that the equivalent EPFL courses were quite comprehensive, I decided to take it nonetheless to be on the safe side and avoid any unpleasant surprises in the fall.

15-213: Introduction to Computer Systems

5/5 🌟 Probably the best introductory system class you can find!

15-213's scope is extensive; it begins with foundational concepts, such as the representation of numbers in computers, and gradually progresses to cover topics like program compilation, linking, execution, and their interactions with hardware and the operating system. It unquestionably provides a thorough, albeit broad, bottom-up understanding of system programming.

While this course proved relatively easy for me, considering my background, I was pleasantly surprised by the substantial amount of new knowledge I acquired. I delved into the x86-64 ISA, more ubiquitous than the MIPS architecture I learned at EPFL. The final part of the course were more instructive as we explored POSIX signals and Berkeley sockets in the last two projects—both new subjects for me.

The class is structured around weekly homework assignments, designed to reinforce the content covered in lectures. While this approach is sound in theory, I find the sheer volume of assignments a bit overwhelming, especially considering their relatively low weight in the overall course grade. I would have preferred fewer but more substantial assignments. Furthermore, the semester includes a total of eight projects. You can find an overview of them on the official course website.

Finally, completing 15-213 is a prerequisite to unlocking all other captivating systems classes, such as 15-441 Computer Networks and 15-445 Database Systems, both of which are nothing short of amazing. Therefore, consider taking it as soon as possible in your program!