As much as I know my readers love to learn about code, sometimes I have to take a moment to cater to the educator crowd. Today, I want to do that by sharing some of the ways I’ve upgraded one of the courses I’m teaching. Let’s get into it!
Table of Contents
I’m sure I’ve described this course countless times on this website (see here, here, and here), but I’ll give yet another overview. In short, I teach an introductory programming course on software components in Java. The idea is to teach students that modern development is about using what already exists to create something new.
In this course, we meet four times a week where days alternate between lectures and labs. Outside of class, students are expected to complete 22 written homework assignments, 11 projects, and 3 exams. With the remaining time, students might choose to hang out with me or one of my undergraduate teaching assistants during office hours.
In terms of content, we cover a lot of interesting ideas from an introduction to coding in Java to data structures like sets and stacks. In addition, we tackle the challenging concepts of recursion and loop invariants, and we even take time to talk about software development practices like design by contract and model-view-controller.
Overall, the course has really grown on me, and I think it is my responsibility to make sure students get as much out of it as possible. In the rest of this article, I’ll talk about how I’ve attempted to accomplish that.
To give a bit more context around this course, I was trained to teach it in the summer of 2019 and taught it for the first time in the fall of 2019. After a year of teaching the course, I switched departments and started working on research. Then, I picked the course back up this fall (2021). Over the last year or so, I decided to take some time to improve the experience for my students, so let’s talk about it.
My Class Is a Community
To me, one of the most important reasons anyone should go to college is to learn the value of community. In college, you have to lean on a lot of people to get through. However, engineering programs tend to do a bad job of teaching you this. If you’re lucky, you might stumble into a good friend group that can support you. If you’re not so lucky, you’ll end up like me grinding through the material in your room alone.
As a result, one of my core values as an educator is to make sure the classroom is about community first. In our field, you can largely teach yourself how to code, so why not spend the classroom time teaching you how to interact with your peers—at least that’s how I see it.
To build community, I do a lot of different things. For example, I tend to start by getting students to learn each other’s names. There are a lot of ways to do this, but I’m a fan of nametags. Then, to facilitate the learning of names, I usually try to do group activities like Think-Pair-Share and Jigsaw. I’m also a big fan of using Peer Instruction which can be used to really nail down a concept while also getting students to work together.
My Expectations Are Explicit
One of the pain points of this class for many students was never knowing why they lost points on an assignment. The main reason for this pain was that grading was never transparent. On one hand, students have a perfectly clear assignment description, so surely they should be able to do well. On the other hand, they’d have no clue how we would actually assess them, so they would often lose points for silly things that we could have warned them about.
As of this semester, I tried to make expectations more explicit—not just for the students but for the graders too. In particular, I made rubrics for the first time. Prior to rubrics, all assignments were graded using a demerit system. Rather than awarding points for doing something well, we took away points for doing something wrong. That might seem like a minor distinction, but it often resulted in really frustrated students as seemingly random points were extracted from otherwise good assignments.
Rubrics were a bit rusty this semester but I am otherwise satisfied with them. I’ll keep working to make sure they look better in the future.
My Efforts Are Flexible
Something else I’ve tried to do this semester was improve the course on demand. In other words, as students have concerns, I tried to address them in the moment. For example, I pushed back several assignment due dates as students asked for more time. Likewise, I made keys for the homework when students complained that they didn’t know if what they were doing was a good approach.
One of the nice things about being flexible is that it has allowed me to really adapt the course to the students needs. For example, I’m currently working on making my own version of the slides which includes all the activities we will be doing each class. In addition, I want those slides to include reminders about assignments and whatnot.
Going into next semester, I am also planning on hosting at least one of my office hours online. Or even better, I might plan to host them in person with the option to go online. We have the technology. Why not use it? Likewise, I’m planning to make checklists for each assignment, so students can remind themselves of things they should care about.
Like every semester, I’m planning to write a reflection, so some of this information will be duplicated. That said, I hope this was useful to you, if for no other reason than to give you ideas on how to improve your own courses. Other than that, thanks again for checking out my work!
Magic numbers are numerical constants that have no clear meaning in the code and therefore make code harder to read. Anything that makes code harder to read is something we can use to obfuscate our...
Type hinting is a nice tool that dynamic typing languages employ to make code more readable. As you can probably imagine, readability is not the goal with obfuscating code, so we ought to get rid of...