This book is a draft textbook to accompany Fundamentals of Computer Science II (Honors): Introduction to Class-Based Program Design at Northeastern University.http://www.ccs.neu.edu/course/cs2510h/ It began its life as a series of course notes from the Spring 2011 incarnation of the class, evolved during Spring 2012, and is now being revised throughout the Spring 2013 semester.
The “book” is very much a work in progress, which means there are large omissions and numerous errors. Moreover, it’s certain to change as the course progresses. Your patience, feedback, and bug reports are greatly appreciated. The book and its accompanying software are maintained on Github at the following URL:
It puts a lot of emphasis on something called The Design Recipe, which sounded hokey to me at first, but when I was shown what The Design Recipe was, I realized, even as someone who’s been programming for 35 years, that rather than code a solution to something complex in say, an hour, after 15-20 minutes, when I thought I was a third done, I was actually and suddenly completely done, sometimes almost feeling like magic. It basically puts a high emphasis on thinking and designing first, writing test cases very early, picking the right program structure, and then filling in the blanks and expanding them in a few places. Following the Design Recipe, not only was I often “suddenly done,” but because my tests were written before I started coding the meat of a solution, I had (and continue to have) high confidence that my program works and will continue to work (or alert me quickly to new errors) should I make any “enhancements” down the road.
The main focus of this book is the design process that leads from problem statements to well-organized solutions, oriented around the concept of objects. We make extensive use of explicit design guidelines formulated as a number program design recipes as described in How to Design Programs. The most general form of the recipe for designing programs is given in figure 1.
Problem Analysis & Data Definition
Contract, Purpose & Effect Statements, Header
The objective of the design recipe is to provide a technique
that guides programmers—
Another lesson we should have learned from the recent past is that the development of “richer” or “more powerful” programming languages was a mistake in the sense that these baroque monstrosities, these conglomerations of idiosyncrasies, are really unmanageable, both mechanically and mentally. I see a great future for very systematic and very modest programming languages.
Edsger W. Dijkstra “The Humble Programmer”, Turing Award Lecture, 1972
In support of this book, we have a developed a series of modest programming languages that emphasize the principles of object-oriented design. We use these languages throughout the first part of the book. They are deliberately not industrial strength programming languages, complete with full-featured libraries, convenience mechanisms, and the usual idiosyncrasies that accompany “real” languages. Instead we have designed a progression of simple and consistent languages which embody the common core of modern object-oriented languages. The idea is that by focusing on the conceptual basis of object-oriented programming, students can apply their design knowledge regardless of whatever linguistic context they happen to find themselves in down the road.
In the second part, we transition to Java, a widely used industrial language that has been developed over more than 15 years. The move to Java allows us to explore the application of the principles introduced in the first portion of the course in the context of a practical language.
After the PLT file has been installed, select Language|Choose Language... and select the “Use the language declared in the source” option. You can now write programs in any of the languages included in the course software by writing #lang class/N as the first line of a file, where N is a number in 0, 1, 2, etc. To find out more about the languages, use Help Desk and search for class/0 to get started.
We are grateful to Matthias Felleisen, our TAs: Daniel Brown (2011), Asumu Takikawa (2012), and Nicholas Labich(2013), our tutors: Alex Lee, Nikko Patten, Jim Shargo, Trevor Sontag (2011), Spencer Florence, Sarah Laplante, Ryan Plessner (2012), Becca MacKenzie, and Kathleen Mullins (2013), and the Northeastern students we have had the privilege of teaching in 2011 and 2012.