Book Review: The Psychology of Computer Programming and Introduction to General Systems Thinking

Since I really enjoyed Weinberg’s Software testing book, I decided to read a couple of his more famous works. Let’s start with the The Psychology of Computer Programming. This book is a bit dated at this point and the examples are in older computer languages, but there are some lessons that I think are timeless. I liked his concept of egoless programming in his ‘Programming as a Social Activity’ chapter. I like this chapter in particular because of the emphasis on working together to produce quality code. He give an example about a team of programmers who figured out how to work together well despite management’s efforts to try to ‘reward’ individual’s efforts in in the team. The person on the team who was selected by management to receive the award did not want it because he saw what he was doing as a group effort. The emphasis on collaboration as opposed to competition is what made this team effective. This remind’s me of one of the community agreements that was posted at a Care Conference I went to:

Alone we know little, together we know a lot

Inspired from a quote by Helen Keller “Alone we can do so little, together we can do so much.”

I very much value group/collaborative efforts and believe it’s one of the things that will keep humanity going (and produce quality software!). I wish it was more effectively taught in our schools systems. I think it’s important to move away from a scarcity mindset to one of abundance so that we can all grow and learn from each other. My experience of being in more horizontal and democratic spaces has taught me a lot about how we can achieve this. There’s much work to be done on this front but here is hoping!


 The other book, Introduction to General Systems Thinking, was a more dense read but I enjoyed it because it touched on the philosophy of science and exposed the amount of assumptions one makes which can be helpful in some contexts but in other’s lead to logical fallacies.

One of the most deeply buried metaphors of science is the concept of a “thing” or “part” that can be separated cleanly from other things or parts. The metaphor is so deep we seldom know when we are using it. The anthropologist speaks of the “social organization” of a tribe, as if it were a box of matches he could carry around in his pocket. […] Still, our ancestors gave us a rather good set of tools for dividing system from environment in physical space, tools we should not simply ignore. When, however, we begin to encounter systems without well-defined physical boundaries, the boundary metaphor lures us more easily into attractive, though false, reasoning.

Chapter 5 Boundaries and Things, Weinburg

Another logical fallacy that he points out is one about linear systems and thinking in this way when dealing with nonlinear systems. His examples range from the fertility of pigeons to the construction of airplanes, to forestry. In the pigeon example, he talks about the fate of the passenger pigeon which were plentiful but are now extinct. People thought they couldn’t die off since there were many of them, so they cut down the forests in which they lived. It turns out that the pigeons lived in social groups in the forest which allowed for their high fertility, so the destruction of the forest lead to their eventual extinction. The example about forestry was about trying to leave some trees behind when cutting down a large portion of the forest with the idea that the forest would grow back if you didn’t clear everything away. The remaining trees blew down and the forest was essentially destroyed because people failed to see that the trees needed each other to be ‘stable’.

For example, linear systems have the convenient property of “superposition.” If we put two of them together, the result is a linear system, at least if we stick to the rules of “putting together.” For example, if we have two systems:
R = f(I)
S = g(I)
both of which are linear, then we can put together
T = R + S = f(I) + g(I)
which is also linear. Or, going backwards, we can decompose a linear system into systems that retain the property of being linear.
Superposition is a handy property, as far as it goes, but it may lead the careless into fallacious arguments about nonlinear systems. For example, W. J. Cunningham,6 in an otherwise sophisticated article about what engineers mean by stability, makes the following argument:
Many large engineering problems can be broken into smaller portions. While the ultimate test of an airplane is whether it functions and flies as a whole, there are many smaller systems within the airplane which can be considered separately. … If the airplane is to operate properly as an entire system, each of the small systems must operate properly. The entire system can hardly be called stable unless the component systems are themselves stable.

But, of course, what Cunningham is doing is arguing by unconscious analogy with linear systems, and making a Decomposition Fallacy. When we admit nonlinear systems into our universe, we can easily put together stable systems out of parts that would be unstable outside of the whole. The tree in the forest was one, and the individual passenger pigeon was another. While we humans prefer to do our mating in private, passenger pigeons evidently would not mate unless they were in a tree with thousands of their fellows. Thus, the “yearly production” of passenger pigeons was not a linear function of the number of pigeons at all. Half as many pigeons did not produce half as many new pigeons, and after halving enough times, they eventually produced none at all.

I’ll leave you with a picture I found when compiling a set of self care imagery that helps keep things in perspective.

Passenger Pigeon, See more from this artist