In solving problems, everyone (doctors, musicians, biologists, computer scientists…) goes down paths that ultimately prove wrong. How can you use those (wrong) paths to gain important insights into the ultimate solution? In this course you have the opportunity to develop these skills. In this course you have the opportunity to develop your ability to make profitable “wrong turns” in problem solving.

How do you break down a really complex problem into solvable parts? Some parts you can separate and some you cannot. In this course you have the opportunity to develop your ability to tackle really complex problems by breaking them down, wisely, into parts.

What do you do with problems that are presented to you in a misleading way This happens unintentionally all the time. One of your collaborators or a team member comes to you with problem that he/she is sure is caused by another person. Or a patient comes in with a set of symptoms and is sure she/he has strep throat and is prepared to convince you of this. You need to be the person who has enough perspective to consider that “Do you have strep throat?” is the wrong question. What’s the right question? In this course you have the opportunity to develop your ability to deal wisely with the different pieces of information provided to you.

Finally, after you’ve come up with a solution to a problem, how do you determine if it is the right one? What checks can you do to confirm that your solution is the best one? In this course you have the opportunity to develop your skill at checking your answer, determining if its reasonable, and relating it to other things you know (without having a “back of the book” to check!) This is incredibly important in programming. There are sort of two levels of a program “working”. The first level is where it actually runs with no errors. This is great, and it’s a great achievement, but it’s not the same thing as a program actually doing what you wanted it to do, and it’s really important to be able to tell the difference. It’s easy to tell whether a program “works” at the first level, but it requires some really fun thinking and fun testing to determine if it’s doing what you thought it should do.

Finally, programming is a very useful skill, and it’s becoming more useful everyday. There’s a reason this course is being offered in chemistry, linguistics, and physics. I actually expect that by the time you graduate it will be offered in a half-dozen more subjects. There is an enormous demand for programmers in the work force in a number of fields. For example Biology didn’t used to be a computer intensive field, but now that the human genome project is underway, it is. What you’re learning in this class is one language - python, but which language you learn first turns out not to matter too much. Once you learn one language it’s pretty easy to pick up whatever other language you need. The skill you’re learning is to think like a computer.

Computers are kind of dumb (don’t tell anyone I said that.) People think they’re incredibly complex and scarey, but honestly I think it’s more useful to think of them as dumb. They will only do exactly what you tell them to do, and no more. They’ll do it really fast, and on much larger data sets than you would have the patience to analyze by hand, but they’ll still only do what you tell them to do. The things students say that lead me to believe they haven’t yet accepted this fact of computer dumbness are things like, “My computer hates me.” or “It’s doing something weird.” Those mantras don’t really help you find the error. The mantra that will help you find the error is “this computer is dumb, and it can only do what I tell it to do.”

You will:

Develop problem solving skills including the following:

  • Develop problem solving skills, specifically in solving problems you’ve never seen before.
  • Develop your ability to make profitable wrong turns in solving problems. In other words, learn from your mistakes.
  • Develop your ability to break down complex problems into doable parts.
  • Develop your ability to determine if your answer is reasonable.

Develop programming specific skills including the following:

  • Learn to think like a computer (if loops, for/while loops, functions, arrays….)
  • Understand what `the cloud’ is.
  • Know how to make your program ``object oriented.”
  • Not be intimidated by reading large data sets in.
  • Not be intimidated by weird error messages.
  • Know how to ``debug” your program.