Software engineering is defined as the systematic, disciplined and quantifiable approach to software development. It focuses on applying engineering principles and techniques to software in a cost-effective manner. As software grew in size and complexity, an engineering approach became necessary to effectively manage projects. Early approaches included structured programming and design based on control flow and data structures. Modern approaches include object-oriented design and iterative development processes. The software development life cycle typically includes phases for requirements analysis, design, implementation, testing, deployment and maintenance.