3A Course Overview


This term, we had one seminar and five courses, one of which was an elective and two of which were shared with Electrical Engineering students. Almost all of the lectures were in the morning (8:30 – 12:30) and the labs were in the afternoon.

Before I explain more about this term, let me first assure everyone that I did pass the term and every course. If you’re a fellow classmate who also passed, then we shall meet again in 3B! I usually don’t make much of a deal out of passing a term but this term was an exception.

After my third co-op term, I became convinced that most of our courses didn’t contribute towards increasing our software development skills and that the time taken to review lectures and study for exams could be put to better uses, such as practicing programming or preparing for interviews. I also believed that the best way to become proficient at new skills was by applying those skills in practical situations, but since our courses rarely provided the practical situations (labs in constrained environments weren’t enough), and I wasn’t interested in seeking them, then the purpose of the courses was to provide introductory overviews of the subjects, which I felt could be self-taught and learned at a later time. This led me to conclude that in the long run, having a good understanding of the course materials and a mediocre one were roughly equivalent. As a result, I decided to focus less on studying and more on pursuing other endeavours, accepting bad grades in exchange for an extra couple hundred of hours of free time. (I want to avoid giving the impression that lectures are useless. They are still useful but not as useful as I had believed them to be when I was in first year. I still believe there are lots of benefits from participating in the CE program.)

I soon realized that I could have even more time to work on hobby projects and self-development by skipping lectures. I initially thought that this was a bad idea and too risky. After all, who in their rightful minds wouldn’t go to class? But I was then reminded of several things:

  • A CS friend (also from Waterloo) was enrolled in his last semester at school…while working full-time at Amazon in Toronto
  • A classmate rarely attended lectures in 2B and 2A and passed with 80+% average. I later learned that he had planned to at least attend the first day of this term’s classes but slept in. He never came to any of the rest of the lectures
  • A job posting that said they wanted you to apply if you ‘skip class to work on your own projects’
  • The reason I received offers from 2/3 of my previous co-ops was not (or perhaps, even in spite of) because of my grades, but rather, because of my hobby projects
  • In 2B, I skipped Monday and Friday lectures after midterms were over and still passed with an acceptable GPA
  • A roommate told me that his classmate was offered to work at Facebook despite having a GPA in the 60s
  • The general consensus that marks don’t determine employability…at least not in the software industry

Clearly, it was possible to skip lectures but still do well. In knowing that other people had done it before, I challenged myself to do so well. I attended the first two weeks of lectures and then the first day of lectures after midterms and then again near the end of the term. (However, I didn’t skip a single lecture for my psych elective.) In total, I went to less than three weeks of lectures…less impressive than the classmate who skipped every lecture and the friend working at Amazon, but still, an accomplishment I’m proud of.

Passing a term but skipping many lectures was more stressful than I had expected, especially during exam times when I struggled to catch up on the courses. I made several crucial mistakes:

  • Not asking friends what kind of questions would be on the midterm, resulting in low marks (still passed every midterm, but lowest non-curved mark was a 51)
  • Not attending the classes immediately before the midterms and finals when the professors hint at the exam questions. Luckily friends and forum discussions helped a lot. Thanks!
  • Confused about how to solve pre-lab and post-lab calculations. Many marks were lost
  • Not coming to more classes in between exams. In hindsight, attending lectures once every two weeks would have been better than not attending any for two months
  • Working on hobby project up until two days before the Compilers finals. I barely had time to finish studying for the finals

Throughout the term, I had also felt genuinely worried about failing the term. If I did, then I had to repeat the term, which meant delaying graduation by at least 4 months (if the courses aren’t offered in Fall 2017, then I would have to wait for 1 year before retaking them), spending another $8000 on tuition, and feeling the gloom of having unsuccessfully skipped lectures. On the other hand, now that I did pass, I will probably continue skipping classes next term but do so more strategically to minimize the risk and stress of failing.

In the end though, I’m glad I passed with an average only slightly below previous terms’ averages. (Interesting stat: the range of my marks was 32)

ECE 316: Probability Theory & Stats

In the previous offering of this course, students were required to write proofs. Luckily, during this offering, we weren’t required to do so. Up to the midterms, we covered combinatorics and basic Bayesian probability. The pace of the course was slow and the concepts were relatively easy. Our midterm average was around 80%, much higher than any other courses’ midterm averages.

However, once the midterms were over, vvvroooom, the pace accelerated.  Single, double, triple integrals raced by with conditional marginal probability quickly following suite. Our friend, the Jacobian matrix from MATH 119, made a cameo and we ended the term with some Brownian motion and spectral density functions. The latter part of the course was challenging and, as if it wasn’t already challenging enough, the final was designed to be extra difficult because our midterm average had been too high. Even the TA who wrote our final said to us it was difficult!

We were allowed to bring our own formula sheet to the final but that simply couldn’t compensate for the exam’s toughness. In fact, I didn’t even refer to the formula sheet because it proved to be of little use. I only needed to get 20% on the final but after writing it, I was left wondering if even 20% was too much to ask for. The exam was disproportionately hard….it was just too much!

Rating: 7.5/10 (the exam was tooo hard but the notes were excellent)
Lesson: Remember to study TA’s practice questions even if they seem unlikely to appear on the exam…Because one of them did.


ECE 327: Digital Hardware Systems

The professor for this course was very nice, knowledgeable, and clearly cared about the quality of his teaching (which was good). Many students gave him high ratings and my friend described him as “amazing”. I also liked the professor.

We also had a 4-person group project in which we implemented the Kirsch algorithm to detect image edges. I enjoyed the group project because …..drumroll please!……it was one of the only two school projects we’ve ever had that included more than two people!!! The other one was a report 4-people groups submitted last term.

Allow me to take a short moment to rant about the CE program.

There are many lectures and labs a week (in first and second year, we were in school for at least 30 hours/week), a lot of technical materials covered (some of which isn’t relevant for finding jobs), and the curriculum is so packed with courses that it’s virtually impossible to minor in another degree without delaying the graduation date.

We’re taught many technical skills but very little communication skills. We do have many labs, which are completed in partners, but aside from them, we have up to now almost no school group projects that requires working with three or more students. Almost all assignments and coursework could be done solo and without the need or encouragement to work with peers. Although we do learn about circuits and software development, we rarely practice building them in a team setting, where we could practice interacting with other members, negotiating, and solving conflicts together. I feel that by having very few group projects, our curriculum is imparting on students the idea that we can do things by ourselves without the need for working together. As a result, when students eventually find themselves working in group scenarios, any conflicts and setbacks may reinforce their belief that working in groups isn’t necessary, which would further exacerbate the conflicts and decrease their ability to work with group members.

Group projects are more than about building something complex, they are also training grounds for developing communication skills. 

During my coop terms, I have had the opportunity to interact with successful as well as mediocre software developers. The difference between the two is more than their technical capabilities, it is also their communication styles. The successful developer tends to speak up in meetings, supply new ideas, and work with other team members whereas the mediocre developer tends to keep to oneself and rarely contribute to the team dynamics.

I am beginning to feel that our current curriculum is putting us on the trajectory to become mediocre developers. By not promoting communication, the curriculum seems to be implying that increasing communication skills isn’t necessary.

Group projects are more than about building something complex, they are also training grounds for developing communication skills.  If they are not a part of our coursework, many students would not have the opportunity to engage in them. Sure, students can always practice their communication skills by joining clubs or working in groups during their co-op terms but many students don’t have time or the interest to join clubs nor do they actually participate in group projects during coop. As a result, I believe it is in students’ best interests that our curriculum contains more group projects to help us gain more experience working in groups.

The notes for this course were very good and it was nice that the professor posted past exams for us to practice upon. Nevertheless, for most of the course, I was pretty lost about what was going on and sometimes fell asleep in class. I think the reason is because I didn’t intuitively understand FPGAs and hardware components and had trouble connecting the dots. Furthermore, because I wasn’t interested in hardware and didn’t see myself working with FPGAs in the future, l wasn’t engaged in this course and was satisfied to receive any passing mark.

Rating: 7/10
Lesson from ECE 327:
It’s nice to work in groups and if the curriculum doesn’t offer opportunities to work in groups, then don’t bother relying on it to gain that experience. Look for other sources that encourage you to work in groups.

ECE 351: Compilers

I had already built an interpreter before beginning this course but knew that there was still so much to learn. I enjoyed hearing our professor recite a poem at the beginning of every class. The concepts were interesting, especially since most of them were new to me.

The labs were alright although I would have preferred if most labs didn’t depend on previous ones. However, some students like it this way because completing the labs then felt like completing a continuous project. Overall, I and many of my classmates enjoyed the course. If I could go back in time, I probably wouldn’t have skipped the lectures.

Rating: 8/10
Lesson from ECE 351: Depending on course and professor, some lectures deserve attending even if you feel too lazy to go to class.

ECE 380: Analog Control Systems

Here’s what I liked about this course:

  • The labs were kind of interesting and I had a really great lab partner
  • The occasional analogies between economics and this course were refreshing
  • Good notes

I enjoyed the idea of learning about feedback systems and how the output affects the input, which then affects the output that then affects the input, and so on. What I didn’t like about this course was that, even after having taken it, I still am not sure what this course was about! There were Bode plots, root locus plots, Nyquist plots, stable/unstable/first-order/second-order systems, and lots of math but at the end of the day, I didn’t see the purpose of this course. Why did it matter? How would it be useful? Perhaps other students saw its purpose or perhaps I would eventually come to understand its importance some day in the future. Nevertheless, after spending $1400 to take this course, I was still left wondering 1) what exactly it was that I learned, 2) how this course was relevant, and 3) when/why/where/how can I use the knowledge presented in this course in real life.

Rating: 5.5/10
Lesson from ECE 380: You can still do well in a subject without really knowing the purpose and applicability of the subject.

ECE 300A: ECE Practice

This was a weekly seminar designed to provide ECE students information relevant to their studies. I didn’t attend any seminars and so do not have any comments about it.

PSYCH 356: Personality

This was my second psych elective and like the previous one, PSYCH 101, it was amazing. Before enrolling, I audited a course about entrepreneurship and tried to enroll in a Management Science course about financial management but didn’t find them to be suitable learning experiences. I audited PSYCH 356 during its second lecture and almost immediately enjoyed it: the lecture was engaging, the professor was fun, and the course contents were (actually) applicable to my life. I was also very surprised by the large proportion of female to male students, which I believed, but could be wrong about, to be 5:1 because in all my engineering courses, the ratio between female to male students were usually 1:10. I wasn’t sure why but I did remember feeling a little self-conscious and slightly out of place during the first several minutes of the course. Luckily, this feeling soon went away.

This was the most interesting course I had taken in university so far. It helped me become more aware of my behaviours, how I developed them, and how to change them. It also showed me more about human nature and that despite our individuality, we all share certain fundamental traits and desires. In contrast with my engineering courses, which often presented us with specific formulas for solving problems, this course presented us with various overlapping theories and experiments to explain many nuances in human behaviour. It was refreshing to learn about a non-engineering subject. My highest mark was from PSYCH 356 and it was also the only course whose lectures I didn’t skip (hmmm, [sarcastically] maybe there’s a correlation between marks and class attendance).

Rating: 10/10
Lesson from PSYCH 356: Psychology is fundamentally about humans and there are scientific theories and actual empirical evidence that explain some of our behaviours.

Other Activities

Last term, I had skipped a couple days of lectures to practice answering interview questions. This term, I skipped a couple weeks to practice. Luckily, the practice paid off and I will be interning at a startup in Silicon Valley in May.

My sleep patterns were unusual this term. Let’s just say that I had mastered the art of pulling all-nighters, in full literal sense of the word. I am rectifying this situation and expect it to be solved soon.

I dedicated a lot of time towards practicing software development and completed two projects, each taking about two months to learn and develop. The first project, Keys ‘n Files, was a set of tools in which client programs collected user information and sent them to a server. Some challenges included interoperating C++ DLLs with C# to attach keyboard and event hooks, designing a state machine, learning React, and integrating with S3. The second project, WebServio, was a multiplexed I/O or a multithreaded web server (depending on configuration) that partially conforms to HTTP/1.1 and written in C. I built it primarily to learn C, read the RFCs, and work in a Linux environment and while building it, I gained a newfound appreciation for higher-level languages, like Java and Python. My goodness, who knew simple string manipulations could become so frustrating!


Overall, this term was very different from previous terms. The course materials were more interesting, more in-depth, and tougher to digest. I put a lot more effort into preparing for technical interviews, worked on more complicated hobby projects, and completed the term by attending a quarter of the lectures. This term was also more stressful than I had expected and there was a genuine chance of failing. Anyways, I’m happy that it’s finally over and co-op is starting.

Sharing is caring!

Leave a Reply

Your email address will not be published.