Software Engineering: A 40-Year History
Software engineering is dominated by intellectual activities focused on solving problems with immense complexity and numerous unknowns in competing perspectives. We can characterize three generations of software development as follows:
1960s and 1970s: Craftsmanship. Organizations used virtually all custom tools, custom processes, and custom components built in primitive languages. Project performance was highly predictable but poor: Cost, schedule, and quality objectives were almost never met.
1980s and 1990s: Early Software Engineering. Organizations used more repeatable processes, off-the-shelf tools, and about 70% of their components were built in higher level languages. About 30% of these components were available as commercial products, including the operating system, database management system, networking, and graphical user interface. During the 1980s, some organizations began achieving economies of scale, but with the growth in applications’ complexity (primarily in the move to distributed systems), the existing languages, techniques, and technologies were simply insufficient.
2000 and later: Modern Software Engineering. Modern practice is rooted in the use of managed and measured processes, integrated automation environments, and mostly (70%) off-the-shelf components. Typically, only about 30% of components need to be custom built.
Figure 3.1 illustrates the economics associated with these three generations of software development. The ordinate of the graph refers to software unit costs (per source line of code [SLOC], per function point, per component—take your pick) realized by an organization. The abscissa represents the lifecycle growth in the complexity of software applications developed by the organization.
Figure 3.1 Trends in software economics
Technologies for achieving reductions in complexity/size, process improvements, improvements in team effectiveness, and tool automation are not independent of one another. In each new generation, the key is complementary growth in all technologies. For example, in modern approaches, process advances cannot not be used successfully without component technologies and tool automation.