Software Engineering at the University of Waterloo

This post was inspired by a fellow software engineering student at UW. If you want even more detail than I’m providing here, check it out.

Last updated December 29th, 2013

The Courses

Here’s a quick list of the courses I’ve taken (the full curriculum can be found here):

First Term (Fall 2012) 1A:

  • CS 137 – Programming Principles

  • ECE 105 – Physics of Electrical Engineering I

  • ECE 140 – Linear Circuits

  • MATH 115 – Linear Algebra for Engineering

  • MATH 117 – Calculus I for Engineering

Second Term (Winter 2013) 1B:

  • CS 138 – Introduction to Data Abstraction and Implementation

  • ECE 106 – Physics of Electrical Engineering 2

  • ECE 124 – Digital Circuits and Systems

  • MATH 119 – Calculus II for Engineering

  • MATH 135 – Algebra for Honours Mathematics

Third Term (Fall 2013) 2A:

  • CS 241 – Foundations of Sequential Programs

  • ECE 222 – Digital Computers

  • CHE 102 – Chemistry for Engineers

  • SE 212 – Logic and Computation

  • STAT 206 – Statistics for Software Engineers

  • (elective) PSYCH 101 – Introductory Psychology

First Term:

I didn’t really know what to expect going into this term; people say your average will drop 10-30%. I found that that’s not true for everyone. You can drop a lot more, and you can drop less. It all depends on your work ethic, innate abilities, and willpower.

A quick disclaimer before I go on, any information here is only completely valid for the term I took it. If/when you take it, it may be slightly different. Your enjoyment and how much you get out of the course will also depend on the instructor. Also, my abilities and your abilities will be different. I try my best to speak to the average prospective student.

CS 137 – Programming Principles

Relevant xkcd:

Your standard introductory CS course. Covers big-O notation (read here for more info:, recursion, methods, sorting and searching, and of course pointers, since the course uses C. If you know any Java, or any other C-like programming language, you shouldn’t have too much trouble.

Many people in my class took notes on paper; I opted for writing on a laptop; I highly recommend doing this for both CS 137 and CS 138 for a couple reasons. You won’t have to type it up again to see what the code does, and you’ve got syntax highlighting so you can more easily read it.

Assignments: Enjoyable; they are paced reasonably well, and if you have a year or two of programming experience, you should be good. Working with pointers was really the only new thing for me in this course, coming from a Java background.

The assignments themselves are marked with an online judge called “Marmoset”. You submit your code, it’s graded based on a comparison between your output and the expected (correct) output and you are awarded points. You may submit as many times as possible until the time it’s due. The catch is as follows. First you start by trying to pass the public (easier) tests. You have unlimited tries for these, and you can submit as often as you want. Once you get these all correct, you move on to what are called release tests. You need tokens to try a release test. You have 3 release tokens and every time you attempt the release tests, you lose a token. The token regenerates after 12 hours. Once you pass the release tests, you get 100% on the assignment. If you don’t pass all the release tests, once the deadline arrives, you get whatever points you were able to get from the public and release tests that you were able to pass.

ECE 105 – Physics of Electrical Engineering I

Hahaha. Hahahahahaha…

This course is infamous for a few reasons. Despite being high school level physics content for the most part (just mechanics, no electromagnetism), there’s a couple reasons why people don’t like this course.

Mastering Physics: Weekly assignments with about 10 questions to answer. They are purely short answer with some multiple choice and true and false. This means there’s no place to show your work; it’s either right or wrong. However, you get 3 chances for each question (except for the true/false of course). The questions vary from super easy (plug into a formula) to moderately difficult. It’s not a big deal to miss the hard ones, the whole point of Mastering Physics is to force you to practice the course material.

The quizzes: these weren’t too bad actually, you spend most of the 2 hour tutorial listening to the TA and doing problems, and in the last 20 minutes, there’s a quiz. Take the time to learn the course material, try hard, and you’ll do fine on the quizzes

The mid-term and final: Unfortunately, our mid-term was 13 multiple choice questions (the questions weren’t actually terribly hard), which meant there was no chance for you to get marks for showing your work. You get one wrong, there goes a couple percent off your final grade. Study hard because the stuff you learn during the first half of the course will be used frequently during the second half. The final was pretty brutal. This dropped my mark/overall average a lot.

Fortunately, there was a nice bell curve of sorts (not necessarily a true Gaussian distribution, but some sort of normalization). Study hard in this course if you want to do well; you won’t be doing mechanics again for quite some time.

ECE 140 – Linear Circuits

Remember the circuits in grade 9 or 10 science? It’s like that, but harder.

You start off with the basics; what’s current, charge, power, what are their units, what’s electricity. Then basic circuits, Ohm’s law, some more advanced systematic techniques of solving circuits, capacitors and inductors, and finally complex numbers play a role in some pretty abstract concepts that I will likely never remember again. Oh and op-amps; those questions were fun.

I bought the textbook for this course. It’s got good practice problems, and you could very well just read the textbook instead of going to class (I don’t recommend that, it goes more in-depth sometimes and going to class is good for at least a few reasons…).

What I did in the second half of the course was simply pay attention in class instead of taking notes; I found I learned better this way because, at least for this course, drawing circuits and taking written notes and trying to pay attention and learn all simultaneously was a bit too much for me. Also my prof posted his lecture notes online, which were neater than the notes I would have taken (it’s pretty easy to mess up drawing a complex circuit, and it takes a while to erase).

You also have labs in this course. You get a partner and you make circuits on breadboards. The labs are fortnightly and you have to submit a small report a few days after the lab (nothing fancy; no procedure, hypothesis, or conclusion, just answer a few questions, graph some data, and talk about your feelings findings).

Midterm was easy (class average of 87), final was fair, harder than the weekly quizzes that were given during the tutorial though.

MATH 117 – Calculus I for Engineering

I wish I was your derivative… so I could lie tangent to your curves

Covers pre-calculus (limits, trigonometry), various types of functions (Heaviside, cosh(x)**), derivatives, integrals, applications of integrals.

If you took AP or IB (I didn’t), you’ll probably be fine since most of the course will be review and/or easy for you. If not, that’s fine too; integrals are objectively harder than derivatives (at least for first year calculus problems), but KhanAcademy, going to lectures, and office hours will help you a lot here.

The weekly assignments can be challenging at times; you will need to do a lot of practice but fortunately, these assignments are great practice for the mid-term and final. There’s also tons of resources for learning the content and there’s no shortage of calculus practice problems out there; in fact it’s not too hard to make up your own if you’re ever bored on the bus.

Complex numbers are also taught. You use them in a few courses, if you haven’t noticed yet.

**not a typo, cosh(x) is not the same as cos(x)

MATH 115 – Linear Algebra for Engineering

Vectors, matrices, and proofs, oh my!

Pretty abstract course; unlike most of the courses you’ll have this term, there are proofs in this course, and some of the content is too abstract to apply to things you’ve learned before. Fortunately we did some work with matrices in high school, but all of it was covered in this course within a couple weeks.

Once again, tons of resources on the internet if you need other places to learn the content, there’s also lots of practice problems out there. The course notes by Dan Wolczuk are great for this course.

“Assignments” took the form of weekly test-like pieces of paper. During the tutorial you’d sit down, collaborate with whoever you want, and answer several questions relating to the previous week’s content. It’s completely open book (and open laptop ;) ), so it’s not too bad. I had this tutorial Monday mornings, and I woke up late a couple of times. That didn’t help me very much.

SE 101 – Introduction to Methods of Software Engineering

Hard to describe this one. So here’s a funny unrelated comic

Yes, you’re going to have 6 courses but this one’s a half-credit (or well, a 0.25 credit, most courses you take at Waterloo will be 0.5 credits, so 0.25 credit courses are called half-credit courses; confusing, I know).

The majority of the course deals with things like ethics and professional engineering and rules. Some parts, like the software development life cycle were actually useful and interesting, so pay attention to that, but otherwise, the 4 quizzes we had were fairly easy.

Our final project had us using Scribblr robots (read: roomba clones). They have a few sensors on them and there’s a fairly simplistic API. Setup can be a pain depending on your computer. You code in python and get it to solve some problem (the problem itself is up to you). You also have to write a report and present it with your fellow group partners.

Second Term:

The subjects in this term are similar to first term’s, except the physics is about electromagnetism and integrals, not mechanics and breaking hearts.

CS 138 – Introduction to Data Abstraction and Implementation

Linked lists, queues, binary trees, linked lists, C++, object oriented development, and oh, linked lists.

If you know about any of these, the implementations of the ADTs (abstract data types) will be easier for you to understand. Once you know how to do one of them, and understand the concepts of pointers and the new features in C++ compared to C, you won’t have much trouble understanding anything in this course. All that’s left are the assignments.

The ADTs themselves are useful for technical interviews (more on this in a later post). Mostly everything you learn in C can be applied to C++.

The assignments here were more involved than those in CS 137. They were assigned every 1-2 weeks and once again use marmoset. I took notes with my com-poo-ter. Found it super handy, especially when studying those ADTs. I just type them up in OneNote, paste to vim for all its awesome vim features, and stare at the screen.

ECE 106 – Physics of Electrical Engineering II

Calculus-based electromagnetism – tons of fun, for some definition of fun

You don’t need much prior experience with electricity for this; but the more you remember from grade 12, the better. You’ll do Gauss’ law, Faraday’s law, Lenz’s law, Ampere’s law, Coulomb’s law, …

You should have a good understanding of how integrals work by the time you get here. They’re used frequently. You don’t actually need to memorize many formulas though. Most of the important physics formulae and integrals on the formula sheet which are provided with the tutorial quizzes, mid-term, and final.

Your enjoyment of this course will depend on a few things; how easy/difficult they decide to make the course, how comfortable you are with the idea of integrals, and how much practice you do. I’d recommend doing the practice problems out of the textbook; they’re super useful for the weekly tutorial quizzes.

Labs are also in this physics course. The content is very similar to what you did in ECE 140; you don’t really apply much of what you learn in class in the lab. They consisted of setting up some circuits, learning to use some new measurement tools, and writing a small report after the fact (fairly simple stuff, not a full report).

Last bit of physics you do for a while.

ECE 124 – Digital Circuits and Systems

There are 10 types of people in the world: Those who understand binary, those who don’t, and those who didn’t see a ternary joke coming.

This is the first course that actually kind of felt like an engineering course; there’s some design involved and the applications to the content you learn are obvious. You learn about binary, logical operators (AND, OR, XOR, etc.), and how to design various types of logic circuits. The powerpoint notes are great, but you’ll need to do a decent amount of practice. The textbook/assigned questions were at an appropriate level, but since they weren’t mandatory, you’ll really have to push yourself to actually do them.

This course also has labs (fortnightly, as usual). You learn VHDL along the way, a hardware descriptive language that’s used to directly manipulate the lights and whatnot on an FPGA board. The labs apply only basic knowledge from the course. It’s mostly fun and design and learning the syntax of VHDL.

The postlab reports here are a bit more wordy and open-ended than your previous labs. A couple pages with strict requirements on the formatting. The labs were worth a decent portion of your mark and were relatively easy, so I was happy about that. You get a partner for these labs too, so you’ll also have some practice coding together on one computer.

MATH 119 – Calculus II for Engineering

Insert calculus pick-up line here

Calculus II won’t be review for most people, at least for those who only know high school material (maybe you know Taylor series and Newton’s method). You learn multi-variable calculus (partial derivatives, basic limits, gradients, directional derivatives), approximations of non-polynomial functions with Taylor series, infinite series, and some vector calculus (weren’t on any tests for us). There weren’t too many proofs in this course, like some people might expect for a math course. Once again, there’s tons of places to find help if you need it for Calc II.

Assignments here weren’t too bad. Study the course notes well and you should be fine. You might need to look online for practice problems if you choose not to buy the textbook (I didn’t).

The final for this course was weighted 65% or so I believe. This was the highest I’ve experienced so far (common percentages were 50% and 64%). How this course is structured and marked will however depend on if they change anything for future students and/or how your fellow students taking the course are doing on the assignments/mid-terms.

MATH 135 – Algebra for Honours Mathematics

Quod erat demonstrandum

I could talk about this course for hours (or rather, write for several paragraphs). It was by far my favourite course and highest mark. You learn various properties about numbers (particularly integers), sets, primes, divisibility, and proofs. You learn how to think logically (you aren’t taught by the professor necessarily, it’s something you develop by doing proofs), and you get a taste of what math is really all about.

Weekly assignments are at a moderate difficulty; your difficulty with them will depend on how good you are at critical thinking. I found them to be very fair and enjoyable (maybe I’m just weird though…), and when I needed help, office hours were available.

There’s a large range of scores that people get in this course; it’s really hard to say how much or how little you need to study. I think a lot of it is actually natural ability. Practicing proofs and the content is absolutely necessary to do well in this course, but if you’re a genius, you won’t need as much of that as others. The proposition sheets provided on the mid-term and final were helpful for the subtleties in the theorems.

The mid-term and final were both good, but it’s hard to speak for others, especially in this course. You’ll just have to wait till you get here!

SE 102 – Seminar

Make sure you know how to make pizza for the midterm

This weekly seminar only actually ended up happening a few times during the term. It’s marked credit/no credit so there’s no evaluations to worry about.

Third Term:

2A was an interesting term. After going on my first co-op in Waterloo, I returned to school for the Fall 2013 term. Second year is typically where the various engineering programs start to diverge more and more since the courses become more specialized.

CS 241 – Foundations of Sequential Programs

Probably one of the most enjoyable courses thus far. The course is extremely well-structured and the applications to the things you learn are immediately obvious.

The course starts off with some tedious (though not too tedious) work with a subset of MIPS, which is one of the many types of assembly languages out there. Eventually you move to compiler design which made me appreciate how ‘deep the rabbit hole goes’. That is, there are several steps that must be taken before an idea in your head can become a reality on a computer, and thanks to thousands of people who came before you, you can do all these steps in a matter of minutes.

The coolest thing about the course is that the assignments are directly connected to each other as well as to the course content. By the end, if you complete all the assignments, you’ll have built a compiler for a very very small subset of C++.

This course is probably the most important one I’ve taken with regards to my profession. This fact will probably change by the end of 2B.

ECE 222 – Digital Computers

Another in a series of hardware courses. This course was more interesting than I initially gave it credit for. I’m definitely at fault here; it was hard to deal with morning classes for me this term.

At any rate, I learned a lot of useful info from this course, most notably, how to design a cache, memory management, and memory pipelining. I’d definitely like to continue learning about this stuff, whether as part of a course or on my own.

The assignments were not mandatory for my class, but they were very helpful. Be careful not to fall into the trap of not doing the assignments though. The labs required you to program an ARM Cortex-M3 processor to perform increasingly complex tasks.

  • CHE 102 – Chemistry for Engineers

To be continued…

  • SE 212 – Logic and Computation

To be continued…

  • STAT 206 – Statistics for Software Engineers

The only stats course you’ll have to take as a software engineer. Statistics is of course very important in various sub-fields of CS, like machine learning. Also, if you took data management in high school, many parts of the course will be familiar. Probability and statistical distributions are the main focuses of the course.

Unfortunately, by the end of the course, I felt I did not have a thorough understanding of the meaning of some of the statistical distributions we studied. Much of the course required memorization of unintuitive formulas. I believe this course, which is a combination of STAT 230 and STAT 231, is too compact to provide a sufficient explanation of all the concepts covered. Proofs were few and far between and too abstract for the average student to relate the concept to the real world.

Once again, no mandatory assignments here. A common complaint of the course was a lack of homework problems which probably contributed to the aforementioned problem. Unfortunately, we were kinda swathed this term with the whole 6 courses and non-trivial assignments due every week and JobMine and exams and …, so who knows if I would have had time for them anyway.

  • (elective) PSYCH 101 – Introductory Psychology

To be continued…