Teaching

Courses that I taught, participated in, and enjoyed.

As an Instructor

Term Course Title Institution
W24 ECE 459 Programming for Performance University of Waterloo
W23 ECE 459 Programming for Performance University of Waterloo
S22 INFO8110 Operating Systems Design Conestoga College
W22 PROG8130 Data Structures & Algorithms for Embedded Programming Conestoga College
W21 EECE2617 Embedded Operating System Development Conestoga College
W21 INFO8110 Operating Systems Design Conestoga College


As a Teaching Assistant (TA)

Course Title Institution
ECE 459 Programming for Performance University of Waterloo
ECE 454 Distributed Computing University of Waterloo
ECE 356 Database Systems University of Waterloo
SE 350 Operating Systems University of Waterloo
ECE 254 Operating Systems and Systems Programming University of Waterloo
ECE 252 Systems Programming and Concurrency University of Waterloo
ECE 155 Engineering Design with Embedded Systems University of Waterloo


Course Descriptions


ECE 459: Programming for Performance

Profiling computer systems; bottlenecks, Amdahl’s law. Concurrency: threads and locks. Techniques for programming multicore processors; cache consistency. Transactional memory. Streaming architectures, vectorization, and SIMD. High-performance programming languages.

ECE 454: Distributed Computing

Principles of distributed computing; architectures and middleware; servers, processes, and virtualization; upper-layer network protocols, interprocess communication and remote procedure calling; concurrency, synchronization and distributed algorithms, dependable distributed systems and fault tolerance.

ECE 356: Database Systems

Data models, file systems, database system architectures, query languages, integrity and security, database design.

SE 350: Operating Systems

This course is an introduction to the fundamentals of operating systems design and implementation. Topics include processes, threads, concurrency, synchronization, scheduling, memory management, file systems, device management, and security.

ECE 254: Operating Systems and Systems Programming

Concepts of operating systems and systems programming; utility programs, subsystems, multiple-program systems; processes, interprocess communication, synchronization, and concurrency; memory management, segmentation, and paging; loading and linking, libraries; resource allocation, scheduling, performance evaluation; I/O systems, storage devices, file systems; protection, security, and privacy.

ECE 252: Systems Programming and Concurrency

Processes and threads (pthreads); system calls; concurrency (semaphore, mutex, monitors, and barrier synchronization); user-level memory management. Performance and correctness of concurrent systems. Deadlock detection and recovery; file systems

ECE 155: Engineering Design with Embedded Systems

Introduction to embedded systems, review of engineering design and analysis principles, software development life cycle, integrated development environments, use of software requirements and specifications, unified modelling language and documentation, event handling, simulation, project management, project scheduling, testing, verification, and maintenance considerations

INFO8110: Operating Systems Design

This course performs an in-depth study of the organization of operating systems for various computer platforms. Aspects covered include process scheduling, process synchronization, multi-process computation, deadlock avoidance, and file system organization and integrity.

PROG8130: Data Structures and Algorithms for Embedded Programming

This course emphasizes software design and implementation that make use of efficient and effective data organization. Essential data structures are discussed, analyzed, and implemented in the context of embedded software development. Algorithms are studied and implemented. Efficiencies and costs of selected algorithms are evaluated.

EECE2617: Embedded Operating System Development

Students will adapt and manipulate an operating system and its custom applications on embedded hardware taking the following topics into consideration: design, analysis, testing, security, fault tolerance, portability, documentation, architecture issues and device drivers.