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]]