Winter 2023
Stanford University
This course aims to teach the art of software design by breaking down complex systems into manageable classes. It covers concepts like information hiding, API design, and error handling. Enrolment is application-based, and prior C++ experience is a must. The curriculum encourages simplicity in system building for easy implementation and maintenance. It is based on "A Philosophy of Software Design" book.
This course teaches the art of software design: how to decompose large complex systems into classes that can be implemented and maintained easily. Topics include information hiding, deep classes, API design, managing complexity, error handling, and how to write in-code documentation. The class involves significant system software implementation and uses an iterative approach consisting of implementation, review, and revision. The course is taught in a studio format consisting mostly of in-class discussions and code reviews. Course enrollment is limited; you must apply for admission.
All of the programming for this class will be in C++; prior C++ experience is essential.
The CS curriculum here has several classes that teach you the mechanics of writing programs (if statements, recursion, inheritance, etc.). We have classes that teach you how to write correct code, how to write efficient code, and how to use various software engineering tools such as make and git. However, we have no other class that teaches software design: how to decompose a complex problem into modules that can be implemented and maintained relatively independently. In CS 190, the primary focus is on complexity: how can we build systems that are as simple as possible, so they can be written quickly and maintained easily?
At the beginning of the class you will learn a set of philosophical principles to guide software design. You will then attempt to apply these principles in a series of programming projects. We will use code reviews and project revisions to improve your ability to work with the design principles. The overall goal for the class is to change the way you think about software design and to give you a foundation that can help you develop into an elite programmer.
This course is based on the material in the book A Philosophy of Software Design, which can be purchased from Amazon (be sure to get the Second Edition). I will not go over the material of the book in detail in lecture, but the material is essential for the class; I will refer to it extensively during the course. You should read the entire book except for Chapters 19-20, which are optional, and familiarize yourself with this material by the first Friday of the quarter.