Abstract: Computer programs consist of large collections of interacting algorithms. They are prime examples of complex systems. The recent advent of cheap, fast, small computers has led to an explosion of very complex programs that must remain easy to use. To a large extent, it is the ease-of-use constraint that is driving up the level of complexity. The programs generally have a direct-manipulation user interface, as opposed to a simple text-based interface. They are nonautonomous, that is event-driven.

Additional technical constraints drive up the complexity. The program's component parts may be distributed over various computers and they may be executing at different times. Furthermore the programs may need to be able execute on different platforms which themselves change over time as operating systems and hardware is updated. Even with the help of software development tools, an increasingly difficult task facing the software engineer is that of controlling and managing the complexity of a program over its lifetime as it inevitable grows in functionality and size.

In the parlance of dynamical systems, as perhaps best defined in Math and Physics, computer programs in general are extremely complex nonautonomous t-advancing iterative maps defined on discrete phase spaces of high dimension.

Over the past several years, as an experiment to learn more about controlling and managing the complexity of computer programs, I have been writing a program designed to help students visualize the complexity and chaos that emerges when small nonlinear dynamical systems, in the form of differential equations and iterative maps, evolve in time. In the course of writing the program, I came to the realization that the program itself was a meta dynamical system.

I will discuss how a program's complexity is controlled and managed in theory. Time permitting, I will also demonstrate how the complexity arises and is managed in practice.&lt;br&gt;<br>