Teaching

Current courses

Teaching Statement

I have been extremely fortunate to have several excellent mentors throughout my academic career. I sincerely believe that their guidance is the primary reason for my success and that it is my responsibility to return their generosity to the next generation of researchers, scientists, and professionals. Being a CU professor and NCAR scientist provides a unique opportunity for me to have a positive impact on a broad spectrum of young people; I have had the pleasure of mentoring thirty-eight over the past nine years, ranging from undergraduate and graduate students to early career professionals such as pre-tenure scientists, professional research associates, and software engineers. Though I get less time in front of students in the classroom than I'd like (seven courses over the past nine years), I endeavor to maximize these opportunities through course and pedagogical development activities that ensure a current and modern treatment of the classes I teach. Finally, I have worked to recruit students by helping organize and host the Department's annual Ph.D. recruiting weekend and by establishing a summer student program at NCAR. The following sections provide a more detailed overview of my teaching and mentoring activities.


1. Course Development: High-Performance Scientific Computing (CSCI 4576/5576)

The Department of Computer Science was one of the first players in the field of computational science and engineering education for undergraduates with its high-performance scientific computing (HPSC) course that was developed by Professor Lloyd Fosdick and Professor Elizabeth Jessup and taught from 1991 to 1998. In order to satisfy the increasing demand for computational skills in a variety of disciplines, I worked with Professor Jessup to revive HPSC in 2003. The source of that demand extends from academic research organizations to employers in industry and the national laboratories. To address technological and pedagogical developments since its first offering, I redesigned the course. First, recognizing that HPSC is a broad multidisciplinary subject area, I removed the numerical analysis prerequisite; this successfully increased the pool of potential students across disciplines throughout the College of Engineering and Applied Science. Similarly, HPSC was condensed into a one-semester course, but the class project from the second semester was retained. As HPSC is a "hands-on" course, I kept the original four credit hour design with three hours of lecture and three hours of supervised lab per week. In the spring of 2003, I proposed a graduate version of HPSC (CSCI 5576). It was designed to satisfy the Department's breadth requirements and also serve as a core course for various computational science graduate programs created in recent years (e.g., in Applied Mathematics). Department and College approval were given in 2003, final Graduate School approval was obtained in January 2004, and the course was first taught in the spring semester of 2004.


In addition to structural changes, rapid changes in technology and demands from employers in industry and the national laboratories needed to be reflected in the course content and tools. Parallel programming skills are currently in high demand. As the Message Passing Interface (MPI) is now the de facto standard for writing message-passing parallel programs, the first half of the course is spent learning the basics of parallel programming with MPI using a popular text by Pacheco entitled Parallel Programming with MPI. Given that mixed-model-programming paradigms are being driven by the increasing use of shared-memory-multiprocessing technology, students also learn the basics of OpenMP by writing hybrid MPI/OpenMP programs. As the success of the Japanese Earth Simulator program has sparked renewed interest in vector programming, and accelerator architectures use vectorization as well, a brief introduction to vector computing is provided. The course's core theoretical component examines parallel architectures, parallel algorithm development and analysis, and performance modeling using material from Leighton's book Introduction to Parallel Algorithms and Architectures: Arrays, Trees, and Hypercubes, focusing on architecture-specific algorithms for commonly encountered problems (e.g., sorting, matrix and graph algorithms, and FFTs).


The course's programming and project activities revolve around the computational platforms available to researchers using Campus and National Science Foundation cyberinfrastructure. To the best of my knowledge, HPSC was the first course to be taught solely using NSF TeraGrid computing systems, pre-dating their offering of educational allocations for this purpose. The upcoming fall 2011 class will also perform large-scale simulations, benchmarking, and scaling studies, and develop "data-intensive computing" workflows, using the recently-installed Janus supercomputer (16,416 cores) built in partnership with Dell and made possible though an NSF Major Research Instrumentation award in 2008.


Finally, the project is an essential component of the course as it allows students the opportunity to apply the skills they've mastered in the course to research areas of personal interest. The projects are a major undertaking requiring at least 50 or 100 hours of effort for 4576 and 5576 students, respectively. In addition to producing parallel code, students must also write a ten-page paper in journal format describing their research and results, make a fifteen-minute presentation to the class, and demonstrate their software. Because oral and written presentation skills are essential for a successful career, whether it be in academia, industry, or research laboratories, I provide detailed feedback and offer students the opportunity of meeting one-on-one to discuss ways in which to improve their presentations and papers.


2. Pedagogical Development: Linear Algebra with Computer Science Applications (CSCI 2830)

This is a required course for Computer Science undergraduates that I taught for the first time in Fall 2010. The last time I taught a strictly undergraduate course was while at the University of Chicago (10 years ago), and the last time I taught a required undergraduate course was at the University of Vermont (20 years ago). The most challenging aspects of teaching this course were achieving an appropriate pace and the absence of a recitation section. In consultation with the Faculty Teaching and Excellence Program (FTEP) I asked them to administer a CLIP (Classroom Learning Interview Process), which allowed me to make several mid-semester adjustments that I believe significantly improved the learning experience of the students and gave me an opportunity to reset the pace of the course. Moreover, the FTEP Faculty Associate provided several suggestions on how to reconnect with undergraduates (e.g., sit in on another professor's class the semester before) and how to zero in on the appropriate pace (e.g., work more examples, show all the details in the beginning even if you think that they should know them, and engage the students through interactive questioning to better assess student comprehension) that are helping me improve my teaching in general.


3. Mentoring

Over the past nine years I have mentored thirty-eight researchers. I am a strong advocate of involving undergraduates in research. To this end I have employed fourteen REU/Earn-Learn students and served as senior thesis advisor to two undergraduate students. These undergraduates have been involved in a wide variety of projects: exploring Taylor- Couette flow using NEK5000, developing techniques to automatically extract cellular structures from digital electron microscopy images, parallelizing a particle model using GPGPUs, developing a Lustre diskless boot capability, evaluating RDMA over Ethernet technology, and a wide spectrum of other software and hardware evaluations. I have graduated four Ph.D. students and currently supervise four, three of whom have passed their prelims. I have employed four M.S. students as research assistants and served as the thesis advisor for one M.S. student. I have also mentored seven professional research associates. Finally, I supervise two scientists and three software engineers at NCAR. My research group spans NCAR and CU, including students and professional researchers at both.


My mentoring style depends on the individual, but at the minimum I try to provide sufficient direction and the resources necessary for each member of my research group to be successful. Though I meet with each person on a weekly or bi-weekly basis to monitor progress and assist and advise with respect to long-term objectives and current obstacles, I give sufficient freedom and time to fully explore the research questions at hand and resist the temptation to micromanage. The group holds weekly research meetings where each person is expected to provide updates on the projects they're working on and to share their research successes and failures with the group. These meetings offer an excellent opportunity for exchanging ideas and reinforcing teamwork skills. Because most high-impact projects are team efforts I stress teamwork and the importance of sharing credit with your colleagues, as these are prerequisites for building successful teams. To help members of the group prepare for successful careers, I involve them in all aspects of the paper and grant writing process. These are excellent opportunities to develop critical thinking and writing skills and learn how to employ these skills to persuasively present their research findings. Moreover, I involve the entire group in academic, industry, and trade field networking. As a general rule I require students to present at conferences. To help them prepare, I review their slides and provide opportunities for "dry runs". Whenever possible I attend their conference talks in order to provide additional (critical) feedback. In order to establish connections between students and researchers, I try to send people to the same conferences several years in a row. Students have also accompanied NCAR administrators to planning and procurement meetings with a variety of corporations, allowing them to experience the complexities of large-scale supercomputer center operations and the balance between research and infrastructure in the field of high-performance scientific computing. Similarly, students have been invited to spend time in small groups with distinguished visiting scientists.


4. Internship Program Development: SIParCS

In 2006, I worked with Dr. Richard Loft, the Director of the Technology Development Division in the Computational and Information Systems Laboratory of NCAR, to develop the SIParCS (Summer Internships in Parallel Computational Science) internship program. Each summer a select group of computational science students are paired with NCAR scientists for 10-12 weeks to explore research topics important to NCAR's mission. This offers an opportunity for cross-pollination of ideas between established scientists and young computational scientists and gives NCAR the ability to encourage and guide the development of young computational scientists. The program has grown from seven students in 2007 from four universities to twenty students in 2010 from thirteen universities.