CSE 490c (a.k.a. CSE 303):
Concepts and Tools for Software Development
Spring Quarter, 2003
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
- 3 credits, graded
- Lectures: MWF 11:30-12:20, MGH 241
- There are no prereqs, aside from being a major in CS or CE and
having completed CSE 143.
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
- 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).
- 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
- other 300- and 400-level CS courses can assume these skills in
their coursework
- students are prepared to get summer jobs doing basic
programming/testing tasks
- students have exposure to key concepts, that they will become
better at applying as they grow in experience
Topics
(Roughly in order of appearance in the course)
- Explicit control over operating system
- Unix (e.g. linux and cygwin), shell commands, shell scripts
- man pages
- perl, python (probably later)
- Explicit control over programming environment
- explicit compile, link, run components
- make
- debugger
- profiler
- emacs? (maybe later)
- Explicit control over program resources
- C (primarily the low-level data model)
- perhaps some brief exposure to C++, mainly templates
- Testing and debugging
- defensive programming, asserts, designing for robustness
- specifications, pre/post coniditions
- test suites, coverage
- writing test cases first, as simple specs
- Design
- design patterns
- requirements, use cases
- (very basic) (human) interface design
- Societal impact, safety, security, privacy, & other ethical
issues in computer software and systems
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
- Tim Budd's "C++ for Java Programmers" (for those students who
know Java but not C or C++)
- Gamma, Helms, Johnson, & Vlissides's "Design Patterns"
- Man pages galore! (who needs no stinkin' textbooks, anyway?)
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