Skip to content

What Makes a Programming Project “Good?”

2010 November 21
by Hélène Martin

I was drawn to computer science when I realized how endlessly creative programming can be.  I was thrilled by my new-found ability to build useful things at my own pace, for free and while solving interesting puzzles.  I hope to re-create this feeling in all my high school students.

I think programming projects are CS instructors’ best tool for capturing student interest.  This may seem like a non-statement but many CS educators have spent a lot of time distancing themselves from programming, especially for the early courses.  I’m torn.  I agree that computer science tackles issues beyond programming such as algorithm complexity or computability.  I know that programming without regard to human-computer interaction or advances in artificial intelligence can be useless or worse.  But programming provides such a great way to formalize algorithms and is such an impressive creative medium that I can’t really imagine discussing these other fascinating ideas without it.

So for me, finding “good” programming projects is critical.  Lots of things can make or break an assignment but I feel like the single most important factor is whether students feel ownership of what they create.  My take on ownership is probably controversial — I don’t necessarily mean that students should have the freedom to design what they work on.  I think that projects should result in complete artifacts that students understand inside and out.

I make heavy use of CSE 142 assignments from the University of Washington because I feel they exemplify this principle (or I feel strongly about this principle because of UW CSE’s influence on me).  I also have found many of Kathi Fisler‘s Scheme projects consistent with it.  These projects are all deliberately structured to give students practice on one or two core ideas as they produce a meaningful result.  Because they are scoped to emphasize only a few principles, the results may not always be very flashy but I don’t think that matters so much to students, especially in the first few weeks of programming.  It feels like a lot of instructors feel pressure to have students produce professional-looking results immediately.  But do students really care?  I clearly remember being thrilled at programmatically printing out multiplication tables… it was much more about feeling like I had power over the computer and could understand is inner workings than about the results themselves.  Even now, I get a rush from a simple “hello, world” in a new context.

Early on in my AP computer science course, I give a project that requires students to print out a Space Needle made of text characters.  This is of course straight from CSE 142 and their assignment writeup can be found by scrolling down to homework 2 here.  I think this is a brilliant project.  Sure, similar projects have been given since the 70s and it’s not particularly useful, but I have never heard students complain about that.  On the contrary, it’s not uncommon for students to cheer when they finish.  They also have a great mental model of procedural decomposition and of definite loops, the only two significant ideas needed to complete the project.

I’m wary of early projects that make heavy use of libraries.  I find (anecdotally) that when students don’t understand what they’re working with they don’t feel as satisfied with their results, even when those results are impressive.  Before getting my current position at Garfield high school, I spent six months visiting various classrooms.  I saw some really amazing teachers and classes but I also saw several classes in which students who had produced great-looking artifacts couldn’t explain the first thing about them and couldn’t generalize their knowledge to any other situation.  It didn’t seem very satisfying to them.

It’s not that I think students should write everything from scratch.  In fact, I agree that learning to work with existing code is a really important skill.  The Advanced Placement computer science exam requires learning and using a library called GridWorld and I’ve found it great to work with once students have the background to understand it.  They find it really cool that they can read the GridWorld code, understand it and interact with it to build things like this ant farm simulation from Robert Glen Martin (who has other great projects on his site).  Although there’s a lot of existing infrastructure for this project, students own it because they understand GridWorld and the few new big ideas (interfaces, abstract classes) emphasized in the project.

I also think it’s very important that projects be thoroughly scoped and explained.  In a college senior-level networks class, it may be ok if students have to flounder to understand what’s even being asked or fight with incomplete libraries.  For introductory students, though, that can be deeply frustrating and even get them to steer clear of computing.  Assignments generally take time to attain a significant level of polish which is why I prefer to use others’ time-tested masterpieces.  The nifty assignment archive is another good starting point for finding fully-baked project ideas.  My favorite from that set is the star map generator which has been a hit in my introductory Python class.

I try to choose assignments that deliberately build up students’ knowledge, thus reducing anxiety and increasing a sense of ownership.  I have found a set I like from various sources but I’m always on the lookout for other great assignments and project ideas to help get my students excited about the possibilities of computing.

3 Responses leave one →
  1. November 23, 2010

    Sounds like you’ve got a pretty darned good handle on what makes a good programming assignment, and have had great success with it. So what part are you torn about again? ;)

    • Hélène Martin permalink*
      November 23, 2010

      A lot of “the literature” disagrees with me — “put context first”, it says, and “avoid programming if you can” and “emphasize the collaborative nature fo computer science.” So I don’t know. If find it helpful to write out my intuitions and see if they still make sense when I read them a few weeks later!

Trackbacks and Pingbacks

  1. Characteristics of a Good Programming Project - BooleanBase

Leave a Reply

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS