CSE 490c (a.k.a. CSE 303):
Concepts and Tools for Software Development

Spring Quarter, 2003

Craig Chambers

chambers@cs.washington.edu

This is the first offering of this course, and as such it is a work in progress.  To give you an idea of what I'm planning to try to do in this course, and how I'm trying to do it, I'm including below a bunch of notes about the course content.  Students who take this course will play a major role in defining how the course turns out, and how it evolves in the future.  Eventually, it is hoped that this course will be a regularly offered, required course of all CS and CE majors.


Administrivia


Catalog description

Introduction to key concepts and tools in the development of software, not introduced in the introductory programming courses. These include programming with explicit memory management and layout (e.g. C or C++), techniques for group software development, modern design, implementation, and testing patterns and strategies, and societal impact.


Themes

  1. 142 & 143 focused on the essentials of programming, abstraction, composition, etc.; stayed at a fairly abstract, high level; and hid as many distracting details of the OS, IDE, and machine representations as possible. Now that students know these basics, and have reached a certain level of maturity and sophistication, we're going to teach them what's going on "under the hood". Give the students more power, more control, and more understanding, and also more responsibility and danger. At the OS level (Unix etc.), the IDE level (javac/gcc, make, etc.), and the PL level (C).
  2. Teach (or give exposure to) additional skills and concepts that are important in being a productive, (semi-)professional programmer. Self-reliance, group programming, design skills, testing & debugging skills, societal impact.  This "book learnin'", along with experience, should enable students to become effective, professional programmers.

Outcomes


Topics

(Roughly in order of appearance in the course)

Projects & Homework

To be figured out!  I'd like to have a running project that involves several elements of the course curriculum, including a component to be written in a low-level language (C or C++), a component written in a higher-level language (e.g. Java), a component or glue written in a scripting language (shell or Perl or Python or ...), using interesting design patterns, developed by several people on a team through a CVS repository, implemented using extreme programming techniques like tests-first and pair programming, etc.  I'm quite open to student teams proposing their own projects, as long as they meet the course criteria; I plan to have a couple of possible projects to offer to students who don't have ideas of their own.  Homework will complement the project, verifying that individual students understand particular technical concepts and tools.

It is hoped that this class will be a "normal" CSE 3-credit load.  Not too burdensome.  It's notintended to be a major project class; I'll let the 400-level classes do that!  But there will be a significant hands-on element, because that's the nature of the course content.

Possible Texts


Enrollment

I'd like to keep the class manageably small, no more than 40 students, for this first offering.  It looks like this class is already full.  I don't want to overload the class, but if you want to take the class and you aren't registered, then I suggest that you come to class the first week, and see if people drop once they find out more about what's going to be going on in the class.

Unfortunately, I don't know when this class will be offered again.  I hope frequently, but I can make no promises.  So take your chance while the taking's good!

chambers@cs.washington.edu