Requirements engineering covers all activities involved in discovering, documenting, and maintaining system requirements. Requirements specify what a system should do and its qualities. There are three main types - functional, non-functional, and domain. Requirements engineering uses systematic techniques to ensure requirements are complete and consistent. Difficulties in requirements engineering are a leading cause of project failures and system problems, as stakeholders often have unclear needs and requirements change over time with multiple priorities involved.