Software takes on a dual role: product and at the same time, the vehicle for delivering a product.
As a product, it delivers the computing potential embodied by computer hardware, or more broadly, a network of computers that are accessible by local hardware.
As the vehicle used to deliver the product, software acts as the basis for the control of the computer, the communication of information, and the creation and control of other programs.
The role of computer software has undergone significant change over a time span of little more than 50 years.
Dramatic improvements in hardware performance, profound changes in computing architectures, vast increases in memory and storage capacity, and a wide variety of exotic input and output options have all precipitated more sophisticated and complex computer based systems.
The programmers are asked some questions when modern computer-based systems are built:
Why does it take so long to get software finished?
Why are development costs so high?
Why can’t we find all the errors before we give the software to customer?
Why do we continue to have difficulty in measuring progress as software is being developed?