With seven semesters down and one more to go, I think I'm in a good position to put together this list. I rate each course on a scale of 5 with 5 being the highest and 1 the lowest based on: in-class experience, assignments and projects, course content and design, how much I learned, and quality of teaching. It's important to note that I don't remember many things about the earlier courses so I might have excluded or mis-rated some of them just because of my fish memory I couldn't put my biases aside when rating the courses (I wish I rated every course right after taking it; it would've been easier), so if you're a CMU-Q student, do not use this list as a reference for choosing your courses .

  1. 15-251: Great Ideas in Theoretical Computer Science or GTI Here's the things, I'm not that brainy, and I'm not the best at CS theory, so the fact that this course sits on the top of my list means that I was very impressed by it. GTI has a very bad reputation of ruining GPAs, and making people switch majors, so I was determined to just get it out of my way with the least damage possible, but then when I took it I actually enjoyed almost ever single class. The course is divided into two halves: the first half introduces students to different topics that were the foundation for the science of computation (this includes the topics in maths) and teaches them how to write proofs the second half and the second half introduces them to popular topics in computer science theory. The course is supposedly 12 units, and I think I actually spent around 18 hours every week on it - but I think I the average is less than 18 hrs. This is actually quite a lot given that, outside the class, we only have weekly quizzes that don't need much preparation and weekly problem sets that are 4 or 5 questions (all theory) and we solve them in groups. Anyways, here's my rating for the course:
  2. 15-213: Introduction to Computer Systems
    Although it's only an introduction to computer systems, this course is the one where computers cease to be a black box with a glowing screen. It included some of the biggest oh-so-that's-how-it-works moments in my life. It also included some of the worst I-can't-believe-I-just-wasted-ten-hours-on-this-bug moments. Overall, the programming assignments (for some reason they're called labs) were super duper time-consuming which always bugged me because I don't think this should be a 12-unit course by any means. This course also has the best textbook EVER which you should never get rid of.
  3. 15-112: Fundamentals of Programming and Computer Science
    This is my first CS course, and the first time I learn programming. I loved programming, and I loved the course that started it all. I CA'd this course twice, and it's just mind-blowing, the magnitude of the transformation in the students' problem-solving and coding abilities. And I meant to put problem-solving first in the preceding sentence because I honestly think this course, more than teaching me how to code, it taught me how to think. And, by the end of my first semester, even life problems, I would approach them in a very programmatic manner - which I makes me wonder if different majors also experience a change in the way they think. Anyways, here's my rating for the course (which might be biased as I mentioned earlier):
  4. 15-150: Principles of Functional Programming
    This course, unsurprisingly, introduces students to functional programming. And I just love functional programming. I took this course with a heavily-imperative-programming course (computer systems) and it just felt so good to shift gears and approach problems with a different perspective. I also happened to be a course assistant for both courses at the same time, and this time I was much more aware of the differences between both courses and it was very interesting to see students doing the same courses at the same time. It's sort of like when someone shifts between languages while speaking and you can sense a change in their tone and the way they express their thoughts - it's much deeper than just changing phonetics. This course was also the reason I developed my research interests. Having said that, I know that many students are not big fans of this course, and I think they have a point. It's not easy, sometimes it feels too abstract (especially when you're taking systems in the same semester), and other times the homeworks are just unnecessarily long. In all cases, here's how I rate the course:
  5. 15-317: Constructive Logic
    This is the only logic course I took in CMU, and it perfectly matched my research interests. I loved all the topics, I loved the assignments, and I loved how the Professors presented actual applications. I wish there was a market for logic beyond academia (I'm not of any and certainly not in Qatar).
  6. 76-270: Writing for the Professions
    This is probably the only non-CS course that will make it to my list. Not that I didn't like all the other electives - I actually regret not taking more electives - but it's just that I was so focused on CS courses that this course is the only one that could leave as much impact on me as the CS ones. The course teaches students the writing and communication skills that are needed in all professions. Coming from a point where I thought that writing a formal email boils down to writing a word in the thesaurus and picking its longest synonym, I think this course really helped me. I also don't think I had as much fun in any course as I had in this one (except for Embedded Systems maybe). But fun aside, even for students who have good professional writing skills, I think this course is still very helpful. I wish I took when I was a junior or senior though because then I might have actually used the resume or cover letter that we had to write as part of the course.

The above list includes courses that I took in CMU Qatar. I also did a semester in CMU Pittsburgh, and I took some really interesting courses there. The other reason I didn't include these courses in the above list is because I took them in spring 2020 which is the semester when the whole Covid pandemic started, so I don't think my in-class experience is very relevant because no one knew what they were doing and I skipped a lot of classes during the pandemic. And, somehow, I can't remember how these courses were like in the first two months - when things were normal. On second thought, I also don't think my rating for the quality of teaching and how much I learned is anywhere close to reality.

  1. 15-312: Foundations of Programming Languages
    This the first PL course that I take. The course is simply brilliant. It's one thing to learn programming and a whole different thing to learn how to design and implement a programming language. And the textbook was a huge huge plus - which has rarely been the case in most of the courses that I've taken. Matching the underlying design principles with a programming paradigm or even a programming language left me in awe. I think if it weren't for the pandemic, this course would have easily been my absolute favourite.
  2. 15-440: Bug Catching: Automated Program Verification
    In short, this course is about proving the correctness of a program by writing specifications and the behavior of programs using automatic theorem-provers (why3 in particular). The course also teaches the theory behind these automated provers but it doesn't delve very deep into this part.
  3. 15-292: History of Computing
    This is a fun five-unit course. It's nevertheless very informative. Seeing the history of computers starting from when the term just referred to humans calculate stuff and seeing how far computers have come is really really intriguing.