Software is expensive: Over the past decades, with the advancement of technology, the cost of hardware has consistently decreased. On the other hand, the cost of software is increasing. As a result, the hardware/software ratio for a computer system has shown a reversal from the early years.
The main reason for the high cost of software is that software development is still labor-intensive. The main cost of producing software is in the manpower employed, the cost of developing software is generally measured in terms of person-months of effort spent in development. And productivity is frequently measured in the industry in terms of DLOC per person-month.
Late, costly, and unreliable: There are many instances quoted about software projects that are behind schedule and have cost overruns. The software industry has gained a reputation of not being able to deliver on time and within budget. Software failures are different from failure of, say, mechanical or electrical systems.
Products of these other engineering disciplines fail because of the change in physical or electrical properties of the system caused by aging. In software, failure occurs due to bugs or errors that get introduced during the design and development process. Hence, even though a software may fail after operating correctly for some time, the bug that causes that failure was there from the start. It only got executed at the time of the failure.
This is quite different from other systems, where if a system fails, it generally means that sometime before the failure the system development some problem that did not exist earlier.
Problem of change and rework: Once the software is delivered and deployed, it enters the maintenance phase. All systems need maintenance, but for other systems it is largely due to problems that are introduced due to aging. Software needs to be maintained not because some of its components wear out and need to be replaced, but because there are often some residual errors remaining in the system that must be removed as they are discovered.
Maintenance involves understanding the existing software, understanding the effects of change, making the changes, to both the code and the documents testing the new parts (changes), and retesting the old parts that were not changed. Maintenance can be corrective and adaptive.