October 2019 Instructor of the Month, Sarah Nadi

Canada Research Chair and assistant professor in the Department of Computing Science, meet October Instructor of the Month Sarah Nadi.

Andrew Lyle - 01 October 2019

Sarah Nadi's research focuses on developing techniques to improve software reuse-a field of study where she is making software development better, faster, and safer as the Canada Research Chair in Software Reuse. Nadi, assistant professor in the Department of Computing Science, is also passionate about improving the classroom with her teaching. Meet our October Instructor of the Month, and hear from her on the importance of perseverance, practicing the fundamentals, and what makes software development challenging and exciting.


What do you teach?

I teach CMPUT 201 Practical Programming Methodology, where students learn to work in a UNIX operating system environment and program in the C programming language.

I also recently started teaching CMPUT 402 Software Quality. The course focuses on ensuring quality in all stages of the software development cycle, with a particular focus on software testing. Students learn about the various kinds of testing and quality assurance tools they can use.

Why should people learn about this subject?

An important part of CMPUT 201 is learning about memory management-that is, how "space" in the computer's memory is reserved for the different parts of a program, how that space differs depending on the type of variables in a program, and how a programmer can access that space.

Knowing how a program works in the background helps developers write more efficient programs and understand why a program behaves in certain ways. Such skills are especially important if you work with smart devices that are now pervasive in our lives, including thermostats, automotive control systems, and medical devices.

In CMPUT 201, students also get exposed to more practical software development, where they learn how to decipher software requirements and implement those requirements in bigger programs than what they were used to in their first year. I also expose students to version-control systems, which are systems that track all the changes you make to a program, as well as continuous integration tools, which allow you to automatically run certain checks and tests on your code with every change you make-both of which are must-have skills for any employee in the field nowadays.

As for CMPUT 402: anyone who plans to write software should learn about software quality. Software systems are now in all the products we use, including safety-critical systems such as airplanes, cars, and medical devices. As a consumer of these devices, someone who relies on the safety of the system, you hope that someone has properly tested them and ran rigorous quality assurance checks on them. Students learn about techniques and tools to help achieve that.

What's the coolest thing about this field?

The truth is, you can never provide a 100 per cent guarantee that your software is free of any bugs. Even formal techniques that try to mathematically prove that a system adheres to certain requirements or is bug-free are often impossible in practice, given the size and complexity of most software systems. One of the main challenges is that it is impossible to know all possible combinations of events that may happen when the system is deployed in the wild.

While this paints a scary picture, it's also quite exciting because there are always new advances in terms of techniques to analyze programs, write better tests and measure their quality, run tests in a faster or smarter way to allow scalability, and better develop practices to catch bugs early when they are cheaper to fix. We talk about some of these state-of-the-art techniques in CMPUT 402.

What was your favourite learning experience as an undergrad? How do you incorporate that experience into teaching your students?

I enjoyed being challenged and learning how to learn. There's a very satisfying feeling when you start out knowing nothing about a topic but slowly start to understand it more. In the process, you realize that you might need to go out and seek information on your own. I think this skill is important and transferable to any job a student may eventually pursue, and I truly appreciate my undergrad profs allowing us to grow that way.

Influenced by those experiences, whenever students come to me during office hours and they are stuck on a problem, instead of giving them a direct answer, I try to show them how to search for information and how to break down a problem into smaller pieces such that they learn how to solve similar problems in the future.

What do you feel is the most important piece of advice you give to your students?

Perseverance is sometimes more important than being "naturally smart." While some subjects may come more naturally to some students than others, I truly believe that as long as the topic interests you somehow, you can become good at it with hard work, practice, and persistence.

What would people be surprised to know about you?

I've been doing 6 a.m. CrossFit classes for about two-and-a-half years now. I'm still nowhere near what the other people in that class are capable of doing, but it's definitely one of those things where perseverance works. I could barely lift an empty bar when I started!