By now, you know the fundamentals of program design. CS 2 aims both to deepen that technical knowledge and to broaden its scope.
Guiding our inquiry this year will be the question: how do we represent this idea in code? Asked in different contexts, this question will lead us to discover a host of new data structures, above and beyond the structs and lists you used last year. These, in turn, will motivate us to develop new forms of abstraction, to help manage the complexity of our new representations. This emphasis on abstraction and data representation will form the technical backbone of the course.
But another goal of the course is for students to become more broadly literate in the technical debates of today. Programming assignments, readings, and in-class discussions will highlight relevant controversies, and connect them to the technical curriculum we are studying. Potential topics include “cookies” and user tracking, regulation and free expression on the Internet, encryption, cryptocurrencies like Bitcoin, and machine learning.
This course also prepares students for the AP Computer Science Principles exam in May.
We will begin the year with an introduction to static type systems and the programming language Go. Students will explore various techniques for data abstraction (such as encapsulation and polymorphism) in programming assignments significantly more sophisticated than those in CS 1. In November, we will embark on a series of month-long case studies, each with its own mini-project. Each case study will both require students to synthesize various data structures and programming techniques, and inform them about a new computer science discipline or tech ethics issue.