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.
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.
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.
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 Adithya Abraham Philip, 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.
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. 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 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 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 them 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!