Software Engineering at the University of Waterloo

Having recently graduated from the Software Engineering program at the University of Waterloo, I thought that it would be helpful to share a few of my perspectives on the program. As someone who has completed the program, hopefully I can provide some additional information that can help you make a decision if you’re considering to apply.

Since you can already find plenty of information about application and degree requirements on the university’s website, I’ll focus on the aspects that are not as well-covered.

Please also keep in mind that these are my own opinions and that they are not endorsed by the Software Engineering program nor the University of Waterloo.


Software Engineering, Computer Science, and Computer Engineering – What’s the difference?

This was often one of the most common questions I was asked when volunteering at the university’s open houses. While I can provide a comparison on a few points between the Software Engineering program and the others, keep in mind that my thoughts are from the perspective of a software engineering student and will be biased. This shouldn’t be a surprise; unless someone has taken all three programs, it would be difficult to provide a bias-free comparison. To get more of a complete picture, I would encourage you to look for comparisons written by students in the other programs as well.

What you learn

At a high level, the software engineering program is a “mix” between the computer science program and computer engineering program with three core software engineering courses added on top. Effectively, this means that as a software engineering student you take the same or similar1 core courses as a computer science student (e.g. honours algebra, logic, algorithms, operating systems, compilers, data structures, and so on) as well as a few of the core courses a computer engineering student takes (e.g. physics, chemistry, linear circuits, digital circuits, digital computers, and feedback control). The program is housed under both the School of Computer Science and the Department of Electrical and Computer Engineering, which means you take these courses from the respective faculty members in each department. So if you’re interested in the mathematical underpinnings of computer science as well as getting an overview of the hardware details about a computer, this is a great program to get a nice mix of the two.

In my opinion, I think this is one of the best parts of the program and is something that is easily taken for granted. To really understand how software runs on the computer it’s not enough to only explore high level computer science concepts. You really need to be aware of how computer hardware works; more or less this involves learning about how a CPU actually executes machine instructions. This is especially important when you’re looking to understand performance issues with your code.

As a part of the software engineering program you get the best of both departments from faculty members that are experts in these respective fields. As a computer science student, you may not necessarily get the opportunity to learn these topics from someone with a deep understanding of computer hardware. Conversely, as a computer engineering student, you may not necessarily get the opportunity to learn core computer science topics from someone with a mathematical background.

Cohorts

Software engineering, like computer engineering but unlike computer science, is a cohorted program. This means you take your core courses with the same classmates until graduation. The really great part about this is that you get a chance to develop friendships with the people in your class, which can be quite helpful when the program gets tough. Your class will feel like a really big and tight-knit family.

The downside with this is that if you fail a term (it’s uncommon, but it does happen) you may have to wait another year to join the next class. This happens when the courses you need to clear are not offered until the following year. This isn’t as much of a problem in computer science because it isn’t cohorted.

Another downside is that, in class, you will not get much exposure to students outside of your program in your earlier years because nearly all of your courses will be core courses. In your upper years, as you take electives, you will get to take classes with students across the university.

Co-op opportunities

Another common question is whether or not students in these different programs have different co-op opportunities. From the perspective of co-op, there is no difference in the kinds of opportunities available between students in these three programs. Throughout my co-op journey, I’ve had peers in all of these programs. If you want a certain role, your program of study will not be a limiting factor.

The only material difference I can think about is that of flexibility. In engineering your schedule is more restrictive because you are attached to your cohort. However in computer science, this isn’t the case. Effectively this affords you more freedom in switching around your co-op streams, which allows you to move around your co-op terms. Some students choose to do this to be able to do their co-op in the summer when there are more opportunities available, for example.


Unwritten benefits

Software engineering is a great program, and there are some unwritten2 benefits too. As a software engineering student you get access to private study spaces on campus from first year (the software engineering lab and lounge) and you eventually get access to an upper year lab in your 3B term. Not many other programs offer this kind of on-campus study space to their students from first year. If you like to study on campus, sometimes the libraries can be quite crowded and the software engineering labs are a great alternative.

Additionally, since the program is quite small (each cohort is about 120 students), it’s a lot easier to get access to your academic advisors—you can often just walk right in to their offices! For larger programs, it’s tougher to get access because there are likely more students who want access too. I’m not sure if this is the case with computer engineering, but computer science advisors are often quite busy at the beginning of a term when everyone is still trying to adjust their class schedules.

And of course, as mentioned previously, you get exposure to faculty members from both mathematics and engineering. While you can always reach out to faculty members across the university, getting exposure to them through your courses is really valuable because you may discover interests you have that you otherwise wouldn’t have without the exposure through your courses.


What’s not so great

At the same time, I think it’s important to bring up some of the not so great parts of the program. Everything has its own set of pros and cons, and the software engineering program is no exception.

In my opinion, one of the downsides is the heavy workload. And don’t get me wrong, the intensity of the program is undoubtedly valuable as it helps prepare you to deal with stressful situations in the future. Not only that, but it helps push you forward and you can often be surprised at how much you can accomplish. But the speed and intensity of the program’s workload can keep you from doing much of anything else during your school terms. And that isn’t always great. A big part of university should be discovering what you like and what you’re passionate about. It’s also a time to reflect on the stuff you’ve learned, how it fits in to the bigger picture, and how you can draw connections between everything new you’ve been exposed to. But when you’re constantly working towards the next assignment deadline or studying for the next exam or preparing for your next interview, it’s hard to have that time for yourself. Your school terms speed by really quickly as a result. In all fairness, however, I don’t think the computer engineering nor computer science programs are any different in terms of workload. All three programs will require a lot of work.

As a software engineering student, you also have less flexibility in the courses you take. This can mean that you may end up being forced to take a course that you don’t enjoy, or wouldn’t have chosen otherwise. For some people this may be a deal-breaker. In contrast, the computer science program offers you some more flexibility as you get more slots for electives. The computer engineering program, however, is similar to software engineering in that the program is also not as flexible.

The constant job search while at school can be tiring and sometimes discouraging. This isn’t something that is unique to software engineering; it happens in many co-op programs. Because your program is cohorted, you’ll be searching for your next co-op job with your classmates. This encourages everyone to help each other improve their resumes and interview skills. But at the same time this can be discouraging for some students, as they may not be happy with their outcomes when compared to their classmates.3

Finding a co-op placement at first isn’t easy either. The university publishes a high statistic for the percentage of students that are employed on a co-op term. But the percentage is finalized at the end of the co-op search process, which is four weeks into the co-op term. If you found your placement during the first month of the co-op term, you’d also be included in that number. That said, the software engineering program has one of the highest co-op employment rates compared to other programs with co-op at the university.

Going on a co-op term every four months also means a lot of moving. You definitely get used to it after a couple of terms and learn how to pack light. While going on a trip every four months to start a new co-op placement is quite exciting, it does get tiring after awhile. While you’ll usually have a break of a week or two between terms, you may have a break as short as a weekend—keeping you constantly on the move. But this is also a good thing too; these experiences prepare you to tackle a lot more in the future.


Overall

Software Engineering is a phenomenal program at the University of Waterloo. I think the combination of academics and co-op helps give you a ton of perspective. You’ll walk away from the program with a lot of insight into life as a university student, life as a member of the workforce, and the state of the software industry. You’ll also get a lot of life experience in terms of moving, finding housing, learning to do your taxes, and learning to invest your earnings. Many students also graduate debt-free because they were able to finance their education using their co-op earnings. Overall at the end of the program, you’re in a great position to make an informed decision about what you want to do after graduating be it returning to school for graduate studies, working full time, or something else.

Lastly, you’ll meet amazing people in your cohort that will undoubtedly go on to do great things. It sounds cliché, but the program really does attract some of the brightest and most capable people your age. Being a part of the program to get to meet and form connections with everyone else is reason enough to consider the program.

If you have any other questions about the program, I’d be happy to answer them! Feel free to reach out to me via Twitter, email, or comment below.


[1] You will cover pretty much the same core concepts as students in computer science. Some of your courses will be the exact same as computer science students (i.e. same course code). Others will be a special software engineering version that aims to cover the same or similar content as the computer science version (e.g. SE 212 Logic and Computation versus CS 245 Logic and Computation).

[2] Technically these benefits are not all "unwritten". Perhaps just not as well known.

[3] It's important to note that you should not be judging your own success by comparing your co-op placements to others' placements. It's an easy mindset to develop, but not a healthy one.