At a high level, the instructor’s goals for this course are to introduce you to fundamental concepts of computer science and to help you develop your ability to design, implement, and test programs. Several skills are needed to successfully write programs, including analytical thinking, systematic experimentation, persistence and patience, organization and time management, interpersonal communication, and effective use of reference material (reading technical documentation, searching the web). We focus on algorithmic thinking and problem-solving: Analyzing requirements, algorithm design, functions and procedural abstraction, pre- and post-conditions, data abstraction, and invariants. We will emphasize techniques for design, such as data driven programming and object orientation.
Along the way we will touch briefly on topics that can be studied in advanced courses, ranging from tools for testing to theories of the limits of computation.
Programming is learned by doing. The main focus of your work will be programming assignments:
There will also be short, unannounced quizzes in class: The purpose is to motivate attendance and to help both you and your instructor gauge your progress. These pop quizzes count as homework scores.
The course score is a weighted average of the following categories.
The course score is normalized to 100 and letter grades are assigned on the usual basis: A = 90–100 B+ = 86–90 B = 80–86 C+ = 76–80 C = 70–76 D+ = 66–70 D = 60–66 F = 0–60
The instructor reserves the right to give a higher grade than your course score, if your performance on later assignments and exams is very strong.
The first three exams consist of a one-hour, on-paper component (scheduled by the Registrar as “quizzes”) plus an in-class on-machine programming problem on a different day. The final exam is on-paper only, i.e., no computers. For dates, check the registrar’s page or the week by week outline.
How to prepare for quizzes and exams: attend class, do the reading, and especially do the programming assignments, carefully and thoughtfully. (Obvious!) The purpose of programming assignments is not to turn them in on time—the purpose is to become a skilled programmer, in which case you’ll get good grades on the exams. Get help from the TA and instructor and work hard.
About the pace: It is possible to do quite a lot by copying and tweaking sample code that uses existing software libraries (“APIs”), without really knowing what is going on. Experience shows that programmers need to have a firm grasp of the basic features of the programming language, like assignments, control structure, and method call, in order to avoid being error-prone and inept. Despite the course pre-requisite, we will cover the basics; if you find the class moving too slowly, help a friend and/or challenge yourself with the many exercises in the book/booksite.
To assess student progress we focus on key skills that can be demonstrated. Here is the official list of outcomes to be achieved by the end of the semester: