4A CS Course Review/Term Retrospective
Another term done! Aside from 2B, 4A was definitely the most memorable term I've had in CS so far, so I have quite a bit to write about.
- CS 370 - Numerical Methods: Basically ECE 204 but taught infinitely better. This course mainly covered numerical problems and some corresponding algorithms to solve them (e.g. time-stepping methods for differential equations, discrete Fourier transform + Fast Fourier Transform, etc.). The assignments were quite interesting, as they all had an application of course content through coding questions. One problem that was particularly interesting to me involved separating a sound clip with combined high and low frequencies into their individual components, as it was similar to a project I had in mind when starting out with programming in first year. The exams were also reasonably fair, and I ended up doing decent without studying too hard.
- CS 451 - Data-Intensive Distributed Computing: Big data. This course went over how to process and analyze huge amounts of data with various distributed computing frameworks. It covered big data in the context of text processing, graph processing, relational data, and more. The assignments for CS 451 involved programming in Java via the MapReduce framework and Scala via Spark. They were mostly straightforward, as I finished most of the assignments within a day or two. This course was actually the first course I intentionally skipped some lectures for, as the content from the slides was relatively easy to understand without going to lectures. As well, there was a series of online lectures for the course from Fall 2021 which I ended up gravitating towards a lot while studying. A big perk of this course was the fact that there was no midterm and the final was weighed a lot lower compared to assignments, so I didn't need to stress too much about CS 451 overall.
- CS 454 - Distributed Systems: Systems design. The course started out with the basics of how machines in a distributed system communicate (RPCs, RMI, message passing) before jumping into how to actually design a system that could scale to millions of users. Next, the course covered key concepts to consider in distributed systems including mutual exclusion, synchronization, and replication. Finally, there were several lectures covering the details of specific protocols and systems (Raft, Chord, DynamoDB, Google File System). There was a combination of written and programming assignments in this course. The written assignments generally asked about concepts covered in the lectures, which made them relatively straightforward. The programming assignments involved the implementation of a distributed file system in C++ via a library called libfuse. While the first programming assignment was easy due to being extremely repetitive (i.e. setting up a client to make RPC calls to a server), the second programming assignment was quite tough, as the caching behaviour to implement could theoretically be done in many different ways. The second programming assignment was the first to make me nearly use my 48-hour absence, as I started a week before it was due and still had a failing release test on Marmoset 24 hours prior to the due date. In addition to an implementation of client caching, the assignment also required an accompanying design document, which I did not start until the day before the due date. Luckily, I managed to get full marks on the programming portion of the assignment by intentionally returning incorrect error codes to determine the exact locations my code failed in the test environment. While the lectures for this course were good, a lot of the concepts discussed didn't make sense to me right away, which meant that I had to spend a good amount of time reading the corresponding papers or textbook sections on a topic in order to get a full understanding of what was covered. Regardless, I really liked the prof for this course, as he was quite funny and good at keeping the class engaged. One moment in class I remember clearly was when the prof was giving an example on the consistency models possible in a distributed system and mentioned the relevancy of the topic to the propagation of someone's feet pics on the internet. Similar to CS 451, this course had no midterm, and while the final for CS 454 was probably the one I was most stressed for, it turned out to be rather reasonable. Overall, this course is definitely one of my favourites from my undergrad, as its content is extremely applicable and the teaching quality was great.
- CS 456 - Computer Networks: How the internet works. CS 456 went over most layers of the network stack and the details around them. Pre-midterm, the course covered the services of the application layer, including HTTP, SMTP, DNS, and more. As well, the course touched on various protocols for reliable delivery in the transport layer. Post-midterm, the course covered the remainder of the transport layer, which mainly involved TCP and congestion control protocols. Next, the data plane and the control plane of the network layer were covered (i.e. packet matching, IP addresses, routing). Finally, the course ended with some details on protocols in the link layer (i.e. self-learning, CSMA). The first two assignments for CS 456 required implementation of protocols for delivering packets between a sender and receiver. Since any programming language could be used, I ended up using Rust for both assignments, which was definitely an interesting experience. The final assignment involved using mininet to program switches and routers within a custom VirtualBox VM, which was also an interesting challenge. The exams for CS 456 seemed fair, as many of the questions were similar to a site with online interactive problems corresponding to the course textbook. While I think this course was solid overall, the content is definitely something I'll be reviewing for the future.
- CS 453 - Computer Security: I ended up dropping CS 453 because of the combined workload of my other courses and co-op interviews. While it seems like the course has a lot of interesting topics and no exams, I probably won't retake this course, as the first assignment seems like a massive time sink and there are other topics I am more interested in.
Compared to my previous terms in UWaterloo CS, my 4A term felt a lot more fun when it came to the actual courses. I feel that there were three main reasons for this. Firstly, the content in my courses had actual application to the work I am looking to do full-time in software engineering, which obviously made me a lot more motivated to understand the material well. Moreover, for the majority of my classes, I had at least one friend in most of the lectures I went to. While I was admittedly more distracted at times, having another person to discuss the content with went a long way in making my courses more interesting. The experience was somewhat similar to being back in ECE, in the sense that I knew plenty of people who were actively interested in discussing course content further. Finally, my concern about grades dropped to the point such that I didn't feel stressed for my exams. One clear instance of this was during my CS 370 final. While I was ultimately unable to fully complete a question or two, I walked out of the exam room relatively apathetic about the exam. Contrasting this to myself in ECE, I would likely be panicking about not getting a 90%+ in a course. As well, I noticed that I simply didn't care about going through every practice exam possible for a course. In a strange way, not caring about grades as much helped me enjoy the process of learning course material a lot more.
A major part of the beginning of this term was the WaterlooWorks co-op process. Initially, I was extremely nervous about finding a co-op for summer given the state of the software engineering industry and the fact that I had not gotten any interviews from applying externally. However, it came as a pleasant surprise that I received more interviews in cycle 1 than I had throughout the rest of my co-op terms combined. Given that I hadn't interviewed through WaterlooWorks for almost three years by then, my first several interviews went rather poorly. I realized fairly quickly that my main struggle wasn't necessarily on coming up with solutions to the technical questions I received. Rather, I screwed up by forgetting to fully show all details and edge cases of my approaches. One particularly tragic case of this was the in-person interview I had with Bloomberg. For the first question I was given, while I came up with an algorithm relatively quickly, I had to be reminded of several of the edge cases by one of the interviewers. Although I was able to correct this in my answer for the second question, I was ultimately not ranked for the role. Thankfully, I was able to realize my failings early on and improve my communication throughout the interview cycle, which eventually led me to getting offers for three different roles. Overall, while interviewing started out rough, I'm hoping that all the practice from the interviews this term will be meaningful for my final co-op job search.
On a completely separate note, I started training in Muay Thai this term. Initially, I went to classes because a friend convinced me to join. However, as the term went on, I found that I enjoyed learning the various techniques and combinations more and more. I enjoyed it to the point that I bought a membership for the gym that was running Muay Thai classes at UWaterloo and went to several classes throughout the exam season. While I mainly went to class to learn the different kinds of strikes, I was surprised by the amount of fitness training which was also involved. The warmup workouts for the fundamental-level class were likely the most challenging workouts I've participated in since high school (though admittedly, this isn't saying much given my fitness level). Regardless, I want to continue training in Muay Thai for the foreseeable future. While I don't know how long I'll be interested, for now, I would say I want to reach a level of proficiency where I can perform fast kicks well (it looks really cool 😎).
My 4A term was a super solid term overall, as I was able to enjoy my classes a lot more, improve at interviewing, and pick up a new interest/skill. Now I'm hoping that my 4B term will be as if not more interesting!