Home
Research Publications
Teaching Student Funding Service
Diversity
Talks
GitHub

Undergraduate and Graduate Teaching

teaching
I chose the academic world because of the opportunity to teach fundamentals that can have an impact on my students’ future careers in research and engineering.

I regularly teach CS 130 a large senior-level undergraduate course on software engineering, CS 230 a graduate version of software engineering, and CS 239 an advanced graduate course on software engineering of AI-ML based systems.

Courses at University of California, Los Angeles

(1) Undergraduate Software Engineering (CS 130). We focus on providing hands-on experience in designing and developing large-scale software systems with emphasis on the use of automated analysis tools. You will generate concrete software engineering artifacts at all stages of the software life-cycle. You will learn systematic engineering methods for large-scale software development: design and modeling methods; collaborative development environment; object-oriented design and analysis; design patterns and refactoring; build & integration; unit testing & regression testing; bug finding; software inspection and verification: Fall 2015, Spring 2015, Fall 2016, Fall 2017, Fall 2018, Fall 2019, Fall 2020, Fall 2021, Fall 2022

(2) Graduate "Software Engineering"(CS230).  As software systems become increasingly large and complex, automated software engineering analysis and development tools play an important role in various software engineering tasks: design, construction, evolution, and testing and debugging of software systems. This course will introduce students to the foundations, techniques, tools, and applications of automated software engineering technology. Students will develop, extend, and evaluate a mini automated software engineering analysis tool and assess how the tool fits into the software development process. This class is intended to students to introduce current research topics in automated software engineering. Spring 2016, Spring 2017, Spring 2018, Spring 2019, Spring 2022

(3) Graduate "Automated Testing of Data and Compute Intensive Systems" as a part of Current Topics in Programming Languages and Systems (CS 239). Automated test input generation has emerged as an effective technique for testing software systems. For example, fuzz testing has been remarkably successful in uncovering critical security bugs in applications such as Chrome web-browser and SQLLite database. Dynamic symbolic execution has leveraged the advancement of constraint solving technologies to find many security-related bugs. However, the effectiveness of current test input generation tools is based on inherent yet over-sighted assumptions: (1) it takes a minuscule amount of time in the order of milliseconds to execute the target application, (2) a set of arbitrary input mutations is likely to yield meaningful inputs, or (3) either the target application code is short, or pre-made abstraction of underlying libraries and frameworks is available. This course is intended to teach the foundation of automated fuzz testing and discussing new approaches to extend its benefit to various kinds of data-intensive and compute-intensive domains. Winter 2022

(4) Graduate "Debugging and Testing of AI/ML based Systems" as a part of Current Topics in Programming Languages and Systems (CS 239). Building complex AI and ML systems requires deep expertise in computer science and extensive programming skills to work with various machine reasoning and learning techniques at a rather low level of abstraction. It also requires extensive trial and error exploration for model selection, data cleaning, feature selection, and parameter tuning. The goal of this graduate seminar is to study recent research projects in the domain of debugging and testing AI/ML based systems and discuss open problems on how to improve the productivity of data scientists, software engineers, and AI-ML practitioners in industry. Winter 2019

(5) Graduate "Tools and Environments for Developing Big Data Analytics" as a part of Current Topics in Programming Languages and Systems (CS 239). An abundance of data in science, engineering, national security, and health care has led to the emerging field of big data analytics. To process massive quantities of data, developers lever- age data-intensive scalable computing (DISC) systems in the cloud, such as Google’s MapReduce, Apache Hadoop, and Apache Spark. While DISC systems help to address the scalability challenges of big data analytics, they also introduce new challenges in developing, debugging, and testing applications. This class discusses recent advances in tools and environments for developing big data analytics with focus on software tooling, environment, and system stacks. Winter 2018

(6) Graduate "Data Science in Software Engineering," as a part of Current Topics in Programming Languages and Systems (CS 239).  Software engineering is a data rich activity. Software produces large quantities of data such as user-orented telemetry data, repository-based productivity and quality data, and business oriented process data. Data scientists work with data and they have "the sexiest job of the 21st century" according to Harvard Business Review. Data scientists  are now becoming a part of mainstream software development teams and they use statistics, data mining, big data engineering, and automated software analysis techniques together to measure software performance and quality, to analyze user engagement, to diagnose and debug software failures, to detect server log anomalies, etc. This course covers data science methods, techniques, and tools used in (and for) software engineering. In addition to discussing the state-of-the-art through research papers, the course will emphasize hands-on experience in using tools for software analytics: Winter 2015, Winter 2016, Winter 2017

Courses at University of Texas at Austin 

(1)   Undergraduate Software Engineering and Design Laboratory (461L). Despite the increasing popularity of the software engineering (SE) technical area within UT Austin ECE, we did not have a core laboratory class in SE (unlike all other areas of ECE). Nor did the students have much opportunity to practice hands-on development of large-scale software. To fill this gap, I proposed and developed a new junior level SE design and laboratory class. I taught development tools required by industry and introduced systematic engineering and design methods through realistic project tasks that emulate industry software development. Student feedback indicated that in-class activities and self-paced laboratory tutorials helped students to engage in highly abstract subject matters and gain confidence in working with large software. Here is the presentation that I gave on the new course development of a junior level software engineering and design laboratory course at the Faculty Innovation Seminar in the Cockrell School of Engineering: Fall 2013, Fall 2012, and Spring 2012

(2)   Graduate Software Evolution (382V/ 379K). Programmers rarely build software from scratch but often spend more time in evolving existing software. I designed and taught a new graduate course that teaches the state-of-the art methods, tools, and techniques for evolving large software systems. To promote critical thinking and help students gain research skills, I designed in-class activities and organized mock-up program committee meetings, where students critically assess research ideas. Student feedback indicated that this course was full of active participation, which helped students understand the concepts in the most critical and rigorous way possible. Spring 2014, Spring 2012, Fall 2010, Fall 2009, Spring 2009  

(3)   Undergraduate Data Structure (322C). I taught EE322C, a lower division programming course intended for sophomores. A strong grasp of data structures is the number one criteria that employers use to distinguish software engineers who know fundamentals from those who simply follow technology trends. I emphasized the fundamentals of abstractions and complexity analysis so that students could learn how to effectively use existing data structures in Java and how to design complex data structures themselves to build high performance software. I see the importance of lower division programming courses and interested in teaching introductory programming, data structures, and algorithms. (EE 322C Data Structures, UT blackboard access only,  Spring 2012)

Software Engineering Reading Group

I started SERG (software engineering reading group) seminar after I joined UT Austin in Spring 2009.  My goal is to collect our efforts in keeping up-to-date with recent papers in software engineering conferences and journals, to understand each other's research interests, and to find opportunities for research collaboration. SERG meets every week in ACES 5.118. For more information on SERG and its schedule, please contact me.