Software engineering is an engineering discipline concerned with all aspects of software production. It involves theories, methods and tools to support the software development process from initial specification through maintenance. Key activities include specification, development, validation and evolution of software to meet changing needs. While techniques may vary depending on the application type, fundamental principles like managed processes, dependability, requirements management and reuse apply universally.