Favorite courses at University of Waterloo

Now that I've graduated, I think it's time to reflect on some of the good courses that I've taken.

Math 145 (Advanced Algebra 1)

A slightly better name for that course would have been Introduction to Number Theory. This was by far the most interesting math course I've taken at UW. There was very little brute force work involved in the course since most problems involved proofs rather than straight forward calculations. The problems were challenging enough to be interesting, yet easy enough to be solvable within a reasonable amount of time.


CS 241 (Foundations of Sequential Programs)

This may come as a surprise to some, but I found this course to be my most challenging course taken at UW. The first few weeks of the course were relatively easy though - we learned assembly and some basic computer architecture(mostly about stack organization and registers).

The remainder of the course proved to be much more difficult. We learned about regular expressions, DFAs and context free grammars. All of that was new to me at the time and to be honest I had trouble understanding that material at first.

The last part of the course involved learning scheme programming language. It wasn't as interesting to me; however the scheme assignment was pretty fun(I remember solving one of the problems during sleep).

The main assignment of the course was to implement a compiler for a simple programming language. It was a great assignment; I really enjoyed it. It was after I completed this assignment that I decided to take the much dreaded CS444(Compiler Construction) course. More on that later.

CS 360 (Theory of Computation)

People either love this course or hate it. I loved it. Most of the problems involved rigorous proofs, often using induction. My solutions often spanned many pages(I tend to write unnecessarily long proofs). During the course we digged deeper into regular expressions, DFAs, context free grammars and learned about Turing machine. During the last part of the course we were introduced to the notion of solvable/unsolvable problems. Unfortunately the course has changed since I took it; i'm not sure about the specifics of the change but the course doesn't appear as be as interesting anymore.

CS 354 (Operating Systems)

This was my first course involving a big programming assignment. We had to implement an operating system based on NachOs. It was during this course that I was introducted to all-nighters. During the course we learned about process scheduling, virtual memory, file system and various other operating system related stuff.

Since I took the course it was merged with Concurrency course and renamed to CS350. From what I undestand, the course became a lot easier as a result of that change.

CS 452 (Real Time Systems)

Arguably the most challenging course at UW. There was even an article about the course in Toronto Star.

I was looking forward to that course since the 2nd year of university. The course involves implementing from scratch(in a group of 2) a real time operating system for i486 processor and then writing an application for controlling trains(all within 3 months). Needless to say taking this course requires a lot of dedication and work.

Implementing the operating system was not too difficult and we've done it successfully. Writing the application for controlling trains was a different story. We spent about a month working on it 10-12-16 hours a day. Unfortunately it wasn't enough and our application wasn't nearly as good as we had hoped.

Nevertheless it was an awesome learning experience, and I would recommend this course to anyone who enjoys challenging programming.

CS 444 (Compiler Construction)

This course involves implementing(in a group of 3) a compiler for a subset of Ada programming language.

The first assignment was relatively easy, but not very interesting. We had to fix the grammar for the language, then implement a lexer and a parser. The greatest strength of our parser was error recovery(thanks to Sergey who've implemented it within 2 days of hard work).

Second assignment was very tough and time consuming. It was also extremely interesting since we had make a lot of non-trivial design decisions. I feel that it was one of the best assignments I've worked on while at UW.

Third assignment wasn't as difficult as the second one. We quickly implemented about 70% of the requirements and then.. then I left to Montreal for a week and Sergey lost interest. Only Thomas continued to do work. Everyone's interest resurfaced on the day of submission; it was really fun finding and fixing bugs 5 hours before the deadline. At the end we submitted a relatively decent compiler which unfortunately lacked support for exceptions and nested procedures. In addition to that, the compiler had a curious bug with array indexing. Oh well. We ended up getting a decent mark.


So there you go. These were were my favourite courses taken at UW.

Comments

Popular posts from this blog

The wonders of photography...

Writing old-school style: With a pen and paper