This page contains references to books and papers about complex systems and how they fail. I'm interested in how these relate to software systems, so my comments will be biased in that direction. In particular, the availability section is specific to high availability in distributed systems.
If you're interested in resilience engineering, check out my resilience engineering notes.
Mark McGranaghan maintains a services engineering reading list with some significant overlap.
Henry Petroski, Vintage, 1992.
Petroski's big idea is that the field of engineering only advances because of failures. If a building stays up, we don't get any information about whether the building was actually designed and built correctly. However, if it collapses, we know for certain that there was a flaw somewhere.
As a consequence, when there are no failures, engineers will push the boundaries over time until a failure happens, and then the engineering community learns from the failure and takes the failure mode into account in future designs.
Unfortunately, the types of failure retrospectives that happen in civil engineering don't happen in IT at the community level. Yes, these retrospectives do happen inside IT organizations, but we don't have the same kinds of mechanisms for sharing these lessons in the wider community.
Richard I. Cook, Cognitive Technologies Laboratory, University of Chicago, Revision D (00.04.21)
Cook presents eighteen observations about systems. It's tempting to simply reproduce them all here, but a few examples should suffice to give a sense of the paper:
This essay is also reproduced as chapter 7 in "Web Operations: Keeping the Data on Time" by O'Reilly Press.
Charles Perrow, Princeton University Press, 1999.
Perrow talks about the failure modes of complex systems whose behaviors cannot be fully understood by human operators, with much discussion about nuclear power plants.
Gerald M. Weinberg, Dorset House, 2001.
There seem to be two schools of thought on the idea of "systems thinking". One of the schools is about how to think about problems, and the other one is about how to model the world. This book falls into the former category: about how to think about problems. He goes into some detail about the imperfect nature of observation.
Weinberg's a software guy, and so he makes heavy use of discrete models: finite sets and state representations. This is quite different from Meaadows' perspective, which uses stocks and flows.
Weinberg summarizes many of the concepts into a pithy set of principles and laws, with names like:
John Gall, General Systemantics Press, 2003.
Written by a pediatrician and originally published in the 1970s, this book is written as a collection of axioms about the behaviors (or, less charitably, pathologies) of complex systems. Examples of such axioms include:
Although originally written decades before the emergence of web-based Internet services, the concepts are surprisingly applicable.
Aug 26, 2003.
This is NASA's post-mortem report on the Space Shuttle Columbia accident. It is a surprisingly readable document that describes the incident and contributing factors.
Donella H. Meadows, Chelsea Green Publishing, 2008.
Meadows's book falls into the "how to model the world" category of systems thinking book. She discusses how to model complex systems in terms of constructs like buffers and feedback loops.
I remember people used to say how computer programs behave differently from physical artifacts. And, yet, distributed software systems do behave like other types of systems. You can expend resources (e.g., memory, disk space), there are couplings and feedback loops that can cause all sorts of interesting systems-like behaviors.
Sidney Dekker, Ashgate, 2011.
Dekker proposes a new model of thinking about accidents: focus on a holistic view rather than loooking for a broken part. A fantastic book.
Sidney Dekker, Journal of Safety Research 33 (2002) 371-385.
A alternate title for this paper might be "against hindsight". This paper is a critique of the traditional retrospctive root cause analysis approach to accident analysis. Instead, it advocates for "human sensemaking":
The question is not "where did people go wrong?" but "why did this assessment or action make sense to them at the time?
You can see the seeds of "Drift Into Failure" in this earlier paper by Dekker.
He notes the following mechanisms of hindsight:
Dekker advocates scouring the record for the following events and activities:
Steps to reconstruct concept-dependent account from context-specific incident data:
Some quotes from the paper:
Rich Hickey, Feb. 2013
Hickey is always an engaging speaker. In this talk, he compares and contrasts how we build programs with how we build systems.
Nassim Nicholas Taleb, Random House, 2014.
The big idea of this book is that there are some systems that acutally get better when exposed to doses of damage.
Mark Burgess, O'Reilly Media, 2015.
Burgess is the author of the venerable CFEngine configuration management system, and this book is a kind of generalization of CFEngine's notion of convergence to more general principles for designing IT-based systems, based on what Burgess calls promise theory.
I debated whether to even put this book on the list here, as I struggled with it. There are ideas worth pondering, but the book lacks focus, and the author meanders across disparate topics without doing a good job tying them into a unified whole.
Daniel Frey, Joseph Palladino, John Sullivan, Malvern Atherton, 16th Annual International Symposium of the International Council on Systems Engineering (INCOSE), July 9–14, 2006, Orlando, FL.
Discusses whether reducing part count improves the robustness of a system. Examines the issue from the perspective of three diffferent theories, and from three case studies in the domain of gas turbine engines.
Conclusion: At the component-level, reducing part count has led to improvements, at the system-level, part count has increased in order to achieve better reliability, and that the theory of Highly Optimized Tolerance best captures this phenomenon.
Also, part reductions at the component-level, while they have benefits, also increase the complexity and coupling of the design and manufacturing stages.
Unique part count is important in systems engineering because it creates demands on inter-functional coordination and in logistics and supply chain management
While it has become cliché that greater complexity creates unreliability, the actual story is more complicated... The essence of this robustness, and hence of complexity, is the elaboration of highly structured communication, computing, and control networks that also create barriers to cascading failure events (quotes Carson & Doyle).
The theory of Highly Optimized Tolerance suggests that systems will evolve towards more complexity as robustness demands require countermeasures against failure modes.
To summarize, although part count reduction is eventually observed at the component level as suggested by TRIZ, when the scope is enlarged to the system context, escalating demands for system robustness have generally resulted in increased number of parts and number of unique parts in jet engines.
Lisanne Bainbridge, Automatica, Volume 19, Issue 6, November 1983, Pages 775-779. https://doi.org/10.1016/0005-1098(83)90046-8
Bainbridge describes how the adopting automation can increase the occurence of incidents.
Design errors in the automation system can be a major source of operating problems.
As automation increases, operators have less experience, and therefore when they need to take over, they are more likely to make a mistake.
David D. Woods, 2018, In book: IRGC resource guide on resilience (vol. 2): Domains of resilience for complex interconnected systems, Publisher: EPFL International Risk Governance Center, https://www.researchgate.net/publication/329035477_Resilience_is_a_Verb
Resilience refers to a system's capacity to adapt to unforeseen surprises (SNAFUs) that result from breakdowns in standard plans and automation.
This includes capacity:
Four capabilities provide the basis for continuous adaptation:
Key terms: resilience, adapt, adaptive capacity, SNAFUs, SNAFU catching, anticipate, synchronize, proactive learning, initiative, reciprocity, tangible experiences, plans, goals
Notable quotes:
David D. Woods, Reliability Engineering and System Safety, Volume 141, September 2015, Pages 5-9, https://doi.org/10.1016/j.ress.2015.03.018
Woods argues that the term resilience is overloaded. He outlines four commonly used meanings:
Woods defines a surprise as a disturbance to the system that is outside of the envelope of events that the system can normally handle.
Rebound refers to the ability of a system to recover after a surprise. In this defintion, more resilient systems are better able to recover from surprises.
Robustness refers to the set of disturbances that the system can respond to effectively. In this definition, more resilient systems can gracefully respond to a larger set of disturbances (i.e., fewer of these disturbances are surprises).
Woods criticizes robustness because it says nothing about what happens to a system when it encounters a surprise. A system may be resilient by this definition and yet utterly collapse when faced with a surprise. (He uses the phrase brittle at its boundaries).
Woods also points out that as the performance envelope of a system widens, it may become vulnerable to new kinds of events.
Graceful extensibility refers to the ability of a system to change itself in order to better handle the different kinds of surprises that it may face in the future. He uses the term stretching, asking how do systems stretch to handle surprises?
An extended quote:
Systems with high graceful extensibility have capbilities to anticipate bottlenecks ahead, to learn about the changing shape of disturbances and possess the readiness-to-respond to adjust responsies to fit the challenges.
The above quote makes it sound like this concept is proactive, but Woods notes that:
[S]urprise has regular characteristics as many classes of challenge re-cur ... which can be tracked and used as signals for adaptation.
Woods contrasts graceful extensibility with what he calls brittleness, defined as how rapidly a system's performance declines when it nears and reaches its boundary.
Sustained adaptability refers to systems that are flexibile enough to adapt over long time scales. Woods claims that this type of resilience requires that the system have a layered network architecture, (a necessary but not sufficient condition). He argues that a system needs this type of architecture early in its life cycle in order to be able to adapt to changes across the system's life cycle. Even as the system adapts, it will preserve certain architectural principles that provide it with the ability to adapt.
Woods asks the following questions of such systems:
Ultimately, Woods argues that rebound and robustness concepts have proven to be less useful He emphasizes the value of graceful extensibility and sustained adaptability.
Jim Gray, Tandem Computers, Technical Report 85.7 June 1985, PN87614
Describes strategies for achieving good reliability and availability in the presence of faults.
Notable quotes:
System administration, which includes operator actions, system configuration, and system maintenace was the main source of failures -- 42%. p8
The top priority for improving system availability is to reduce administrative mistakes by making self-configured systems with minimal maintenance and minimal operator interaction. p12
A way to improve availability is to install proven hardware and software, and then leave it alone. p13
If you consider an industrial sofwtare system which has gone through structured design, design reviews, quality assurance, alpha test, beta test, and months or years of production, then most of the "hard" software bugs, ones that always fail on retry, are gone. The residual bugs are rare cases, typically related to strange hardware conditions (rare or transient device fault), limit conditions (out of storage, counter overflow, lost interrupt, etc,, or race conditions (forgetting to request a semaphore). p17-18 (emphasis mine).
Dealing with system configuration, operations, and maintenance remains an unsolved problem. p32
Joe Armstrong, PhD Dissertation, Royal Institute of Technology, Stockholm, Sweden Decmeber, 2003
Describes both Erlang and principles for using it to build reliable systems.
Michael Nygard, Pragmatic Bookshelf, April, 2007
James Hamilton, Proceedings of the 21st Large Installation System Administration Conference (LISA '07), November 11-16, 2007
Even though this paper was written before cloud computing became widely adopted (the word "cloud" does not appear once), it feels as if it could have been written today. The only other indications of it being a little are a discussion of hardware, and a proposed deployment cycle of three months.
John Allspaw & Jesse Robins, eds. O'Reilly Media, July 2010
A collection of essays.
Ding Yuan, Yu Luo, Xin Zhuang, Guilherme Renna Rodrigues, Xu Zhao, Yongle Zhang, Pranay U. Jain, and Michael Stumm Proceedings of the 11th USENIX Symposium on Operating Systems Design and Implementation (OSDI '14) Oct. 2014.
An empirical study that explores the reasons why distributed systems fail in production by analyzing the root causes of around 200 confirmed system failures. You can read my review of this paper at It Will Never Work In Theory.
I also wrote more details on this paper here
Ahmed Alquraan, Hatem Takruri, Mohammed Alfatafta, and Samer Al-Kiswan Proceedings of the 13th USENIX Symposium on Operating Systems Design and Implementation (OSDI ’18). Oct. 2018
An empirical study that demonstrates how many open source distributed systems (including Cassandra, Zookeeper, Mesos, Chronos, Kafka, Redis, Riak, and RabbitMQ) fail badly under network partitions.
The authors built NEAT, a tool for injecting network partitions, in order to do these their testing.
The findings:
Jeff Hodges, Something Similar blog, January 14, 2013
General advice from a Twitter engineer about the challenges of developing and debugging distributed systems. He also gave an excellent talk at RICON West 2013 entitled Practicalities of Productionizing Distributed Systems that is well worth your time.
John Allspaw, ACM Queue, Volume 10, issue 8, August 24, 2012
Allspaw argues that you must observe the system tolerating failures in production in order to have confidence in the system's resiliency. He discusses fault injection in the context of GameDay exercises at Etsy. Although the essay does not mention Chaos Monkey, it provides a strong motivation for tools similar to Chaos Monkey.
Joe Duffy, Joe Duffy's Blog, February 7, 2016
Duffy talks about the error model that they used in the Midori language. Interesting content about how to handle errors in code.
Nancy Leveson, Safety Science, Vol. 42, No. 4, April 2004
Leveson proposes a model of accidents called STAMP: systems-theoretic accident model and processes. STAMP focuses on identifying safety constraints that were violated and determining why the controls were inadequate.
While this paper is focused on software safety, it is still relevant for availabilty, since an outage can be viewed as an accident.
David Oppenheimer, Archana Ganapathi, and David A. Patterson, 4th Usenix Symposium on Internet Technologies and Systems (USITS ‘03), 2003.
Oppenheimer et al. did a case study of three Internet services to determine common causes of failures. Findings incldue:
Networking problems are difficult to mask because:
Proposed techniques for avoiding or mitigating failures, in decreasing order of impact:
Denis Besnard, Erik Hollnagel, Cognition, Technology and Work, Springer Verlag, 2014, 16 (1)
The authors discuss five myths about safety and propose revisions.
Myth: Human error is the largest single cause of accidents and incidents
Revision: 'Human error' is an artifact of a traditional engineering view, which treats humans as if they were (falliable) machines and overlooks how performance adjustments are used to match activities to the working conditions.
Myth: Systems will be safe if people comply with the proedures they have been given.
Revision: Actual working situations usually differ from what the procedures assume and strict compliance may be detrimental to both safety and efficinecy. Procedures should be used carefully and intelligently.
Myth: Safety can be improved by barriers and protection; increasing the layers of protection leads to higher safety.
Revision: Technology is not value netural. Additional prteoction changes behaviour so that the intended safety improvements might not be obtained.
Myth: Root cause analysis can identify why mishaps happen in complex socio-technical systems.
Revision: Human performance cannot be described as if it was bimodal. In socio-technical systems, things that go wrong happen in the same way as things that go right.
Myth: Accident investigation is the logical and rational identification of causes based on facts.
Revision: Accident investigation is a social process, where causes are constructed rather than found.
Myth: Safety always has the highest priority and will never be compromised.
Revision: Safety will be as high as affordable — from a financial and ethical perspective.
Butler W. Lampson, ACM SIGOPS Operating Systems Review, Volume 17 Issue 5, October 1983
General advice on building system, based on the author's experiences building several systems at Xerox PARC. It's all still relevant, but here are some quotes I found particularly notable:
Defining interfaces is the most important part of system design.
Interface design must satisfy three conflicting requirements:
Do one thing at a time, and do it well.
Don't generalize; generalizations are generally wrong.
Neither abstraction nor simplicity is a substitute for getting it right.
The purpose of abstractions is to conceal undesirable properties; desirable ones should not be hidden.
Use procedure arguments to provide flexibility in an interface (support functions as arguments).
Keep basic interfaces stable.
Even when an implementation is successful, it pays to revisit old decisions as the system evolves; in particular, optimizations for particular properties of the load or the environment (memory size, for example) often come to be far from optimal.
Use a good idea again instead of generalizing it.
Handle normal and worst cases separately as a rule.
In allocating resources, strive to avoid disaster rather than to attain an optimum.
We learned that the only important thing is to avoid thrashing.
The most successful schemes give a fixed share of the cycles to each job and don't allocate more than 100%.
Shed load to control demand, rather than allowing the system to become overloaded
End-to-end: Error recovery at the application level is absolutely necessary for a reliable system, and any other error detection or recovery is not logically necessary but is strictly for performance.
Two problems with the end-to-end strategy:
Log updates to record the truth about the state of an object.
J.H. Saltzer, D.P. Reed and D.D. Clark, ACM Transactions on Computer Systems (TOCS), Volume 2 Issue 4, Nov. 1984
Proposes that functionality guarantees must be implemented on an end-to-end basis, rather than by simply building on top of some infrastructure that provides guarantees.
The example given in the paper is that if you want to ensure that file transfer is reliable, you have to do an end-to-end check to verify that the transfer succeeded, because there are failure points other than at the levels of infrastructure you build on that can provide guarantees.
Julie Gainsburg, Journal for Research in Mathematics Education Vol. 38, No. 5 (Nov., 2007), pp. 477-506, DOI: 10.2307/30034962
This paper describes an ethnographic study of structural engineers to understand how they use mathematics. She introduces the idea of skeptical reverence.
Quotes from paper:
Students come to see mathematics as a rule-driven, linear, solitary, school-only activity, in which problms have one correct solution that should be quickly evident, and true understanding requires special talent. ...mathematics is about understanding, sense-making, communicating, and discovering patterns; that mathematics is collaborative; and that people with differing backgrounds, talents, and perpsectives-including children- can and should participate in it.
...many mathematicians do not hold the view that every child can and should participate in authentic mathematical activity.
Traditional efforts to demonstrate mathematic's real-world utility take the form of "word problems" that thinly disguse mathematial exercises in real contexts; these contrived problems do little do sitrub student's view of mathematics as a school-only activity.
More often, problems arose because the complexity and uniqueness of each building precluded the simple application of easablished procedures.
Engineering theory and methods had to be adapted to each new project in ways not immediatley evident, and for much of the work I observed, no established procedures were available.
... structural engineering work is by nature iterative.
The most intractable problems I observed stemmed from what I came to see as the fundamental problem of structural engineering: that the phenomena at the center of the engineer's work (the structure and their behaviors) were nonexistent or inaccessible.
Structural engineering is a bootstrapping process. The engineer makes initial rough design assumptions to get started, then design and analysis inform each other as they converge to a final state through repeated iteration.
Unfortunately, an empirical test of the "correctness" fo the design or analysis is rarely possible.
[A design] also had to be justifiable on the bases of feasibility, available materials, labor capacity, budget, and time, as well as on the less tangible but arguably more crucial grounds that the design solution and the method that yielded it made sense and "felt" good" to the engineer.
In some sense, the engineers equated engineering with the exercise of engineering judgment: at least, what inspired engineers to identify colleagues as expert had more to do with the ability to make judgments than to apply and perform mathematics.
As did the engineers I observed, Vick concluded that engineering judgment was virtually synonymous with expertise.
Kinds of decisions:
Engineering judgment often entailed a nonmathematical decision about a situation that could not be adequately mathematized; that is, it sometimes replaced mathematical resources, bridging unmathematizable gaps in the analytic process.
...engineering judgement had no recourse to proof; it could not be verified.
Again, there were no established rules to guide these sorts of decisions, yet they had to be made well. The consequences of poor judgment here ranged from increased time and cost to catastrophic structural failure.
In this episode, Micahel resorted to engineering judgment to determine his degree of trust in the results of their mathematical modeling and what to do when that trust was shaken.
On occasion, they even rejected proven results that they felt were dedutivley sound, because they were impractical. In these cases, the engineers relied on judgment to convince themselves that ocerriding the proof would be safe and justifiable.
Proof, however, is not always possible. For example, at one point Michael and Ray were forced to exercise judgment when no mathematical method was available.
The concept of engineering judgment reifies the process of prioritizing and selecting among these resources, task by task, and I contend that engineering judgment, rather than mathematics, is hegemonic over the practice of structural engineering.
Mathematics enables anlaysis, but analysis can only be retrospective. Matheamtical theories and methods do not point to particular designs or best methods of analysis and so cannot serve as the ultimate authority for engineering work.
The structureal engineers' mathematical point of view appears to be one of skeptical reverence-matheamatics is a powerful and necessary tool that must be used judiciously and skeptically.
The end products of structural work are a symbolically expressed design and a story about how that design came to be.
That story .... erases nearly all traces of iterations, missteps, and rejected methods...
The new official story presented to building officials, owners and contractors is straightforward, linear, and rational, aimed to create the impression that the design solution was the inevitable consequence of the constraints and the theory, that the analysis took the only logical route, and that the process unfolded unimpeded, step by predictable step.
He admitted to using computerized anlyses, post hoc, to justify solutions he had attained using "classical" (approximation) methods:
Practically speaking, could I get it through a city building department? No... Could I get it through a peer reviewer? No. Everyone in the industry believes in computers. So the issue for me, the challenge, is to make the computer come up with the right answer. I use all the classical methods to figure out what the answer ought to be, and then I use that figure to figure out exactly how I'm going to arrange my model.
So I think that over-reliance on a mathematical process actually obscures the fundamental nature of the behavior you're trying to describe.
Matehmatics is fundamental to solving structural engineering problems.
People may be more inclined to use mathematics, and in more effective ways, in everday life and work if their school training acknowledged that "doing everyday math" larbely means deciding how, when and when not to use mmathematics, and if they were offered opporutnities to make and reflect on such decisions.
authentic problems from high-tech professions are usually inapporpriate for the classroom, for practical reasons and because students lack athe domain knowledge to make judgments about the use of mathematics and other resources.
A worthy challenge for mathematics educators is to make the matehamtical products of professional engineersa nd scientists accessible to students for analysis, even if sttudents are incapable of producing such work themselves.
Shawna J. Perry, Robert L. Wears Cognition, Technology & Work, Vo. 14, Iss. 3 (Sept. 2012), pp. 253-260 DOI: 10.1007/s10111-011-0207-2 pdf (paywalled)
Two observational case studies about new technologies that were introduced into hospital emergency departments:
In both cases, the replacement technology did not accomodate all of the work that the doctors were doing with the previous technologies, and so the doctors adapted by using workarounds ("shadow" paper charts, using both old white board and new digital status board, carrying papers around). There was work that suffered due to the introduction of the new technology.
They summarized their findings as:
Jens Rasmussen, Safety Science, Vol. 27, No. 2/3, (1997), pp 183-217 DOI: 10.1016/S0925-7535(97)00052-0 pdf (paywalled)
In this widely cited paper, Rasmussen advocates for a cross-disciplinary, systems-based approach to thinking about how accidents occur. He argues that accidents occur because the system migrates across a dangerous boundary, and this migration occurs during the course of normal work.
This paper contains the seeds of Woods's notion of the adaptive universe, Dekker's notion of drift, and Leveson's notion of control-theoretic systems-based approach to safety.
In particular, he proposes the following risk management framework for control of safety in a socio-technical system (section 2):

He relates accidents to the notion of a system moving towards a boundary (section 6):

Jorge Aranda, PhD dissertation, Department of Computer Science University of Toronto, 2010 pdf
Aranda proposes shared understanding as a theory to explain challenges to effective coordination and communication in software engineering organizations.
His theory is outlined in Chapter 5 of the dissertation. A summary of his model can be found in figure 5.3 on page 101:
Coordination and communication consist of developing and negotiating a shared understanding of:
His model consists of four attributs of interaction that can impact shared understanding:
Understanding that is shared synchronously to the situation in which it applies is more effective than an understanding about multiple potential situations shared asynchronously, in advance.
Developing a shared understanding is most effective when it occurs in physical proximity to its situation. One implication is that co-located orgs will be more effective in shared understanding than distributed ones.
Proportionality refres to a balance between the involvement of each agent in the situation and the situation's needs; an alignment of responsibility with authority.
Proportionate coordination consists of coordination that is performed by the people who will be primarily affected by the consequences—and most knowledge about the details—of the situation they face. It emphasizes shared responsibility and team ownership of the strategies used to deal with the production of their systems.
Disproportionate coordination is performed by people unrelated to the situation under consideration. It is an imposition of a plan of action and of the goals to pursue in the situation, determined by somebody other than those involved in it or by a more fraction of those involved.
When high-level coordination is disproportionate, the goals of some members of the organization may be overlooked or dismissed. Under some circumstances this may lead to the successful completion of the software project from the point of view of those doing the coordination, but thes ame project may have been a failure from the point of view of those organization members that did not have a say in goal-setting and planning.
Participants share their understanding taking advantage of their previous patterns of behaviour.
As an organization evolves its behavior to face some particular kinds of situations, the difficult of establishing a shared understanding of those kinds of situations decreases considerably.
Hence, under many situations, the advantages of switching to a promising set of coordination and communication patterns has to be weighted against the loss in maturity entailed by engaging in a novel set of patterns.
7 commits
This page contains references to books and papers about complex systems and how they fail. I'm interested in how these relate to software systems, so my comments will be biased in that direction. In particular, the availability section is specific to high availability in distributed systems.
If you're interested in resilience engineering, check out my resilience engineering notes.
Mark McGranaghan maintains a services engineering reading list with some significant overlap.
Henry Petroski, Vintage, 1992.
Petroski's big idea is that the field of engineering only advances because of failures. If a building stays up, we don't get any information about whether the building was actually designed and built correctly. However, if it collapses, we know for certain that there was a flaw somewhere.
As a consequence, when there are no failures, engineers will push the boundaries over time until a failure happens, and then the engineering community learns from the failure and takes the failure mode into account in future designs.
Unfortunately, the types of failure retrospectives that happen in civil engineering don't happen in IT at the community level. Yes, these retrospectives do happen inside IT organizations, but we don't have the same kinds of mechanisms for sharing these lessons in the wider community.
Richard I. Cook, Cognitive Technologies Laboratory, University of Chicago, Revision D (00.04.21)
Cook presents eighteen observations about systems. It's tempting to simply reproduce them all here, but a few examples should suffice to give a sense of the paper:
This essay is also reproduced as chapter 7 in "Web Operations: Keeping the Data on Time" by O'Reilly Press.
Charles Perrow, Princeton University Press, 1999.
Perrow talks about the failure modes of complex systems whose behaviors cannot be fully understood by human operators, with much discussion about nuclear power plants.
Gerald M. Weinberg, Dorset House, 2001.
There seem to be two schools of thought on the idea of "systems thinking". One of the schools is about how to think about problems, and the other one is about how to model the world. This book falls into the former category: about how to think about problems. He goes into some detail about the imperfect nature of observation.
Weinberg's a software guy, and so he makes heavy use of discrete models: finite sets and state representations. This is quite different from Meaadows' perspective, which uses stocks and flows.
Weinberg summarizes many of the concepts into a pithy set of principles and laws, with names like:
John Gall, General Systemantics Press, 2003.
Written by a pediatrician and originally published in the 1970s, this book is written as a collection of axioms about the behaviors (or, less charitably, pathologies) of complex systems. Examples of such axioms include:
Although originally written decades before the emergence of web-based Internet services, the concepts are surprisingly applicable.
Aug 26, 2003.
This is NASA's post-mortem report on the Space Shuttle Columbia accident. It is a surprisingly readable document that describes the incident and contributing factors.
Donella H. Meadows, Chelsea Green Publishing, 2008.
Meadows's book falls into the "how to model the world" category of systems thinking book. She discusses how to model complex systems in terms of constructs like buffers and feedback loops.
I remember people used to say how computer programs behave differently from physical artifacts. And, yet, distributed software systems do behave like other types of systems. You can expend resources (e.g., memory, disk space), there are couplings and feedback loops that can cause all sorts of interesting systems-like behaviors.
Sidney Dekker, Ashgate, 2011.
Dekker proposes a new model of thinking about accidents: focus on a holistic view rather than loooking for a broken part. A fantastic book.
Sidney Dekker, Journal of Safety Research 33 (2002) 371-385.
A alternate title for this paper might be "against hindsight". This paper is a critique of the traditional retrospctive root cause analysis approach to accident analysis. Instead, it advocates for "human sensemaking":
The question is not "where did people go wrong?" but "why did this assessment or action make sense to them at the time?
You can see the seeds of "Drift Into Failure" in this earlier paper by Dekker.
He notes the following mechanisms of hindsight:
Dekker advocates scouring the record for the following events and activities:
Steps to reconstruct concept-dependent account from context-specific incident data:
Some quotes from the paper:
Rich Hickey, Feb. 2013
Hickey is always an engaging speaker. In this talk, he compares and contrasts how we build programs with how we build systems.
Nassim Nicholas Taleb, Random House, 2014.
The big idea of this book is that there are some systems that acutally get better when exposed to doses of damage.
Mark Burgess, O'Reilly Media, 2015.
Burgess is the author of the venerable CFEngine configuration management system, and this book is a kind of generalization of CFEngine's notion of convergence to more general principles for designing IT-based systems, based on what Burgess calls promise theory.
I debated whether to even put this book on the list here, as I struggled with it. There are ideas worth pondering, but the book lacks focus, and the author meanders across disparate topics without doing a good job tying them into a unified whole.
Daniel Frey, Joseph Palladino, John Sullivan, Malvern Atherton, 16th Annual International Symposium of the International Council on Systems Engineering (INCOSE), July 9–14, 2006, Orlando, FL.
Discusses whether reducing part count improves the robustness of a system. Examines the issue from the perspective of three diffferent theories, and from three case studies in the domain of gas turbine engines.
Conclusion: At the component-level, reducing part count has led to improvements, at the system-level, part count has increased in order to achieve better reliability, and that the theory of Highly Optimized Tolerance best captures this phenomenon.
Also, part reductions at the component-level, while they have benefits, also increase the complexity and coupling of the design and manufacturing stages.
Unique part count is important in systems engineering because it creates demands on inter-functional coordination and in logistics and supply chain management
While it has become cliché that greater complexity creates unreliability, the actual story is more complicated... The essence of this robustness, and hence of complexity, is the elaboration of highly structured communication, computing, and control networks that also create barriers to cascading failure events (quotes Carson & Doyle).
The theory of Highly Optimized Tolerance suggests that systems will evolve towards more complexity as robustness demands require countermeasures against failure modes.
To summarize, although part count reduction is eventually observed at the component level as suggested by TRIZ, when the scope is enlarged to the system context, escalating demands for system robustness have generally resulted in increased number of parts and number of unique parts in jet engines.
Lisanne Bainbridge, Automatica, Volume 19, Issue 6, November 1983, Pages 775-779. https://doi.org/10.1016/0005-1098(83)90046-8
Bainbridge describes how the adopting automation can increase the occurence of incidents.
Design errors in the automation system can be a major source of operating problems.
As automation increases, operators have less experience, and therefore when they need to take over, they are more likely to make a mistake.
David D. Woods, 2018, In book: IRGC resource guide on resilience (vol. 2): Domains of resilience for complex interconnected systems, Publisher: EPFL International Risk Governance Center, https://www.researchgate.net/publication/329035477_Resilience_is_a_Verb
Resilience refers to a system's capacity to adapt to unforeseen surprises (SNAFUs) that result from breakdowns in standard plans and automation.
This includes capacity:
Four capabilities provide the basis for continuous adaptation:
Key terms: resilience, adapt, adaptive capacity, SNAFUs, SNAFU catching, anticipate, synchronize, proactive learning, initiative, reciprocity, tangible experiences, plans, goals
Notable quotes:
David D. Woods, Reliability Engineering and System Safety, Volume 141, September 2015, Pages 5-9, https://doi.org/10.1016/j.ress.2015.03.018
Woods argues that the term resilience is overloaded. He outlines four commonly used meanings:
Woods defines a surprise as a disturbance to the system that is outside of the envelope of events that the system can normally handle.
Rebound refers to the ability of a system to recover after a surprise. In this defintion, more resilient systems are better able to recover from surprises.
Robustness refers to the set of disturbances that the system can respond to effectively. In this definition, more resilient systems can gracefully respond to a larger set of disturbances (i.e., fewer of these disturbances are surprises).
Woods criticizes robustness because it says nothing about what happens to a system when it encounters a surprise. A system may be resilient by this definition and yet utterly collapse when faced with a surprise. (He uses the phrase brittle at its boundaries).
Woods also points out that as the performance envelope of a system widens, it may become vulnerable to new kinds of events.
Graceful extensibility refers to the ability of a system to change itself in order to better handle the different kinds of surprises that it may face in the future. He uses the term stretching, asking how do systems stretch to handle surprises?
An extended quote:
Systems with high graceful extensibility have capbilities to anticipate bottlenecks ahead, to learn about the changing shape of disturbances and possess the readiness-to-respond to adjust responsies to fit the challenges.
The above quote makes it sound like this concept is proactive, but Woods notes that:
[S]urprise has regular characteristics as many classes of challenge re-cur ... which can be tracked and used as signals for adaptation.
Woods contrasts graceful extensibility with what he calls brittleness, defined as how rapidly a system's performance declines when it nears and reaches its boundary.
Sustained adaptability refers to systems that are flexibile enough to adapt over long time scales. Woods claims that this type of resilience requires that the system have a layered network architecture, (a necessary but not sufficient condition). He argues that a system needs this type of architecture early in its life cycle in order to be able to adapt to changes across the system's life cycle. Even as the system adapts, it will preserve certain architectural principles that provide it with the ability to adapt.
Woods asks the following questions of such systems:
Ultimately, Woods argues that rebound and robustness concepts have proven to be less useful He emphasizes the value of graceful extensibility and sustained adaptability.
Jim Gray, Tandem Computers, Technical Report 85.7 June 1985, PN87614
Describes strategies for achieving good reliability and availability in the presence of faults.
Notable quotes:
System administration, which includes operator actions, system configuration, and system maintenace was the main source of failures -- 42%. p8
The top priority for improving system availability is to reduce administrative mistakes by making self-configured systems with minimal maintenance and minimal operator interaction. p12
A way to improve availability is to install proven hardware and software, and then leave it alone. p13
If you consider an industrial sofwtare system which has gone through structured design, design reviews, quality assurance, alpha test, beta test, and months or years of production, then most of the "hard" software bugs, ones that always fail on retry, are gone. The residual bugs are rare cases, typically related to strange hardware conditions (rare or transient device fault), limit conditions (out of storage, counter overflow, lost interrupt, etc,, or race conditions (forgetting to request a semaphore). p17-18 (emphasis mine).
Dealing with system configuration, operations, and maintenance remains an unsolved problem. p32
Joe Armstrong, PhD Dissertation, Royal Institute of Technology, Stockholm, Sweden Decmeber, 2003
Describes both Erlang and principles for using it to build reliable systems.
Michael Nygard, Pragmatic Bookshelf, April, 2007
James Hamilton, Proceedings of the 21st Large Installation System Administration Conference (LISA '07), November 11-16, 2007
Even though this paper was written before cloud computing became widely adopted (the word "cloud" does not appear once), it feels as if it could have been written today. The only other indications of it being a little are a discussion of hardware, and a proposed deployment cycle of three months.
John Allspaw & Jesse Robins, eds. O'Reilly Media, July 2010
A collection of essays.
Ding Yuan, Yu Luo, Xin Zhuang, Guilherme Renna Rodrigues, Xu Zhao, Yongle Zhang, Pranay U. Jain, and Michael Stumm Proceedings of the 11th USENIX Symposium on Operating Systems Design and Implementation (OSDI '14) Oct. 2014.
An empirical study that explores the reasons why distributed systems fail in production by analyzing the root causes of around 200 confirmed system failures. You can read my review of this paper at It Will Never Work In Theory.
I also wrote more details on this paper here
Ahmed Alquraan, Hatem Takruri, Mohammed Alfatafta, and Samer Al-Kiswan Proceedings of the 13th USENIX Symposium on Operating Systems Design and Implementation (OSDI ’18). Oct. 2018
An empirical study that demonstrates how many open source distributed systems (including Cassandra, Zookeeper, Mesos, Chronos, Kafka, Redis, Riak, and RabbitMQ) fail badly under network partitions.
The authors built NEAT, a tool for injecting network partitions, in order to do these their testing.
The findings:
Jeff Hodges, Something Similar blog, January 14, 2013
General advice from a Twitter engineer about the challenges of developing and debugging distributed systems. He also gave an excellent talk at RICON West 2013 entitled Practicalities of Productionizing Distributed Systems that is well worth your time.
John Allspaw, ACM Queue, Volume 10, issue 8, August 24, 2012
Allspaw argues that you must observe the system tolerating failures in production in order to have confidence in the system's resiliency. He discusses fault injection in the context of GameDay exercises at Etsy. Although the essay does not mention Chaos Monkey, it provides a strong motivation for tools similar to Chaos Monkey.
Joe Duffy, Joe Duffy's Blog, February 7, 2016
Duffy talks about the error model that they used in the Midori language. Interesting content about how to handle errors in code.
Nancy Leveson, Safety Science, Vol. 42, No. 4, April 2004
Leveson proposes a model of accidents called STAMP: systems-theoretic accident model and processes. STAMP focuses on identifying safety constraints that were violated and determining why the controls were inadequate.
While this paper is focused on software safety, it is still relevant for availabilty, since an outage can be viewed as an accident.
David Oppenheimer, Archana Ganapathi, and David A. Patterson, 4th Usenix Symposium on Internet Technologies and Systems (USITS ‘03), 2003.
Oppenheimer et al. did a case study of three Internet services to determine common causes of failures. Findings incldue:
Networking problems are difficult to mask because:
Proposed techniques for avoiding or mitigating failures, in decreasing order of impact:
Denis Besnard, Erik Hollnagel, Cognition, Technology and Work, Springer Verlag, 2014, 16 (1)
The authors discuss five myths about safety and propose revisions.
Myth: Human error is the largest single cause of accidents and incidents
Revision: 'Human error' is an artifact of a traditional engineering view, which treats humans as if they were (falliable) machines and overlooks how performance adjustments are used to match activities to the working conditions.
Myth: Systems will be safe if people comply with the proedures they have been given.
Revision: Actual working situations usually differ from what the procedures assume and strict compliance may be detrimental to both safety and efficinecy. Procedures should be used carefully and intelligently.
Myth: Safety can be improved by barriers and protection; increasing the layers of protection leads to higher safety.
Revision: Technology is not value netural. Additional prteoction changes behaviour so that the intended safety improvements might not be obtained.
Myth: Root cause analysis can identify why mishaps happen in complex socio-technical systems.
Revision: Human performance cannot be described as if it was bimodal. In socio-technical systems, things that go wrong happen in the same way as things that go right.
Myth: Accident investigation is the logical and rational identification of causes based on facts.
Revision: Accident investigation is a social process, where causes are constructed rather than found.
Myth: Safety always has the highest priority and will never be compromised.
Revision: Safety will be as high as affordable — from a financial and ethical perspective.
Butler W. Lampson, ACM SIGOPS Operating Systems Review, Volume 17 Issue 5, October 1983
General advice on building system, based on the author's experiences building several systems at Xerox PARC. It's all still relevant, but here are some quotes I found particularly notable:
Defining interfaces is the most important part of system design.
Interface design must satisfy three conflicting requirements:
Do one thing at a time, and do it well.
Don't generalize; generalizations are generally wrong.
Neither abstraction nor simplicity is a substitute for getting it right.
The purpose of abstractions is to conceal undesirable properties; desirable ones should not be hidden.
Use procedure arguments to provide flexibility in an interface (support functions as arguments).
Keep basic interfaces stable.
Even when an implementation is successful, it pays to revisit old decisions as the system evolves; in particular, optimizations for particular properties of the load or the environment (memory size, for example) often come to be far from optimal.
Use a good idea again instead of generalizing it.
Handle normal and worst cases separately as a rule.
In allocating resources, strive to avoid disaster rather than to attain an optimum.
We learned that the only important thing is to avoid thrashing.
The most successful schemes give a fixed share of the cycles to each job and don't allocate more than 100%.
Shed load to control demand, rather than allowing the system to become overloaded
End-to-end: Error recovery at the application level is absolutely necessary for a reliable system, and any other error detection or recovery is not logically necessary but is strictly for performance.
Two problems with the end-to-end strategy:
Log updates to record the truth about the state of an object.
J.H. Saltzer, D.P. Reed and D.D. Clark, ACM Transactions on Computer Systems (TOCS), Volume 2 Issue 4, Nov. 1984
Proposes that functionality guarantees must be implemented on an end-to-end basis, rather than by simply building on top of some infrastructure that provides guarantees.
The example given in the paper is that if you want to ensure that file transfer is reliable, you have to do an end-to-end check to verify that the transfer succeeded, because there are failure points other than at the levels of infrastructure you build on that can provide guarantees.
Julie Gainsburg, Journal for Research in Mathematics Education Vol. 38, No. 5 (Nov., 2007), pp. 477-506, DOI: 10.2307/30034962
This paper describes an ethnographic study of structural engineers to understand how they use mathematics. She introduces the idea of skeptical reverence.
Quotes from paper:
Students come to see mathematics as a rule-driven, linear, solitary, school-only activity, in which problms have one correct solution that should be quickly evident, and true understanding requires special talent. ...mathematics is about understanding, sense-making, communicating, and discovering patterns; that mathematics is collaborative; and that people with differing backgrounds, talents, and perpsectives-including children- can and should participate in it.
...many mathematicians do not hold the view that every child can and should participate in authentic mathematical activity.
Traditional efforts to demonstrate mathematic's real-world utility take the form of "word problems" that thinly disguse mathematial exercises in real contexts; these contrived problems do little do sitrub student's view of mathematics as a school-only activity.
More often, problems arose because the complexity and uniqueness of each building precluded the simple application of easablished procedures.
Engineering theory and methods had to be adapted to each new project in ways not immediatley evident, and for much of the work I observed, no established procedures were available.
... structural engineering work is by nature iterative.
The most intractable problems I observed stemmed from what I came to see as the fundamental problem of structural engineering: that the phenomena at the center of the engineer's work (the structure and their behaviors) were nonexistent or inaccessible.
Structural engineering is a bootstrapping process. The engineer makes initial rough design assumptions to get started, then design and analysis inform each other as they converge to a final state through repeated iteration.
Unfortunately, an empirical test of the "correctness" fo the design or analysis is rarely possible.
[A design] also had to be justifiable on the bases of feasibility, available materials, labor capacity, budget, and time, as well as on the less tangible but arguably more crucial grounds that the design solution and the method that yielded it made sense and "felt" good" to the engineer.
In some sense, the engineers equated engineering with the exercise of engineering judgment: at least, what inspired engineers to identify colleagues as expert had more to do with the ability to make judgments than to apply and perform mathematics.
As did the engineers I observed, Vick concluded that engineering judgment was virtually synonymous with expertise.
Kinds of decisions:
Engineering judgment often entailed a nonmathematical decision about a situation that could not be adequately mathematized; that is, it sometimes replaced mathematical resources, bridging unmathematizable gaps in the analytic process.
...engineering judgement had no recourse to proof; it could not be verified.
Again, there were no established rules to guide these sorts of decisions, yet they had to be made well. The consequences of poor judgment here ranged from increased time and cost to catastrophic structural failure.
In this episode, Micahel resorted to engineering judgment to determine his degree of trust in the results of their mathematical modeling and what to do when that trust was shaken.
On occasion, they even rejected proven results that they felt were dedutivley sound, because they were impractical. In these cases, the engineers relied on judgment to convince themselves that ocerriding the proof would be safe and justifiable.
Proof, however, is not always possible. For example, at one point Michael and Ray were forced to exercise judgment when no mathematical method was available.
The concept of engineering judgment reifies the process of prioritizing and selecting among these resources, task by task, and I contend that engineering judgment, rather than mathematics, is hegemonic over the practice of structural engineering.
Mathematics enables anlaysis, but analysis can only be retrospective. Matheamtical theories and methods do not point to particular designs or best methods of analysis and so cannot serve as the ultimate authority for engineering work.
The structureal engineers' mathematical point of view appears to be one of skeptical reverence-matheamatics is a powerful and necessary tool that must be used judiciously and skeptically.
The end products of structural work are a symbolically expressed design and a story about how that design came to be.
That story .... erases nearly all traces of iterations, missteps, and rejected methods...
The new official story presented to building officials, owners and contractors is straightforward, linear, and rational, aimed to create the impression that the design solution was the inevitable consequence of the constraints and the theory, that the analysis took the only logical route, and that the process unfolded unimpeded, step by predictable step.
He admitted to using computerized anlyses, post hoc, to justify solutions he had attained using "classical" (approximation) methods:
Practically speaking, could I get it through a city building department? No... Could I get it through a peer reviewer? No. Everyone in the industry believes in computers. So the issue for me, the challenge, is to make the computer come up with the right answer. I use all the classical methods to figure out what the answer ought to be, and then I use that figure to figure out exactly how I'm going to arrange my model.
So I think that over-reliance on a mathematical process actually obscures the fundamental nature of the behavior you're trying to describe.
Matehmatics is fundamental to solving structural engineering problems.
People may be more inclined to use mathematics, and in more effective ways, in everday life and work if their school training acknowledged that "doing everyday math" larbely means deciding how, when and when not to use mmathematics, and if they were offered opporutnities to make and reflect on such decisions.
authentic problems from high-tech professions are usually inapporpriate for the classroom, for practical reasons and because students lack athe domain knowledge to make judgments about the use of mathematics and other resources.
A worthy challenge for mathematics educators is to make the matehamtical products of professional engineersa nd scientists accessible to students for analysis, even if sttudents are incapable of producing such work themselves.
Shawna J. Perry, Robert L. Wears Cognition, Technology & Work, Vo. 14, Iss. 3 (Sept. 2012), pp. 253-260 DOI: 10.1007/s10111-011-0207-2 pdf (paywalled)
Two observational case studies about new technologies that were introduced into hospital emergency departments:
In both cases, the replacement technology did not accomodate all of the work that the doctors were doing with the previous technologies, and so the doctors adapted by using workarounds ("shadow" paper charts, using both old white board and new digital status board, carrying papers around). There was work that suffered due to the introduction of the new technology.
They summarized their findings as:
Jens Rasmussen, Safety Science, Vol. 27, No. 2/3, (1997), pp 183-217 DOI: 10.1016/S0925-7535(97)00052-0 pdf (paywalled)
In this widely cited paper, Rasmussen advocates for a cross-disciplinary, systems-based approach to thinking about how accidents occur. He argues that accidents occur because the system migrates across a dangerous boundary, and this migration occurs during the course of normal work.
This paper contains the seeds of Woods's notion of the adaptive universe, Dekker's notion of drift, and Leveson's notion of control-theoretic systems-based approach to safety.
In particular, he proposes the following risk management framework for control of safety in a socio-technical system (section 2):

He relates accidents to the notion of a system moving towards a boundary (section 6):

Jorge Aranda, PhD dissertation, Department of Computer Science University of Toronto, 2010 pdf
Aranda proposes shared understanding as a theory to explain challenges to effective coordination and communication in software engineering organizations.
His theory is outlined in Chapter 5 of the dissertation. A summary of his model can be found in figure 5.3 on page 101:
Coordination and communication consist of developing and negotiating a shared understanding of:
His model consists of four attributs of interaction that can impact shared understanding:
Understanding that is shared synchronously to the situation in which it applies is more effective than an understanding about multiple potential situations shared asynchronously, in advance.
Developing a shared understanding is most effective when it occurs in physical proximity to its situation. One implication is that co-located orgs will be more effective in shared understanding than distributed ones.
Proportionality refres to a balance between the involvement of each agent in the situation and the situation's needs; an alignment of responsibility with authority.
Proportionate coordination consists of coordination that is performed by the people who will be primarily affected by the consequences—and most knowledge about the details—of the situation they face. It emphasizes shared responsibility and team ownership of the strategies used to deal with the production of their systems.
Disproportionate coordination is performed by people unrelated to the situation under consideration. It is an imposition of a plan of action and of the goals to pursue in the situation, determined by somebody other than those involved in it or by a more fraction of those involved.
When high-level coordination is disproportionate, the goals of some members of the organization may be overlooked or dismissed. Under some circumstances this may lead to the successful completion of the software project from the point of view of those doing the coordination, but thes ame project may have been a failure from the point of view of those organization members that did not have a say in goal-setting and planning.
Participants share their understanding taking advantage of their previous patterns of behaviour.
As an organization evolves its behavior to face some particular kinds of situations, the difficult of establishing a shared understanding of those kinds of situations decreases considerably.
Hence, under many situations, the advantages of switching to a promising set of coordination and communication patterns has to be weighted against the loss in maturity entailed by engaging in a novel set of patterns.
7 commits