A chronology of the courses I have taken thus far at Carnegie Mellon University.
My opinions are just that. Take what I say with a grain of salt, and keep in mind, this is from the perspective of someone with prior experience in systems programming. Your mileage may vary.
- 15-112: Fundamentals of Programming and Computer Science
At this point, I was only cross-registered in 15-112 as a non-CMU student.
Despite being a little overqualified for this course, it gave me a more rigorous set of fundamentals to draw upon compared with my self-taught background, and gave me fun opportunities to work on projects for the course hackathon and the term project.
My term project in particular is notable, as I made a multiplayer FPS game with a custom 3D graphics engine. Fighting with the performance limitations of Python was interesting and I learned a lot working on my project. You can check out my project here!
If you are coming to CMU and unsure whether or not you should take this course, I would say it depends on what you want to do. Starting 122 in your first semester would be a more difficult start, but it would allow you to push further in the CS curriculum, allowing you to take 213 in your freshman year if you like. On the other hand, 112 may allow you to get a stronger foundation.
I will say, the course has also changed a lot since I have taken it, so I can't speak as much for the student experience using the new CS Academy system, for example. I can say that I very much enjoyed having Professor David Kosbie as my instructor—I found him a very engaging lecturer and an inspiring person.
- 17-214: Principles of Software Construction: Objects, Design, and Concurrency
- 21-127: Concepts of Mathematics
- 33-104: Experimental Physics
- 84-104: Decision Processes in American Political Institutions
Post-transfer to CMU, I had gotten credit out of 15-122 and was able to skip it. To be cautious in my first semester, I took 17-214 with the non-CS version of concepts.
17-214 was an overall nice experience, and it covered design patterns and basic software engineering quite well. I think this course was not challenging enough for me at this point, though, and I would have been better served to take 15-213 directly.
21-127 was my first experience with discrete math—I thought it was quite difficult at the time. I had Professor Garrett Ervin, who has unfortunately moved to Caltech since then—he was a very clear, kind, and understanding lecturer. Looking back, I would have preferred to have taken the CS 15-151, since stronger fundamentals in discrete math would have served me well through the rest of the CS curriculum.
84-104 was an unexpected hit for me—the course is taught by Geoffrey McGovern (whose name is I believe in the Wean stairwell somewhere), and he stands out to me as a very charismatic lecturer, who was clearly having a lot of fun teaching the course. There are many reading assignments, but I found them very interesting. Overall, I would definitely recommend this course.
- 12-100: Exploring CEE: Infrastructure and Environment in a Changing World
- 15-150: Principles of Functional Programming
- 15-213: Introduction to Computer Systems
- 21-241: Matrices and Linear Transformations
- 98-242: Student Taught Courses (StuCo): Intro to Esoteric Programming Languages
15-150 is surely one of CMU's most iconic courses. I came in with no functional programming experience at all, and leaving it gave me background knowledge that is still useful to this day. I would recommend this course to even non-CS students at CMU who are interested in programming.
15-213 is one of my all time favorite courses at CMU. I thoroughly enjoyed the labs, and I think that the course does a very good job of teaching what it sets out to teach, in a fun and engaging way. For me personally, I feel the workload was lower than 15-150.
98-242 is one of the most fun StuCos I have ever taken (and I have taken many). I highly recommend this course if the idea of learning about and laughing at "creatively" designed programming languages sounds like your idea of a good way to spend a weekday night.
- 15-210: Parallel and Sequential Data Structures and Algorithms
- 15-251: Great Ideas in Theoretical Computer Science
- 15-330: Introduction to Computer Security
- 98-317: Student Taught Courses (StuCo): Hype for Types
I would generally not recommend taking 15-251 and 15-210 at the same time, unless you find yourself very adept at this sort of content. It was pretty taxing to me and I felt the courses did not play well off of each other, scheduling or content wise.
15-251 was certainly a tricky course, but the quality of the lectures and course materials is very high. Additionally, Ada is an amazing lecturer, and perhaps made the entire course for me.
15-330 was a very nice experience! It is a combination of advanced 15-213 attacklab-esque buffer overflow exploits, cipher proofs, and web exploits. The assignments were very fun, I learned a lot, and the workload was relatively light. An example of a well designed course, in my opinion.
- 15-411: Compiler Design
- 15-312: Foundations of Programming Languages
- 15-281: Artificial Intelligence: Representation and Problem Solving
- 79-372: The Rise and Fall of Pittsburgh Steel
- 98-008: Student Taught Courses (StuCo): Intro to Rust Lang
15-411 was a great experience for sure. I was blessed, partner-wise, and so the workload was very manageable and I learned a lot. I will say, I wish that the lecture content went deeper—compilers is a field that goes so much deeper, and I really feel the lectures only scraped the surface.
15-312 was a surprise hit—one of my all-time favorite classes. It is a complete crash course in the field of PL, showing how to formally reason about how programming languages are defined (static semantics) and the way they step during execution (dynamic semantics). Bob Harper is an absolute legend and was a complete joy to learn from. A very good friend of mine was a TA at the time, and that likely contributed to my enjoyment.
79-372 was an interesting class that my roommate proposed I take with him, and it ended up being very fun. The readings can be a little taxing, but the content is very interesting and I learned a lot from this course. The lecturer was definitely having fun teaching the content, which is always a plus. At the end of the course, he gave us all t-shirts and we got to tour a real steel mill during operation.
- 21-259: Calculus in Three Dimensions
- 15-445: Database Systems
- 15-451: Algorithm Design and Analysis
- 85-104: Psychopathology
- 98-341: Student Taught Courses (StuCo): Build Your Own Breadboard Computer
15-445 is one of the best classes I have ever taken. Andy Pavlo is one of my favorite lecturers of all time—he really brought the topic to life for me, and his passion for databases, fast and organized lecturing style, and hilarious sense of humor made me look forward to every lecture (the rumors are true—there is a course DJ). Databases are now my favorite field of computer science, thanks to this class.
98-341 was an excellent excuse to build a 6502-based computer on a breadboard. A good friend of mine is the leader of this course, and he was very knowledgeable and did an excellent job supporting the students. Highly recommended, if building a computer on a breadboard sounds fun to you.
15-451 is the most difficult class I have ever taken, and it is genuinely nobody's fault. The scope of the course is just extremely large and the exams very intense.
- 15-410: Operating System Design and Implementation
- 15-721: Advanced Database Systems
- 98-179: Student Taught Courses (StuCo): Introduction to Japanese Mahjong
- 98-374: Student Taught Courses (StuCo): Steep by Steep: Investeagation into Tea Culture
We'll see how it goes!
If you would like to hear more about my experiences at CMU, feel free to shoot me an email!