An Evolution View of Software as Complex Adaptive Systems enriches the current study on software evolution. This blog attempts to analyze modern software viewed as a complex adaptive system (CAS) by going through Paul Cilliers’ characteristics of CAS. By comparing software populations with biological populations, an evolution approach to software development emerges. The benefit of the approach is rather practical targeting to promote the understanding of modern software analogous to biological complexity and to guide the progress in software development in order to improve software quality and software development productivity. The writing will be composed in two parts. The first part will be titled as Software as Complex Adaptive Systems and the second part is called An Introduction to Software Evolution
I. Software as Complex Adaptive Systems
Software is a digital form of solving problems that we encounter in our daily living. As the subject of software engineering, software systems have been studied for more than forty years. How software life cycle management should be carried out has been contemplated. An effort to model software maturity analogous to the maturity process of human beings has enabled us with a novel understanding: what software is and how to achieve effective and efficient software development through its guidance . The study of software evolution can add another dimension to this maturity model and may be further empowering software engineers in the pursuit of excellence in software development. Introducing the view of software being complex adaptive systems under the study of complexity science is one approach to the software evolution study. Therefore let us define complex systems.
B. Complex systems
Paul Cilliers  offers the following five essential characteristics of complex systems:
1. A complex system consists of a large number of elements.
2. These elements interact dynamically via information exchanges non-deterministically. The interactions may be described technically as fairly rich, non-linear, short ranged, and recurring.
3. A complex system interacts with its environment openly. The scope of the system is usually determined by the purpose of the system description, thus it is often influenced by the position of the observer, i.e., how the observer is framed.
4. Complex systems have a history and must be viewed both synchronically and diachronically.
5. Complexity is the result of a rich interaction of simple elements that only response to the limited information presented to them.
Looking at this list, dealing with complex systems clearly requests our continuous efforts to comprehend such systems externally. On the other hand, the nature of the system may be interpreted as adaptive internally. This leads us to define Complex Adaptive Systems next.
C. Complex Adaptive Systems (CAS)
Given by Wikipedia CAS page  , the ideas and models of CAS are essentially evolutionary, grounded in modern chemistry and biological views on adaptation and exaptation, as well as the models simulating the economics and social systems. Typical examples are the stock market, the political parties at national, state, or local levels, social animals such as ant colonies, the brain and the immune system of animals, to name a few. Here I argue that the simulation programs to model either the biological or the social and economic systems are complex adaptive software systems. According to Wikipedia page , John Holland has provided the definition of CAS as the follows:
“Complex adaptive systems are systems that have a large numbers of components, often called agents, which interact and adapt or learn.”
Assume this is true, the words “adapt” and “learn” have to be exchangeable. In this sense, studying CAS is recognized as studying machine intelligence and it is beyond this blog to address.
Let us keep our focus on software as CAS and let us find out how software systems can be mapped using five characteristics of complex systems given by Cilliers in the above list.
D. Software as complex adaptive system
First, a complex system consists of a large number of elements.
This character is manifested by the state of the art of computer on which software is executed. Stated famously by F.P. Brooks 25 years ago :
“Digital computers are themselves more complex than most things people build: They have very large numbers of states. This makes conceiving, describing, and testing them hard. Software systems have orders-of-magnitude more states than computers do.”
Indeed, computers are the most complex machines in human creative history. The fact that software is the responsible part for such complex machines to work qualifies software being a complex system. Software instructs computer hardware about what to do by means of lines of code, instructions and algorithms, i.e., the executable routines and programs capable to complex digital functions. Nowadays, it is common that a PC or a laptop has a dual-core and that a desktop has a multicore, much less about servers in the cloud computing. Each core is the equivalent to a supercomputer in Brooks’ time 25 years ago. The complexity of digital computers in Brooks’ term has two levels of implications: in the multi-core chips at the macro-level and in ever thinner (45-16nm from current to foreseeable future) transistors/IC at the micro-level. As it has explicitly stated by Brooks, this complexity in hardware had made conceiving, describing, and testing hard. Along with the hardware complexity growth, software complexity grows even faster.
Second, these elements interact dynamically via information exchanges non-deterministically. The interactions may be described technically as fairly rich, non-linear, short ranged, and recurring.
This character is manifested by the state of the art of computing technology. For any particular software product, there are many different computer platforms, programing languages, software development technologies (tools and frameworks) and methodologies (software development processes), which may be selected for its development. It is practically impossible to test a modern software system end to end fully. This is the root cause for software to be non-deterministic and possibly recurring.
Third, a complex system interacts with its environment openly. The scope of the system is usually determined by the purpose of the system description, thus it is often influenced by the position of the observer, i.e., how the observer is framed.
The end users of software systems are people. People as part of the software running environment make the interaction between software and its operational environment open. To illustrate this characteristic in software, let us quote Chun’s lucid description in her software study: Programmed Visions . “Software is extremely difficult to comprehend. Who really knows what lurks behind our smiling interfaces, behind the objects we click and manipulate? Who completely understands what one’s computer is actually doing at any given moment? Software as metaphor for metaphor troubles the usual functioning of metaphor, that is, the clarification of an unknown concept through a known one.” This sensible description of wanting to understand the complexity of software, but incapable of doing so from a user point of view has captured exactly why we can categorize software being “a complex system interacts with it environment openly.” When a user’s understanding of the system is ambiguous, the user’s interactions with the systems are bounded to be unpredictable.
Forth, complex systems have a history and must be viewed both synchronically and diachronically.
This character is manifested by software being a product or a product family serving users. To understand it and to select an appropriate one requires our inquiry to its history and its peer/competitive products. That is, we want to look at the depth and breadth of a software product and its product family. This character is the driven force for researchers and developers to take the evolutionary view of software.
Fifth, complexity is the result of a rich interaction of simple elements that only response to the limited information presented to them.
This characteristic reflects the fact that how software is developed, i.e., one component at time. Each component can be implemented through applying appropriate software development methodologies that depends on what programming technologies are being used.
This mapping is to prepare us to look at how comparison between biological entities (populations) and software systems in order to take advantages of biological evolutionary theories to serve software evolution study. It will be given in next blog.
 B.H. Wu, “Modeling Software Maturity: a Software Life Cycle Management Approach”, to appear in the proceedings of ICIST 2012, an IEEE conference, Wushan, China, March 23-25, 2012, in press.
. Frederick P. Brooks, Jr, “No Silver Bullet-Essence and Accident in Software Engineering,” Proceedings of the IFfP Tenth World Computing Conference, H. -J. Kugler, ed., Elsevier Science B.V.,Amsterdam, NL(1986) pp. 1069-76.
 W.H.Y. Chun, Programmed Visions. Cambridge, Mass. : MIT Press, c2011.