Software design
223325
224715389
2008-07-10T02:31:37Z
NapoliRoma
1741963
[[WP:UNDO|Undid]] revision 224701237 by [[Special:Contributions/203.167.84.18|203.167.84.18]] ([[User talk:203.167.84.18|talk]])
{{Software development process}}
'''Software design''' is a process of problem-solving and planning for a [[software]] solution. After the purpose and specifications of software is determined, [[software developer]]s will [[design]] or employ [[designer]]s to develop a plan for a solution. It includes low-level component and algorithm implementation issues as well as the architectural view.
The [[software requirements analysis]] (SRA) step of a [[software development process]] yields [[specifications]] that are used in [[software engineering]]. If the software is "semiautomated" or [[user centered design|user centered]], software design may involve [[user experience design]] yielding a [[story board]] to help determine those specifications. If the software is completely [[automation|automated]] (meaning no [[user]] or [[user interface]]), a software design may be as simple as a [[flow chart]] or text describing a planned sequence of events. There are also semi-standard methods like [[Unified Modeling Language]] and [[Fundamental modeling concepts]]. In either case some [[documentation]] of the plan is usually the product of the design.
A software design may be [[platform-independent model|platform-independent]] or [[platform-specific model|platform-specific]], depending on the availability of the technology called for by the design.
==Design Considerations==
There are many aspects to consider in the design of a piece of software. The importance of each should reflect the goals the software is trying to achieve. Some of these aspects are:
*Marketability - If the software is to be mass marketed, there must be a market for the software. Research must be conducted to determine the [[target market]] and its needs.
*Usability - The software [[user interface]] must be intuitive (and often aesthetically pleasing) to it's target user/audience.
*Packaging - Printed material such as the box and manuals should match the style designated for the target market and should enhance usability.
*Extensibility - New capabilities can be added to the software without major changes to the underlying architecture.
*Robustness - The software is able to operate under stress or tolerate unpredictable or invalid input. For example, it can be designed with a resilience to low memory conditions.
*Reliability - The software is able to perform a required function under stated conditions for a specified period of time.
*Fault-tolerance - The software is resistant to and able to recover from component failure.
*Security - The software is able to withstand hostile acts and influences.
*Maintainability - The software can be restored to a specified condition within a specified period of time. For example, antivirus software may include the ability to periodically receive virus definition updates in order to maintain the software's effectiveness.
*Compatibility - The software is able to operate with other products that are designed for interoperability with another product. For example, a piece of software may be backward-compatible with an older version of itself.
* Modularity - the resulting software comprises well defined, independent components. That leads to better maintainability. The components could be then implemented and tested in isolation before being integrated to form a desired software system. This allows division of work in a software development project.
* Reusability - the modular components designed should capture the essence of the functionality expected out of them and no more or less. This single-minded purpose renders the components reusable wherever there are similar needs in other designs.
==Design Patterns==
A software designer or architect may identify a design problem which has been solved by others before. A template or pattern describing a solution to a common problem is known as a [[Design pattern (computer science)|design pattern]]. The reuse of such patterns can speed up the software development process, having been tested and proved in the past.
==Design methodologies==
Design methodologies aim to provide a template process or a framework for the actual design of a system. They aim to
simplify the actual process of designing a system and aim to enforce some standard design principles which improve
the quality of a design. One of the earlier design methodologies is the [[Responsibility Driven Design]] (RDD) pioneered
by Rebecca Wirth et al. It forms the basis of the [[URDAD]], the Use Case, Responsibility-Driven Analysis and Design method which aims to generate a technology neutral design which is then mapped onto one's choice of implementation architecture and technologies.
==Usage==
Software [[design document]]ation may be reviewed or presented to allow constraints, specifications and even requirements to be adjusted prior to [[programming]]. Redesign may occur after review of a programmed [[simulation]] or [[prototype]]. It is possible to design software in the process of programming, without a plan or requirement analysis, but for more complex projects this would not be considered a professional approach. A separate design prior to programming allows for [[multidisciplinary]] designers and [[Subject Matter Expert]]s (SMEs) to collaborate with highly-skilled programmers for software that is both useful and technically sound.
==See also==
*[[Software development]]
*[[Software blueprint]]
*[[Software architecture]]
*[[Search Based Software Engineering]]
*[[User experience]]
*[[Experience design]]
*[[Model-driven architecture]]
*[[Software Design Description]] (IEEE 1016)
*[[Design pattern (computer science)]]
*[[Service-Oriented Modeling]] Framework
*[[Common layers in an information system logical architecture]]
*[[GRASP (Object Oriented Design)]]
*[[S.O.L.I.D. principles]]
[[Category:Software development]]
[[Category:Project management]]
[[Category:Computer and mathematical occupations]]
[[Category:Software design|*]]
[[fr:Conception de logiciel]]
[[ja:ソフトウェア設計]]
[[pt:Projeto de Software]]
[[vi:Thiết kế phần mềm]]