Software engineering involves modeling systems through abstract representations called models to help answer questions about complex systems. It is a problem-solving activity that formulates problems, analyzes them, searches for solutions, decides on appropriate solutions, and specifies those solutions. Software engineering is not algorithmic but rather requires experimentation, reuse of patterns, and incremental evolution toward client-acceptable solutions.