I love teaching. I've always taken to mentorship positions, even in undergrad and high school. Since becoming a grad student, I've had the privilege to be involved as a teacher in several classes and have enjoyed doing so immensely. My goal as an instructor is to connect students to the real-world, practical experience of engineering.
In Fall 2020 I began teaching full-time as an Assistant Professor of Instruction in the Computer Science Department at Northwestern University. My teaching focuses on the "computer science systems" domain, from entry-level courses to more senior, in-depth courses. Recent courses include:
- CS211: "Fundamentals of Computer Programming II"
- An introduction to C/C++ and command line
- CS213: "Introduction to Computer Systems"
- An introduction to a programmer's perspective on computer systems
- CS343: "Operating Systems"
- An in-depth view of operating system design and abstractions
- CE346: "Microprocessor System Design"
- An introduction to microcontroller-systems software and hardware
- CS397/CS497: "Wireless Protocols for the Internet of Things"
- An in-depth exploration of wireless protocols used for Internet of Things technologies
Prior course materials for my classes are publicly available.
In Fall 2019/Winter 2022 I was on the market. I was focused on teaching positions including teaching faculty at larger R1 institutions and tenure-track faculty at smaller teaching-focused institutions. Typically my applications were to the Computer Science departments, but occasionally to Electrical and Computer Engineering departments as well.
All of my application materials are publicly available including my teaching statement, research statement, and diversity equity & inclusion statement. Some of this varied slightly from institution to institution. Also included are my cover letters and the build system to generate all documents.
Below are other teaching experiences from before I started as a faculty.
Instructor - Great Ideas in Computer Architecture:
In Summer 2019, I had the opportunity to be an instructor for the introductory computer architecture and computer organization class at Berkeley, CS61C. The course is the first hardware class that many computer science students take and covers assembly, pipelined processor design, caches, and parallelism. I presented material on RISC-V assembly, digital logic, data-level and thread-level parallelism, and I/O.
As a summer course, we covered the material at double speed (8 weeks for a normally 16-week course), and the course had approximately 200 students enrolled, with one third of the population international students. We also had a large course staff to help with the load: three instructors, eight teaching assistants, eight tutors, and ten academic interns. Managing this staff and making sure that the course progressed smoothly was a great learning experience for me.
TA - Introduction to Embedded Systems:
In Fall 2018, I was a graduate student instructor for EE149: Introduction to Embedded Systems at UC Berkeley. I was one of three TAs in charge of all lab and project work for the course. The course covers many aspects of the design and analysis of cyber-physical systems including sensors, system dynamics, wireless networking, state machines, memory management, and embedded operating systems. The course includes an eight-week project where teams of 3-4 students work on a system of their own choosing that demonstrates the cyber-physical systems concepts they've learned in the course. Projects from Fall 2018 included gloves that played musical notes as you moved the fingers, Kinect motion controls for coordinating swarms of robots, and tracking interactions with a steering wheel to display accurate information in a virtual reality headset. I won an Outstanding GSI Award from UC Berkeley for my work in the course.
For this semester, we redesigned all of the labs from scratch to focus on command line embedded tools (GCC cross compiling, Make, and JTAG code upload) based on a development board that I designed, the Berkeley Buckler. Buckler is a shield for the nRF52 development kit and gives students access to various sensors and an LCD display, and is also connectable to the Kobuki robot platform. The redesigned labs covered topics including: embedded development tools, interfacing with sensors, memory mapped I/O peripherals, interrupts, virtualized timers, and controlling robots with state machines.
TA - Computer Organization:
In Fall 2013, I was a graduate student instructor for EECS 370: Computer Organization at the University of Michigan. The course covers basic processor design (up to multi-stage pipelines), assembly language, and memory management. My job included teaching discussion sessions, holding office hours, and grading homework. I discovered that teaching is both a considerable amount of work and something I really enjoy. I won an Outstanding GSI Award for my efforts in EECS 370. Below are the discussion lecture slides that I created.
At Michigan and at Berkeley I was proud to support undergraduate research. At Michigan I advised nine undergraduates and two high school students for positions either during the summer or the school year. Four of these students have since gone on to pursue PhDs in computer science. At UC Berkeley, six students from the Introduction to Embedded Systems class were inspired to pursue research with our lab group after the course ended and another two from CS61C the year after.
Embedded Systems Office Hours:
The Michigan Embedded Systems Hub (MESH) is an open lab providing power supplies, oscilloscopes, and soldering supplies to allow students to design, fabricate, and test real hardware systems. MESH frequently holds classes on soldering and PCB design and enables many student groups to tackle ambitious hardware design projects. MESH also holds office hours on embedded systems topics, open to anyone at the university.
From 2014 to 2017 I held these office hours weekly during semesters. I advised individual students taking project-based classes, student groups working on projects, and researchers in other departments. As an example, during one office hour session, I spoke with a group working on a drive-by-wire tractor about how to power their system, helped design a PCB with a student remote-controlling a cockroach, and debugged software with a neuroscience researcher working on eye monitoring hardware. The idea of holding open office hours for the entire university is one that I hope to start at other institutions in the future.
Introduction to Embedded Systems
At Berkeley, I sometimes covered lectures in the intro to embedded systems class: EE149. My lectures have covered networking and memory architecture topics.
Design of Microprocessor-Based Systems
At Michigan, I occasionally filled in as a guest lecturer for EECS 373: Design of Microprocessor-Based Systems. I have taught on embedded systems toolchains, ARM Application Binary Interface, Memory-Mapped I/O, and the AMBA Advanced Peripheral Bus. Example code from class is available on my github.