Description

Many view software design as a craft, learned best through practice that is guided by experienced mentors, where the best lessons are learned by making mistakes rather than there being one right way to do it. In this respect it is more like art than science. The arts, as well as architecture and engineering, benefit from subjecting work to constant review by both peers and mentors as a means of providing fast feedback which allows students to learn quickly from their mistakes.

This course focuses on the design of software by implementing successively larger projects in successively larger teams. As such, students should focus on improving their program's flexibility while communicating with other students to fit their code into a larger whole. Projects given are intended to be under-specified, so that their design and functionality must be justified and improved through iterative feedback.

In short, my goal is for you to be able to turn vague and ambitious specifications into a system design that can be built, maintained, and extended, prioritizing the features to be built first, then refining and extending the project through multiple draft releases.

This course is geared towards highly motivated and capable students who enjoy software development and abstract thinking. Those merely seeking an easy elective will be deeply unhappy; those willing to put forth the time and effort will likely find this to be one of the most useful classes of their undergraduate career (based upon comments made by former students). If you find your efforts are not being well directed towards learning, contact the course staff immediately to help us remedy the situation — the goal is not to work you simply for work's sake.

Required Background: It is assumed that you have previously programmed extensively in Java (e.g., at the level of
CompSci 201
at Duke). If you do not have such experience programming, this probably is not the right course for you. See the course staff if you have questions.