Wednesday, August 24, 2011

Complexity and Power

The world of electronic computing hasn't turned out much like originally envisioned. Thinkers like Leibniz and Hilbert realized that resolving deep questions requires subtle and precise logic. The human mind gets overwhelmed beyond a few layers of abstraction and too easily steps over some crucial gap, missing the details where whole legions of devils often hide. Machines can tirelessly apply inferential rules to logical expressions of daunting complexity. The surprise is that the movement this brings about tends to be horizontal rather than vertical. Indeed, still in the prehistory of computing, Gödel and Turing showed how mechanical application of rules cannot fathom the subtleties of the deepest truths. That lack of depth was the first surprise. But practical mechanical computing brought a second surprise. No one in the 1950s seems to have imagined that computers would become so universal that most folks in the developed world would routinely carry several around in various pockets, chatting with friends and checking on the stock market. Computing has become pervasive.

Parallel to these surprises, the breadth of computing instead of its depth, has come another surprise, the overwhelming complexity of the software that governs computation. The insights of Gödel and Turing in the 1930s already showed the way: code and data are interchangeable. The distinction is one of perspective. Each layer of code interprets data at an outer shell of a system, and itself becomes data to be interpreted by code the next inner shell of the system. The outer layers of the system merge into the vastness of modern life in the information age. Indeed, these layers evolve together, they drive each other's evolution. Computing pushes the complexity of life and life in turn pushes the complexity of computing.

When Leibniz and Hilbert dreamt of computational solutions to profound problems, they dreamt of software with the elegant simplicity and obvious universality of Platonic ideals. The standard formula of Garbage In, Garbage Out is too kind to software. Once software gets tangled enough, it is capable of producing Garbage Out no matter the quality of the input. And the explosion in breadth of computing guarantees that software will be tangled. Indeed, a further surprise is how we are constantly discovering new species, indeed whole new phyla, of tangles: viruses, worms, phish, etc.

This exploding ecology includes more than the two niches of software and user. There is also the software developer. As software complexity has exploded, a dream has lingered that at least the software development process could be managed as a clean methodical process. But slowly the realization has emerged that software and its developer are tightly coupled and evolve together, along with the user community, or not at all. How to manage this co-evolution is not so clear. But it is far more like leading a living community of farmers and artisans and their families than like arranging a flow of subassemblies in a factory. A healthy community is full of surprises, where a well run factory is devoid of them.

A common difficulty in any living community is where some small group gets into a reinforcing feedback loop which accelerates its growth at the expense of the rest of the system. Once this imbalance gets extreme enough, the feedback loop reaches its limits and the bubble collapses. This sort of dynamic happens in the world of software development. Software and its developers can push the complexity of the code and pull the user community along. At first the added complexity brings useful capability so the users incorporate the software more integrally into their business processes. The later levels of complexity serve more to bind the user community to the software ever more tightly, with less and less added utility. The developers can bleed the users to the point where a scary new start, and a shedding of the parasitic developers, happens despite all the efforts to maintain continuity. Often as not a new set of users springs up with the new developers.

In our information age, complex information processing technology is not developed solely by the software industry. Every institution involved in our lives of accelerating complexity is built around such technology. Medicine, automobiles and aerospace, agriculture, and finance all build devices and models of daunting complexity. Each of them are prone to the dynamic of exploiting users by binding them with chains of escalating complexity.

The recent film Inside Job poses the question: how is it that the very architects of the financial crisis of 2008 continue to hold positions of leadership in government and academia? Shouldn't the crisis they engineered disqualify them from those positions?

One good answer to this paradox may be the dynamic of binding users with escalating complexity. The financial system is vastly complex but also pervasively entangled with the rest of the economy. The developers of this system gain their awesome power through this entangled complexity.