In the Fall of 1996 and Spring of 1997, I was a Teaching Assistant for CSE 110, Introduction to Computer Programming, as a part of the CIS Department's Ph.D. teaching practicum. At that time CSE 110 was introductory course for non-computer science majors and had a couple of hundred students enrolled each semester. There were several TAs and several graders for the class that worked with the lecturer. As a TA, I was in charge of preparing and giving two recitations per week and also holding office hours. There were approximately 50 students in my sections. At the time, the class was taught in C, which I didn't know when I started. Every week before my first recitation, I would look up what the new constructs were for the week and experimented with them. In a way, I think learning the material right before I taught it to the students helped. I could anticipate some of the questions and problems they might have, because I had just had them myself. Of course, in the Spring preparing for the class didn't take nearly as much time, which was also good. One of the things I enjoyed most from the class was trying to figure out how to explain the same thing (normally a programming construct) in many different ways. The students in the class came from all sorts of majors and hence had many different ways of thinking about things. Trying to find the right way to describe something was sometimes challenging, but quite rewarding when I saw the "ah ha" look on the student's face when they got it.
In the Spring of 2007, I was also able to participate in the planning and execution of a new computer graphics course here at Penn. I was a Teaching Assistant for CIS 277: Introduction to Computer Graphics Techniques, a sophomore level class aimed at bridging the gap between introductory programming classes and our senior level computer graphics and animation classes. The class had 43 students enrolled. Most were DMD sophomores, but there were also a couple of freshman, a few juniors, and even a few CSE seniors. The instructor, Dr. Badler, another TA, Matt Kuruc, and I collaborated on most every aspect of the course including the syllabus, the lectures, the homeworks, and the exams. Much of what we planned to teach before the semester started was revamped as we went along. Most of the students had taken introductory computer science classes taught in Java, but few had C++ experience. Few, if any had OpenGL or FLTK experience. Their programming experience overall was pretty limited with little software engineering or even debugging knowledge. We ended up spending even more time than we had allotted filling in these gaps, but we were able blend together many of the computer graphics algorithms we envisioned with the computer programming concepts required. The image shown here is from the final group project of three of the sophomores. The final project included a height-field mesh, sub-divisional surfaces, fractals, file I/O, rendering through OpenGL, user interaction with FLTK, and an option to use Python to procedurally determine the heights of the mesh. While there are many aspects of computer graphics and programming that the students in the class may carry with them as they move forward, I think the greatest thing the class provided them with was experience: the experience of turning an algorithm into working code, the experience of working with several different software packages in one program, the experience of designing and redesigning classes and then designing them again, the experience of debugging code, the experience of working both individually and in groups, the experience of fixing the code you wrote for the previous homework because now you need it in perfect order for the next one, and most of all the experience of pushing through the toil and frustration until it all becomes just another tool in your belt.
As Associate Director of HMS, I've also had the opportunity to work on research projects with students in smaller groups and individually. I'm continually amazed by their abilities. My fellow Ph.D. students are of course very knowledgeable and quickly move forward with projects. I've also worked with a number of undergraduates and even high school students, who for the most part do not have a lot of programming or graphics experience. I find that largely they don't need to be taught as much as they need opportunities to learn. I give them some context for the project they will be working on, the existing code, and point them to a few resources or references they might find useful and away they go. They may come back with a question from time to time when they get stuck or aren't sure in which direction to focus their efforts, but I find if they are motivated and interested, they are more than willing to explore the necessary references and dig through the code to learn what is required to accomplish the task. All they really needed was the opportunity to contribute. This is being echoed by many of the DMD students who are giving us updates from their summer internships at animation studios and game companies. They are productive assets to the companies, contributing to real projects even though they are doing things that they were never taught to do and until now had no experience with. These opportunities give them the chance to apply and expand their experience.