Software plays a dual role as both a product and a vehicle for delivering products. It serves as an information transformer, managing, acquiring, modifying, displaying, or transmitting data across various platforms, including mobile devices, desktops, the cloud, and mainframes.
Key characteristics of software:
Unlike hardware, software does not wear out but deteriorates over time due to changes and updates.
Software applications span diverse domains such as system software, application software, embedded software, engineering/scientific software, and artificial intelligence-based software.
Legacy software presents challenges due to outdated designs, poor documentation, and maintenance complexities. However, software engineering aims to develop methodologies that ensure software systems remain viable, adaptable, and maintainable over time.
The IEEE defines software engineering as the application of a systematic, disciplined, and quantifiable approach to software development, operation, and maintenance. It is based on a layered approach:
A quality focus – Ensuring software meets high standards.
The process layer – A structured framework for development.
Methods – Technical procedures for software development.
Tools – Software applications that automate or support the development process.
The software process is a structured approach consisting of activities, actions, and tasks aimed at developing high-quality software. It includes:
Process framework – Encompasses five fundamental framework activities:
Communication – Understanding user needs.
Planning – Organizing tasks and resources.
Modeling – Structuring software design.
Construction – Coding and testing.
Deployment – Releasing and maintaining the software.
Umbrella activities – Cross-cutting tasks such as project tracking, risk management, quality assurance, and change control.
Process adaptation – Adjusting the software process based on project requirements.
Software engineering practice is rooted in problem-solving principles derived from George Polya’s problem-solving approach:
Understand the problem – Identify stakeholders, unknowns, and required functions.
Plan a solution – Identify similar problems, reusable solutions, and possible design models.
Carry out the plan – Develop the software based on the design.
Examine the result – Ensure correctness through testing and validation.
Software projects often begin with an idea or market need. The SafeHome example in the book illustrates how a company initiates a project based on market research, technical feasibility, and business potential.
Software is an integral part of modern life, supporting business, government, and everyday activities. The growing complexity of software necessitates systematic engineering approaches to ensure quality, maintainability, and reliability.
This chapter establishes the foundational principles of software engineering, highlighting the necessity of structured processes, disciplined practices, and a focus on quality in software development.