User:Robbie404/Software requirements

In software engineering and requirements engineering, software requirements describe what a software system should do, the service or services that it provides and the constraints on its operation. The ISO/IEC/IEEE Systems and software engineering vocabulary defines a software requirement as:
 * 1) A software capability needed by a user to solve a problem or to achieve an objective.
 * 2) A condition or capability that must be met or possessed by a system or system component to satisfy a contract, standard, specification, or other formally imposed document.

Which of these definitions to use, depends on the context in which the software is developed. While the first definition is appropriate in less constrained environments, the second definition is mainly applicable in environments constrained by existing processes and systems.

Software requirements can be categorised as functional requirements and non-functional requirements. Functional requirements describe the functionalities or behaviour the system should support, usually in terms of anticipated inputs and expected outputs. Non-functional requirements, also known as quality requirements, describe non-functional qualities of the system, such as security or stability, that can be used to judge the system's performance. Additionally, software requirements can be categorised in terms of the key stakeholder, such as client or user-oriented requirements and developer-oriented requirements.

The aim of software requirements is threefold. First, it enables for discussion and agreement among stakeholders on what the system should include. It should be noted that good communication between stakeholders and frequent reviews are vital for this. Second, it should provide software developers with an understandable description of what the system to be realised should include, as the software developers may not be familiar with the concepts and terminology of the application's domain. Last, the requirements should provide a standard to evaluate the system with.

History
The use of software requirements dates back to the early days of software development. The first systems were built to perform specific tasks and were often developed without a formalized process for specifying requirements, but as the field of software engineering evolved, the importance of requirements began to be recognized, leading to the development of formal methods for specifying and managing requirements.

One of the earliest approaches to managing software requirements was the waterfall model, which was proposed by Winston W. Royce as a linear, sequential process for software development. This model emphasized the importance of specifying requirements up front and then using those requirements to guide the design, development, and testing of the software. However, it was soon recognized that the waterfall model was not well-suited to the dynamic nature of software development, and alternative approaches were sought.

In the 1980s and 1990s, a number of approaches were proposed to address the limitations of the waterfall model. One of the most prominent of these was the "iterative and incremental" approach, which emphasized the importance of iteratively refining requirements and incrementally delivering working software. This approach was seen as more flexible and better suited to the dynamic nature of software development, and it became the basis for many modern software development methodologies, such as agile development.

With the rise of agile development, there has been an increased focus on requirements management in recent years. Agile requirements management involves constant communication and collaboration between the developers and stakeholders, with frequent inspections and adaptations to requirements. This approach has been widely adopted in the software industry, and it is considered to be one of the most effective ways to manage software requirements.

System Requirements
Software requirements are a type of system requirement. System requirements describe what should be enforced within an environment, and are described in terms of environmental phenomena. Software requirements, on the other hand, describe what the software should enforce in terms of phenomena shared between the software and the environment. Following this distinction, software requirements are aimed at developers, whereas system requirements are to be understood by all stakeholders.

Related disciplines
The disciplines related to software requirements are involved in the process of transforming stakeholders' wishes to specified and validated requirements. The most notable being: requirements elicitation, analysis, specification, validation, and management.

Elicitation
Elicitation is the gathering and discovery of requirements from stakeholders and other sources. It aims to establish what the system should and should not include. A variety of methods can be used, such as joint application design (JAD) sessions, interviews, document analysis, and focus groups. Because of the strengths and weaknesses of each method, and possible varying expertise with the method of the requirement engineer, a combination of methods is often required to effectively do requirement elicitation. Elicitation is the first step of requirements development.

Analysis
Requirements analysis is the logical breakdown that proceeds from elicitation. The analysis involves reaching a richer and more precise understanding of each requirement and representing sets of requirements in multiple, complementary ways. In addition, requirements analysis often involves exploring and evaluating alternatives to the elicited requirements.

Requirements Triage or prioritization of requirements is an activity which often follows analysis. It involves considering the different aspects of the requirements, such as costs, benefits, and risks. Various prioritization methods exist - for example, ranking, numerical assignment, and the 100 dollar test, to name a few. Priorizitation methods vary in complexity and granularity; the choice for a particular prioritization method is often influenced by the context and nature of the project (e.g., its project management structure) and requirements or product/service that is getting build.

Specification
Requirement specification involves representing and storing the collected requirements knowledge in a persistent and well-organized fashion that facilitates effective communication and change management. Use cases, user stories, functional requirements, and visual analysis models are popular choices for requirements specification. These models may be structured in a software requirements specification (SPS) document, providing a detailed description of the system to be developed.

Validation
Requirements validation involves techniques to confirm that the correct set of requirements has been specified to build a solution that satisfies the stakeholders' needs. Requirements validation is usually subjective; the specification of requirements is evaluated against informal (i.e., insufficiently documented) requirements. Methods that can be used for requirements validation include inspection, state-based exploration, and scenario-based validation.

Management
Requirements change during projects and there are often many of them. Management of this change becomes paramount to ensuring that the correct software is built for the stakeholders. Amongst other things, requirements management deals with organizing requirements, tracking their status, tracing their change history, and updating the project plan in accordance to the changed requirements. As requirements may change during development, requirements management is a continuous process.

Types of software requirements
Software requirements can be categorized in several ways. The following are common categorizations:


 * Business requirements
 * Statements of business level goals, without reference to detailed functionality. These are usually high level (software and/or hardware) capabilities that are needed to achieve a business outcome.


 * Customer requirements
 * Statements of fact and assumptions that define the expectations of the system in terms of mission objectives, environment, constraints, and measures of effectiveness and suitability (MOE/MOS). The customers are those that perform the eight primary functions of systems engineering, with special emphasis on the operator as the key customer. Operational requirements will define the basic need and, at a minimum, answer the questions posed in the following listing:
 * Operational distribution or deployment: Where will the system be used?
 * Mission profile or scenario: How will the system accomplish its mission objective?
 * Performance and related parameters: What are the critical system parameters to accomplish the mission?
 * Utilization environments: How are the various system components to be used?
 * Effectiveness requirements: How effective or efficient must the system be in performing its mission?
 * Operational life cycle: How long will the system be in use by the user?
 * Environment: What environments will the system be expected to operate in an effective manner?


 * Architectural requirements: Architectural requirements explain what has to be done by identifying the necessary systems architecture of a system.
 * Structural requirements: Structural requirements explain what has to be done by identifying the necessary structure of a system.
 * Behavioral requirements: Behavioral requirements explain what has to be done by identifying the necessary behavior of a system.
 * Functional requirements: Functional requirements explain what has to be done by identifying the necessary task, action or activity that must be accomplished. Functional requirements analysis will be used as the toplevel functions for functional analysis.
 * Non-functional requirements: Non-functional requirements are requirements that specify criteria that can be used to judge the operation of a system, rather than specific behaviors.
 * Performance requirements: The extent to which a mission or function must be executed; generally measured in terms of quantity, quality, coverage, timeliness or readiness. During requirements analysis, performance (how well does it have to be done) requirements will be interactively developed across all identified functions based on system life cycle factors; and characterized in terms of the degree of certainty in their estimate, the degree of criticality to system success, and their relationship to other requirements.
 * Design requirements: The "build to", "code to", and "buy to" requirements for products and "how to execute" requirements for processes expressed in technical data packages and technical manuals.
 * Derived requirements: Requirements that are implied or transformed from higher-level requirement. For example, a requirement for long range or high speed may result in a design requirement for low weight.
 * Allocated requirements: A requirement that is established by dividing or otherwise allocating a high-level requirement into multiple lower-level requirements. Example: A 100-pound item that consists of two subsystems might result in weight requirements of 70 pounds and 30 pounds for the two lower-level items.

Well-known requirements categorization models include FURPS and FURPS+, developed at Hewlett-Packard.