Teaching

Teaching #

The majority of my teaching and my true passion has always been in undergraduate education. I have taught a wide variety of Computer Engineering and Computer Science courses at Indiana University (IU) and Cornell including digital systems, computer structures, embedded systems, computer architecture, computer networks, and operating systems. I have created a number of substantial and successful ``hands-on’’ undergraduate courses. These efforts included the design and implementation of the laboratory experiments and laboratory infrastructure, writing open source tutorial materials, and successfully soliciting in excess of $800,000 of industry support for course development.

Computer Structures #

For a decade I taught Computer Structures C|H335, which previously was a course on assembly language programming. While I still taught some assembly programming, I used this as a way to understand the stack-based execution model utilized by most compilers. In contrast with the approach often taken in such courses, I examined in depth the application binary interface (ABI) that serves as a contract between assembler and compiler by defining how objects are represented in memory, how registers and the stack are used to both interact with procedures and for temporary storage by procedures. My lecture notes for this course are available at lecture notes. I derived this approach directly from my experiences with the Lx/ST200 VLIW project at Hewlett-Packard Laboratories.

Computer Structures was also a major laboratory course – while the lecture focuses on the core processor, the weekly three hour laboratory focused upon the interaction between the processor and the physical world. During the time I taught this course I completed two major (and several minor) revisions. Initially I had the students use a modified children’s toy, goofy giggles (An early document from this effort is goofy), to which we added a small processor board (initially an MSP430 and later an ARM based NXP) to allow the students to augment the toy’s repertoire – for example performing a small dance. Recognizing that this was an extremely successful (and popular) learning exercise, I wanted to do even more to prepare students for independent design work. This led me to redevelop the laboratory using readily available off-the-shelf modules with the hope that students could use the course as a launchpad for creating their own systems. The manual for this more recent approach is lab manual.

Courses Taught #

The following are courses I have taught at IU.

  • C200 Introduction to Computers and Programming
  • C|H335 Computer Structures
  • P436 Introduction to Operating Systems
  • C343 Data Structures and Algorithms
  • B441 Digital Design
  • B524 Parallelism in Programming Languages and Systems
  • B639 Ensuring Long-term Access to Digital Information
  • b649 Concurrent Programming Languages for System Design