The nature and complexity of software have changed significantly in the last 30 years. In the
1970s, applications ran on a single processor, produced alphanumeric output, and received
their input from a linear source. Today’s applications are far more complex; typically have
graphical user interface and client-server architecture. They frequently run on two or more
processors, under different operating systems, and on geographically distributed machines.