CS 257: Software Design

Course Information

Goals

I have two main goals for you in this class. I want to help you improve your independence as a programmer and your ability to write high quality code. Pursuing these goals involves the usual academic emphasis on concepts and vocabulary that you need to learn through study and experimentation. But it also involves lots of practice with the tools of the trade, and lots of effort to develop good habits and discard bad ones. Therefore, we'll spend a lot of class time on practice.

Class time

Most days, we'll do some combination of:

Books

We will take readings from a variety of sources. Enough of the readings will come from two books that I have asked you to purchase them: The Pragmatic Programmer, by Andrew Hunt and David Thomas, and Don't Make Me Think, Revisited, 3e, by Steve Krug. Both of these books are short, fun to read, and reasonably cheap. They're also both packed with ideas that programmers should think about. You'll get lots of good advice here, plus some advice you disagree with. The disagreement is natural, and the discussion matters.

Languages

At various times during the course, we will use Python, Java, and Javascript. We'll also use some special-purpose languages like HTML, CSS, and SQL.

Code reviews

For some programming assignments during this term, we will have code reviews. For our purposes, a code review will be a meeting of the students at one of the tables in Weitz 235, with drop-in interruptions by me. The goal of each code review will be to will discuss the strengths, weaknesses, and other interesting features of each student's solution of a particular programming problem. Code reviews are one of the most efficient and powerful tools I know of for improving your software, but of course most people feel a fair amount of apprehension at the idea of discussing their code in detail in front of other people. Thus, it's essential that each participant in a code review prepare thoroughly by studying everybody else's code, and by preparing positive comments, constructive criticism, and plenty of questions. We'll discuss the details of our code review process before the first code review.

Grading

Your grade will be based on your performance on a variety of assignments, and and on your participation in the code reviews. The assignments will include a little bit of writing, several programming assignments, and at least one revision of a programming assignment. There will be no exams in this class.

Though the precise weighting of the assignments in your grade will depend on the exact nature of each assignment (which I won't determine until the assignment is written and posted online), a good estimate will be the number of days I give you between the last assignment and the current assignment. So if there's a two-week gap, that assignment will be worth approximately 20% of your grade in a ten-week term (with the caveat that I don't count midterm Saturday through Monday as days--I intend for you to have time to rest and catch up on midterm weekedn).

Late homework will receive 25% reduction of score during the first 24 hours after the homework was due, and will receive a score of 0 after that. Consult me at least 24 hours before an assignment is due if you have extraordinary circumstances preventing you from handing in your work on time. In real emergencies, contact me as soon as you are able.

Rough schedule

I may reorder some things along the way, but the schedule will look more or less like this: