CS 100: Software Construction

Winter Quarter 2005: January 3, 2005 - March 11, 2005

Contents

Basics

Catalog Description: Development and construction of software products. Topics include design, coding layout, and style; implementation strategies; quality attributes; prototyping, reuse, and components; debugging, testing, and performance; integration and maintenance; documentation; standards, analysis, and selection of tools and environment; and personal software processes.

Prerequisite(s): CS 141: Intermediate Data Structures and Algorithms. You must be reasonably comfortable with C++ programming and Unix to pass this course!

Time Requirements: Four units (12-16 hours/week): lecture (3 hours/week), laboratory (3 hours/week), individual study (6-10 hours/week; includes reading, writing, and hacking).

Coordinates

Instructor: Peter H. Fröhlich
Office Hours: Monday, Friday, 2:10 pm - 3:00 pm; Wednesday, 4:10 pm - 5:00 pm (email for additional appointments)
Location: Surge, Room 341

Lectures: Monday, Wednesday, Friday, 10:10 am - 11:00 am
Location: Boyce Hall, Room 1471

Assistant: John Anderson
Office Hours: Monday, 2:00 pm - 3:00 pm (email for additional appointments)
Location: Surge, Room 282

Lab: Monday, 11:10 am - 2:00 pm
Location: Surge, Room 170

Assistant: Nelson Perez
Office Hours: Wednesday, 1:00 pm - 2:00 pm (email for additional appointments)
Location: Surge, Room 282

Lab: Tuesday, 11:10 am - 2:00 pm
Location: Surge, Room 283

Mailing List: cs100@lists.cs.ucr.edu (Archive)

Books

Required

Andrew Hunt, David Thomas: The Pragmatic Programmer. Addison-Wesley, 1999. A wealth of practical advice on various topics relevant to software construction, including design, implementation, testing, debugging, etc. Organized in 46 relatively small "lessons," extensively cross-referenced, including 70 "rules" and several check lists on a reference card. You can download additional material for this book here. An errata is available.

Recommended

Martin Fowler: UML Distilled. Addison-Wesley, 3rd edition, 2003. Succinct introduction to the Unified Modeling Language (UML) and also a concise summary of basic software engineering and software construction concerns. The 2nd edition is also good enough for the course, and it's available much cheaper.

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns. Addison-Wesley, 1995. The standard reference for object-oriented design patterns: well-documented solutions to recurring design and implementation problems. The case study in chapter 2 is also a great introduction to object-oriented design and programming. We'll discuss number of patterns in the course.

Also Running

Brian Kernighan, Rob Pike: The Practice of Programming. Addison-Wesley, 1999. Succinct discussion of a variety of programming topics. Deals with style, documentation, design, testing, debugging, portability, etc. Uses several programming languages (C, C++, Java, Perl) and discusses the tradeoffs involved. I used this one in Spring 2003 as the main text, but I think the new choice is more comprehensive and accessible; still, get this one if you feel like it, goes nicely with the current text. An errata is available.

Barbara Liskov, John Guttag: Program Development in Java. Addison-Wesley, 2001. Do not be fooled by the title. This is an excellent advanced programming text that deals with many software engineering concerns as well. If you want to learn some Java and along the way pick up lots of programming and design skills, get this book.

Steve McConnell: Code Complete. Microsoft Press, 1993. Another excellent advanced programming text, again covering many software engineering concerns as well. This is a real classic, but currently out of print as far as I know. An errata is available.

Schedule (Tentative!)

Note the word tentative above. Things seldom go according to plan, and I expect changes here and there as we go along. Please also read the notes below.

Notes

The term "H s" refers to the required text by Hunt et.al.; for example, "H 27" refers to section 27. It's a good idea to skim related sections as well (as indicated in the book).

Bold sections are not discussed in lecture or lab (unless you ask about them), but the material is relevant. Some topics we go over in lecture or lab are not covered in the text; I will try to provide additional references for those.

You are expected to do the assigned reading before a topic is covered in lecture or lab. Reading assigned in the week of an exam is part of the exam! Please try to read ahead, you'll be surprised how much more sense the lectures make...

The department's programming guidelines make for quite interesting reading, often highly relevant to this course.

Slides

I try to write slides for my lectures, but I am not always very lucky in getting them done (either on time or ever). In other words, it's a good idea to always take notes in class. :-) That said, I decided to put all my slides into one PDF file instead of posting every lecture by itself. The advantage is that you never have to guess whether I forgot to post a certain lecture, or whether I never wrote the slides for it. The drawback is that the file evolves during the quarter, so the version you download in one week will be quite different from the one available three weeks later. Keep that in mind please.

I'll try to email the list whenever I post a new version of the slides, but of course I might forget. If in doubt, just check back here.

Links

Here are a bunch of links you might be interested in as you try to get a grip on software engineering. I didn't have time to organize them yet, but I promise that all of them are quite enlightening.

Project

There is not really a "distinct" project in CS 100, instead all project work is integrated with the weekly assignments. In Spring 2003, the assignments focused on an improved implementation of the standard Unix wc command, the so-called "word count" tool. In Fall 2003 the assignments focused on a "schedule generator" application called sg, which takes a plain text list of events and produces nice XHTML output. In Winter 2004 the assignments focused on a "find duplicate" application called fd, which recursively explores a directory tree and produces list of duplicate files and subtrees. In Spring 2004 the assignments focused on a "disk usage" application called du2, which recursively explores a directory tree and computes it's size in a variety of formats. In Fall 2004 the assignment focused on a "circuit simulator" application called cs, a project that went so well that I am using it again. So without further ado... :-)

This quarter, the assignments will focus on a "circuit simulator" application called cs for obvious reasons. The basic cs tool accepts a combinatorial circuit as input and produces the circuit's truth-table as output. Combinatorial circuits consist of inputs, gates (such as and, or, and not), outputs, and wires. The truth-table of a combinatorial circuit shows the state of its outputs for each possible combination of inputs. More details on what cs must be able to do will be given as we go along, but this should be enough to get a "flavor" of the project.

Important Note: As long as you understand what the C++ expression (a || b) && c computes, you will be fine. We will review the basics of combinatorial circuits in lecture and lab, for the benefit of those who did not take CS 061: Machine Organization and Assembly Language Programming yet.

Teams

The following teams are currently registered. If there are any changes in your team, be sure to let us know, we need to approve those to keep track of what's going on in the course. Also, if any information below is wrong, tell us ASAP. Thanks!

Assessment

Assignments (8): 40%, Quizzes (2): 10%, Midterm (1): 20%, Comprehensive (1): 20%, Peer Review (1): 10%. See my policies for more information.

Updated: $Id: index.html,v 1.12 2005/03/29 08:13:51 phf Exp $ Validate: XHTML CSS
Copyright © 2003-2004 Peter H. Fröhlich. All rights reserved.