Software design is the process of preparing the plan for the development of a software application while satisfying a problem’s functional requirements and not violating its non-functional constraints. During this process, tradeoffs need to be made, like the tradeoff between performance and resource consumption, so that the application is optimized to meet the non-functional requirements. There can be no tradeoffs among functional requirements because they all need to be met.
What (requirements) vs. how (design): The design process converts the “what” into the “how”.
There are 2 phases in the design process:
Step 1: Architectural Design – The process of carving up the app into components and assigning behavior/functionality to each component and detailing how the components are going to interact with each other.
Step 2: Detailed Design – The process of breaking down the individual components into classes and interfaces that can be implemented.