I believe that the first courses in computer science are extremely important for establishing a strong conceptual foundation and a correct perspective. When I began teaching in fall 2009, I asked to teach CS 120, our introductory programming course for computer science majors. Since then, I have taught CS 120 in fourteen semesters. It is useful to consider here the evolution of this course, paralleling my own growth as a teacher over this time.
All responses to the open-ended questions on the student evaluation form from this class in the fall semesters 2009-2013 are available here. I have slowly refined the course in response to student feedback and my own perceptions.
When I began in fall 2009, there was not a clear outline of the course content beyond a generally shared understanding of what “should” be in an introductory course. I have worked since then in conjunction with other faculty to standardize the course content and to tie it better to later courses.
Another faculty member in the department had developed an automated grading tool for computer programs. The initial tool was insufficient, leading to student comments like “Homework checker is off a lot” and common requests for less homework. I believed that they needed more practice but we needed the toolset to support this. The homework checker has since gone through numerous revisions and improvements; I have refined the automated scoring keys and developed many more homework assignments for use in the course. Students are now much more accepting of this tool and comment favorably on its ease of use.
I did not initially have a good understanding of how to determine student grades. My early exams were too long and too hard, with many students unable to complete the entire exam. I have experimented with various exam formats and have made many improvements. For example, I used to believe that multiple-choice questions could not accurately assess a student’s understanding. I have since come to believe that by understanding common errors and misperceptions, I can design multiple-choice questions that do test students well. This approach now allows for automated scoring of exams given online, showing students immediate feedback after their exam while they are still interested in specific questions. I have also found that my exams became shorter over time; as I designed better questions, I needed fewer questions to make good assessments. I now see fewer comments on the length or difficulty of exams.
I never found a textbook for this course that I wanted to use, so I have been writing my own notes to distribute to students. Initially, I posted a PDF document online that looked very much like a “normal” textbook but had my own material in the order I preferred. This worked okay but I had some trouble making sure that students downloaded the file again after I made updates and posted a new version. I later moved to a Google Docs format, so that students automatically saw the latest version. This was better but still not ideal. After I began using an online LMS (initially Moodle, later Canvas), I found it best to break the notes into smaller pages and intersperse them with the related homework assignments. I also found it helpful to record and post videos, introducing concepts or stepping through examples. This approach has worked well and I have been engaged for six years in developing better online material for the course. The full course site includes more than one hundred notes pages, dozens of explanatory videos and about seventy-five homework assignments. These are still changing, of course, as I add new material and improve existing notes.
With all of this material available, I began to experiment with the course format. I began “flipping” the class in fall 2013. I asked students to read the notes outside of class, then provided opportunity during class time for them to work on their programs. This approach has been popular with some students but others struggle with the inherent responsibility pushed onto them. I believe that it was having a positive effect on performance in the course overall but found that some students needed more structure than this provided, to help them build the necessary study habits.
Inspired by a colleague, I introduced daily quizzes in the course, beginning each class period with a 5 minute quiz (addressing recent course material) followed by an immediate “debriefing” discussion of the problem and solution. This daily assessment provided clear evidence both to students and to me about who was actually keeping up with course material. For students who were struggling, this also created an easy opportunity to see a working solution of the current material and ask any needed questions. Based on that success in this course, I have introduced this practice into several other courses as well.
I have also experimented with different timelines for homework deadlines, varying from 2-3 specific days each week to several problems due once per week to about ten problems due every few weeks to even trying one deadline for all homework at the end of the semester. Each approach worked well for some (but not all) students. I’ve recently settled into a “middle ground” approach with assignments early in the semester due often (to ensure students are working on the course material) then trending to longer gaps between deadlines later in the semester (to allow students more freedom and flexibility, with sufficient time to ask questions as needed).
No course structure is well-suited for every student. I keep modifying different aspects of the course, improving it slowly over time. I enjoy the cyclic nature of the course that allows this iterative improvement, the eternal opportunity to “tweak” it a bit more, to try something new.