Software engineering is the application of engineering principles to the systematic development of software. It involves modeling the system and domain to focus on relevant details, building different models to experiment and search for acceptable solutions given constraints. Software engineering also involves knowledge acquisition by collecting and organizing data on the application and solution domains, and capturing the context and rationale behind decisions.