Software design is a process of problem solving and planning for a software solution. A software design may be platform-independent or platform-specific, depending on the availability of the technology called for by the design.
Software design can be considered as putting solution to the problem(s) in hand using the available capabilities. Hence the main difference between Software analysis and design is that the output of the analysis of a software problem will be smaller problems to solve and it should not deviate so much even if it is conducted by different team members or even by entirely different groups. But since design depends on the capabilities, we can have different designs for the same problem depending on the capabilities of the environment that will host the solution (whether it is some OS, web, mobile or even the new cloud computing paradigm). The solution will depend also on the used development environment (Whether you build a solution from scratch or using reliable frameworks or at least implement some suitable design patterns)
Software design plays an important role in developing software: it allows software engineers to produce various models that form a kind of blueprint of the solution to be implemented. We can analyze and evaluate these models to determine whether or not they will allow us to fulfill the various requirements. We can also examine and evaluate various alternative solutions and trade-offs. Finally, we can use the resulting models to plan the subsequent development activities, in addition to using them as input and the starting point of construction and testing.
software design consists of two activities that fit between software requirements analysis and software construction:
- Software architectural design (sometimes called top-level design): describing software’s top-level structure and organization and identifying the various components
- Software detailed design: describing each component sufficiently to allow for its construction.
A number of key issues must be dealt with when designing software. Some are quality concerns that all software must address – for example, performance. Another important issue is how to decompose, organize, and package software components