The Problem of Growing Complexity in the Evolution of Computing

Complexity in the digital world gives rise to bugs and creates the weaknesses that enable hacking exploits.  Yet complexity grows beyond our control while reliable computing becomes ever more central to business and society.

In 2005, early in his tenure as CTO of Microsoft, Ray Ozzie wrote a memo to Microsoft developers in which he points out that: "Complexity kills. It sucks the life out of developers, it makes products difficult to plan, build and test, it introduces security challenges, and it causes end-user and administrator frustration." He went on to suggest that better software engineering techniques and improvements to processes within their programming culture can keep complexity under control.

He's certainly right about the problem.  Consider the below call graph of Microsoft's IIS Web Server serving one HTTP request asking for a single image.

IIS HTTP request
          call graph

Windows continues to grow more complex. Reportedly, there were 20 million lines of code in Windows 2000, 25m in XP and 50m in Vista. Microsoft has not revealed the number for Windows 7 or 8. More code, more bugs!  Complexity has not been brought under "control" in Windows. Even if by brute force-of-will Microsoft could tame complexity within its domain, the digital world outside their walls continues to grow more and more complex because it is beyond our control. Operating systems, applications, browser plug-ins, clusters and grids, blogs and wikis, peer-to-peer file-sharing networks, and collaborating web-services grow and mutate before our eyes

The solution is not likely to be found in improving the programming culture. Computing systems tend to evolve rather than be carefully designed. As they do so, they become ever more Byzantine and complex because evolution is never tidy. The Internet and the Web are the most obvious example of such evolution. While the underlying protocols were designed, the resulting networks emerged in unexpected ways as people discovered novel ways to exploit those protocols. Unfortunately cultures, including programming cultures, change more slowly than the software and hardware evolve.

Various sorts of encapsulation mechanisms, i.e., barriers to unwanted interactions, have evolved in both living and computing systems to help control runaway complexity. We can and should continue improving our systems in a piecemeal way when possible. Nonetheless, it is impossible to permit only desired and safe interactions. Thus we cannot precisely control and manage all interactions in complex living or digital systems.

Instead of stubbornly believing that we can control runaway complexity, we should look for large-scale architectural approaches that are inherently less susceptible to failure. And where better to look than the complex world of living systems? Carver Mead, a professor of Computer Science at Cal Tech, said years ago that, “engineers would be foolish to ignore the lessons of a billion years of evolution. He was talking then (1993) about constructing a silicon retina and silicon cochlea. The rapid growth of the Internet was just beginning at that time. Its current extent and complexity was beyond our imagination then, just as the extent and complexity of the Internet/Web of 2020 is beyond our imagination today.

This site explores some of the lessons we can draw from a billion years of evolution. It focuses in particular on four organizing principles that evolved during the evolution of multicellular organisms. I argue that these principles can illuminate our development of multicellular computing.

Last revised 9/3/2013