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. For students who want to pursue careers in software engineering, I teach them fundamental skills that they cannot attain in the workplace on their own but that are valued by employers. For students who want to pursue careers in academia, I nurture them through a deep one-on-one supervision, and I set high yet attainable goals for them. My purpose is to help students to become the next generation leaders in computing.
(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.
(2) 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
(3) 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
(4) 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
(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
Software Engineering Reading Group
(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)