Oberon and language design
This paper by Niklaus Wirth describes the evolution of Modula-2 into Oberon. The whole paper is interesting, but I found this paragraph to be the most poignant:
My long term goal had been to demonstrate that a systematic design using a supportive language leads to lean, efficient, and economic software, requiring a fraction of the resources that is usually claimed. This goal has been reached successfully. I firmly believe, out of many experiences over many years, that a structured language is instrumental in achieving a structured design. In addition, it was demonstrated that a clean, compact design of an entire software system can be described and explained in a single book. The entire Oberon System, including its compiler, text editor and window system occupied less than 200K bytes of main memory, and compiled itself in less than 40 seconds on a computer with a clock frequency of 25 MHz. In the current year 2007, however, such figures seem to have little significance. When the capacity of main memory is measured in hundreds of megabytes, and disk space is available in dozens of gigabytes, 200K bytes do not count. When clock frequencies are of the order of gigahertz, the speed of compilation is irrelevant. Or, expressed the other way round, in order that a computer user will recognize a process as being slow, the software must indeed be lousy. The incredible advances in hardware technology have exerted a profound influence on software development. Whereas they allowed systems to reach phenomenal performance, their influence on the discipline of programming have been rather detrimental as a whole. They have permitted software quality and performance to drop disastrously, because poor performance could easily be hidden behind faster hardware. In teaching, the notions of economizing memory space and processor cycles have become a thing apart. In fact, programming is hardly considered as a serious topic; it can be learnt by osmosis or, worse, by relying on extant program “libraries”.
This stands in stark contrast to the times of ALGOL and FORTRAN. Languages were to be precisely defined, their unambiguity to be proven; they were to be the foundation of a logical, consistent framework for proving programs correct, and not only syntactically well-formed. Such an ambitious goal can be reached, only if the framework is sufficiently small and simple. By contrast, modern languages are constantly growing. Their size and complexity is simply beyond anything that might serve as a logical foundation. In fact, they elude human grasp. Manuals have reached dimensions that effectively discourage any search for enlightenment. As a consequence, programming is not learnt from rules and logical derivations, but rather by trial and error. The glory of interactivity helps.
The world at large seems to tolerate this development. Given the staggering hardware power, one can usually afford to be wasteful in space and time. The boundaries will be hit in other dimensions: usability and reliability. The enormity of current commercial systems limits understanding and fosters mistakes, leading to product unreliability.