Hélène Martin had a pair of great posts last week (links below) about what makes a good programming project which I linked to from my links post. Hélène asked in the comments what my idea of a good programing project was. It’s a fair question. Developing projects is one of the hardest things teachers of programing have to do. A lot of what we do involves borrowing projects that other people develop. Sometimes we get them from textbooks, others from course websites, more from conferences, and still more more conversations with other teachers. Some of my favorite original projects have come from conversations with students in class. But what makes a project a good project?
Before we go farther I divide projects into small projects and large projects. large projects are very different in scope and purpose than small projects. For the purposes of this post I will talk about the sort of small projects that are assigned during the course of a semester. These projects are generally focused on a particular concept. In fact a project that tries to cover too many topics in a small space is not usually a good idea. So to start off a small learning project has to have at its core a central, as close to atomic (I use that word very loosely) operation or concept. Ideally you don’t want students confused by trying to use two or more new concepts at a time. As a teacher you don’t want to have to guess about which of several concepts students are having trouble with.
A good project should have a “hook” for the student. While not every project is going to interest every student one should aim to interest as many as possible. I got interested in programming because it was fun. It is still fun. It’s not much fun if the project isn’t personally interesting to me though. The same is true of students. A motivated student will knock themselves out to work on a puzzle/project that interested them. They’ll do the minimum and get the minimum out of a project that makes no sense to them or lacks interest for them. I think that some courses get too pure mathematical for some students. Programming and math have more than enough in common that beating a student over the head with the connection can be counter productive. Fun is not a bad thing and I would argue that more learning happens when students are having fun than when there are miserable. But no I don’t have peer reviewed research to support the idea.
A good project lends itself to helping the instructor understand what students do and do not understand. This is a hard piece and frankly I think it comes more with instructor experience than purely a function of the project. For me any assessment tool, including projects, are most valuable when instructors are able to use it to gauge learning. This cycles back to the bit about a single main concept of course. I’m not sure how to define this characteristic. I used rubric a lot in evaluation. So a project that allowed me to define a lot of things to check while remaining simple (yeah a tricky balance) was/is a good project.
The other thing I like in a project is that it is easily expandable. By that I mean that a student who completes the basic assignment can easily find ways to expand their project. They can make it personal. They can use it as a base to learn beyond what has been covered during lectures or assigned reading. When students learn on their own they seem to learn it better. They also often teach the concept to their peers. While one has to be careful to make sure this peer tutoring is accurate it can be a real bonus to learning. Letting students get creative lets students get more satisfaction from their work. It can also open the door for development of additional projects or aspects of projects that can be used in future classes. There is nothing wrong about learning for students.
I like Hélène’s list and her thinking behind it. She has clearly given a lot of thought to what she has been doing. I don’t think my ideas are all that different. I do think I took longer to stumble on to my conclusions though. It may be that we as a CS education community need to talk more about what is and is not a good project. Maybe if we had a better mental image of what we wanted we’d have an easier time creating new projects. Or worst case, recognizing one when we find one.
Hélène Martin’s posts:
Follow Up: Programming Assignments for Mental Models
One of the cool things about having the kids write a game is there are always more added features that can be dreamed up. Our Programming I kids are writing games with Scratch. It is truly amazing how much time a kid will put into a project trying to figure out how to get a new feature to work. These are not programming geek kids, but mainstream kids who signed up for the class because they needed the required CS credit. I am simply not used to plans that work this easy. They come into the programming class and of course the first thing they ask is “Can I write a game?”, and the answer is “Of course you can!” Little do they realize it is all a trick to make them learn some programming and thinking skills. I almost feel like I am cheating.