According to Larry Wall, the inventor of Perl, three characteristics distinguish good programmers: laziness, impatience, and hubris. Of these, I think hubris is the most important, although I prefer to think of it as a sense of adventure. The best programmers I know are all comfortable with:

  1. googling various combinations of likely-sounding terms until they find some software that might do what they want;
  2. downloading, installing, and trying out that software; and
  3. throwing it all away and starting over again if it doesn't seem to be doing what they want.

With every passing year, more and more of what's in the average programmer's toolbox is free or open source software. Knowing how to go through the three steps listed above efficiently is therefore increasingly important. My question is, can you teach someone to do this, and if so, how? Can you tell an undergraduate class, "For 10% of your course mark, find a tool to profile Java applications, run it on the example code you've been given, and hand in the profile"? How do you mark something like that? How do you prevent cheating? Most importantly, how do you prepare students to tackle it?