Software has always been interesting to computer scientists, who appreciate its arcane details and deep technical challenges. But why should it be interesting to other professions? One reason has already been noted: It is the foundation of an important industry, and it is making an increasingly important contribution to the world's economy and raising a number of challenging policy and legal issues. Fortunately, there is much more to it than that—software is intellectually interesting from a wide variety of perspectives. The following are some interesting aspects of software; each is described here briefly and elaborated throughout the book.
The software industry started from scratch only about fifty years ago, and has arguably become indispensable today, not only in its own economic effect but also in the efficient and effective management of many other industries. This journey from obscure to indispensable is by no means unique; for example, witness the earlier technological revolutions wrought by electrification or the automobile or communications. It is interesting to compare software to other industries, looking for parallels that might offer insights to the software industry. A basic thesis of the book is that software and the software industry are simply different; while such parallels are useful, they are inadequate to explain the many characteristics of the software industry.
Consider software as an economic good. It does have many characteristics that are individually familiar, but they are collected in unusual combinations. For example, like writing a novel, investment in software creation is risky, but unlike writing a novel, it requires collaboration with its users in defining its features. Like an organizational hierarchy, software applications are often essential to running a business, but unlike an organizational hierarchy, software is often designed by outside vendors with limited ability to adapt to special or changing needs. Although like many material goods and even human employees, software is valued for what it does, unlike material goods it has practically no unit manufacturing costs and is totally dependent on an infrastructure of equipment providing its execution environment. To a considerably greater degree than most material goods, a single software application and its supporting infrastructure are decomposed into many internal units, called modules (see chapter 4), which are often supplied by different vendors and with different ownership. Even the term ownership has somewhat different connotations than when used for material goods, because it is based on intellectual property laws rather than on title and physical possession. As with many other goods, the use of software includes an important operational side, but these operations are often split across a multitude of administrative domains with a limited opportunity for coordination. Like information, software is usually protected by copyright, but unlike information it can also incorporate patented inventions.
These examples, and others developed later, suggest that the software industry—as well as interested participants like the end-user, service provider, and regulatory authorities—confronts unique challenges. In addressing these challenges, it is important to appreciate the many facets of software and how it is created and used in the real world.
Software is everywhere! Many of us use computers and software on a daily basis, often many hours per day. Many material products that have a behavior, that do something, have software embedded within. Software has become a part of our lifestyle, but even more fundamentally it has become integral to the operation of organizations of all types, including industry, education, and government. The operations of most organizations are as dependent on software as they are on their human workers, and dependent as well on the smooth interworking of software with workers. This puts a burden on many professions and disciplines whose work bears on individuals or organizations to develop and incorporate a deeper understanding of software.
One of software's primary effects is to change our environment in fundamental ways. In the past, our environment was mostly built; we were surrounded by largely passive objects and artifacts, and most of our interaction was with other people. Increasingly, software is creating an environment in which we interact with inanimate objects in increasingly sophisticated ways.
In our information age and information society, information has become an important commodity. More and more workers are information workers, who manipulate and manage information as their primary job function, or knowledge workers, who create and use new knowledge based on assembling and assimilating large bodies of information. Software has become a primary vehicle by which the most mechanistic aspects of information acquisition, organization, manipulation, and access are realized, supplemented by the insights and actions of people. The growing importance of information and knowledge lead directly to the growing importance and role of software.
The addition of communication to the suite of information technologies (manifested primarily by the Internet) is dramatically increasing the importance of software to organizations and other social institutions. A primary distinguishing feature of groups, organizations, communities, and society is their patterns of discourse and communication, and software today joins mass transportation as a technology having a profound effect on those patterns. This is an evolution in its infancy, and software should only grow in significance over time.
It is tempting to think of software in terms of instructions and bits and bytes, but fundamentally, from a user perspective, those technical constructs are largely irrelevant. Software is really the expression and representation of the wishes and actions of a human programmer in the context of an executing software program. As a useful thought model, consider a computer or material product with embedded software as having a person inside, that person responding to external stimulus and defining what actions to take next. In reality, that person is the programmer (or often a large team of software developers) who has anticipated all the possible external stimuli and expressed the resulting actions through the software she writes. Thus, software is really an expression of the behavior defined by a programmer in much the same way that a novel is the expression of plot and emotion.
Increasingly, software expresses and represents an information-based business process, along with a human organization and its participants. Software works in concert with a human organization, and the technological and social aspects of this combination are deeply interwoven.
Software suffers from no significant practical physical limitations. Much more so than material goods, software can be molded pretty much as we choose. A lot of what we have today is the result of many arbitrary choices; the most significant limitation is conceptual bottlenecks and the remnants of history. We have an opportunity to make better choices in the future if we take account of the needs of users, end-user organizations, and societal needs. However, if this is to happen, we have to transcend the common perception of software as a manifestation of technology and think more deeply and clearly about software an important enabler of individuals, groups of individuals, organizations, communities, and society as a whole. We have to consider software a human artifact or tool, one that can be almost infinitely flexible and that could bring greater benefits if only it could be molded more appropriately.
A number of factors are converging to radically change the software industry, and underlying many of them is the astounding success of the Internet. The Internet is not only opening up entirely new categories of applications. It is irrevocably changing the ways in which software is sold and entangling software technologies in contentious debates over many public policy issues, including national sovereignty, national security and law enforcement, and limitations to information access.
The fundamental structure of the software-related industries has undergone the change characteristic of an immature industry, but arguably never has that change been more rapid or fundamental than now. This creates interesting opportunities to consider different models for the industry, and their relative merits and challenges.
We are familiar with the "nerd" image of social isolation associated with programmers. Like many such prejudices, there is some truth to it but also a substantial falsehood and oversimplification. Most of the desirable properties that make software successful are not a result of technical prowess but of a deep understanding of what the users of a program need and want, and how they can be accommodated in an efficient, natural, and even enjoyable way. The creators of the best and most successful application software must think much more like managers, psychologists, and sociologists than technicians. Good software cannot be created without a strong connection to all the stakeholders, which includes not only users but also managers, administrators, operators, and others. Taken in its entire context, identifying and analyzing needs through operations and use, creating and managing software is ultimately a highly social activity.
On the other hand, the programming phase of creating software requires spending a lot of time in front of a computer. In this respect, creating software is no different than creative writing, not generally considered a "nerdy" activity. How does programming differ from creative writing? On the one hand, software is almost always undertaken by large teams, an inherently social enterprise, and writing isn't. But the perceptual gap probably arises from the programmer's focus on technical detail and the writer's greater attention to plot, to artistic expression, and emotional connections. This distinction is changing rapidly. Programming tools are reducing the technical content of application creation, especially as they allow the customization of existing applications. As software becomes more integral to the lifestyles of its users, and integral to the functioning of organizations, successful programmers form a strong emotional bond with the ultimate users. So, too, with expanding computer power, with software enabling good tools and rich graphics and sound, application programming assumes the flavor of an artistic rather than a technical endeavor.
In contrast to every other economic good except information, software does not suffer from any important physical limits; it can be molded in almost any way we wish. For this reason, the limitations on what we can do with software are primarily social, economic, and conceptual, not physical. The sophistication and complexity of software grows to the point where it can no longer be managed because of conceptual limitations; no amount of money or resources can overcome these human limits. Understanding this unique aspect of software is essential to understanding the challenges faced by the software industry in moving forward.
If we think of an executing software program as a surrogate agent for its creators, one great challenge is that responsible actions must be predefined for all circumstances that may arise, not only the normal and expected but also the abnormal and exceptional. This makes accomplishing a complex task through software much more challenging than accomplishing the same task via a human organization because people can be counted on to react intelligently to exceptional circumstances.
Although it wasn't always true, post-Internet the software industry faces a monumental challenge in industry coordination. Infrastructure from many vendors must work together, and applications must work with infrastructure and work in complex ways across organizational boundaries. Other industries face coordination challenges—train locomotives have to fit with the tracks, and lubricants have to match the design of machinery—but arguably none face as wide-ranging and complex a coordination challenge as the software industry.
Technologies are morally neutral; each can be used for good or for ill. We have a collective opportunity and responsibility to mold software in ways that give it higher utility and mitigate its possible negative effects. The potential deleterious effects of software are numerous and well publicized. They include increasing the social disadvantage of poor or handicapped citizens, curtailment of free speech and civil liberties, stifling of innovation through excessive reliance on intellectual property, an overabundance of information and communication, and many others. Addressing these challenges is largely the role of public advocates, policy experts, politicians and lawmakers, but to do the job properly they must understand more fully the capabilities and limitations of software and the industries that surround software.