For beginners, it is hard to understand the differences between functional requirements and non-functional requirements. Let us consider an example to illustrate the differences.

Suppose that we would like to implement a binary tree object that should allow us to add, delete, and search a particular node of the tree. Such a requirement is what can normally read from data structure textbooks.

- For functional requirement, we specify what are node addition, node deletion, and node search.

Suppose that a designer proposes two algorithms (Algorithm A and Algorithm B) for us to decide which one to be implemented in the application: Algorithm A supports fast search but slow addition and deletion of nodes; whereas, Algorithm B supports slow search, but efficient addition and deletion of nodes.

How do we choose between the two algorithms, even though both algorithms can meet the functional requirements? To decide which algorithm to be implemented in our application, we need to know the non-functional requirements that users expect our applications to provide.

- Suppose that there will be many searches of tree nodes and relatively small amount of node maintenance, then we prefer algorithm B to algorithm A. On the other hand, if we expect that we will maintain the tree frequently, then we may prefer algorithm A to algorithm B. In short, non-functional requirements help us to make appropriate design decisions.