COMP 115: How to Design Programs

Dan Licata Fall, 2017


The purpose of this course is to introduce you to computer science and programming. You will learn a systematic method for going from an informal description of a problem to a computational solution to it, and develop some understanding of what kinds of problems are easier or harder to solve computationally. More specifically, you will learn to

  1. represent information from a problem domain as data in a programming language, using a variety of types of data (such as numbers, strings, aggregates, choices, arbitrary-sized data, and intertwined data)
  2. write functions that compute with such data
  3. develop programs using good software engineering practices, such as writing types, documentation, and examples/unit tests
  4. write interactive programs that respond to user input
  5. use abstractions to eliminate repeated code

Examples will be drawn from various areas of computer science, such as data analysis and artificial intelligence.

This class is designed for students with no prior computer science experience, and can be taken as a single computer science class or as preparation for COMP 211 (which covers more difficult programming, as well as other fundamental skills, such as such as formal program verification and analysis of program running time). COMP 115 plays roughly the same role in our curriculum as COMP 112, so you cannot take both of these classes. If you have taken AP Computer Science, you may be better off taking COMP 211, though you are certainly welcome to take COMP 112/115 for a gentler introduction. Many future computer science majors start with COMP 112/115, while many also start with COMP 211 directly; feel free to ask me for more specific advice.


There will be two classes per week, Tu-Th 2:50pm-4:10pm in Exley 113. In general, Tuesday will be more lectures and Thursday more laboratory work time (working on problems with our help), though we may do some of each on each day. If you have a laptop, please bring it to class every day. Lectures and labs will be your primary source of information for the course, and attendance is strongly encouraged.

We may use readings from several related online texts (which are freely available): Programming and Programming Languages, (Chapters 1-13 provide a fast-paced introduction to some of the course material, in the programming language we will use), How to Design Programs (covers the methodology we will use in detail, but in a different programming language), and Bootstrap (a curriculum aimed at middle/high school students, but there are some helpful materials and reference examples, especially in the Reactive and Data Science courses).

There will be weekly teaching assistant help sessions at some subset of the following times Sunday (7pm-8:30pm), Monday (7pm-8:30pm), Tuesday (7pm-8:30pm), Wednesday (5:30pm-7pm) (exact times will be fixed based on TA schedules and space constraints). We encourage you to work on your homework problems at these sessions, with the help of the TAs.

For most of the semester, there will be weekly homework assignments, generally due Wednesday at 11:59pm (unless otherwise specified). Homeworks are designed to help you internalize the course material; they consist of written problems and programming tasks. No credit will be given for homework handins that do not load. No late homeworks will be accepted, except by permission of instructor.

The final assignment, during the last 2-3 weeks of the course, will be a project on a topic of your choice.


Your grade will be based on homework assignments (75%), the final project (20%), and lab/class participation (5%). (Percentages are subject to change.) Generally, 90%-100% should be interpreted as A work, 80-90% as B, 70-80% as C, 60-70% as D, and below that as failing. However, the instructor may adjust the final letter grade boundaries (in either direction) at the end of the semester, to account for differences between the intended and actual difficulty of the assignments.