2nd Year
This tier list assumes you passed all classes and applying the knowledge you learned from first year.

😎 S-Tier
EECS 2030: Advanced Object-Oriented Programming
This is the predecessor course for EECS 1021. You will touch on advanced (also very important) OOP principles such as inheritance, polymorphism, aggregation and composition, shallow copy and deep copy, interfaces, abstract classes, etc. I would take this course ASAP (ideally in the fall of your 2nd year) because it unlocks many courses in 2nd year and beyond, that require EECS 2030 as a prerequisite.
🟡 Difficulty: 6/10
🚀 Usefulness: 10/10
OOP concepts may come up in technical interviews for something like OOP design, so that's another important application of this class.
EECS 2101: Fundamentals of Data Structures
Previously known as EECS 2011, this is the most important and my favourite course in 2nd year. You will learn about data structures that you'll need for coding interviews or online coding assessments (arrays, stacks, queues, linked lists, hashmaps, heaps, trees and graphs), as well learning the best usage for these data structures in problems. You will also touch a bit on algorithms, like sorting, tree and graph traversals (e.g., Djikstra). The course is manageable in the first half, but it gets a little tough when you get to trees and graphs.
EECS 2101 will go into more theory than actually implementing them in coding problems from my experience (it could be different with other professors). I recommend doing LeetCode problems utilizing data structures to expand your understanding on them. I also rarely did any proofs in the course, but again it can depend on the professor, so I'd maybe brush up on discrete math knowledge as well.
🔥 Difficulty: 7/10
🚀 Usefulness: 10/10
EECS 2311: Software Development Project
You will be put into a group throughout the semester of this course, developing a software project mostly in Java and the stuff you learned from EECS 2030. Make sure you find a group that is willing to do above the minimum. I also recommend learning, most importantly, Git and Github, along with databases with SQL before taking this course, don't wait until the class covers them (I made this mistake). It also covers common and important SWE practices in the industry like testing, code reviews, user stories, agile software development, etc.
Depends on your group and project, but generally:
🟡 Difficulty: 5/10
🎯 Usefulness: 8/10
🙂 A-Tier
MATH 2930: Introduction to Probability & Statistics
Disclaimer: I did not take this course, but I did take an equivalent course to this at another university. This will be one of the easier math courses to take in your degree. If you've taken Data Management in an Ontario high school, this course should be easy; otherwise, it's not bad. This course is useful if you plan on doing ML and Big Data courses, as they rely heavily on statistics.
🟡 Difficulty: 6/10
🎯 Usefulness: 7/10
ENG 2003: Effective Engineering Communication
I took this course during the summer after my first year along with another course. So, I had fun taking this course and I found it definitely better than ENG 2001. This is a communications course, which involves giving pitches, presentations, interviews and writing communication through giving feedback, a technical report, etc. Communication skills are crucial life skills people need to grasp looking for jobs or networking.
Writing technical reports are common among mechanical, electrical, civil and electrical engineers. Pick a topic you're interested or passionate about for your technical report, so it can feel less tedious (my technical report was 20 pages long).
This class was also the reason I created my LinkedIn page. I highly recommend to create an account and display a profile about your background, so you can get your name out there.
🟡 Difficulty: 5/10
🎯 Usefulness: 8/10
ENG 2001: Engineering Projects: Management, Economics, and Safety
ENG 2001 is your engineering economics course where you also learn about project management and safety. I really wish I took this course sometime in the summer because I found it to be in the way at times. I also didn't like this course for several reasons. I wasn't really interested in project management and the assignments were basically "fill-in-the-charts".
Understanding economics and how the market works is worthwhile. However, you can do the same thing by self-learning in your spare time (YouTube, LinkedIn, etc.) or take an economics course.
🟡 Difficulty: 5/10
🎯 Usefulness: 7/10
🤔 B-Tier
EECS 2021: Computer Organization
One of my favourite 2nd year courses. In this course, you will learn topics related to both hardware, such as gates, memory, and number systems (binary, octal, decimal, hexadecimal), cache, pipelining. You will also learn assembly programming, using RISC-V. It's a vital course if you want to look into fields like embedded systems, firmware design, FPGAs, etc. As of Fall 2025: Verilog is not taught anymore (finally!) and instead, the 2nd half of the labs are using an ESP 32 microcontroller in RISC-V. Be warned that this course is time-consuming, and I would recommend spending a good amount of time for this course. If you are interested or considering going into hardware, EECS 2021 is an important course for that matter.
💀 Difficulty: 9/10
🧩 Usefulness: 6/10
EECS 2032: Introduction to Embedded Systems
Despite the course name, this is your typical C + UNIX/Bash course, you don't learn about embedded systems until the end (although this might depend on the professor). Bash is an important skill to pick up in development, where you'd have to navigate and interact with a terminal. Moreover, if you plan on going into IT/Infrastructure, you will need to know Linux and shell scripting, which are essential skills.
You also learn C, which might be a learning curve only coming from Java. The syntaxes of both languages are similar, however, you'll need to understand how memory works under the hood in a computer. In fields like embedded systems, you need to highly prioritize code safety and program optimization using memory management and pointers. C is also the mother of all programming languages, which largely influenced the creation of today's operating systems: Windows, MacOS, and Linux. In general, you may rarely or never use C, unless probably if you'll be working in semiconductor and hardware companies like AMD, NVIDIA, or Qualcomm. Or you could join the dark side and dabble in kernal and OS development in C.
The embedded systems part of the course is just programming a microcontroller using C and learning how to read microcontroller schematics. This course, when I took it, contained lab tests of Bash and C, so make sure you practice both to pass the lab tests (it's also 4 credits too, so keep that in mind).
🔥 Difficulty: 8/10
🎯 Usefulness: 8/10
MATH 2015: Applied Multivariate & Vector Calculus
The final calculus course. I found this to be significantly easier than integral calculus because of the heavy overlap between differential calculus, integral calculus, and linear algebra. Coming from MATH 1014 to MATH 2015 is easier than going from MATH 1013 to MATH 1014. However, you will have to know your linear algebra well from MATH 1025 since you will work in 3D or multi-dimensions.
90% of the course is differential and integral calculus in multiple dimensions, which also involves some linear algebra. The last 10% of the class is vector calculus (which some consider as Calculus 4), which includes topics like Green's Theorem, Curl, Divergence Theorem, etc.
🟡 Difficulty: 6/10
🧩 Usefulness: 6/10
😒 C-Tier
MATH 1090: Introduction to Logic for Computer Science
Imagine if EECS 1028 (or EECS 1019) is a bag of potato chips. Then you have this other bag of chips with a weird and unique flavor (like shrimp), that is MATH 1090. You will learn about boolean and first-order logic in a completely new abstract syntax as opposed to EECS 1028.
Though the content in the course seems useless, however some content from MATH 1090 will come back in EECS 3342 and EECS 4315, which are for high-level control systems like aircraft, medical equipment, etc. Otherwise, I see it as a filler course for CE and CS students (even other professors like to roast it or despise teaching it). One important thing to note that EECS 1028 is not a prerequisite to MATH 1090. However, EECS 1019, which is discrete math for CS, is indeed a prerequisite for MATH 1090. In this case, I personally recommend taking EECS 1028 first, so MATH 1090 has an easier learning curve for you.
🟡 Difficulty: 6/10
🧩 Usefulness: 4/10
PHYS 2211: Experimental Magnetism
This is supposed to be the lab component for PHYS 2020 (similar to PHYS 1801), but it's split into a 1.0 credit course. The only work you have to do are pre-lab quizzes before the lab and the experiments in the lab. The experiments are similar to the ones done in PHYS 1801 labs. Not hard to pass if you work with your group mates.
🟢 Difficulty: 2/10
💤 Usefulness: 1/10
😭 F-Tier
EECS 2200: Electrical Circuits
EECS 2200 is the ultimate "F-tier" course on my list. This course is all about analyzing and solving electrical circuits, beyond what you learned in PHYS 1801. I personally think this is the hardest course in second year because you need to have a unique approach to solving circuit problems. You have to understand HOW a circuit works to be able to solve problems, before throwing formulas all around then perform computations. Moreover, you have to master the basics of circuits: how voltage, current, and resistance work, Kirchhoff's Laws, how to tell if resistors are in series, parallel, or neither, etc.
The good news is it's not a prerequisite to required classes in Software Engineering (except for some EECS electives you want to take), so you may take it later. I found this course with little purpose for Software Engineers, but this would be how our program would be accredited by the CEAB. I highly recommend not pairing this with heavy classes, taking it in the summer might be a good idea. Here is a good playlist of videos covering topics of the course.
💀 Difficulty: 10/10
💤 Usefulness: 1/10
PHYS 2020: Electricity & Magnetism
The concepts are mostly the same from the E&M you learned in PHYS 1801. However, you will be solving more complex problems with calculus and deriving equations from PHYS 1801.
Note that I was fortunate enough to have an amazing professor in the class, so I did not have a rough time. With anybody else however, this course can be difficult and challenging. Even though this class isn't useful, I really enjoyed taking this class and learned a lot. This is just to show that the professor plays a huge role into whether you will love or hate the class.
This will also be the last mandatory physics class you will take in SE, unless if you decide to take another physics class for your science credit in your third year.
🔥 Difficulty: 8/10
💤 Usefulness: 1/10