ABSTRACT

The design of software is different from other engineering design tasks because software is not bounded by physical structures or laws. Consequently, the demanded functionality of software, to a large extent, is constrained only by what one can imagine. This unboundedness generally increases the complexity of the software design task, as well as derived software systems. However, four fundamental principles help manage this complexity: (1) the use of abstraction, (2) the maximization of cohesion, (3) the minimization of coupling, and (4) the creation of systems that correspond to reality. From these principles, several valuable software development practices can be derived, which, when adopted, significantly improve the quality of software systems. In addition, several metrics can be created to objectively and quantitatively measure the quality of software. This chapter discusses these principles, practices, and metrics and attempts to show that they respond to limitations of human cognition. Finally, these principles, practices, and metrics are incorporated into recommended procedures for architectural and detailed design.