Andrew Lukefahr - Teaching Statement

From smartphones to automobiles, computers are ubiquitous, connecting us and enriching our lives. These devices are the result of a creative and innovative community of dedicated engineers and scientists. Today, an increasing number of students are eager to be part of that community. I am excited to have the opportunity to teach and encourage these students in the process of joining that community.

Teaching Experience

At Michigan, I have been a primary instructor for two undergraduate level courses, “Programming and Introductory Data Structures” and “Introduction to Computer Organization”. “Programming and Introductory Data Structures” is a sophomore-level course which broadens and deepens students’ programming knowledge, while teaching best programming and testing practices. Topics covered include procedural and data abstraction in C++, pointers, linked-list, and basic tree structures. “Introduction to Computer Organization” covers the basics of what is going on “under-the-hood” of modern processors, helping students understand how to take advantage of this internal architecture to write more efficient software. Topics covered include instruction-set architecture (ISA), linking/loading, pipelining, branch prediction, caches, prefetching, virtual memory, input/output devices, and performance evaluation.

With hundreds of students spread across multiple sections, multiple instructors, numerous graduate and undergraduate teaching assistants, these are large classes that required significant coordination and management. Simple errors can quickly become a large problem. One area that I give particular focus is on ensuring the timeliness and quality of the assignments and exams. Additionally, for “Introduction to Computer Organization” I designed a lecture unit on cache prefetching, a technique which predicts memory access patterns and tries to pre-buffer the data before it is actually requested.

Classes of this size require constant effort to prevents students from ”slipping through the cracks” or becoming “just a number”. Poor experiences with course staff can have a dramatic impact on a student’s willingness to learn. It is essential to make every student feel that you care. Practically speaking, this means students with special circumstances should receive prompt resolution, errors in grading should be corrected quickly, and plagiarism checks should be tough but fair. Again, the sheer scale of the course adds to these challenges.

Teaching Approach

I believe that students are more willing to learn from an instructor who is invested in them. Being prepared for lectures, learning students’ names, and a willingness to listen show an investment in the students that is reflected in their attitudes toward learning.

My lectures are loosely modeled on an active-learning style [2], where I deliver short lecture segments followed by in-class practice problems. Students are given time to work on the problems in small groups before we solve the problem together. This not only gives the students a chance to actively engage with the material, but also helps them learn to communicate and problem solve together within a small group. A major advantage of this approach is encouraging small-group participation. Especially for students struggling with self-confidence or feeling self-conscious, small groups can help them feel more comfortable interacting and give them a sense of belonging.

Unfortunately, it seems much of the traditional CS education has emphasized “lone-wolf” programming, and discourages communication between the students. Yet, once these students enter the workforce, programming writing becomes a community activity. Their code will be uploaded to a global repository where it will be reviewed and revised by others. “Programming and Introductory Data Structures” introduced (optional) pair-programming [1], helping students learn how to function as a team, rather than just how to program. These pairings encourage the development of communication skills that will be necessary to thrive in largely team-based workforce.

I strive to embrace technology where it can improve the learning experience. For example, recorded lectures allow students to learn or review any course material on their own schedule. It can also have a major impact on how we teach. For example, writings on a whiteboard can become illegible on recordings, whereas Powerpoint slides and a stylus remain clear. Additionally, a tablet coupled with mobile screencasting technologies free the lecturer to move around the room while maintaining the ability to instantly write to the projected screen.

Course Offerings

As a computer architect, I have experience spanning electrical engineering, computer engineering, and computer science. This positions me to teach a wide variety of courses. At the introductory level this includes circuit theory, digital logic, and programming courses. More advanced courses include data structures and algorithms, embedded systems, controls, assembly programming, digital circuits, computer organization, and computer architecture. Finally, I have experience teaching large classes and managing the associated staff, infrastructure, and curriculum.

For institutions with only a introductory architecture course, I am also excited about bringing a second computer architecture courses, similar to the “Computer Architecture” course at Michigan. While the introductory course introduces the students to pipelining, it omits a very important component of modern processors, out-of-order execution. This component, introduced in the second architecture course, is found in virtually every computer from servers to smartphones today. Additionally, this course can feature major design projects that culminate with the students writing a fully-functional state-of-the-art processor design in Verilog. Students who have successfully completed this course are valued by both traditional hardware companies, e.g., Intel, AMD, and ARM, and companies optimizing performance for large datacenters, e.g., Google, Facebook, and Microsoft.


I am excited for the opportunity to teach, and to help introduce my students to the future of computing that has continued to excite me throughout my college experience. My goal as an educator is effectively lead, teach, and mentor students to help them excel both inside and outside the classroom.


C. McDowell, L. Werner, H. Bullock, and J. Fernald. The effects of pair-programming on performance in an introductory programming course. ACM SIGCSE Bulletin, 34(1):38–42, 2002.
M. Prince. Does active learning work? a review of the research. Journal of engineering education, 93(3):223–231, 2004.