Software engineering is concerned with developing software using a systematic process and addressing factors like increasing demands and low expectations. It involves activities like specification, development, validation and evolution. Some key challenges are coping with diversity, reduced delivery times and developing trustworthy software. Different techniques are suitable depending on the type of system, and processes may incorporate elements of models like waterfall, incremental development and integration/configuration. Prototyping can help with requirements, design and testing.