 In complex systems, there is always two fundamentally different levels to the system, the micro and the macro, or what we might call the local and the global. This is in contrast to simple linear systems where it is possible to reduce the whole system to one level. So let's first unpack this statement a bit to see why this is so. Firstly, complex systems are composed of many parts. We may be talking millions as in the number of inhabitants of a city or billions as in the number of devices connected to the internet. For those of you who aren't mathematicians, a number like a million is a highly abstract thing. Trying to relate a number like a billion to our everyday physical experience where we are really dealing with numbers like five, ten or possibly a hundred should give you an idea of the vast gap or difference in scale difference between any individual node on the local level and the system as an entirety. Secondly, because the components have some degree of autonomy, they are adapting to their local environment. These components are often very simple and they do not respond to information on the global level. Thus, one pattern of order can and often does develop on the micro level and a second pattern emerges or is imposed on the macro scale as a result of trying to design the system to have some form of global coordination. An example of this might be the official use of two different languages in many parts of the world where we have the local level that has emerged organically and English that has been placed on top of this so as to make the system more interoperable on the global level. Lastly, because of the high degree of connectivity within the system, we have many interactions. These interactions inevitably lead to elements synchronizing which gives rise to macro scale patterns. This is what is called emergence. Traffic jams are a good example of emergence as are bank runs. The net result of all this is that we have two qualitatively different levels within complex systems, meaning they cannot be reduced to a single level. This makes designing and managing these systems much more difficult. We need to be firstly aware of this multi-dimensional nature to complex systems and aware that if we try to reduce them to simple monodimensional systems, there will be unintended and unfortunate consequences. Thus, we need to learn to design for this multi-dimensional nature to complex systems. In order to do this, we have to be able to structure and model the system we are designing according to its different levels of abstraction. But what is abstraction? Abstraction is a powerful tool used in all areas of math, science and engineering. Maybe the easiest way to understand it is as the process of removing successive layers of detail from our representation of the system in order to capture its essential features, what we might call its global features. They are common to all the components and are thus on the system's level. This is like zooming in on a satellite map of a city. Each level will have a certain degree of detail, creating a certain type of structure that will feed into defining the patterns on the level below. Thus, we see how complex engineered systems are what we call systems of systems, but unlike mechanistic systems where each level is just a scaled-up version of the components below it. What mathematicians call scale invariants, the levels to complex systems can be understood to be scale invariant, but they also have their own internal variation and dynamics that cannot be fully abstracted away. So you may or may not have heard of things called fractals. They are geometric structures that have this scale invariant property. Examples being the arteries in the human body, the structure to snowflakes, the formation of rigid mountains, and sea coastlines. If we make one of these, such as the coastline, and zoom in on it, the overall structure on each level will be the same, but it will not be exactly the same. There will be variation and unique differences on each level. To make this more relevant to us as designers and engineers, let's take an example of what this means in practical terms for the systems we are developing. So say we're designing a structural adjustment program for the Mongolian economy. No amount of data crunching and analysis from our IMF headquarters will tell us how things will really play out on the ground. Yes, our abstract economic models will tell us how the system works on the global generic level, but there is another level to the Mongolian economy that represents a particular social, cultural, and geographical mix that is unique to this particular instance of the global economy. If we want to design this program properly, we need to model and understand the different levels of abstraction from the local to the global level, how the interaction between the generic and the specific play out on each level, and how each level feeds in to define the level below and above it. One thing to take away from this with respect to our design methodology will be the importance of ethnographic studies and real end user experience. Our abstract models are one thing, but in these large complex systems, they will go through phase transitions as they are implemented on the ground. If we design a military intervention in Iraq without understanding the local level context within which it takes place, then this phase transition can go in any direction. Real experience of the local level is crucial if we hope to have a strong influence over this process. With the huge scale of some of these complex systems, things can go very wrong and get very messy. The so-called Big Dig may be cited as an example of this. A mega project to reroute a highway through the center of Boston estimated at $2.8 billion. The project was completed at a final cost of $14.6 billion after being plagued by numerous implementation problems. In summary then, abstraction is a powerful tool for solving complexity. The end user will experience excessive complexity when we have too many components on a single level. By understanding the different levels of abstraction, we can take a mono-dimensional system that is all on one level and create a multi-tiered system giving each component its own appropriate space. But when we use abstraction as we have to be able to deal with the overwhelming complexity of these systems, we need to be aware that there will be a phase transition between our models and the reality or between the macro level and the micro level.