Software engineering is an engineering approach to software development that applies systematic techniques, methodologies, and guidelines. It arose due to issues with early software development approaches, including programs frequently crashing, being expensive and difficult to alter, and often being delivered late. Modern software engineering uses defined life cycle models to structure development through phases like requirements, design, coding, and testing. This helps prevent errors and allows for systematic planning, monitoring, and development of software by teams. Common life cycle models include waterfall, iterative waterfall, evolutionary prototyping, and spiral models.