We all marvel at the wide variety of things computers are capable of doing. The same basic electronic device can print payroll checks, optimize gasoline usage in an auto engine, and play a game of chess.
In fact, though, the computer that performs such a variety of tasks is itself not very versatile at all. It is capable of performing only a few simple operations, such as adding two numbers, and then only when explicitly instructed to do so.
For each of these and hundreds of other computer applications, software, or computer programs, have been written which tell the computer exactly what to do. Each program makes the computer behave like a special-purpose device designed expressly for that application.
Unlike the more familiar computer hardware, the software is usually not visible. It consists of long lists of instructions telling the computer what to do. These instructions may be printed on paper, recorded on a tape or disk, or stored in the computer's internal memory, like the text of a book might be. The computer includes logic circuitry to "read" these instructions and carry them out. Where we might press the buttons on a calculator, the computer can "press the buttons" itself, in the pattern specified by the instructions.
Programming, the process of creating software, or computer programs, is an activity that lies somewhere between writing an article or book and designing and building an electronic circuit. The software engineer, or programmer, divides his time between thinking and writing at a desk, and testing out his software creation at a computer terminal.
Learning the mechanics of programming -- how one writes out the instructions to the computer, or tests them out at a terminal -- is no more difficult than learning to use other tools. The challenging part lies in understanding the problem to be solved and all of its ramifications so thoroughly that one can teach an extremely simple and literally minded servant -- the computer -- to solve it.
Programmers are usually of above-average intelligence, are good conceptual thinkers, and are able to keep track of many details in their heads. They are often solitary workers, like writers, who need to concentrate for long periods of time. Although nearly anyone can learn to be a competent programmer, there are enormous variations between individuals. The best programmers are often 5 to 10 times as productive as the average.
But even the best programmers are rarely, if ever, able to write programs of any size without errors, or "bugs." Hence, every program must be exhaustively tested and "debugged" -- the errors found and corrected. The computer always carries out the instructions written by the programmer . . . to the letter. Although in theory the programmer knows exactly what to expect from the computer , the interactions in a large program are so complex that the programmer is often surprised by the outcome. Debugging is like puzzale-solving or detective work, in which the culprit is the error in the programmer's own thinking.
Many programs are designed only to perform calculations, control machinery, or fulfill some routine accounting function. But today many programs are written to make computers interact directly with people. It's even more challenging to create a program that will provide for all the needs these people may have.
On personal computers, attention to the "human interface" often separates the good programs from the bad ones. A poor program won't let you correct your own typing errors; may make you enter similar information twice; will display results in a hard-to-read format; or may make it cumbersome to stop one operation and start another. A good program will make it easy for people to use the computer, even if that makes the programmer's job more complex.
The largest computer programs are incredibly complex and require far more design and engineering effort than the computer hardware itself. The space shuttle Columbia has more than 500,000 lines of program instructions in its on-board computers. The operating system programs for IBM's latest line of computers required several man-millenniums -- thousands of man-years -- of expert programmers' time to develop, and they cost hundreds of millions of dollars.
Because programming, like writing, is a talent-and labor-intensive activity, the cost of software continues to rise along with inflation, while technological advances have made the cost of hardware decline. However, software shares another characteristic of writing: Once an article or book -- or a program -- is written (a considerable expense), duplicate copies of it can be made for only the cost of printing -- or duplicating magnetic tapes and disks. Each individual buyer can obtain the program for a tiny fraction of what it would cost to develop the program himself. Because hundreds of thousands of personal computers have been sold, software packages representing many man-years of effort can be sold at prices ranging from $20 to $200.
When a software package is being designed for use by tens or even hundreds of thousands of people, it is almost impossible to anticipate the variety of needs these people might have. To provide for such variety, the software package can itself be made "programmable" -- it will obey instructions which accomplish more and are easier to write than the primitive "add" and "test" instructions which the hardware can interpret. One example of this is the BASIC language, which is available on most personal computers. An average person can learn BASIC with a few days' effort and then write simple programs himself.
Programs which make the computer even easier to use than BASIC include specialized application packages, such as STRUDL (Structural Design Language), which is designed to solve problems in civil engineering, SPSS (Statistical Programs for the Social Sciences), and VisiCalc, which makes it easy to solve budgeting, forecasting, and other financial problems. Each of these problems has its own "language" or set of commands, so that the user can "program" the computer to solve a particular problem. But the commands are now so high-level ("test the beam at a 30-degree angle," "cross-tabulate questionnaire responses," or "change the interest rate to 9 percent") that problems can be solved far more quickly and easily.
Advances in hardware technology and new enterprise have made computers more available and affordable than ever before. To put these computers to use in a wide variety of applications, advances in software are required as well. Without doubt, we'll see more and better software packages in the future, which are designed for ease of use and are flexible enough to be adapted for different purposes through simplified "programming" by the user. Computer software, which today is still somewhat mysterious to most people, will become as commonplace and familiar as books and records.