The big picture
I taught my first CS class in 1984. Since then my teaching has slowly transitioned from a sage-on-the-stage to a guide-on-the-side approach. Sage-on-the-stage is someone who acts like they know it all (it is usually a result of overcompensating for one’s lack of confidence in teaching others). Whereas, a guide-on-the-side is where you get when your realize that it is OK to not know some things, as long as you are willing to apply your skills and knowledge to learn them (and also teach your students how to do the same).
The following is a snapshot of my views, on how to be an effective CS educator (as of Mar. 2008; updated Sep. 2017). These views are dynamic—they change and adapt as I grow and learn more about teaching and learning.
Prepare for life-long learning
I believe that computer scientists should be prepared for change. Our field evolves very fast compared to other disciplines—it practically “redefines” itself every 5-10 years, in terms of development paradigms, programming languages, hardware, and software. This has implications for both teachers and students.
A teacher is a scholar
Teachers should prepare their students for life-long learning. This is difficult to do if teachers do not practice life-long learning themselves. Therefore, CS educators should stay current, possibly by attending conferences, reading professional journals, or contributing to the field’s evolution—through research, scholarship, and service. A teacher is a scholar.
A student is an apprentice scholar
Students should learn how to learn. This cannot be taught directly. It has to be acquired experientially, through exposure to a well-designed curriculum, and through progressively increasing challenges. However, in order for this to work, the students themselves have to be self-motivated and hard-working. No pain, no gain. Students must understand that when a teacher challenges, it is to help them reach their potential. I view students as apprentice scholars.
Produce competent professionals
I believe CS educators have an ethical obligation to produce competent professionals—professionals with strong technical foundations who can deal with the complexity of today’s software development. Our graduates need to know how to pay attention to detail and be able to deal with all aspects of software development—coming up with a new idea, design, implementation, testing, documentation, and maintenance.
Teach long-term concepts
I aim to teach long-term concepts as opposed to programming languages and technology du jour. Although students should be exposed to state-of-the-art tools, this should be done in the context of theoretical concepts. Tools become obsolete within a few years, but concepts last a lifetime. My first languages were FORTRAN and Pascal—both gone, more or less. But the concepts of modularization, documentation, top-down design (to name a few), taught to me by my professors, are still here guiding me as I move through the field.
Invest in collaborative learning
I am a strong advocate of collaborative learning. The following quote captures part of the inspiration: “For collaborative learning to be effective, the instructor must view teaching as a process of developing and enhancing students’ ability to learn. The instructor’s role is not to transmit information, but to serve as a facilitator for learning. This involves creating and managing meaningful learning experiences and stimulating students’ thinking through real world problems.” (see Kara L. Orvis, Computer-Supported Collaborative Learning: Best Practices and Principles for Instructors, IGI Global, 2008.)
Collaborative learning should be done carefully and progressively, as students must develop their own skills and be protected from the leader-follower syndrome. Otherwise, weaker students tend to follow the ideas of one or two stronger students without really thinking (and learning) for themselves.
I assign in-class collaborative exercises in all my courses. I ask students to work in groups of two or three towards a common goal, such as tracing a challenging algorithm, commenting on a reading assignment, or developing a user interface prototype. I find that this helps students master new concepts better than if they worked on their own.
Starting in the first programming course, I like to introduce pair-programming exercises to expose students to group dynamics and help improve communication and people skills (e.g., see Laurie Williams, “Lessons learned from seven years of pair programming“, ACM SIGCSE Bulletin 39(4), Dec. 2007.)
Bring research to the classroom
I believe that CS educators should try to incorporate results from their research into the classroom, whenever possible, through lecture, assignments, special project courses, and curriculum development. This makes them look relevant to their students and can be very motivating—it shows that, after all these years, teachers are still learners themselves (also, see 2.1 above).
Maintain high expectations
In closing, I try to maintain high standards for my students. I try to challenge them in ways that benefit and provide a sense of accomplishment. It takes very little time to develop trivial or impossible assignments—good assignments require creativity, sensitivity to student capabilities, and observance of learning objectives as identified in the course syllabus.
What makes my work as a teacher meaningful over the years is the hope that my colleagues and I (through our individual and perhaps complimentary teaching styles) are helping produce competent computer scientists—individuals who are valuable contributors to the profession and society. Given that computing permeates and shapes society, this hope is not a small thing.