Winter Quarter 2005: January 3, 2005 - March 11, 2005
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).
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)
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.
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.
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.
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.
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.
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.
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.
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.
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!
Assignments (8): 40%, Quizzes (2): 10%, Midterm (1): 20%, Comprehensive (1): 20%, Peer Review (1): 10%. See my policies for more information.