The preceding discussions on requirements suggested that various "kinds" of requirements exist. Specifically, we have found it useful to think about three types of requirements, as shown in Figure 20-3:
Figure 20-3. Types of requirements
Functional Software Requirements
As you might expect, functional requirements express how the system behaves ”its inputs, its outputs, and the functions it provides to its users. These requirements are usually system action-oriented . These are the types of requirements we have been capturing in the use cases for HOLIS.
Nonfunctional Software Requirements
However, functional requirements alone are insufficient to describe the requirements of a system completely. We must also consider other types of requirements. Grady  called these types of requirements nonfunctional requirements and suggested that they arise because it is necessary to specify other aspects of the system, such as:
These requirements are used to express some of the "attributes of the system" or "attributes of the system environment" elements of our elaborated guidelines [Davis 1999].
This last class of requirements may be the trickiest of all. Design constraints typically impose limits on the design of the systems.
We'll define constraints as
This convenient three-type classification helps us understand more about the system we are to build. We'll revisit each of these three types of requirements in Chapter 22, Developing the Supplementary Specification.