I view teaching as one of the most important ways for me to reach others. Even for the most fundamental undergraduate courses, my research informs my teaching, and my teaching informs my research. Not only do I highly value my classroom teaching activities, but I also very much enjoy the time I spend with students in the classroom and out. Since joining the University of Texas at Austin, I have developed two new graduate courses that emphasize software engineering research as it relates to mobile, distributed, and pervasive computing. I have also contributed to the teaching and refinement of three core undergradaute courses and an aditional graduate course.

EE360C: Algorithms

This upper division undergraduate course builds on our core curriculum in programming, data structures, and discrete math to introduce students to styles of algorithms, evaluating algorithm complexity, and designing new algorithms. Through a combination of significant written homework assignments and progrmaming assignments, I have attempted to emphasize two aspects of traditional views on algorithms: first the formality of representing, proving, and characterizing algorithms and second, the use of algorithm and algorithm design in the engineering of large systems.

Semesters taught: Spring 2023, Spring 2021, Spring 2020, Spring 2018, Spring 2017, Spring 2014, Spring 2013, Spring 2012, Spring 2011, Spring 2010, Spring 2009

EE382V: Mobile Computing

This course is continuously redefining itself. It is based on current research papers on fields related to software engineering research in mobile computing. The course is specifically designed with two purposes: to generate students with significant depth in mobile computing research topics and to give graduate students practice in critical thinking by exposing them to current research papers and requiring critical review of the research contributions explored in the course. This course includes significant writing and presentation components; students are expected to generate a conference-quality research paper on a novel research project in mobile computing by the end of the semester.

Semesters taught: Fall 2023, Fall 2021, Fall 2017, Fall 2016, Spring 2012, Spring 2010, Fall 2008, Fall 2006, Fall 2005, Fall 2004

EE382V: Advanced Programming Tools

This course refines a course introduced into our curriculum by Adnan Aziz. The course is a graduate level course that introduces students to myriad tools that support the software engineering process. In addition to learning to use the tools, we also study the fundamental problems they seek to solve and investigate the internals of the tools to understand how they work (and how they might be extended). The course is heavy on project work and emphasizes working in teams.

Semesters taught: Spring 2022, Fall 2019, Fall 2017

EE461L: Software Engineering Design Laboratory

This upper division undergraduate course is the capstone of the undergraduate software engineering curriculum at the University of Texas. The course focuses on software design and implementation, which is driven home through a semester-long team-based development project of the students' own design. This project is coupled with in depth lectures on software design, design patterns, effective Java programming, software engineering tools, and much more.

Semesters taught: Spring 2015, Fall 2014, Spring 2014

EE382V: Middleware

This course is a graduate level course introducing and investigating middleware at all levels, largely from a software engineering perspective. Students are introduced to various types of middleware (from object-oriented middleware to message-oriented middleware and beyond) both through lecture materials and through active "mini-projects" through which the students build complex applications using existing middleware solutions. The course also offers lectures on "trends" in middleware, including how middleware addresses challenges related to mobile computing, sensor networks, real-time computing, "green computing," etc.

Semesters taught: Fall 2013

EE382V: Formal Methods in Distributed Computing Systems

This course came out of an observation of a lack of formal foundations in the graduate students in my mobile computing course. The course uses a combination of textbooks and seminal research papers to introduce a variety of methods for representing concurrent, distributed, and mobile computations mathematically. Students gain significant exposure to a wide variety of models, many of which they are required to use to construct proofs of distributed solutions.

Semesters taught: Spring 2011, Spring 2009, Spring 2007, Spring 2005

EE312: Software System Design and Implementation I

This is a core undergraduate programming course that builds on our bottom-up curriculum. For many of our students, this course is their first exposure to any sort of high-level programming. Because the course is required, these students are intermixed with students exposed to such high-level programming in high school. The course also introduces core software engineering concepts including requirements, design models, testing, etc. While teaching C programming can be a dry subject, I attempt to engage the student through in class activities and by emphasizing the importance and impact of abstraction.

Semesters taught: Fall 2010, Spring 2008

EE372N: Telecommunication Networkss

This upper division undergraduate course introduces students to networking challenges and solutions. This is an important course in several of our undergraduate focus areas as students who graduate and join industry are likely to be expected to work with and design networked systems. The course has been long taught in our curriculum, but as the first of the software engineering faculty to teach the course, I brought with me a new perspective on networks as large software systems and tried to explicitly use this connection to bring out software engineering challenges and solutions exposed by these networks.

Semesters taught: Spring 2007, Spring 2006