Skip to content

Course Reviews — Real Student Perspectives

These reviews are synthesized from student discussions on r/uAlberta and RateMyProfessors data. Difficulty and workload ratings reflect student consensus. Professor recommendations are based on RMP ratings and Reddit sentiment. "Best for industry" ratings reflect how directly the material maps to software engineering roles.


How to Read This Page

  • Difficulty: Easy / Medium / Hard / Brutal
  • Workload: Light / Moderate / Heavy / Overwhelming
  • Best prof / Worst prof — based on RMP + Reddit data
  • Industry relevance: Low / Medium / High / Critical

CMPUT 101 — Introduction to Computing

Difficulty: Easy | Workload: Light | Industry relevance: Low

The gentlest introduction to programming at UofA. Designed for students with zero background. If you've already programmed in high school, this is almost certainly too easy — most students with any programming experience report going to almost no classes and still doing well.

Best profs: Michael Bowling (4.6/5 RMP) brings genuine enthusiasm and CS research credibility to what could be a throwaway course. Russ Greiner (3.5/5) is another option — goes on tangents but clearly cares about students.

Student tips: - If you have any programming background, consider skipping straight to 174. Talk to an advisor. - Show up for labs even if lectures seem too slow. Labs count. - Don't pick this course expecting it to be challenging — treat it as a free GPA boost.


CMPUT 174 — Introduction to Computing I

Difficulty: Easy–Medium | Workload: Moderate | Industry relevance: Low (foundational)

First-year Python course. Variables, control flow, functions, recursion, basic data structures. The pace is manageable for students who engage consistently, but students who miss lectures and try to catch up before exams frequently struggle — programming doesn't work that way.

Best profs: - Osmar Zaiane (4.6/5) — possibly the most beloved professor in the entire CS department. Uses physical props to illustrate programming concepts (reportedly brought a volleyball to class to demonstrate exception handling), calls on students with prizes, genuinely enthusiastic. Heavy workload with 3–4 assessments per week, but you actually learn. "Fantastic prof, the best prof in CS so far," one student wrote. - Joerg Sander (4.0/5) — solid and reliable. Explains material thoroughly, responds to emails, good for students without prior experience. "Really engages the class; rather than blasting through solutions he will stop and get the class to solve each problem." - Jonathan Schaeffer (4.7/5) — when he teaches 174/175, students consistently rate him among the best they've had. Inspiring lecturer who ties content to real CS history.

Avoid: - Some sections of 174 have had poor instruction in the past — check RMP before registering.

Student tips: - Do your labs independently. Students who collaborate too closely or use AI on labs fail to build the actual skill and later struggle. - If you have prior Python experience, 174 might feel slow — use the extra time to build personal projects rather than coasting. - The jump from 174 to 175 is real. Don't let an easy 174 make you complacent.


CMPUT 175 — Introduction to Computing II

Difficulty: Medium | Workload: Moderate–Heavy | Industry relevance: Low–Medium (foundational)

Continues from 174. Object-oriented programming, more complex data structures, recursion deepened. The jump from 174 to 175 catches a lot of students by surprise.

Best profs: Same as 174 — Zaiane and Schaeffer are consistently praised. One student who got Schaeffer wrote: "Jonathan is an inspiring lecturer and one of the best profs I had this term. I was honestly considering dropping CS until he showed me how interesting it can be."

Student tips: - The OOP concepts introduced here (classes, inheritance, interfaces) will appear in every upper-year course. Don't treat this as just "more Python." - 175 is a good place to start doing side projects in Python using what you've learned.


CMPUT 274/275 — Tangible Computing I & II (Alternative First-Year Stream)

Difficulty: Hard | Workload: Heavy–Overwhelming | Industry relevance: Medium

The alternative to 174/175. Uses Raspberry Pi hardware, covers Python deeply in 274, then C++ in 275. Reddit is divided: students with strong prior experience often found it manageable and preferred the content depth; students who went in without a strong base often found it brutal.

"274/275 are the worst designed classes I've ever taken. You put in 20 hours per week in just one class. Everything is insanely crammed in," one student wrote. But another countered: "I disagree. 274/275 wasn't hard, I got an A in both. The content is much more important than 174/175."

The honest consensus: 274/275 works well for students with prior programming experience who want to move faster. It's a rough experience for students without that foundation. Also note: some upper-year professors recommend students retake 204 even after completing 275, since 275 covers algorithms less thoroughly.

Best profs: - Michael Bowling (4.6/5) and Omid Ardakanian (4.5/5) are both praised for 275. - Paul Lu (2.⅖) has a difficult reputation for 274 — unclear explanations, exams described as "multiple guessers that have 6 choices that are all right and ask you which one is more right."

Student tips: - If you're considering 274/275, be honest about your background. If you have 2+ years of prior programming, go for it. Otherwise, 174/175 and a higher GPA is probably the smarter play. - If you take 275, still consider taking 204 later — it covers algorithms in more depth.


CMPUT 201 — Practical Programming Methodology

Difficulty: Hard–Brutal | Workload: Heavy | Industry relevance: High

The course that breaks people. C programming: pointers, memory management, bitwise operations, makefiles, debugging with gdb. The difficulty is not just the content — it's that there is no graceful way to skip understanding. Either you understand pointers or you don't. You cannot fake it.

One student described their 201 final: "an 8/45 class average on a final exam written by the professor — in no universe is that acceptable." Another wrote more diplomatically: "CMPUT 201 is a difficult course but it makes you a better programmer... you'll learn a lot and 379 will be a breeze."

Best profs: - Sarah Nadi (3.⅘) — considered by students who've taken 201 under multiple profs to be the clearest teacher. "Sarah is by far the best at teaching it. Though the assignments are hard, they help you later in 300-level courses." Mixed reviews about availability. - Henry Tang — mentioned by students as a recommended alternative to Lin.

Avoid: - Guohui Lin (2.5/5) — frequently cited as making a hard course significantly harder. Very difficult to understand in lectures, and in-class coding exercises are reportedly harder than other sections. 200-rating count on RMP, mostly negative. "CMPUT 201 is a difficult course but Guohui makes it much worse because no student can understand what he's saying." - Michael Buro (2.0/5) — knowledgeable but notorious for pop quizzes, heavy workload, and labs described as nightmares. "Course load was absolutely ridiculous... if you're taking this, learn C/C++ already."

Student tips: - Get the textbook: C Programming: A Modern Approach by K. King. Multiple students say 201 follows it closely and the book alone can carry you. - Start labs early. Labs near the end get brutal. - Use PuTTY or SSH to access school computers to make sure your code works on the graded system, not just your local machine. - Weekly quizzes carry a lot of weight. Take them seriously from week 1.

Pairs well with: 204 (same semester is very common and manageable). Don't pair with: 229 in the same semester unless you have strong C background.


CMPUT 204 — Algorithms I

Difficulty: Medium–Hard | Workload: Moderate–Heavy | Industry relevance: Critical

Big-O analysis, sorting, graphs, dynamic programming, greedy algorithms. This is THE interview course. Everything you will be asked in a technical interview draws from this material.

"Take it seriously. Do extra problems. Review the textbook. Revisit the material before every interview season." That's not fluff — students who get good internships consistently say 204 was where it started.

Best profs: - Martin Mueller (2.7/5) — mixed. Some students find his lectures too vague ("huge walls of text"), but others note he is easy to get a good grade with if you put in the work. Assignments are fair. - Zachary Friggstad (3.7/5) — highly recommended. Very smart, active on Discord, approachable. Goes fast in lectures but willing to slow down if you ask. "Insanely smart guy, and watching him solve Kattis problems in class was an experience in itself." - Mohammad Salavatipour — mentioned positively by students in Reddit threads for both 204 and 272.

Student tips: - Do practice problems beyond the assignments. 204 material is best learned by doing, not reading. - If you plan to do competitive programming (CMPUT 403), start building those habits now. - This course is harder than 201 in a different way — it's abstract, not mechanical. Budget time accordingly.


CMPUT 229 — Computer Organization and Architecture

Difficulty: Brutal | Workload: Overwhelming | Industry relevance: Medium

Assembly language, MIPS, CPU design, memory hierarchy. Consistently cited by students as the hardest course in the program. One student's RMP review: "One time a friend asked me, 'How's life besides 229?' I quickly answered, 'There is no life besides 229.'"

The course genuinely matters — understanding what happens at the hardware level makes you a better programmer. But the execution has varied wildly by professor, and the workload (weekly labs, difficult midterms) is punishing.

Best profs: - Jose Nelson Amaral (3.7/5) — polarizing but often excellent. Passionate, makes dry material genuinely exciting, has industry connections (his students go to Google, IBM). His labs are extremely hard and his exams tough. "Nelson is incredibly passionate and his lectures are excellent. He has extremely high standards but sets his students up well to meet them." Some students found him too demanding and felt he played favorites.

Avoid: - Karim Ali (2.7/5) — very poor reviews. "Imagine a class where the average GPA for the entire class was 1.6." His midterms reportedly don't match what was taught. One student suggested: "Take 229 with Mike [another instructor] and watch Nelson's videos on YouTube."

Student tips: - If you're registering and Nelson is teaching, take him — but go in knowing it will be a grind. If you have the choice, multiple students recommend watching Nelson's free YouTube lecture series even if you're in a different section. - Pairs reasonably with 291 (databases), which has lighter workload. Do not take 229 with 301 and 350 in the same semester. - The memory hierarchy concepts in 229 directly feed into 379 (Operating Systems) — don't treat it as disconnected content.


CMPUT 267 — Basics of Machine Learning

Difficulty: Hard | Workload: Heavy | Industry relevance: High

Statistics-heavy intro to ML — linear algebra, probability, gradient descent, regression, classification. This is not a "here's how to use scikit-learn" course. It's mathematical foundations. Uses Julia as the programming language.

One student summarized it well: "It's basically applied stats. That's what a lot of ML is." Another: "My roommate took 267 and it was TOUGH."

Student tips: - Strong stats and linear algebra background (MATH 125, STAT 151/252) helps a lot. - Don't take this with 379 or other heavy courses. One student who took 379, 401, and 267 in the same semester was specifically advised to drop 267. - If you want ML but aren't math-comfortable yet, consider 366 (intro to reinforcement learning) first — it's considered lighter and more conceptually accessible.


CMPUT 272 — Formal Systems and Logic

Difficulty: Medium | Workload: Moderate | Industry relevance: Low–Medium (foundational)

Propositional logic, predicate logic, proofs, set theory. Dry but necessary. Many students find it tedious; the students who actually absorb the proof-writing skills are better prepared for theory courses.

Best profs: - Lorna Stewart (3.9/5) — highly recommended. Posts all notes online (great typed notes), clear lectures, lenient on missed quizzes (weight transfers to final). "I feel sorry to know that this is her last semester to teach because this class is comprehensive and builds great foundations." If she's still teaching, take her. - Mohammad Salavatipour — mentioned positively by Reddit users.

Avoid: - Randy Goebel (1.8/5) — "Genuinely the worst prof I have seen in the university. Shouts at people if they leave class even 10 mins early." Multiple reviews describe him as refusing to teach, directing students to the textbook instead. His exams are reportedly much harder than the course material covered in lectures.

Student tips: - If you get Stewart (or her notes are available), the course is very manageable. - Do all the practice problems. The exam questions mirror practice closely.


CMPUT 291 — Introduction to File and Database Management

Difficulty: Medium | Workload: Moderate | Industry relevance: High

SQL, relational models, NoSQL (MongoDB), query optimization basics. Two big assignments and two group projects in most sections (a Python SQLite project and a MongoDB project). Students generally find the course reasonable — it's considered significantly lighter than 229.

"I think Davood [Rafiei] is actually a pretty good prof and most of the hate is for the course. The course is pretty difficult and it is quite unique compared to other CS courses, meaning you probably need to put in more time than usual."

Best profs: - Davood Rafiei (2.5/5) — mixed but not as bad as his RMP score suggests. Does many examples in class, exams are fair. Main complaint: lectures occasionally unorganized, not enough prep material for midterm/final. - Joerg Sander (4.0/5) — when he teaches 291/291-adjacent courses, ratings are strong.

Avoid: - Mario Nascimento (2.7/5) — students describe eClass as disorganized, TAs who can't help, and a course structure that doesn't reward effort.

Student tips: - The group projects are actually interesting and involve real tools (Python+SQLite, MongoDB). Engage with them. - Start the SQL assignment early — multiple students report it being very time-consuming. - Good pairs with 229 (manageable combined workload, and 291's disk content connects to 229's memory hierarchy).


CMPUT 301 — Introduction to Software Engineering

Difficulty: Medium | Workload: Heavy (team-dependent) | Industry relevance: High

Android development project + software engineering concepts (design patterns, UML, requirements). The project is the course. Your experience with 301 is almost entirely determined by your team. A good team makes it one of the better courses in the program; a bad team makes it one of the most stressful.

"Don't look at GPA or internships when choosing teammates. Look at what they've committed to on GitHub — commit frequency, net lines of code, contribution history." This is actual, verified advice from students.

"If you get a good team who doesn't rely on AI (LLMs are terrible at Android Studio), the class is really light. Exams are basically free if you pay attention and can think critically."

Best profs: - Abram Hindle (4.⅕) — actual industry experience, excellent slides, runs in-class worksheets (you need to attend). Regular participation marks. Exams match what's practiced. "In a department that's terrible, this guy shines." Recommended.

Avoid: - Ken Wong (2.⅕) — consistently the worst-reviewed choice for 301. The primary complaint: marks are returned extremely late, often weeks after the semester ends. "It has been over a month since we wrote our final exam and still no grades back." Vague grading criteria, incomplete slides. If at all possible, wait for Hindle. - Hazel Campbell (2.0/5) — teaches 301 occasionally. Described as reading off slides, going on random tangents, and giving random criteria additions to assignments without notification.

Student tips: - Teams are formed by lab section, not lecture section. Coordinate with friends so you're in the same lab. - The Firebase database integration is where many groups get stuck. Start early. - 301 uses Java + Android Studio. Brush up on Java OOP before the semester starts.


CMPUT 313 — Communication Networks

Difficulty: Medium | Workload: Moderate | Industry relevance: Medium–High

TCP/IP, routing, DNS, the OSI model, socket programming. Often cited as "boring but useful." Students who go on to do backend or infrastructure work often say they wished they'd paid more attention.

"313 is drier than the desert. Not much relevancy to modern hands-on networking unless you want to get deep into network protocols." But counter-view: "After 313, I finally understood what actually happens when you type a URL."

Best profs: - Ioanis Nikolaidis (3.5/5) — entertaining, goes on tangents (many interesting), assignments are tough but rewarding. Students who took him for 379 also spoke highly of him. When available, he's a significant upgrade.

Avoid: - Ehab Elmallah (2.⅘) — dry, monotone, slides ripped straight from the textbook, and teaches "extremely outdated" networking content. Grading criteria described as inconsistent. "Holy shit do I not like his style of teaching." Students who chose 379 (OS) over 313 partly because of Elmallah.

Student tips: - This course pairs well with 379 (operating systems) — they cover complementary systems content. - The concepts are more directly applicable to industry than the course's reputation suggests.


CMPUT 325 — Non-Procedural Programming

Difficulty: Medium | Workload: Moderate | Industry relevance: Medium

Functional programming (Lisp/Scheme or Haskell depending on the semester), logic programming. Teaches a completely different way of thinking about computation.

"325 was much more useful and fun. It'll help teach you recursion really well." Another student: "313 is boring and relatively painful to study for but will teach you some fantastic concepts. 325 is more fun."

Student tips: - If you've only programmed in Python/Java/C, functional programming will feel alien at first. Stick with it — the perspective shift is the whole point. - Take this before 466 (ML) if you can — functional thinking maps well to ML.


CMPUT 379 — Operating Systems

Difficulty: Hard | Workload: Heavy | Industry relevance: High

Processes, threads, scheduling, memory management, file systems, IPC. One of the most prof-dependent courses in the program — the same material can be a very different experience depending on who's teaching.

"It's basically an extension of 201 with more interesting theory and a little bit of new programming. Definitely worth taking." Another: "It can be up there in difficulty — my prof curved it so nobody got an A."

Best profs: - Jonathan Schaeffer (4.7/5) — among the best-reviewed professors at UofA, period. Mixes in personal stories (including his famous 17-year chess program Chinook), excellent lectures. Assignments are tough but fair. "I'm in my final year and Schaeffer is one of the top three professors I've had." His exams are difficult and can be longer than the time allows, but the class is typically curved. - Omid Ardakanian (4.5/5) — teaches clearly, accommodating, midterm and final described as "very reasonable if you pay attention." - Ioanis Nikolaidis (3.5/5) — entertaining but goes on tangents. Hard assignments, hard tests. "Very bright person and one of the better profs in the department."

Avoid: - Ehab Elmallah (2.⅘) — also teaches 379 sometimes. Same issues as in 313 — boring, ineffective teaching. One RMP review: "Prof took a normally curved 300-level class and said nah, what if average GPA was 2.3?" Another: "Only 1 or 2 people got an A out of about 100."

Student tips: - The textbook is a must for Nikolaidis sections — his lectures don't cover everything. - For Schaeffer: read the lab slides before labs. His first assignment is reportedly the hardest; it gets easier. - 379 is significantly easier if you're solid on 201. The C programming comfort level matters.


CMPUT 382 — GPU Programming and Architecture

Difficulty: Medium | Workload: Moderate | Industry relevance: High (niche but rare)

CUDA programming, GPU architecture, parallel algorithms. Not widely discussed on Reddit because not many students take it. The few who have report that labs take the full 3 hours but the course isn't disproportionately harder than other 300-level courses. Disorganized in some past offerings.

Student tips: - The ability to write GPU code is genuinely rare among CS graduates. This is a strong differentiator if you're going into ML infrastructure, HPC, or graphics. - Background in 229 (computer organization) helps significantly — GPU optimization requires understanding what hardware is actually doing.


CMPUT 401 — Software Process and Product Management

Difficulty: Medium | Workload: Moderate | Industry relevance: Medium

Software development lifecycle, project management, agile, product thinking. More conceptual than 301. Exams are typically manageable; the course leans on readings and projects.

"When I did 401 last fall, the final exam was a take-home written and you had ALL DAY to work on it. The exam itself was not hard at all — mainly some questions asking about terminology and your experience with these terminologies during your project."

Best profs: - Abram Hindle (4.⅕) — if he's teaching it, take it.

Avoid: - Eleni Stroulia (2.8/5) — "Nice person but terrible teacher. All questions so ambiguous with little clarification." Heavy on readings, difficult to know what she's actually testing. 50/50 would-take-again on RMP.

Student tips: - Pairs surprisingly well with 379 — they're both manageable in workload terms and cover different enough material that studying doesn't interfere. - The exam weight is usually low (many versions are take-home or project-based). Focus energy on the project.


CMPUT 403 — Algorithmics in Competitive Programming

Difficulty: Hard | Workload: Heavy | Industry relevance: Critical

Segment trees, advanced graph algorithms, string algorithms, dynamic programming optimization, computational geometry. The best interview prep course at UofA.

Best profs: - Zachary Friggstad (3.7/5) — highly recommended. Brilliant, active on Discord, will accept imperfect solutions in spirit. "Amazing CMPUT 403. Definitely recommend him." Also described as someone who "was a father to me. A watchful protector of the CS department."

Student tips: - You need 204 first. No exceptions. - Do problems on Kattis regularly throughout the semester — don't try to cram. - If you're applying to Google, Meta, or any company that does hard algorithm interviews: this course maps directly to what they ask. There is no better use of an elective slot.


CMPUT 404 — Web Applications and Architecture

Difficulty: Medium | Workload: Heavy | Industry relevance: High

Web protocols, HTTP, REST APIs, front-end and back-end web development. The content is highly practical and directly applicable to most industry roles.

Avoid: - Hazel Campbell (2.0/5) — the most consistently negative-reviewed professor for this course. Multiple reviews: disorganized Canvas site, reading off slides, strange group project deadlines, adds grading criteria mid-assignment. "If you have read horror stories about toxic bosses and wanted to get a glimpse of how it feels... take a course with this prof." Despite this, a minority of students have positive experiences.

Student tips: - The content itself is excellent for industry regardless of professor quality. - Web development skills built here directly transfer to internship work. Pay attention.


CMPUT 415 — Compiler Design

Difficulty: Brutal | Workload: Overwhelming | Industry relevance: Medium–High

Lexing, parsing, ASTs, semantic analysis, code generation, LLVM. One of the most work-intensive courses in the program.

"The workload never lets up. You constantly need to be working on stuff. As soon as an assignment is done, it's in your best interest to start the next one immediately." And: "Without a doubt the most work I've had to do for a CMPUT course. Also the course I learned the most in — in retrospect, I would still take it again."

The project is a full LLVM-based compiler for an obscure IBM language (the spec is 40 pages and glosses over features). Most groups don't finish all features.

Student tips: - Know Java before you start (that's what the implementation uses). - Look up ANTLR (parser generator) and LLVM before the course begins. - Do not take 415 with other heavy courses. Three moderate courses + 415 is better than 415 + one other heavy course. - Despite the pain, this course is worth it if you're interested in compilers, developer tooling, or understanding how languages work.


CMPUT 466 — Machine Learning

Difficulty: Hard–Brutal (professor-dependent) | Workload: Heavy | Industry relevance: Critical

Supervised learning, neural networks, probabilistic models, optimization. The capstone ML course. Quality varies enormously by who is teaching.

Best profs: - Dale Schuurmans (4.⅕) — "Dale is very clever and knows how to make students understand the material. The book he uses is very good. The course itself is not too difficult and his exams and assignments are very fair." Highly recommended; 100% would-take-again on RMP. - Russ Greiner (3.5/5) — "Inspirational. His enthusiasm for machine learning is contagious. His ML course is THE foundational course that helped me launch my career in this exciting area."

Mediocre: - Richard Sutton (3.⅕) — the RL legend, but not a natural classroom teacher. Heavy reading load, forum questions often go unanswered, exams can feel disconnected from lectures. "He understands AI quite deeply, but can't teach." Worth taking for the exposure to foundational RL concepts, but go in knowing you'll do a lot of self-teaching. - Csaba Szepesvari (3.⅕) — brilliant researcher, but his teaching style presumes graduate-level math fluency. "An extremely intelligent man — given that, I don't believe he should be allowed to teach any course that isn't a masters course." His exams have been described as masters-level regardless of course level.

Avoid: - Martha White (2.6/5) — heavy criticism on RMP. Multiple-choice exams with negative marks, assignments with errors that go unfixed, pacing described as impossibly fast. "Somehow worse than XBL. She zooms through lectures so fast no one understands anything." - Nidhi Hegde (1.⅗) — the lowest-rated professor in the entire department. 62 reviews, only 6.5% would-take-again. Posts assignments late, no practice exams, unanswered forum questions, unintelligible handwritten notes. "No practice pretty much at all. Only way to learn is reading AI-generated slides."

Student tips: - Check who is teaching before registering. The difference between Schuurmans and Hegde in this course is enormous. - Prerequisite-wise, CMPUT 267 and MATH 125 are important. Students who skipped 267 often feel lost on the math. - If you're going into ML in industry or research: this course is mandatory. Take it with a good prof even if it means waiting a semester.


Summary Table

Course Difficulty Workload Best Prof Worst Prof Industry Relevance
101 Easy Light Bowling Low
174 Easy–Med Moderate Zaiane varies Low (foundational)
175 Medium Moderate–Heavy Zaiane, Schaeffer varies Low (foundational)
201 Hard–Brutal Heavy Nadi, H. Tang Lin, Buro High
204 Medium–Hard Moderate–Heavy Friggstad Critical
229 Brutal Overwhelming Amaral (YouTube) Karim Ali Medium
267 Hard Heavy Buechler (new) High
272 Medium Moderate Stewart Goebel Low–Medium
291 Medium Moderate Rafiei Nascimento High
301 Medium Heavy (team-dep.) Hindle Ken Wong High
313 Medium Moderate Nikolaidis Elmallah Medium–High
325 Medium Moderate Medium
379 Hard Heavy Schaeffer Elmallah High
382 Medium Moderate High (niche)
401 Medium Moderate Hindle Stroulia Medium
403 Hard Heavy Friggstad Critical
404 Medium Heavy H. Campbell High
415 Brutal Overwhelming Medium–High
466 Hard–Brutal Heavy Schuurmans Hegde Critical

Common Course Combos — What Students Actually Recommend

The classic 2nd year: 201 + 204 + 291 + MATH 125. Manageable. 201 and 204 pair well — different kinds of difficulty.

The notorious combo to avoid: 229 + 301 + 350 in the same semester. Multiple students describe this as survivable but brutal. If you have no choice, ensure you can drop one.

Competitive programming path: 204 → 403 → apply for internships. This sequence is the most direct path to landing technical interviews.

ML path: 267 → 466 (with Schuurmans if possible) → 365. Take MATH 125 and STAT 151/252 first.

Systems path: 201 → 229 → 379 → 382. The natural progression if you're interested in low-level systems, OS, or GPU work.