Dr. Jeffery's Software Engineering Resource Page

This page stores pointers to resources of interest to those studying software engineering.

Unified Modeling Language

Three competing object-oriented methodologists recently joined forces to create the Unified Modeling Language (UML). UML is a diagramming notation useful for requirements analysis and software design. It emphasizes object modeling to identify and describe a program's data and use-case analysis to determine a program's functionality.

On-line references to UML are available at:

Object Management Group's UML standards site
We have local mirrors for the following documents as of 6 September 1998:
http://www.rational.com/uml/
Rational Software's UML site

The main UML books are by Booch/Rumbaugh/Jacobson and published by Addision Wesley. They are big and expensive reference works. Among third party UML books, I have looked at books by authors Fowler/Scott, Ericsson/Penker, Larman, and so far my favorite is UML Toolkit, by Eriksson and Penker. None of these books is perfect, but UML Toolkit gives its UML treatment a pretty reasonable context and appropriate object-oriented underpinnings, and it includes a demo copy of Rational Rose with UML diagramming support.

make

Make is a classic UNIX development tool. After reading the "man page" for it, you may want to consult UNIX books for additional details. You can also check out the free online documentation for GNU make at http://www.gnu.org/manual/make/.

CVS

The Concurrent Versions System (CVS) is a front-end for the Revision Control System (RCS), a popular tool for tracking source changes. CVS allows multiple people to simultaneously edit the same sources, and applies conflict resolution algorithms to merge the resulting source changes.

A CVS white paper (12 pages) is available at http://www.loria.fr/~molli/cvs/doc/cvs-paper.pdf
The complete reference manual (170 pages) is available at http://www.loria.fr/~molli/cvs/doc/cvs.pdf

Capability Maturity Model

The Software Engineering Institute at Carnegie Mellon University has published a guide for "customers" such as the DOD to use in evaluating developers of software. The Capability Maturity Model (CMM) defines practices that characterize an organization's ability to develop software from an engineering (repeatable, documented process) perspective. The on-line references to the CMM are available at:
www.sei.cmu.edu/pub/documents/93.reports/pdf/tr24.93.pdf
This is the main CMM specification, version 1.1; it is 80 pages.
www.sei.cmu.edu/pub/documents/93.reports/pdf/tr25.93.pdf
Key Practices of the Capability Maturity Model Version 1.1, a 500-page elaboration of what is meant in the CMM document.
www.sei.cmu.edu/pub/documents/94.reports/pdf/sr07.94.pdf
Maturity Questionnaire, a 57-page inquiry into current software processes in order to evaluate an organization's maturity as defined by the CMM.

Literate Programming

Literate Programming is the art of writing a single document that serves both as a program that the computer can run and the documentation of that program for humans. It was popularized by the legendary Donald Knuth, who wrote several components of the TeX typesetting program in a literate style and published them in book form.

Today, literate programming is practiced mainly by visionaries and radicals, but it is slowly becoming recognized as an ultimate means of providing program documentation for use by subsequent program maintainers.

One of the most popular literate programming tools is Noweb, by Norman Ramsey. It is simple and language-independent, which makes it adaptable to most software development environments. Noweb has been widely ported and is in wide use.

Design Patterns

Design Patterns describe commonly re-used components of software designs. The analogy is to architecture, where patterns have been used to improve the re-usability of standard building materials and techniques. Design Patterns establish a common vocabulary among software engineers. The most famous book on Design Patterns is by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides.

A design pattern typically includes an extended prose definition of the problem that the pattern addresses, examples of its use, and an object model diagram that describes the relationships and interactions between components involved in the solution.

Some design patterns revolve around the creation of object instances, while others provide solutions to common data structures and algorithms. Design patterns are typically "meta-structures" or "meta-algorithms"; they reside one level of abstraction away from the actual code, and point programmers in the direction of appropriate data structures or algorithms for particular problems.