This is a first course in programming -- applying computation to problem solving. The course is aimed at students with little or no prior programming experience. We’ll be using a programming language called Racket, in which we will practice functional programming. But, this is not a course about Racket; it’s a course about software construction: designing programs and then translating designs into implementations. Designing software means making wise choices about data structures, algorithms, and program organization. Implementing means more than just writing code: it means making wise decisions about systems and interfaces. By the end of the course, students should be familiar with various programming constructs universal to all languages, they should be able to analyze problems and then create programs to solve them.