The Chaos Model and The Chaos Cycle
The Chaos Model and The Chaos Cycle
The Chaos Model and The Chaos Cycle
Introduction
The Chaos Model
The Linear Problem-Solving Loop
The Fractal Problem-Solving Loop
Influences within a Project
Software Development is a Human Activity
An Interpretation of the Chaos Model
Users' Needs
Technical Resources
Developers Solve Mid-Level Problems
The Chaos Life Cycle
A Note on Life Cycles
Fractal Phase Definitions
Phase Means Perspective
EvelTone Needs All Skills
Conclusion
Acknowledgments
Bibliography
INTRODUCTION
I believe that to truly understand software development, we must not only understand the flow of an entire
project and how to write each line of code, we must also understand how one line of code relates to the whole project. It
seems to me that we have studied each aspect of software development in isolation, not how all aspects fit together. The
Waterfall model, defined by Royce, and the Spiral model, defined by Boehm, discuss management-level issues, such as
phases and deadlines, rather than how to write one line of code or fix one bug. Programming methodologies show us
how to solve technical problems, rather than how to solve users' problems or to meet deadlines. In this paper, I use the
principles of chaos (or ffactals) as a metaphor to bridge the gap in our understanding of the relationship between one
line of code and the entire project.
Throughout this paper, I describe software development from the developer's point of view. If we want to
understand software development, we must describe what developers do. After all, developers do the work. We know
that large programs consist of many lines of code and that large projects consist of the daily efforts made by individual
developers. We know that the large scale and the small scale somehow relate to each other. Yet most models of soRware
development seem to focus on one extreme or another, ignoring the role of developers.
In the first section, I define the Chaos model which combines a simple, people-oriented, problem-solving loop
with ffactals to describe the structures within a project. I believe that soRware development is a human activity: people
write the software, use the solutions, and experience the problems. I believe that creating software is very complex; we
cannot simplify software development by imposing simple models on it. The Chaos model uses fractals to describe a
cohesive structure which encompasses many of the issues actually encountered during software development. This
structure helps to explain the influences within a project and the roles that developers play.
In the second section, I interpret the Chaos model to reveal the meaning behind the structure. I show that users,
developers, and technologies form a continuum throughout software development. They all interact in a complex dance.
This interpretation improves our understanding of the contribution and limitations of users, developers, and
technologies.
In the third section, I define the Chaos life cycle to describe how a project evolves over time. Life cycles are
essentially the top-level perspectives of software development. In light of the Chaos model, I define the phases of the life
cycle in terms offfactals and show that all phases occur throughout the life cycle. These chaotic definitions suggest that I
can interpret the complete life cycle in terms of each phase, and conversely, I can interpret each phase in terms of a
Copyright 1994 by L. B. S. Raccoon, Albuquerque, New Mexico. All rights reserved.
ACM SIGSOFT
complete life cycle. The phases of the life cycle show our perspectives on the state of a project, rather than what the state
of a project really is. Thus, developers need many skills to be able to understand and respond to situations that arise
throughout a software development project.
ACM SIGSOFT
be in five and ten years. Sometimes polities plays a big role, especially when a decision requires a consensus among
many people. In this ease, bad politics can sink a good solution. There are often many reasonable solutions and no easy
way to choose among them.
During technical development, developers do the work. Ira problem can be solved by technical means,
developers will solve it. Professionals use technical tools and methodologies when appropriate. But developers cannot
use technology to solve nontechnical problems nor can they ensure that the right problem gets solved nor that a good
solution will get used. Inappropriate use of technology is destined to fail. Placing technical development in the context of
the linear problem-solving loop emphasizes these limitations.
During solution integration, programmers
incorporate the results of technical development into the
world at large. Integration involves advertising, selling,
and disseminating the solution to users. Users reject or
ignore many results because they fred that the wrong
problem was solved or the improvement is inadequate.
Graphical user interfaces languished for years, mostly
due to nontechnical concerns, such as cost and
compatibility.
The status quo represents the current state of
affairs in the world. This includes the technical state-ofthe-art, as well as the economic and social circumstances
of the participants. As the new teclmieal solution gains
acceptance, a new status quo emerges and the cycle
repeats. Depicting the loop, rather than the stages of
problem solving, points out that problem solving
Figure 3: The Fractal Problem-Solving Loops in Theory.
improves the status quo. Figure 2 shows that the linear
problem-solving loop has no starting or stopping points.
The status quos are points of stability within a stream of change.
ACM S I G S O F T
J a n u a r y 1995 Page 58
Example: Consider a company which wants to forecast and manage its growth. If the company predicts that it will
outgrow its internal accounting system and it decides to develop a new accounting program, these are a few of the
many distinct levels the project contains:
At the program level, the company must handle projected growth. The technical solution is to create a new
program. Integration involves patting the system on line and educating the users.
At the component level, a team creates the user interface. During problem definition, the team members
define how the interface will work and how each member will contribute. During technical development,
they create the user interface. Integration involves selling the finished code back to the whole project
through code reviews, code integration, and system testing.
At the function level, developers work on their own parts of the project. A developer first decides what
function to create. During technical development, he or she edits and compiles the function. During solution
integration, he or she tests and integrates the results.
At the "one line of code" level, a developer decides which line of code to edit next and why. Technically,
he or she makes changes using an editor and then decides whether the result looks correct and elegant
enough to keep.
Influences within a Project
Levels are not independent. All levels of a project are connected by a web of influences that stretches between
the "whole program" level and the "one line of code" level. Adjacent levels influence each other very strongly. Distant
levels influence each other very weakly. For example, the meaning of a function depends very much on the exact
position and meaning of each line of code. Yet the meaning of a program depends very little on the position and meaning
of any one line of code. One line of code changes or disappears completely, depending on the algorithms and data
structures used and the developer's programming style.
To understand software development
- - The "Whole Program" Level
effectively, we must distinguish between those issues that
we both can and want to control and those issues that we
either cannot or do not want to control. The state of a
project is the subset of the status quo of interest to
developers. The distinction between the state of a project
and the status quo often seems arbitrary. In Figures 5, 6,
7, and 8 the states of a project are represented as vertical
strings of dots. Each dot represents a different logical
level of the project state. The dots oversimplify the
depiction of the levels, which are multidimensional and
quite complicated.
The state of a project separates naturally into
distinct conceptual levels. The top level represents the
- The "One Line of Code" Level
concept of what the whole program should accomplish.
The bottom level represents what we can accomplish
Figure 5: The Web of Influences Within a Project.
with one line of code. The levels in between represent
This diagram shows the flow of project states over time.
what we can accomplish using mid-level structures, such
Each vertical string of dots represents one project state.
as functions and modules. The middle levels do not refer
The intensity of each arrow represents the degree to
to the physical structure of the project, the call structure
which one level influences another.
of the code, the inheritance structure of the code, the size
of the code, or any other explicit structure in the code.
Code structures often mimic the conceptual structures, but seldom exactly. While many conceptual components are
implemented as separate functions in separate files, some conceptual components may be spread across many different
functions in many different files.
Software development is the flow from one project state to the next. Normally, each level of a project proceeds
in loose coordination with the other levels, with no single level dominating or controlling the whole project. Changes can
occur at any level during a state transition and one change can affect many other levels.
ACM S I G S O F T
Users' Needs
Software is valuable because it helps businessmen to manage finances, helps students to write reports, helps
publishers to lay out graphics, and helps workers to run factories. The goal of software development is to improve users'
productivity. Application software makes the general public more productive. Systems software makes other developers
more productive.
The top levels of the project are defined by the needs of the user and tend to be outside of the developers" realm
of control. While developers do help users tmderstand their needs, developers do not determine what the users need.
Note that the users' needs can change over the course of a project.
Users depend on developers to create robust and effective programs to meet their needs. Users would like to
decide what a program should do, but they cannot make all decisions which matter. If users could make these decisions,
they would write their own software. But, few users possess the development skills necessary to adequately specify,
ACM SIGSOFT
implement, and maintain a large program. Software developers have the skills and resources to decipher the users' needs
and create effective technical solutions.
Unfortunately, many traditional models
.~ The "Whole Program" Level
decouple software development from the users during
requirements analysis, and then they ignore the users
during the rest of development. Developers become
responsible to the specification and are discouraged from
~.::~.:::::.,
interacting with users, ff the specification is inadequate
or changes arise, the users have little recourse and the
decoupling prevents anyone from clearing up the
problem. Developers do currently recognize the
impoaance of user participation during User Interface
design. However, user participation is still not
i
considered part of normal software development.
Developers must understand the application
~ T h e
"One Line of Code" Level
and the needs of users. It often takes a long-term
relationship between users and developers, with a lot of
dialog, to uncover what users really need. If the needs of
Figure 6: The Influence of the Users' Needs. The goals of
users change, we must accept those changes. If users are
the project are defined at the top level and trickle down.
slow to understand their needs, then developers must
wait for users to clarify their needs. As software
engineering becomes more applications-oriented, developers must work more effectively with users. Solving the wrong
problem is very unproductive for both users and developers.
Technical Resources
Technology is the collection of tools and methodologies that enable developers to solve specific technical
problems. We use technology to build programs for nontechnical users. Most tools and methodologies apply only to the
lowest levels of a project. At the bottom levels, editors help developers to change one line of code at a time and
debuggers help developers to watch one line of code execute.
The bottom levels tend to be outside of the
S
The "Whole Program" Level
developers' realm of control. The bottom levels are
defined by what we can achieve with one line of code.
For example, programming languages determine how
functions are built, but not how programs should be
constructed for the user. Note that the technical
resources can change over the course of a project.
Software developers often seem to think that
technology can do anything, that technology suffuses our
environment. In fact, when problems easily reduce to
technical solutions, developers get predictable results.
But, developers must construct everything that
technology does not implement directly. Most of what
developers do, at the middle and upper levels of a
project, remains unsupported by technology. In the
middle levels, "make" allows developers to update a
Figure 7: The Influence of the Technical Resources. The
project with one command and revision control systems
solutions of the project are defined at the bottom level and
allow developers to manage groups of changes with one
trickle up.
command. Libraries and class hierarchies fit between the
bottom and middle levels. One function call or object
invocation can stand for one idea, which is a bottom-level interpretation, or can stand for a lot of code, which is a midlevel interpretation.
Few tools apply to the middle and upper levels of a project. Most high-level tools, such as formal specification
languages and test ease generators, are really projects, not tools. Formal specifications and test suites are usually many
lines long. Thus these are not technologies; they are complete development projects in their ownright. These projects
i !2!!%
iii!i!'',ii!!i!','iiiiiiiii!
!i!!i!iiiii!iiiiii!!iiiiii!i!
Jiiiiiii i
ACM SIGSOFT
can help the whole software development project, but they are not part of the finished program. Developers creating
formal specifications and automatic test systems use most of the same technologies that other developers use: editors,
compilers of various sorts, "make," and revision control systems.
While developers do use the programming technologies, we are not responsible for creating new programming
technologies. Viewing technical resources as part of a chaotic structure reveals that developers need tools and
methodologies to work on higher and higher levels of the project.
ACM SIGSOFT
life cycle in terms of each phase and view each phase in terms of the whole life cycle. By transitivity, the phases are
essentially identical. So, our assessment of where a project is shows our perspective about the project, rather than any
essential truth about the project.
Developers use all skills throughout a project. Developers often get caught up in small problems and forget
how they relate to other problems that come before and after, or above and below the focus of attention. Developers need
to keep the whole flow of software development in mind.
A Note on Life Cycles
A life cycle is not a model. To greatly simplify the distinction between them, a life cycle depicts the sequence of
events within a project, while a model depicts the structure within a project. Figure 9 shows one set of variations on the
Waterfall and Sashimi life cycles (as defined by DeGrace and Stahl) and the Regression and Chaos life cycles (as defined
here). These life cycles depict four different ways that programming flows from requirements analysis to design to
implementation to maintenance. Each life cycle differs in how the phases change throughout the project.
Simple life cycles help us understand projects
by emphasizing simple parts of soRware development
and ignoring complex, obscure details. The Waterfall life
cycle depicts software development as a fixed sequence
of distinct phases. The Sashimi life cycle allows phases
to overlap, though not to get mixed up. These fast two
life cycles suggest that projects follow rigid patterns.
~t~hirn~Life Cycle
Waterfall Life C 'ele
They suggest that to write the best program possible,
developers should plan to meet specific schedules, and
that changes and problems that unexpectedly arise
probably reflect bad planning.
Complex life cycles help us understand the
more sophisticated facets of projects by revealing
complexity. The Regression life cycle allows each phase
Regression Life Cycle
Chaos Life Cycle
to linger throughout the entire project. Maintenance
starts on "day one" and requirements analysis finishes at
Figure 9: Four Life Cycles. This shows the percentage of
the end of the project. The Chaos life cycle breaks the
resources devoted to each phase of the life cycle
rigid flow of phases and allows them to come and go as
(Requirements Analysis, Design, Implementation,
the project evolves. Problems and changes may surface
and Maintenance) as a function of time.
and then get resolved. These last two models suggest that
projects are adaptable. They suggest that planning and
scheduling can only be so useful, and that to write the best program possible, developers must respond to the various
problems and opportunities that will undoubtedly arise.
I/D
The normal definitions of life cycle phases focus on the top, project-level concepts. In light of the Chaos model,
I generalize these phase definitions and show how they apply to all scales, from large to small, between the users' needs
and the technical resources. The following definitions can refer to the activities on any one scale, on all scales together,
or on any subset of scales. I define five representative terms here, leaving the definitions of specification, testing, and
other life cycle concepts to the reader.
ACM
SIGSOFT
At the top levels, we identify what the users want the program to do.
In the upper levels, we identify what a program needs the components to do.
In the lower levels, we identify what a component needs lines of code to do.
At the bottom levels, we identify what a line of code needs the compiler to do.
Design: To design means to plan ahead, to bridge goals and actions. This means a variety of things, from laying out
the structure of the code, to establishing coding standards. Coding standards include plans for how lines of code
should work together. Whenever developers think about how they will do something, before they do it, they are
designing.
At the bottom levels, we design how individual lines of code will work.
Implementation: To implement means to carry out or perform an action. Developers create pieces of code of
various sizes and scopes.
ACM SIGSOFT
The definitions of phases in the previous table show that all phases apply to every sized piece of code. On every
level of the project: components must be specified, designed, and implemented. We can also interpret horizontal slices in
terms of levels. Every level acts as a specification for the level below it, an implementation for the level above it, and a
design that connects the level above with the level below. Even the top level acts as an implementation of the user's
needs and the bottom level acts as a specification to the compiler.
In terms of fractal scaling, each phase resembles the whole life cycle and the whole life cycle resembles each
phase. The first column of the following table shows that each phase occurs in all phases. Each phase involves setting
goals, carrying out the goals, and maintaining the results. The second column of the following table shows that the
complete life cycle can be viewed in terms of a single phase. We can view all of software development in terms of
design, in terms of implementation, or in terms of maintenance. To read the table, I find it helpful to keep the following
three points in mind. First, the empty program is an infinitely buggy version of a real program. Anything will improve it.
Second, the bulk of standards committee work involves maintaining, improving, and correcting the specification. For
example, the C-H- standard changes every three months as it is corrected and refined. Third, even the smallest bug must
be identified, and therefore specified, before it can be fixed.
So by transitivity, each phase is identical to every other phase. The phases blend into each other and the life
cycle dissolves into an amorphous flow of emphasis. The distinctions that we make between phases become arbitrary
and show our perspective on the project, rather than any essential truth about software development. When we say that a
project is in one phase or another, it shows where we think we are, more than where we actually are.
Each Phase Occurs in All Phases
specification documents
pieces of code
specification documents
pieces of code
specification documents
pieces of code
specification documents
pieces of code
specification documents
pieces of code
ACM SIGSOFT
CONCLUSION
In this paper, I have shown how the principles of chaos can lead us to a better understanding of software
development. I use chaos as a metaphor to define both the Chaos model and the Chaos life cycle, emphasizing the
developer's point of view. The Chaos model and Chaos life cycle define a concise framework for exploring, interpreting,
and assessing software development.
The Chaos model combines a linear problem-solving loop with fractals to suggest that a project consists of
many interrelated levels of problem solving. The top levels of a project consist of resolving a few large problems and the
bottom levels of a project consist of resolving many small problems. Developers solve problems at all levels between
the "whole project" level and "one line of code" level. The Chaos model expresses the humanness and the uniform
complexity of software development.
Interpreting the Chaos model shows how users, developers, and technologies interact during a project. The
users' needs define the goals of the project at the upper levels, and must trickle down to the bottom levels. The technical
resources define the solutions at the bottom levels, and must trickle up to the top levels. Developers match the users'
needs with the technical solutions in the middle levels of a project.
The Chaos life cycle reveals complexity in the evolution of a project. Defining the phases of the life cycle in
terms offfactals shows that all phases of the life cycle occur within all other phases, throughout the life cycle. Thus, how
we interpret the phases of the life cycle shows our perspective on the state of a project, rather than any essential truth
about the state of the project.
Many authors have made similar points and created models that are both iterative and flexible. But, the
perspective of the Chaos model allows us to combine many of these issues and arguments into one framework. The
power of the Chaos model is that it concisely unifies so many facets of software development.
ACKNOWLEDGMENTS
Over the last six years, many people helped me to develop, critique, and expand on the ideas expressed in this
paper. I would like to thank Bear, Bunnyrabbit, Anne Cable, K. C. Cress, Anthony Giancola, Joe Hill, Janice Kim,
Arthur B. Maocabe, Puppydog, Gideon Shaanan, Charles Troup, Edwin E. Wing, Laura Yedwab, and colleagues at
Electronic Data Systems Research, Vision Harvest, and WordPerfect. I would especially like to thank Mina Yamashita.
ACM SIGSOFT
BIBLIOGRAPHY
Boehm, Barry W. (1986) A Spiral Model of SoRware Develooment and Enhancement, ACM Software Engineering
Notes, August 1986, pages 14-24.
Booth, Gr~dy (1991) Object-OrientedDesign, Benjamin Cummings.
Borenstein, Nath~[iel S. (1991 ) Programming as if People Mattered, Princeton University Press.
Brooks, Frederick P. Jr. (1975) The MythicalMan Month, Addison Wesley.
Brooks, Frederick P. Jr. (1987) 12t9..~J1~_I~, in Computer, April 1987, IEEE Computer Society.
Charette, Robert N. (1986) Soft,are EngineeringEm,ironmems, McGraw-Hill.
DeGrace, Peter and Leslie Hulet St~l (1990) WickedProblems, Righteous Solutions, Yourdon Press.
Gries, David (1981) The Science of Programming, Springer Verlag.
Mandelbrot, Benoit B. (1983) The Fractal Geometry of Nature, Freeman.
Marcus, Clare Cooper and Wendy Sarkissian. (1986) Housi,g As If People Mattered, University of California Press.
Royce, W. (1970) Managing the Development of Large SoftwareSystems:Concepts,WESCONProceedings(Aug.)
I~
UNITED~TATE$
POSTAL .~ERVICE,~
Statement
of Ownership,
i ~101_19ppi7
....................
a year
AssociaEion
in
Jan.,
April,
July,
William T r a c z ,
Hark Mandelbau=.
Federa
Systems,
lnc,,
1515 Broadway,
0 2 1 0 , Owego, HY
MY NY 1 0 0 3 6
13827-1298
Full N I ~
Association
N~ NY 100036
1no., 1 5 1 5 B r o a d w a y . NY N~ 1 0 0 3 6
Computing Machinery.
Loral
,0,,,9~
$23 Hembers
$&7 N o n m e m b e r s
for
Circulati,
l: ........
Oct.,
Associa1on
and
fReOu~reo D 39 U S C 3~
.......................
5 times
& Dec.
Management,
for Co=puling
Machinery.
~11~ ld~l
I~c.
(a nonprof~ organlza~ion)
151.5 B r o a d w a y . MY N~ 1 0 0 3 6
Full N l m
C ~
Mlillh~ A d ~ e l ,
Soitware
Engineering
News
i l l , m I~d N I I g t l Of it=lltWn
t5
D g f i n | P m c t (lln~ I 1 M ~ t h l
A C t v I I N o Copies ol ~ l n g l l I I
p U b l l l h l d N l l r l l l to Fihn~ 0
9073
9073
973~
2
9075
93~
96X
(1) o , * u,*. L e ~ * n . s ~ e d
Pl~ent pI~I I i ~
r ; ~ / ' - ~ = ;ooj
t
i ~i~
~t
RllQlmlSlld Cuc,ltlbrm
~.
Inil i l l mtcm~al:o,ilur~st~id ~ h
~=s
~
r.~
is t ~ I I ~ (waplete I ~
Director
of
Publications
9130194