Three Terms Teaching Intro Programming

This past quarter was a weird one. COVID-19 necessitated remote education, and so I set out to teach programming to 330+ students online from my dining room. (I simultaneously taught data science to 440+ students, but that’s another post).

Here, I summarize the three quarters I’ve now taught COGS 18 Introduction to Python at UCSD, following up on my previous blog post about this course, which summarized my first go at teaching this course.

Course Objectives

As a reminder, the course objectives for this course are as follows:

  1. Program at an introductory level in the Python programming language
  2. Read basic Python programs, recognizing the structures they use and be able to explain how they work
  3. Solve basic problems using programmatic solutions
  4. Write and debug small Python programs
  5. Execute Python programs on your local computer, using notebooks and the command line
  6. Describe and implement best practices in Python, keeping in mind that programming is done by and for humans

Changes I’ve made to the course

While the structure of the course has remained consistent, having learned from where students struggled previously, I’ve changed the time I dedicate to certain topics and the way in which I explain many things, particularly in the last few weeks of the course when we move away from Jupyter Notebooks and discuss code testing, documentation, and code style. I increased the live coding I’ve done throughout the course with a particular focus on doing so toward the end of the course. Further, I have included more demonstrations of common issues in code that students encounter and demonstrated more explicitly how to refactor and improve code style.

There have also been a number of logistical changes across iterations; however, for Spring 2020, the largest logistical changes were that I 1) did not require/motivate attendance at any specific time, 2) exams were completed remotely and were open notes/open Google and 3) coding labs were graded on effort rather than simply “showing up”.

Survey Analysis:

At the end of the course, I always solicit feedback from students. As in the previous post, I’ll again focus on two important questions about how they were feeling with the course content:

  1. How comfortable are you with programming in Python?
  2. Check all that apply: After COGS 18, which of the following skills do you feel you possess?

Response Rate

The first time I taught the course there were 275 students enrolled at the end of the quarter, with 195 students (71%) responding to the post-course survey. For Fall 2019, there were 301 students enrolled, with 219 students (73%) responding. And, in Spring 2020, there were 307 students enrolled, with 233 students (76%) responding.

How comfortable are you with programming in Python?

In response to this question, students were guided to respond on a scale from 1 to 5, where 1 was “What’s Python?” and 5 was “I could teach an intro Python Class!”

Here, the red vertical line indicates the median. With this, we see a slight shift in students’ comfort, with more students reporting that they are a 4 out of 5 in the most recent iteration of the course. This past Spring (Spring 2020), >90% of the class responded that they are at least a 3. In the beginning of the quarter in this class, 60% of students typically have no programming experience. I am very clear with students on the first day of class that I do not expect them to become a programming expert in 10 weeks. It’s my goal that students move away from novice in the direction of expert. It is my expectation that students leave this course rating themselves a 3 out of 5 Anything higher is great, but not my expectation. My goal will be to get closer to 100% of the class self-reporting a 3.

Check all that apply: After COGS 18, which of the following skills do you feel you possess?

Beyond general student comfort level, I’m always curious about how well I’ve accomplished my course objectives.

In my previous post I wrote:

During the quarter, I sensed that students struggled in the last few weeks of the course when we focused on best practices in Python and using the command line (rather than Jupyter notebooks). I also had a feeling throughout the quarter that I could have taught debugging better and done more live coding. So, fingers crossed I can increase all these numbers this Fall when I teach the course again. And, specifically, I’m going to work improve how effectively I teach the last few weeks of the course!

Here we see that for the top three course objectives, there hasn’t been much change from one quarter to the next; however, we do start to see shifts in students’ comfort writing and debugging code, understanding and applying best coding practices, and in their comfort at the command line, which is great. But, I’d love to see these increase further. I have a few changes to make to the course overall, so hopefully, I can increase student mastery of these course objectives more in the future! I also intend to analyze (at some point) student projects, as they are excellent sources of students demonstrating mastery, which can be used in addition to this survey data.

Next academic year, I’m teaching this course every quarter. I’m so excited to improve the course and continue to teach Python to our amazing undergraduates at UCSD!