This is a review of the book _Patterns of Software_, by Richard P. Gabriel (Oxford Univ. Press, 1996).
I was strongly attracted to the author because of his fame in the Lisp community, and because I usually highly value ideas from the Lisp community. Reading this book is one big disappointment. In two sentence summary: the book appears to be an old crank's rambling on software issues and personal bearings. Nothing of technical value, and the insights are of dubious or trivial value.
A bit about the content:
First of all, this book does not teach the least bit of science or programing. It is rather an incoherent commentary on several aspects related to software, and the author's life stories. The whole book is written in prose style, containing 0 lines of actual code. If you thought this book is a non-technical book that one might learn something about the latest programing methodologies (as the title might suggest), you are wrong. It is more to the point if the title were "My view and life stories". (Rather a fit title given the author's fame.)
The book is written (completed) around 1995, as hinted in chapter 5. The book is divided into 5 chapters, about 235 pages:
1. Patterns of software.
Reuse versus Compression
Habitability and Piecemeal Growth
Abstraction Descant
the Quality Without a Name
Patterns Languages
the Failure of Pattern Languages
the Bead game, Rugs, and Beauty
2. Languages.
Language Size
The End of History and the Last Programming Language
Productivity: Is there a Silver Bullet?
3. What we do.
What We Do
Writing Broadside
4. Life of the critic.
A personal Narrative: Journey to Stanford
A Personal Narrative: Stanford
5. Into the ground.
Into the Ground: Lisp
Into the Ground: C++
Money Through Innovation Reconsidered
Epilogue
References
--
Here's a short summary of each chapter. Following that is a review of the book as a whole.
Chapter 1 _Patterns of software_ is the most relevant to programing of the whole book. Basically, it is a series of commentaries on issues related to programing methodologies. In particular, a non-critical criticism on object orientated technologies. It occupies about 40% of the book. 92 pages.
Although this is the largest part of the book, but I think it is also the most worthless. I did not read the book in order. I started at chapter 2 (because it seems most interesting), then 3, 4, parts of 5, then back to 1. By the time I'm reading chapter 1, my enthusiasm of the book has fallen from fanatic to almost uninterested. After reading several sections in chapter 1, I became so bored and disgusted to the point of feelings that it is a _complete_ waste of time to go further. Thus I have only scanned the last 3 sections in chapter 1 in order to write this review with a moral sense of completeness. The unintelligibleness of chapter 1 feels like reading Taoism, except one doesn't see the truism.
--
Chapter 2 _Languages_ is a 30 pages haphazard comments on some aspects of languages. Again, it is not a report of some scientific study. It is only the author's thoughts, outlooks, and predictions.
This chapter is roughly an elaboration of the "worse-is-better" philosophy explained in his earlier publication (see footnote 1 below) except that the author this time meant it literally without sarcastic undertone. I'll give an example of the chapter's theme, so readers not familiar with the term may get some idea. The author lists four elements for a language to flourish. Quote:
<begin quote>
* Languages are accepted and evolve by a social process, not a technical or technological one.
* Successful languages must have modest or minimal computer resource requirements.
* Successful languages must have simple performance model.
* Successful languages must not require users have "mathematical sophistication.
<end quote>
I'll briefly go over each. By the author's first criterion, for example, Java or Perl would be more popular than, say, Dylan or Python. The previous two are based on widely popular C or Unix tools, making them much easier to accept than the latter, even if the latter two are technically superior. By the second criterion, for example, C is good because it requires little resource, while Lisp is bad because it requires large resource (relatively). By criterion 3, it means that the mathematical model the language is based must be simple. For example, C is the simplest because it is close to assembly, while Prolog, Lisp, or Java have complex performance models. By criterion 4, for example, Lisp is very bad because it requires some mathematical sophistication (e.g. lambda functions, recursions, and so on.). C is good because it's as simple as manipulating beads on an abacus.
I think if we look at the facts, any well-read person will believe that these are good criterions on judging whether a language would be popular at present time. However, will they be the characteristics of language popularity in the future? The author believe so, and the chapter's climax predicts that C will be the last programing language.
Footnote 1: The keynote address _Lisp: Good News, Bad News, How to Win Big_ is given by the author in 1990 at the European Conference on the Practical Applications of Lisp, and reprinted in several computer journals. It is
available on-line at
http://cbl.leeds.ac.uk/nikos/tex2html/examples/good-bad-win/node9.html
--
Chapter 3 _What we Do_ are divided into two sections. The first section _what we do_ is only 4 pages. It is an account of an (careless) misunderstanding of technology by Paul Zimmer (supposedly a known figure in the press/writing community). The relation of this story to the section title is that "we" computer scientists should spend more time to explain to the public what we do. In particular, write books that popularize computer technology for the laymen, in the same sense that there are popularizing books on Fractals/math, Theories of Relativity/physics, stars/astronomy, dinasaurs/archeology, ...etc. The second section _Writing Broadside_ is also only 4 pages. Here the author, as a "broadside", encourages computer scientists to improve writing skills. In particular, he emphasized studying poetry and engaging in writing workshops.
One would expect titles like "What We Do" must contain some non-trivial directions or advice. Instead, out of the meager 8 pages, half of them is the author's peddling of his hobby (writing/poetry), and the bulk of the other half contains the account of misunderstanding technology by an apparently unsophisticated Paul Zimmer, and a trivial provocation for writing more popularizing books. This chapter failed to convince or persuade me in any way. The story of Paul Zimmer seems laughable and unrelated.
--
Chapter 4 _Life of the Critic_ is a short autobiography of author's life in academy from teens to up to about age 30. (23 pages.)
This and next chapters seems to be the most valuable of the whole book. Chapter 4 candidly tells how the author grew up in an unimportant town as a poor nobody, missed the chance of going to Havard through an incident with a lousy and nasty highschool teacher, and how he by hard work and some luck, went to MIT, UIUC, and lastly obtained a Ph.D. Stanford. The writing is touching with a pessimistic undertone, and many "hackers" in the programing industry can probably sympathize and identify with. (me, for example.)
--
Chapter 5 _Into the Ground_ is the continuation of author's biography, where he narrates the start and fall of his Lisp company Lucid Inc. in the period 1981-1994, after he obtained his Ph.D. from Stanford. (33 pages.)
Throughout chapters 4 and 5, the author gives hindsight along the narration. In particular in chapter 5, the section _Money Through Innovation Reconsidered_ (13 pages) is a detailed explanation of why worth-is-better is better. The author uses analogy of theory of evolution, and classic examples like Macintosh vs. PC, success of MicroSoft, Japanese vs. American car industry...etc. to persuade the reader that worth-is-better is not just better in practice, but also in theory. The Right Thing philosophy are categorically condemned as being unfit for survival. This is in fact the main theme of the whole book. (if there is one.)
--
General Criticism of the book:
We may divide the book into two parts. One is the author's views on software engineering issues, the other is his biography. The value of the second is intrinsic, thus it needs not be assessed. I'll focus on his views, and the overall quality of the book.
First, about his writing quality.
We learned from chapters 4 and 5 that the author has strong interest in writing since teens, and has seriously engaged in writing and poetry writing starting on 1992. (he was born on 1949) Throughout the book, the author freely makes analogies to poetry to make a point. Clearly, he is infatuated with poetry. His writing style is illogical and imprecise, yet failed to be clear. There are illogical (literary) writing styles with exemplary clarity and excellence, but I judge the book's writings to be very low quality. Sentences' grammatical structure are very complex, without being artful. Sentences are often much longer than normal. The structure of content is not easily perceived in paragraphs. In general it is difficult to read. Ideas and passages are sometimes repeated in sections or in chapters. The arguments are not convincing. One gets the feeling that the author kicked in too much flavor of poetry haplessly. The physical aspects of reading of this book has not been a pleasant experience.
With respect to the author's views on software methodologies, it appears that he has succumbed to fashionable mediocrity. Instead of pushing for austere mathematics, he talks about what pleases people. Instead of encourage people to study more math and science, he goes the other way around, saying that languages and methodologies should not be based on math but to suit average programer's intellects. It is not clear to me which goal he has in mind: (1) To enrich and improve people's lives (for both programer and user) in the general sense as a contribution to human kind. (2) To make successful (popular) software/company. If the goal is latter, then much of what he said is true, at least at present. That is, language and software should be based on the worse-is-better philosophy, which will result in speed, ease of porting, smallness, virus-modeled popularity, and will get people hooked on for perpetual improvements and mutation. Even then, I doubt that worse-is-better philosophy's survivability will remain stronger than The Right Thing in the next 10 years. If his goals is (1), then his views are muddled.
There is a saying, that Computer Science (CS) is as much science as fluid dynamics in plumbing. Today we have so much confusion in computer science is partly due to the infancy of the field, and partly due to the ease a laymen can be involved in programing. Open a college student's science textbooks, it is amazing that the most abstruse facts of nature are explained in perfect detail. Particles smaller than visible light wavelength are measured and classified, the age of universe is estimated, and abstract ideas in math so advanced that it takes years of training just to be able to imagine it. It is worth noting that each chapter represents 200 centuries of knowledge in respective fields. If we ignore the hardware parts of computer science, then it reduces to mathematics. The math for CS is only 50 years old, and the confusion is understandable. In analogy, the state of physics of ancient times is as much a science as plumbing in their time.
The author's comments are mainly about human psychology towards software. He discusses and summarize people's habits in programing, language productivity statistics, preference of syntax, small vs. large languages, pitfalls of Object Oriented Programing...etc. These issues are of superficial nature in CS. As an analogy, it is like "A Study on Cancer Patients with Pets" vs. "New Findings about Cancer". The only real progress in CS in the long run is by solving math problems. The short term solution is to educate programers. Teach them algorithms, algebra, symbolic logic, discrete math, or even scientific philosophy. Teach them to think independently and logically, so the quality of the corporate programer as a whole will be improved, and the worse-is-better tendency will decrease.
If we ask "did he do a good job on the topic as is?", and my answer would be "No". In the subject of human psychology to software technology, there are nobler approaches, in either scientific direction or observational. The author's comments read like crackpot's. This is especially disappointing given the fact that the author has significant training in research level math and is a prominent figure in CS.
Engineering depends on science. Computer science is a science. Let's not let plumbing muddle it.
"Beware the lollipop of mediocrity. Lick it once and you suck forever." (Footnote 2.)
Footnote 2: The quote is from Rich Siegel's email signature. Author of the popular text editor BBEdit.
-----------------------
(the above concludes my review of the book. What follows are some random rants on parts of chapter 1 of the book.)
He makes heavy use of analogy of building designer Christopher Alexander's criticism in architect to software engineering. This parallelism is employed fanatically, where Alexander's every principle and ideas in building design are forced to have a counterpart in software engineering. And the author goes to great effort to explain the parallelism. Scientific principles are pushed aside in favor of new-age style reasoning.
The section "Reuse versus Compression" in chapter 1 expresses the author's opinion that the quality and purpose of inheritance in OOP is better thought of as "compression" than reuse. This is really a bad choice of term because "compression" does have a technical meaning in information theory. Even ignoring that, the author's meaning attached to compression is ill-advised. He thinks compression is a better term because code reuse through inheritance is basically accomplished by a referencing scheme, so that classes and instances in lower hierarchy are defined in terms of their parents. Thus, a particular module (class) is merely a _compressed_ way of writing the module as a stand-along entity. He uses an analogy in poetry to illustrate compression, saying that poetry is an example of compression. This is inept because the analogy is logically clashing. Poetry is an expression of human qualities (emotion). The "compression" is at best an effect, not intent. There can be (or exists) poetry that are based on redundancy.
The reason of citing "compression" is never made crispy clear, but it seems to be a support of his argument that OOP's promise of reusability is at best not a complete solution, because it is actually more or less a method of "compression".
In "Habitability and Piecemeal Growth", "Habitability" roughly refers to familiarity and comfort. That is, a programing language or paradigm is habitable if it would be comfortable for any _average_ programer to understand and use. It should not require sophistication or abstraction. For example, C is habitable and Lisp is not. In C (or any worse-is-better type of language), there is a sense of directness. One can copy and paste and modify with confidence and without concerns for structure. While this is not so in an abstract or structured setting, which usually requires certain prerequisites. Thus, for example, C is very habitable and supports piecemeal growth, while Lisp is not. There is certain sense of holistic outlook here. _Average_ programer are emphasized, not elite or sophisticates. Comfort and naturalness is emphasized. Not established disciplines.
In "Abstraction Descant", he degrades abstraction through various arguments and out of context quotes. It should be emphasized that he discuss the horrors of _too much_ abstraction, not abstraction in general. "Oh, Okay. Swell! Point taken."
Reading "The Quality Without a Name", a tsunami of aversion is flowing through my veins. Here, the _Quality Without a Name_ refers to a quality without a name. This is where one picks up Zen lessons. What is the _Quality without a name_? Well, as the name implies, it's self-explanatory. Some helpful synonyms would be: <begin quote> "alive, whole, comfortable, free, exact, egoless,and eternal. I'll go through all of them to try to explain the quality without a name" <end quote> This _Quality without a name_ will be applied to programs. _Perhaps_ you get the idea.
... "Patterns Languages", "the Failure of Pattern Languages", "the Bead game, Rugs, and Beauty"... Unread.
Xah,
x...@best.com
http://www.best.com/~xah/PageTwo_dir/more.html
Mountain View, CA, USA