n A design should exhibit an architecture that
(1) has been created using recognizable architectural styles or patterns,
(2) is composed of components that exhibit good design characteristics and
(3) can be implemented in an evolutionary fashion
n A design should be modular; that is, the software should be logically partitioned into elements or subsystems
n A design should contain distinct representations of data, architecture, interfaces, and components.
n A design should lead to data structures that are appropriate for the classes to be implemented and are drawn from recognizable data patterns.
n A design should lead to components that exhibit independent functional characteristics.
n A design should lead to interfaces that reduce the complexity of connections between components and with the external environment.
n A design should be derived using a repeatable method that is driven by information obtained during software requirements analysis.
n A design should be represented using a notation that effectively communicates its meaning.