After ENIAC, virtually all general purpose digital computers followed the von Neumann architectural model and were therefore programmable without hardware reconfiguration. Even though until late in the 1950s most programming was done in machine language, requiring detailed knowledge of the hardware, the machine could be turned from task to task as rapidly as new programs could be loaded into memory. With computers built from vacuum tubes or discrete transistors being so expensive, extensive efforts were devoted to maximising the productivity of a computer, and as the 1950s waned the original model of computer usage, an individual user signing up for dedicated time on the machine, was supplanted by the batch shop, with a specialist computer operator running a stack of jobs. In time, computer operating systems automated much of the operator's work, assuming responsibility for scheduling, priorities, allocation of resources, and efficient management of the scarcest and most precious resources--CPU cycles and memory space. In time, the advent of remote job entry provided the same batch computing service available in the computer room to remote terminals located anywhere in the world.
The user's image of the computer during the second generation often revolved around a countertop. It was across the counter that the user handed the card deck containing his program and data, and across the same counter that, some time later, his cards would return, accompanied by a printout which he hoped would contain the desired result (but more often consisted of a cryptic error message or the Dreaded Core Dump).
Second generation operation introduced many important levels of mediation and abstractions between the user and the computer hardware. First and probably most important was the time shifting performed by a batch system and the autonomy this gave to the computer (or its operator) at the expense of the user's direct control. Since the computer did the user's bidding without an opportunity for user intervention, time limits, resource scheduling, recovery from unanticipated errors, and the like became a shared responsibility of the user and the autonomous computer operating system. This led to the development of job control languages, which provided a powerful (though often arcane) means of controlling the destiny of a task being performed by the computer without the user's involvement. The card deck, printout, countertop, and job control language form the heart of the user's view of a second generation system. The concurrent development of high-level programming languages reduced the degree of specialised knowledge needed to use such systems and made them accessible to more people.
Editor: John Walker