Teaching Statement
My goal as an educator is to provide everyone with the opportunity to learn the basics of computer science and programming. At the University of Illinois, I have pursued this goal by improving and scaling our first course for majors and students with a deep interest in the subject, which I have taught since Fall 2017. (The course is currently numbered CS 124, but was previously numbered CS 125. To avoid confusion I will use the umbrella term CS1.)
When I began teaching CS1 in Fall 2017, 700 students completed the course, with 50% earning A-range grades and 5% failing. By Fall 2024, over 1,200 students completed the course each fall semester, with 80% earning A-range grades and 2.5% failing. Over 21 terms at Illinois I have taught a total of 15,007 students. Students today get more practice, are better supported, and complete a more challenging project. Grading standards and learning objectives have not changed. Performance gaps between students with and without prior experience and between genders have shrunk significantly, and many CS1 students continue to and succeed in downstream courses. Growth in CS1 has outpaced growth in the major—since Fall 2017 enrollment in CS majors at Illinois has grown by a third, while enrollment in CS1 has nearly doubled. Today 80% of students who enroll in my CS1 course are non-majors, and despite significant differences in academic preparation due to my department’s highly-competitive CS admissions, non-majors succeed at similar rates to majors. By supporting student success at scale, my course is helping make computing’s remarkable opportunities available to all.
Chronology of Course ImprovementsChronology of Course Improvements
During my time at Illinois, I have been fortunate to be able to focus my teaching activities entirely on one large course. Taking full advantage of this opportunity, I have been able to complete at least one and frequently several significant course improvement projects each year. Before discussing two important aspects of the design of my course in more detail, I provide an overview of the changes I have made—as my course evolved from a synchronous lecture-based format utilizing high-stakes assessment taught in Java, to an asynchronous lesson-based format utilizing frequent small assessment taught in both Java and Kotlin. Note that these improvements are in addition to the usual tasks required to run a large class—authoring new assessments, maintaining infrastructure, training and managing a large staff, student communication and outreach, dealing with academic integrity, and so on.
As a co-instructor in Fall 2017, I began work on updating and modernizing the assignments and built the course’s first continuous autograder. Spring 2018 was the first semester I was responsible for classroom instruction. I migrated away from paper worksheets and to online interactive live coding exercises, supported by the first iteration of a high-performance Java online execution engine that has been used by the course ever since. I also developed support for including small programming exercises on weekly quizzes, released the course’s first Android programming project, and created a plagiarism detection pipeline that we continue to use.
In Fall 2018 we began assigning daily programming exercises, and the semester was largely devoted to authoring and deploying the first set of these assignments. Spring 2019 brought new Android programming assignments and assessment infrastructure. By Fall 2019 we were ready to move away from multiple small disconnected programming assignments to a set of connected checkpoints comprising a larger project—providing students the chance to build something more significant, and an experience that more closely mirrors modern software creation. That semester I also completed significant changes to the course infrastructure, migrating to our own private cloud and completing a cloud-native autograder designed to support the new Android programming project.
The COVID-19 pandemic that began in Spring 2020 resulted in a large set of changes to the structure of the course designed to support student success in an online learning environment. I completed a first iteration of our tutoring site over break in Spring 2020, in time to support students during the remainder of that first COVID semester. By Fall 2020 the course was set up online in a completely new format—with daily lessons replacing synchronous lectures, interactive walkthroughs replacing classroom live-coding, and online tutoring replacing in-person office hours. I also created new systems for online quizzing and homework autograding.
By Fall 2021, with evidence that the asynchronous daily lesson model was successful, we began taking advantage of the affordances of this format. I added Kotlin as a language option side-by-side with our existing Java materials, providing students the opportunity to learn a modern multi-paradigm programming language. The Kotlin option also allows students with Java experience the opportunity to reinforce their existing knowledge while also learning something new. Supporting Kotlin required a completely new set of lesson materials, homework, assessments, and project materials and infrastructure. That semester Colleen Lewis also joined as a co-instructor and recorded a complete set of explanations for the existing Java content alongside those I provided in Fall 2020. This allowed students to hear from multiple instructors with different perspectives and mental models. In Spring 2022 I began work on a set of novel debugging exercises, and released our materials publicly at learncs.online. In Fall 2024 I also began teaching CS 199 SOC: Technology and Society, an exploratory seminar examining students’ relationship with technology through reading, reflection, and conversation.
In Fall 2022 I fully incorporated those novel debugging challenges into our online materials. I also added new security features to help ensure the integrity of our online quizzes. In 2023 I added profiles of diverse computer scientists to our daily lessons to help students appreciate both the diversity of the field and the many contributions to computer science by diverse individuals. In Fall 2024 I deployed autogenerated testing exercises, providing students with practice writing test suites. More recently, I have introduced quiz retake opportunities to give students additional chances to demonstrate mastery, launched a coaching program to proactively support students who need help with course strategy, and integrated code quality instruction and automated feedback throughout the daily lesson content.
Frequent Small AssessmentFrequent Small Assessment
The high rates of student success in my CS1 course are due to many factors. However, I believe that one of the main design choices supporting student success is our use of frequent small assessment. In many courses student grades are largely determined by a small set of high-stakes assessments—for example, a few midterms and a final exam, which might together account for 50% or more of a student’s grade. In contrast, in my CS1 course the most significant untimed assessment (a one-week project checkpoint) counts for only 4% of a student’s grade, and the most significant timed assessment (a one-hour weekly quiz) only counts for 2.5%. I have entirely eliminated high-stakes assessments to reallocate those points toward more-effective frequent small assessment.
Our experience with frequent small assessment has been uniformly positive, and I have cataloged the many and varied ways that this assessment strategy improves my course. First and foremost, students are doing better—with 80% regularly earning A-range grades. This level of student success in CS1 is unusual, and remarkable given that my course covers many topics not always included in an introductory course—including interfaces, functional programming basics, and data structures including linked lists and binary trees. By breaking things down into smaller pieces and requiring that students practice and study regularly, frequent small assessment allows us to both cover more material and graduate students who are uniformly well-prepared for their next CS course. Students don’t learn by cramming, and frequent small assessment provides no incentive to pursue this ineffective strategy.
Frequent small assessment also plays a critical role in helping keep students on schedule. Most students who fail my course get into trouble because they get behind. Having a weekly quiz allows us to identify students with knowledge gaps quickly. Students know what they don’t know, and can review the material and adjust their study strategies accordingly. My staff performs weekly outreach to students who did poorly on recent assessments. We contact each student directly—both to remind them about our support resources, but also to ensure that they feel seen. This is one way that we provide students with the individual attention they might receive in a smaller classroom, but at scale.
Because we assess students frequently, we also have a lot more data about their performance in the class, which allows us to implement flexible and student-friendly grading policies that reduce stress while accounting for the vagaries of life. We provide students with flexibility about when they complete the daily homework, as well as a generous number of drops on both homework and quizzes to accommodate illness and other normal life events. Because the material in CS1 is mostly cumulative, we allow students to raise a quiz score if they do better on the next one—a policy I call catch-up quiz grading, because it encourages students to catch up when they get behind.
While difficult to measure, my impression is that frequent small assessment has resulted in students finding my CS1 course to be easier. I know exactly how much my students have accomplished at the end of the semester. But because the structure provided by frequent small assessment helps students avoid procrastination and generally stay out of trouble, students seem to emerge with the perception that the course was not particularly hard. While this is hard to quantify, I will note that the growth in CS1 since Fall 2017 has not been mirrored in our gentler introductory computer science courses, where enrollments have remained flat or declined while enrollment in my CS1 course has doubled. This suggests the course is appealing effectively to non-majors and calibrated properly for beginners.
Asynchronous Daily Lesson FormatAsynchronous Daily Lesson Format
When the COVID-19 pandemic began, I used the challenge of supporting remote instruction as an opportunity to experiment with a new asynchronous daily lesson model. That change has worked so well that I plan to continue to teach the course in this format.
Prior to Fall 2020, my CS1 course met three times weekly for synchronous instruction. Classroom instruction mixed traditional lecture-based delivery with a heavy complement of live coding exercises integrated directly into the online slides. Participation was graded and students were expected to attend and follow along.
Despite the use of active learning components, the synchronous version of my course suffered from many of the same weaknesses that have been identified in lecture-based courses for decades. No single pace of live instruction is appropriate for a large group—particularly in CS1 which enrolls students with a wide mix of prior experience. Ensuring student participation in classroom activities is difficult. Watching someone else is not only an ineffective way to learn, but can breed overconfidence. Students are naturally reluctant to ask questions in a large classroom, nor is it possible to properly answer all questions asked by students during lecture.
I had prior experience designing and delivering a large course in a fully-flipped format—an introductory course on the Internet that I created at the University at Buffalo. However, that course lacked a well-structured set of assessments to keep students on track and drive engagement, and was ultimately not successful. However, by the time the pandemic started in Spring 2020, I had a well-structured set of CS1 assessments—the daily homework problems and weekly quizzes. With the structure provided by frequent small assessment already in place, I saw an opportunity to create materials that were aligned with the assessments. Materials that would be highly-interactive and encourage student engagement, but allow students to work at their own pace and on their own schedule.
The result was the set of daily lessons that I inaugurated in Fall 2020 and that we have continued to use and update since then. I refactored each week into five daily online lessons. Lessons combine (1) playgrounds, where students can edit, run and experiment with Java and Kotlin code; (2) interactive walkthroughs, which combine audio with an animated editor to support live coding explanations from a community of instructors and course staff, as well as video explanations when appropriate; (3) debugging exercises, where students are challenged to fix small mistakes in code; and (4) practice and homework problems, which engage students in computational challenges. All these components combine to create a highly-interactive student-directed experience, where students are both introduced to new ideas and provided with frequent opportunities to evaluate their understanding of new concepts and reinforce existing skills.
Student success rates using our asynchronous materials have remained strong, even as the course has continued to grow—from 900 students in Fall 2019 (the last pre-pandemic semester), to 1400 students in Fall 2022. Several aspects of the overall design of the course have contributed to its success in this format. One is our use of frequent small assessment, as described above—even more effective now with homework and practice problems more directly integrated alongside the explanatory content. Second, we provide students with online tutoring support from dawn until dusk, to ensure that whenever they are studying, there is a staff member available to help. Together my staff fielded 17,000 questions on our tutoring site in Fall 2022, an average of 14 per student—far more questions than we would be able to field during class. We also see evidence that students are more comfortable asking for private one-on-one tutoring than posting on a public forum.
Together the combination of the asynchronous online format, frequent small assessment, and on-demand tutoring has resulted in a course that is both more successful and more scalable than the previous lecture-based model. While there is the loss of some amount of socialization that can occur in a large lecture, this is more than offset by the increased accessibility of the course, the ability for students to work at their own pace, and the promotion of active and self-directed learning grounded in engagement with the material. As the pandemic has eased, we have reintroduced in-person components into the course, but still find students making heavy use of our online resources. Moving forward, we are exploring ways to create an even stronger sense of course community, particularly through out-of-class activities and engagement opportunities.
CoachingCoaching
In Fall 2024 we launched a coaching program that proactively contacts students in need of support and offers individual course strategy sessions. This program complements our existing dawn-to-dusk online tutoring by identifying students who may be struggling and reaching out to offer personalized guidance on study strategies, time management, and course navigation. Early results suggest that this proactive approach helps students get back on track before small difficulties become larger problems.