Beyond specific domain skills, building software is a
craft that requires careful design. This course teaches key
software design principles in a studio setting. Each week,
students present their programs to the class for a design
review. Together, the class evaluates the programs for their
correctness and, more importantly, their clarity and design.
Expect to learn how to build reliable, maintainable,
extensible software and how to evaluate other’s code for
those same properties.
You must join the piazza group. Occasionally, important
announcements are posted there between classes.
Gamma, Helm, Johnson, Vlissides
Design Patterns: Elements of Reusable Object-Oriented Software.
This text plays the role that a writing guide plays for an essayist, but for
Felleisen, Findler, Flatt, Krishnamurthi
How to Design Programs
Extreme Programming Explained
All projects must be implemented via pair programming.
Pair programming means that you do all programming together.
For the first several assignments, any time either you or your partner
type a single keystroke towards
what you hand in, you must be together. Thinking about the project
separately is fine, but not working on it. We will revisit pair programming
throughout the quarter but expect to spend considerable amounts
of time with your partner.
You must choose a partner
with whom you wish to work on projects as soon as possible.
You may switch partners after consulting with the course staff and
discussing the work log together.
about the pragmatics of pair programming.
|Journal & Estimates|
Each person must keep a work journal (individually). Every time you work on
something related to this course, enter the following information
(one line each):
- what (topic),
- when (date, time),
- where (location),
- who (working partner),
- and how long (duration).
Please estimate at the beginning of each project how much time you think it will take.
Enter the estimate in your journal.
As the course progresses, try to understand how much you
over/underestimate and try to correct for it.
We will review the notebooks in case of conflicts and in case of borderline grades.
For in-class demonstrations and discussions,
I will use UML diagrams, Java, and Racket.
For projects, you are free to choose whatever language you wish to use.
You may also switch your language of choice over the course of the quarter.
Mostly, there will be one assignment per week. The assignments
will include a short essay, modifications of a Java program,
designing and implementing programs from scratch, and
maintaining/modifying your own code.
We will be using Github for assignment submission starting with assignment 3.
If you haven't used Git before, you can get familiar with its mecahnics with this
We have set up a GitHub organization for the course
. Once you join the organization
you and your partner will have access to a subset of the organization's private repositories:
- the repository teamX-working where X is the number of the Github team for
- all repositories teamN-codewalks where N is a team number,
- and the repository topics.
repository is for you and your partner to use for working on
your code. Only you, your partner and the course's staff have access to it. We will use the
last commit before the deadline of the relevant assignment to pull the code for your code
All members of the organization have read access to the teamN-codewalks
repositories. We will use these repositories to make available to the class the code of
the corresponding team after each code presentation so that you can comment on each other's code.
repository contains a single file where you can suggest topics we should
discuss in class.
As you work on the assignments, please remember to commit often and use descriptive
commit messages. Git commits are your best friend when you want to understand
changes in your code or revert your code to a previous version.
Grades are assigned based on two factors: your class participation
and your code presentations.
Your weekly homework may have some influence in boundary cases.