Understanding needs of software-intensive systems. Converting the statement of needs into complete and unambiguous description of the requirements. Techniques for elicitation, analysis, and specification of requirements. Mapping of requirements into a description of their implementation. Software design techniques for capturing and expressing a different view of the system. Elements of architectural design, abstract specification, interface design, data structure and algorithm design.