- Acquire an in-depth understanding of issues regarding nonfunctional requirements and constraints related to programming languages, component reuse, operating systems, distribution and concurrency technologies, database technologies, user-interface technologies, transaction management technologies, and so on.
- Create an appropriate input to and point of departure for subsequent implementation activities by capturing requirements on individual subsystems, interfaces, and classes.
- Be able to decompose implementation work into more manageable pieces handled by different development teams, possibly concurrently. This is useful in cases where such decomposition cannot be done based on the results from requirements capture (including the use-case model) or analysis (including the analysis model). An example would be cases when implementation of those results is not straightforward.
- Capture major interfaces between subsystems early in the software's life cycle.
- Be able to visualize and reason about the design by using a common notation.
- Create a seamless abstraction of the system's implementation.