In Software Engineering, requirements are descriptions of what the system should do and how it should behave. Requirements also specify the constraints the system will operate under.
The process of Requirements Engineering is extremely important and often sets the tone for the rest of the Software Development Lifecycle regardless of the development model (Waterfall, Agile, etc.) in use.
Requirements are divided into:
Non-functional Requirements (also called quality attributes) are the major concern of Software Architecture.
Most quality attributes in building information systems have a triangular relationship where as you lean towards any two, you forgo more of the third.
Consider an example with regards to cybersecurity and performance in in these systems. You can have:
Caching will improve performance and usability, but will introduce vectors for attack thus, compromising security.
Of course, there are patterns and techniques that invalidate cycles like these, but it helps to be aware of them.
You can have Personalization, apps, recommendations tailored to your taste and Portability, these preferences migrate with you as you move from one medium or device to another but Privacy will need to take a hit.
As we’ve said, there are ways to escape the cycle depending on how much we’re willing to re-architecture.
For example, with these 3 P’s, if the user had their own, self hosted service for managing Preferences and they could take that with them to other Platforms, then that would take care of the Privacy concern, since no third party would need to be involved.