#import "../../template.typ": *
= Requirements Engineering

#definition[
  Requirements Engineering, (RE) is the process of establishing the needs of *stakeholders* that are to be solved by software. 
]

#blockquote[
  So, what is the importance of RE?
]

One of the reasons that RE exists today is because of most software failures are actually caused by *poor requirement definitions*, rather than a lack of qualified resources or inadequate risk management.

Software runs on some hardware and is developed for a purpose. Re is about identifying that process. However, identifying that task can often be an extremely hard task.
- Sheer *complexity* of the purpose/requirements
- People often don't even know what they want themselves
- Multiple stakeholders can have conflicting requirements

#definition()[
  *Non-functional requirements*: criteria that can be used to judge the operation of a system, rather than specific behaviors. 

  Basically, they describe how the systems performs aka. its quality, rather than what it does (actions).
]
#definition[
  *User Requirements*: Requirements written for customers
  - Often written in natural language and doesn't have any technical details
  *System Requirements*: Requirements written for developers
  - Detailed functional and non-functional requirements
  - Clearly and rigorously specified
]
#note()[
  Sometimes, you may need to prioritize some resources over others, known as #underline()[resource prioritization]. 
  This often happens if aren't able to satisfy all the requirements so you need need to prioritize them.
]


