Requirements engineering (RE) is concerned with the elicitation of the goals to be achieved by the system envisioned, the operationalization of such goals into specifications of services and constraints, and the assignment of responsibilities for the resulting requirements to agents such as humans, devices, and software. Getting high-quality requirements is difficult and critical. Recent surveys have confirmed the growing recognition of RE as an area of primary concern in software engineering research and practice. The paper first briefly introduces RE by discussing its main motivations, objectives, activities, and challenges. The role of rich models as a common interface to all RE processes is emphasized. We review various techniques available to date for system modeling, from semi-formal to formal, and discuss their relative strengths and weaknesses when applied during the RE stage of the software lifecycle. The paper then discusses some recent efforts to overcome such problems throu...