This book is intended for architects, designers, and developers of software on which a business depends and whose failure costs money. The tone is informal and the style is easily read. Some architects may wish for more rigor and consider it too easily read but they might still benefit because it contains quite a bit of wisdom earned by experience.
The book discusses issues of uptime, failure, and maintainability with examples drawn from the author's experience and from other industries. Making the point from more than one point of view serves to drive it home.
This is not a programming book but the illumination of a problem is often improved by a snippet of code. The code is Java and is easily read by anyone familiar with programming. Having some familiarity with multi-threaded programming in following the explanations and their examples will make them a little easier to read but is not necessary to get the point. (Even if you truly have no knowledge of Java, looking up JDBC, JVM, EJB, JSP, J2EE, log4j, and servelet will not be much effort because not much knowledge of them is required.) The examples emphasize web applications because, I suppose, that's the environment most vulnerable to huge capacity requirements, more complex environments, more numerous causes of failure, and failures that are more visible.
The author's analysis of the problem space has two dimensions --- stability and capacity --- in which a given enterprise system can be located. The analysis also has two categories: general design and operations.
Stability and Capacity
A given coordinate, on the stability axis, for example, implies the presence and absence of features that improve and diminish stability. A feature that contributes to stability is the use of timeouts and one that detracts is the presence of many interfaces to other systems. The author identifies 8 such stability patterns that contribute to stability and 11 antipatterns that detract from it. Capacity has 4 patterns and 10 antipatterns.
General design and Operations
These two categories are less structured than those of stability and capacity.
"General design" contains advice about networking (integration with local and remote servers), security (principle of least privilege and managing passwords), availability (load balancing and clustering), and administration (QA vs production environments, configuration files, anticipating failure in start-up and shut-down, and an administrative interface).
"Operations" contains advice about recovery-oriented computing (surviving failure by restarting components, et al.), transparency (allowing a view of the system's internals), and adaptation (managing change).
The idea of patterns from software development is raised from the level of programming to the level of systems. I might have called them, for example, stability patterns and anti-stability patterns but the author's meaning is clear enough.
At the end of each pattern and antipattern section is a short and effective summary that begins with "Remember this". The design chapter has a summary and the operations chapter has two section summaries. The author clearly has in mind the reader's take-home lesson and the possibility that the book may be skimmed to reread a section. The book is cross-referenced, forward and back -- if an idea of current relevance is explained elsewhere in more detail, the page number is noted. For example, if an antipattern has a countermeasure identified by a pattern, then the relationship is noted with a page number.
Implementing some suggestions may make the QA phase of testing easier by making diagnosis and (white box) testing itself easier. If you want to design your software to be more reliable and easier to maintain after the QA phase of testing, then this book is for you.