Any deviation from the specification must be recorded and approved in a
Specification Change Order (SCO).
The specification plus SCOs form a binding contract between the
customer and the design team.
No changes to specification can be made without consulting with the customer
and completing a signed SCO.
Achieve design quality goals:
Traceability -- elements of the design trace back to corresponding
elements of the specification.
Modularity -- elements of the design are organized into logically
cohesive modules.
Portability -- the design is sufficiently general that it can be
implemented on a variety of platforms and a variety of (related) programming
languages.
Maintainability -- the system is designed such that it can be easily
repaired and enhanced.
Reusability -- where appropriate, modules are designed to promote
their reuse in other (future) designs.
The step starts by deriving the high-level architecture of the program from the
requirements model constructed in the Specify
step.
The modularization defined for the structural model is carried forward into the
packaging of the program design.
This enforces traceability between the abstract specification and the
corresponding architectural program design.
The high level architecture of a program is defined in terms of data classes
and computational functions.
These are derived, respectively, from the objects and operations of the
abstract requirements model.
The program classes and functions derived directly from the requirements model
constitute the model portion of the design.
The program classes derived directly from concrete user interface are the
view portion of the design.
Apply Design Patterns.
Once the top-level design elements are derived from the requirements
specification, software design patterns are applied.
A design pattern is a pre-packaged piece of design, based on experience that
has been gained over the years by software engineers.
High level design patterns can be used to improve the software architecture,
which entails how the major software components relate to one another and
communicate.
A widely-used design pattern for end-user software is Model-View-
Process (MVP).
The MVP pattern organizes the design into three major segments:
the Model is directly traceable to the abstract functionality defined
in the requirements model, and is independent of the concrete end-user
interface;
the View segment of the design is devoted specifically and solely to
the end-user interface
the Process segment defines underlying processing support for the
model, in particular processing that encapsulates platform-dependent aspects of
the design.
Other patterns are employed to assist with design of program data, control, and
communication.
Refine Model and Process Design.
The derived, pattern-based design produced by the first two steps must be
refined into a concrete, object-oriented program design.
Model package design is refined using object-oriented design principles,
information hiding conventions, and other design guidelines.
Derived functions must be associated with specific model classes, along with
other class refinements.
The function-assignment step is necessary because the operations of the
functional specification do not necessarily belong to specific objects.
In terms of typical nomenclature, functions associated with classes become
class methods, with appropriate adjustment to method signatures based
on object-oriented design concepts.
Other necessary design refinements are in the areas of class member visibility,
inheritance, and the selection of concrete data representations.
In a modern program design, data representations are typically selected from
reusable program libraries.
Process class design entails determining the underlying processing support that
is necessary to produce an efficient program.
To encapsulate platform-dependent data processing, process classes are
interfaced with model classes via controller, adaptor, and wrapper classes.
These model/process interface classes encapsulate aspects of the program that
are specific to specific operating systems, hardware platforms, and external
data stores.
An important part of model and process refinement is detailed control flow
design.
Dataflow relationships defined in the specification are refined into concrete
procedural or multi-process control flow
Other important aspects of control-flow design are functional control flow,
event handling, and exception handling.
Refine User Interface Design.
The fourth step of design is devoted to refining the end-user interface.
In the current state of the art, user interface design typically relies heavily
on libraries of reusable interface classes.
The class libraries define commonly-used interface elements and layouts.
In a Model-View design, the model classes must be refined to support the view
classes, based on the specifics of the user interface.
A particularly useful design pattern in this regard is called the
"Observer/Observable" pattern.
This pattern defines the way in which view classes can be systematically
updated in response to changes made by the user to data values stored in the
model classes.
Design for Non-Functional Requirements
Any non-functional requirements that were not modeled in the specification or
are not yet incorporated in the design are dealt with in this step.
The purpose of this step is to ensure that all system-related non-functional
requirements are fully addressed in the design.
Formally Specify Design.
As the detailed program design is established, the design is formally
specified.
This entails the precise definition of function (i.e., method) input/output
signatures, followed by the specification of preconditions and postconditions
for all functions.
For the model functions derived directly from the specification, the function
conditions are derived directly from the preconditions and postconditions
defined in the derived-from operations.
For other model and process functions, preconditions and postconditions are
defined with the same methodology used in the abstract specification model.
Namely, preconditions are expressions that must be true before function
invocation; postconditions must be true after function executions.
Apply Design Heuristics.
Various design heuristics (i.e., general guidelines) can be applied throughout
the process of design.
Minimizing coupling among program elements aims to reduce the dependency and
communication to only that which is essential
Maximizing cohesion means that program elements that are functionally related
are grouped together, without extraneous unrelated elements.
Other heuristics can be applied, such as controlling the size of various
program components.
Define SCOs and Iterate Back as Necessary.
During the course of program design, the developer may discover aspects of the
requirements specification that need to be modified or enhanced.
In such cases, the designer defines a specification change order that
clearly states the necessary modifications or enhancements.
This formalized change order is in keeping with the high-level process
decomposition into problem definition and problem solution phases.
As discussed above, the Analyze and Specify process steps comprise the problem definition
phase.
The Design and Implement steps then comprise the problem solution phase.
In this software process, as in a traditional problem-solving process, changing
the problem definition while the solution is underway requires careful
consideration.
The specification change order codifies this careful consideration in a precise
way.
Comments on the 309 Design Process.
The process employs techniques from a number of design methodologies,
including:
The UML (unified modeling language) of Rumbaugh, et al.
The structured design techniques of Yourdon, et al.
The MVP (Model-View-Process) technique (aka, MVC -- Model-View-Controller),
used originally with the Smalltalk language, and now used extensively in Java
designs.
The process works well for information processing systems with substantial end-
user interfaces, which are the types of systems developed in 308 and 309.
For other types of system, similar process steps can be used, but possibly in a
different order, and with different domain-specific methodologies.
Other major system types include:
Realtime systems, such as communications software.
Utility systems, such as compilers and operating systems.
Embedded systems, such as device drivers and process controllers.
The languages of system specification and design.
One of the problems to be confronted in designing from a formal specification
is the translation from the requirements/specification language into the
design/implementation language.
In some cases, specification languages may differ from programming languages,
since there are different forces influencing the design of the two types of
languages.
In the case of specs written in Fall 2012, the specs are written in a subset of
Java, which is the same as the 309 design and implementation language.
Specs from past quarters of 308 used a modeling language different from Java.
The data dictionary generated from the formal specification can be useful, but
you are not expected to read or understand the compilable model code.
If you use requirements from previous quarters, you'll need to generate the
Java model from scratch, but this should not be an overly difficult task.