Teaching

Courses

After completing my Ph.D. at the University of Toronto, I worked in industry before returning to academia. That experience gave me a different perspective on software engineering education, especially on the distance that can exist between learning individual technologies and understanding how they come together in real systems.

This perspective continues to shape how I design my courses. I design lectures and assignments to help students build a solid foundation in the technologies and concepts at the core of each course. Along the way, I also use examples and discussions to draw attention to the ideas behind the technologies themselves: why a particular abstraction exists, what problem it is intended to solve, and what trade-offs come with different approaches.

Projects provide a broader setting in which students can put those foundations into practice. Within the practical limits of a course, I design them to incorporate several aspects of engineering work: making and justifying technical decisions, integrating components into a coherent system, evaluating and verifying its behavior, collaborating with teammates, and communicating their work clearly. A course project cannot reproduce the full complexity of professional engineering, but it can give students meaningful opportunities to practice these skills in a more open-ended and integrated setting.

The growing capability of AI-assisted development tools is also changing what meaningful technical practice looks like. Rather than treating AI simply as something to allow or prohibit, I am interested in how learning activities can be designed so that AI supports exploration and problem solving without removing the thinking that gives the activity educational value. This has led me to think more carefully about where understanding, judgment, verification, and explanation should appear in assignments and projects, and how the role of AI may differ depending on what a particular activity is intended to help students learn.

I develop and refine the content, assignments, projects, and learning activities for the courses I teach, adapting them as technologies change and as I learn more from each offering. I often think of course design as a form of system design, where lectures, assignments, projects, assessment, tools, collaboration, and feedback interact to create a coherent learning environment. Building and continually refining that system is one of the most rewarding aspects of my teaching.

ECE1724: Advanced Web Development: React Ecosystem and Modern Frameworks
Winter 2025, Winter 2026, Fall 2026

A graduate-level course on modern full-stack web development. Students design and build complete web applications spanning frontend, backend, and data layers using technologies such as React, TypeScript, Next.js, relational databases, and modern development frameworks. Alongside learning these technologies, students practice integrating them into coherent applications and begin considering broader questions of application architecture, technical choices, and how to verify that a system behaves as intended.

ECE1778: Creative Applications for Mobile Devices
Fall 2025, Winter 2027

A project-based course on modern mobile application development using React Native, Expo, and TypeScript. Students design and build cross-platform mobile applications while learning core concepts including user interfaces, navigation, state management, notifications, backend integration, and deployment. Through progressive assignments and a team project, students gain experience integrating these pieces, developing features iteratively, and turning an idea into a coherent and functional mobile application.

ECE1779: Introduction to Cloud Computing
Fall 2025, Winter 2026, Fall 2026

A graduate-level introduction to cloud-native systems and modern cloud computing. Students work with containers, orchestration, serverless computing, distributed state, and edge platforms while designing, deploying, and evaluating complete cloud applications. The course focuses first on building a practical understanding of these technologies, while the project provides a setting for students to begin reasoning about system behavior, architectural choices, scalability and reliability trade-offs, and the evidence needed to evaluate technical decisions.