In the early days of the information age, computers were expensive and large, but had slow processors and small memories. It should come as no surprise then, that early computers had a limited number of applications, most of which dealt with numeric processing, not information management. Modern computers, on the other hand, are continually becoming cheaper and smaller, while also coming equipped with faster processors and larger memories. Consequently, modern computers are used for a myriad of different applications. Indeed, many modern toys, such as singing dolls and talking action figures, have embedded processors with more speed and memory than the first digital computer, ENIAC, which was the size of a large room. In addition, computing researchers of a couple decades ago used the term "supercomputers" to refer to computing devices that were slower and had smaller memories than today's personal computers. Thus, modern computers are significantly smaller, cheaper, faster, and higher-capacity than their predecessors. Yet these advances bring higher expectations for software.
Creating software has become a complex enterprise. Designing and implementing a new software application typically involves the interaction of pieces of software written by many different people in several different organizations. These people may not know each other and may not even be willing to share the source code for their respective software pieces. In addition, over time, there is a natural tendency to want to upgrade old software, adding new features for applications in new environments. The challenge for software engineers is to create software that is itself complex, but nevertheless appears conceptually simple, so as to easily integrate with other software and allow for future modifications.
Thus, a driving force in research in software engineering and programming languages has been the development of methodologies that can produce designs that are conceptually simple enough to be understandable while being powerful enough to solve hard problems efficiently. Achieving such a balance is not easy, but a methodology that is showing considerable promise is object-oriented design.