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
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, throughout my time at CMU.

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 potential overlaps between them.

Although I was initially concerned about the workload, everything turned out great, and I still managed to find a decent amount of free time to focus on some research and my startup.

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. Feel free to check their research pages: Hugo Sadok, Nirav Atre, and Philip Adidthya, it’s definitely worth it!

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. Realizing this early is a knowledge many people don’t grasp until later in their careers.

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:

  • 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-dependent protocol meant to recover from even a nuclear breakdown, as the internet was intended.

  • The second project involved implementing TCP on top of UDP, providing an in-depth understanding of TCP’s nitty-gritty details and the transport layer in general. We also had the option to develop our own congestion control algorithm alongside Reno.

  • 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++, each building upon the previous one:

  1. Storage Layer: Develop your own buffer pool manager system with a corresponding replacement policy.

  2. Hash Index: Implement an extendible hash table on your buffer pool manager to enable support for faster point queries.

  3. Execution Engine: Utilize both your buffer pool manager and your index to support basic SQL queries (i.e. SELECT, UPDATE, INSERT, etc.).

  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 multiple times. 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:

  • 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.

  • The second project involved implementing the Raft consensus protocol.

  • 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 was especially fascinating 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. I cannot emphasize enough how well-organized and knowledge-intensive these projects are. You can find an overview of these projects in the CS:APP book or on the official course website.

Since the class took place during the summer, and I wasn’t physically in Pittsburgh yet, we had biweekly remote and pre-recorded lectures from previous years. While watching videos instead of attending in-person lectures can be somewhat monotonous, Prof. Brian Railing’s charisma managed to keep me engaged throughout the sessions.

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!