Fall 2015


This course introduces students to abstract problem solving through the design of computer programs. Students are not expected to have had any prior programming experience. I have a lot of fun teaching this class and my goal is for everyone to have fun learning this material. Whether you do or not is entirely up to you. However, I will guarantee that if you learn to love the challenges presented in this course and you are willing to invest the time necessary to overcome those challenges, you will not only do well in the class, you will be equipped to overcome any challenge you may ever face.

The skill of designing programs transcends specific programming languages. However, as much as we might like to think in abstractions, we must use an actual concrete language in order to practice the abstraction skills we are learning. In this course, we use a series of languages starting with several written in the language Racket, which is wonderfully simple yet powerful and is ideal for full-blown commercial applications as well as for a beginning student's first language. The languages we will use have only a hand-full of syntactic elements and we will learn them early in the semester. The simplicity of the language lets us quickly reach a stage where we can write programs that do interesting and fun things. We will be writing network and/or web applications as well as animated simulations before the end of the semester.

By the end of the semester, you will be reasonably fluent in Racket-like languages and prepared to learn any one of the many other programming languages or to continue in Racket. We will model the course after learning a foreign language by immersion. For most class meetings, we will introduce some new material and use that to write programs -- sometimes together, sometimes in pairs, sometimes individually.

Course Materials