Books

The following are a list of books that I have found interesting and useful. Some of them directly relate to software engineering, others are more general interest.

Reference

Here are some reference texts that I have liked. Most of these I haven't read through cover to cover.

Fundamentals of Behavioral Statistics by Runyon, Coleman, and Pittenger. Since my background is in engineering, I don't have much training in the kind of statistics that you need for conducting experiments with human subjects (e.g. software engineering experiments). This is a pretty good book on the subject, though somewaht introductory.

Software Engineering: A Practitioner's Approach by Roger Pressman. This is a good reference book that manages to to cover all aspects of software engineering: life cycle models, requirements, design, testing, metrics, it's all here. However, the book is quite theoretical. If you're looking for ways to improve your programming, this isn't the book for you (check out Code Complete by Steve McConnell instead).

The C++ Programming Language by Bjarne Stroustrup. This is simply the best computer language reference book that I've ever read. The writing is lucid, the whole book is cross-referenced, and the index is great. I've even read sections of this book for fun. Every time I've had to use a reference book for another language, I've thought to myself, "How come this book isn't as well-organized as Stroustrup?" My one nitpick is that there isn't enough detail about the STL. Unfortunately, the STL is so large that it really requires a separate book to cover in sufficient detail.

Writing in Engineering: A Guide to Communicating by Cecilia Mavrow. When I was an undergraduate student, I had to take a course called "Effective Written Communication", and this was a textbook. It's a great reference for technical writing.

Object-Oriented Software Construction by Bertrand Meyer. This is considered a classical book on object-oriented programming. It's quite hefty, and not easy to read from cover to cover. However, there's a lot in here worth reading. The material on "design by contract" is especially interesting, and I hadn't encountered a full treatment of the topic before. Throughout the book, Meyer uses the Eiffel programming language to illustrate the OO concepts, though he doesn't tell you that his notation is based on Eiffel until the end of the book. Having learned OO from C++ and Java, I had a hard time getting my mind wrapped around the different notation.

Testing Object-Oriented Systems by Robert Binder. Affectionally referred to as "TOOS", this book is a reference for various patterns of testing object-oriented software. This book is *huge*, and I hope to finish it someday.

Refactoring by Martin Fowler. Refactoring is the act of restructuring source code without changing its behavior: you refactor the code so that it is easier to modify in the future. Fowler describes a number of different kinds of refactorings, with explicit instructions on how to apply these refactorings.

Design Patterns by Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides. Design patterns are getting a lot of attention from both practitioners and researchers these days. This is the book that started it all off. Design patterns are solutions to commonly occurring problems in software development. This book is often referred to as GoF, which stands for "Gang of Four", a reference to the four authors.

The Visual Display of Quantitative Information by Edward Tufte. I had heard many people rave about this book, and after I read it I realized that it deserved the hype. The book is a discussion on the best way to present data sets to an audience through the use of charts and graphics. It's something that's really essential to scientists and engineers, and yet we receive no real training in it, which is a shame. Tufte's book is a setp in the right direction.

The Elements of Graphing Data by William S. Cleveland. Where Tufte gives you a good high-level view about displaying info through graphics, Cleveland gets into the nuts and bolts of the issue. This work is actually more useful than Tufte's book, as it gives a lot more practical advice on how to organize your graphs to convey the right level of information.

Real world research by Colin Robson. An excellent overview of the different methods for doing social-science research in the "real world", including both fixed and flexible designs. For those who are not all that familiar with methods of social science research (controlled experiments, case studies, surveys, grounded theory), this is a wonderful place to start.

Handbook of research synthesis by Harris Cooper and Larry V. Hedges. Considered on authorative text on meta-analysis

Software development

These are books related to software development, other than the reference books listed above.

Facts and Fallacies of Software Engineering by Robert Glass. Robert Glass is one of the contrarians in the field of software engineering. The title of his regular column is "Loyal Opposition", and his opposition to the commonly held beliefs shows here. This book is a listing of "facts" about software engineering, backed up by studies, which are either unknown, forgotten, or ignored by developers, managers, and researchers. It's a quick, fun read.

Pattern Hatching by John Vlissides. John Vlissides is one of the "Gang of Four" who wrote the seminal "Design Patterns" book. Where "Design Patterns" was really a catalog of patterns, "Pattern Hatching" is about how to apply design patterns in certain situations, and it also includes some patterns that didn't make it into the original book. It's relatively short, and doesn't read like a reference book as the original did.

Agile Software Development, Principles, Patterns, and Practices by Robert Martin. "Uncle Bob" opines on the agile way to develop software. Actually, a better title for this book might be "Applied Software Patterns with Java, with some agile practices thrown in". While the beginning of the book does discuss some agile techniques such as test-driven development, much of the book is really about design patterns in Java. There's a lot of source code here, which is a refershing change from books like GoF which describe a design pattern but don't have the space to show it in the context of a real application. On the other hand, it can be tough reading through all of that source code.

Code Complete by Steve McConnell. Steve McConnell is a pretty big name in the software development community, and I always enjoy his writing. This book is a collection of good programming habits, a topic which is often neglected in higher-level software engineering books.

Professional Software Development by Steve McConnell. Another McConnell book, this one is about the software engineering profession. Here, McConnell emphasizes the importance of best practices, and how successful companies who use them do a lot better than companies that don't. He also discusses the idea of software engineering as a proper engineering discipline, and the related issues (university programs, licensing issues, etc.).

The Pragmatic Programmer by Andrew Hunt and Dave Thomas. This book is a collection of helpful hints and advice for software developers. It's a relatively short, pithy book, targeted at a similar audience to McConnell's Code Complete book.

Peopleware: Productive Projects and Teams by Tom DeMarco and Tim Lister. This is another one of those "must read" books for everyone in the software engineering business. It's a collection of essays about the human side of software development. Another title of this book could be "what companies and managers often do wrong". I suspect that this book isn't being read by the people who should really be reading it.

Death March by Ed Yourdon. This is about how to survive a software development project when management has not allocated sufficient resources (e.g. time, money, people) to complete the job. Like Peoleware, it's often oriented at the human side of things.

The Career Programmer : Guerilla Tactics for an Imperfect World by Christopher Duncan. Very much in the spirit of "Death March", this book is largely about all of the issues in the world in software development that you'd prefer not to deal with, but you ignore at your peril. As the title suggests, this isn't anywhere near an academic-style software engineering text, or even a McConnell-style best practices work. Rather this is more of a "how to deal with politics and make the best out of bad situations" (though not quite death-march bad). I especially liked the parts about how to squeeze in some extra estimation and design time into your process through some creative interactions with management.

Test-Driven Development: A Practical Guide by Dave Astels. Astels provides a good guide to test-driven development (TDD). The bulk of the book works through an example of developing a Swing-based GUI application using TDD. The book is quite Java-centric, but there's several sections at the end on unit testing tools for non-Java languages, and the general concepts should apply to any language. It was also nice to see how to apply TDD to a GUI, which is something I didn't understand before reading the book. If you're interested in trying out TDD, but you don't really know how to proceed, this is a good place to start.

Software Craftsmanship: The New Imperative by Pete McBreen. McBreen argues that the engineering metaphor in software is only appropriate for very large software projects, and offers a craftsmanship metaphor in its place. He envisions a system of apprentices, journeymen, and masters. Developers are hired based on reputation from their previous work, and they see a project all of the way through from requirements to maintenance.

The Software Development Edge by Joe Marasco. Marasco is a seasoned veteran of managing software development projects, and this is a collection of essays about issues relating to the management side of software development projects. He deals with issues such as estimation rules of thumb, the importance of iterative development, managing risk, a flow-based model of compensation, and tradeoffs.

Higher level stuff

The books listed below don't directly address software engineering, but deal with higher-level concepts that are certainly related to software engineering.

Zen and the Art of Motorcycle Maintenance by Robert Pirsig. This is one of my favourite books of all times. it's very difficult to describe what it is that this book is about. It's quite philosophical, and it touches on a number of different topics. There's a lot of discussion about "quality", which is quite relevant for those of us concerned with software development. (The main character goes insane trying to define quality, hopefully we're a little better off). I particularly like Pirsig's discussion about the process of analysis. He argues that any analytical approach will be wrong, because the world is not organized in a way that it can be decomposed into neat little boxes. On the other hand, humans can only understand the world through decomposition, so we must perform analysis, even though it will always be wrong. He argues that, because of this, we shouldn't get hung up on one particular method of decomposion. It's difficult not to draw parallels with software development here.

The Design of Everyday Things by Don Norman. This is considered an essential book on industrial design. Norman claims that designers get hung up on making devices look pretty at the expense of having them be difficult to use. He argues that they should place more emphasis on designing artifacts which communicate to the user how it is that they should be used. Important reading for people on the user interface side of software development.

Godel, Escher, Bach: An Eternal Golden Braid by Douglas Hofstadter. This is one of those books that everybody raves about, so I felt compelled to add it to my list. However, I wasn't as impressed with this book as the buzz indicates. I enjoy the subject matter very much, but this one didn't really speak to me.

The Sciences of the Artificial by Herbert Simon. This is another one of those books that gets referenced so often that I added it to my list. I have seen references to this work in the context of design, artificial intelligence, and economics. I confess that I don't see what is so impressive about it. Perhaps the ideas it introduces were revolutionary in its time but now have become so accepted that it seems obvious? One concrete contribution is the idea of "satisficing", meeting the constraints of a problem without finding the optimal solution.

To Engineer is Human: The Role of Failure in Successful Design by Henry Petroski. Petroski describes the role of failure in advancing the field of engineering. Most of the examples are from civil and mechanical engineering, but the lesson is still quite relevant for those of us working in other areas of engineering: we can learn more from our failures than our successes. It's a very entertaining read.

Secrets of Consulting by Gerald Weinberg. Don't let the title fool you, this is not your typical management-style consulting book. Gerald Weinberg is one of those ubiquitious big names in software engineering, up there with Tom DeMarco and Ed Yourdon. His book on consulting advice is a collection of "rules" and anecdotes about being a good consultant. It's highly amusing.

An Introduction to General Systems Thinking by Gerald Weinberg. Another gem from Gerald Weinberg. This one is about "systems", in a very general sense. Anybody doing science or engineering (or pretty much anything that involves some type of analysis) will find material of interest here.

The Lady Tasting Tea: How Statistics Revolutionized Science in the Twentieth Century by David Salsburg. Salsburg recounts the origins behind many of the statistical tools that are used in everyday science today. Non-statisticians may be surprised at how controversial some of these techniques are in the statistics community. The book also contains some philosophical musings on the nature of the truth that can be obtained from statistical analysis.

Out of the Crisis by W. Edwards Deming. Demings tells American management what they are doing wrong and what they can do fix it. That sounds like a lot of hubris, except that Deming is the guy credited with turning around the Japanese manufacturing industry after World War 2, so he knows what he's talking about. Demings emphasizes the importance of statistical process control, and how manufacturing problems are almost always attributable to the system, and not the workers. He speaks out against short-term objectives that end up being harmful in the long term (e.g. quotas, management by objective, increasing stock value in short term). If you are interested in "quality", this is a book to read.

What engineers know and how they know it : analytical studies from aeronautical history by Walter G. Vincenti. Through the use of case studies in aerospace engineering, Vincenti illustrates how engineering kowledge accumulates over time, often contrasting it with how scientific knowledge advances.

How to read a book by Mortimer J. Adler and Charles van Doren. Adler and van Doren describe their analytic framework to get the most out of reading books, especially difficult ones to understand.

The existential pleasures of engineering by Samuel C. Florman. Florman defends engineering as a fulfilling and worthwhile endeavour.

Expertland by Robert Sommer. A somewhat satirical look at the lifestyle of "Experts", which includes academic researchers. Written in the sixties, much of it still holds true today.

General interest

These books aren't related to software engineering at all. Most of them are about science and society.

The Demon-Haunted World by Carl Sagan. People are irrational. Science is good. This book is about the various myths that are present at different times in history, whether they be fairies or angels or UFOs, and how science can cut through the bunk.

The Lexus and the Olive Tree by Thomas Friedman. I'm a big fan of Friedman's syndicated columns from the New York Times. He seems to be the most rational voice speaking out on issues involved the Middle East, as opposed to the flaming rhetoric you tend to hear from one side or another. In this book, he explores the issue of globalization, how it affects different parts of the world, and how various people react to it. Friedman's clearly a fan of globalization, though he also points out the down sides. Whether its ultimate effects will be good or bad, Friedman makes the convincing case that globalization is inevitable, so you'd better make the most of it rather than flail helplessly against it.

Faster by James Gleick. I dislike preachy books that tell us how some aspect of our culture is making our lives worse. Luckily, this isn't one of those books. It is about how we seem to keep moving faster and faster, and get more efficient, yet seem to always not have enough time. I like it becaues Gleick doesn't make value judgements about this phenomenon, and he doesn't try to offer "solutions" to the "problem". Rather, it's a collection of observations on our rushed world. It discusses things like the "close door" button on the elevator, and how people push "88" instead of "90" on their microwave to save time. Highly entertaining.

The Unnatural Nature of Science by Lewis Wolpert. This book was required reading for a philosophy of science course at McGill that I had to drop because of a scheduling conflict, and I've often regretted not taking it (It was taught by Mario Bunge, a quite famous philosophy professor with a PhD in physics, who held engineers in higher regard than scientists!). Getting back to the book... The central premise of this book is that science does not come naturally to human beings. We did not evolve to do science, but rather to survive in a hostile environment. Our brains contain a number of assumptions that are useful for survival, but turn out not to be true. Because of this, science is hard, and it requires a change in mindset to be able to do it properly.

Voodoo Science by Robert Park. Some things are presented as science, but really aren't. These are the topic of Park's book. He deals with issues such as cold fusion, homeopathic medicine, and perpetual motion machines. I was particularly upset by the discussion of the perceived dangers of power lines, and how scare-mongering can trump empirical evidence.

The Selfish Gene by Richard Dawkins. This is one of those landmark science books written for the general public. Dawkins makes a convincing case for a gene's-eye view of evolution. He introduces concepts like evolutionary stable sets (ESS), survival machines, and memes. Since this isn't my area of research, I do not know whether or not Dawkins represents mainstream views in the biology community.

Darwin's Dangerous Idea by Daniel Dennett. Dennett is an unapologetic neo-Darwinist, in the same camp as Richard Dawkins and Steven Pinker. In this book, he discusses the philosophical implications of evolution by natural selection. Interesting topics of discussion include skyhooks, adaptationism, and mimetics.

Guns, Germs, and Steel by Jared Diamond. Why was it the Europeans who colonized North America, rather than the other way around? In this book, Diamond argues that geography, and indiginous plants and animals played a key role in why certain civilizations advanced much quicker than others.

The Blank Slate by Steven Pinker. I'm a big fan of Steven Pinker. He's a highly entertaining psychology researcher who delights in slaying sacred cows. In this book, Pinker argues that "society" is not to blame for nearly as much as we think it does. He uses a wealth of psychological studies to make his case.

Race and Culture: A World View by Thomas Sowell. Where Pinker argues that society is not wholly to blame for the behaviour of the individual, Sowell argues that society is not wholly to blame for the behavior of groups. His argument is that behavior of the individuals within a culture is not shaped by the external environment, but remains relatively unchanged even if the individuals migrate (or are transplanted) somewhere else. For example, he argues that Jews were textile merchants simply because they were forced into that niche in certain countries, because they were pretty much textile merchants wherever they went. Like Pinker, he has plenty of data to back up his thesis. He also covers other topics such as I.Q. tests and slavery. Well-documented without being dull.

Bowling Alone by Robert D. Putnam. Another book in the "seminal" category, Putnam argues that community in the U.S. hsa been on a steady decline for the past several decades. As I mentioned earlier, I dislike preachy books that tell us how the world is ending because of some aspect of our society that the author dislikes. However, Putnam's book is not like that all. Putnam throws an avalanche of data at us to defend his thesis that we're "bowling alone" (rather than in bowling leagues) more often. He then lists a number of arguments that others have proposed to explain the decline, and tries to evaluate how much each of these factors contributes. I'm a big fan of using empirical data to support your argument, but even I think that Putnam went a little overboard with all of the data he presents. Still, if you can slog through it all, there are some very interesting ideas here. Putnam's concept of "social capital" is especially interesting, and having moved from a tight-knit community to one where I knew almost nobody, I can definitely appreciate the idea.

Fast Food Nation by Eric Schlosser. There's a lot about the fast food industry that you'd prefer not to know, but you probably should. Schlosser looks at all different aspects, from the slaughterhouses to the potato farms to the labs in New Jersey where they make the artificial flavours. It's a very entertaining read.

No Logo by Naomi Klein. "No Logo" is an analysis of the phenomenon of corporate "branding". It seems to have been adopted as some sort of anti-globalization manifesto, but that shouldn't stop you from reading it.

The Innovator's Dilemma by Clayton Christensen. I don't often read business books, but this was quite a good one. Companies can follow all of the "right" business practices, doing all of the things that made them successful, and stil fail. It's all because of what Christensen calls "disruptive technologies."

Soul of a New Machine by Tracy Kidder. Once upon a time there was a company called "Data General" that built what were then called "minicomputers". Kidder followed around some of the engineers as they were building a new minicomputer in the 1970s. You wouldn't think that would make for an exciting book, but you'd be wrong. Tracy manages to capture the excitement and frustration of building one of these digital monsters.

The Structure of Scientific Revolutions by Thomas Kuhn. Another book in the "seminal" category, you can thank Kuhn for introducing the term "paradigm shift" into popular culture. Kuhn presents his theory as to how science progresses over time. I don't necessarily agree with Kuhn's theory, but I think it's worth reading.

Hackers by Steven Levy. This is a great read about the origins of the personal computer industry. It starts with MIT students playing around with some very large (and expensive!) machines, and ends with the computer game programmers of the early 80's.

Real Boys by William Pollack. Pollack tries to capture the difficulties inherent in growing up as a boy in Western society. I think he does a pretty good job.

Semites and Anti-semites by Bernard Lewis. A scholarly work on the history of anti-Semitism, especially how it evolved from a predominantly European/Christian phenomenon to a predominantly Middle-Eastern/Muslim phenomenon.

Why Things Bite Back by Edward Tenner. This is a wonderful book about the unintended effects of technology. Tenner focuses specifically on "revenge effects", when the actual effects of a technology are the opposite of the intended effects. Tenner is no Luddite. He doesn't argue that technology is bad, only that its effects are often unforseeable.

Mind Over Machine by Hubert Dreyfus and Stuart Dreyfus. People aren't rational, and that's a good thing. This book is a criticism of artificial intelligence, specifically rule-based expert systems. Dreyfus and Dreyfus argues that experts do not reason rationally. Rather, they work largely by intuition and pattern-matching the current problem to similar problems that have been previously encountered.

Influence: Science and Practice by Robert Cialdini. Human beings use a number of heuristics to simplify our decision-making processes. Unfortunately, these heuristics can be exploited by other people for personal gain. Cialdini describes how people can be influenced to do things contrary to their own best interests by describing a series of psychology experiments that have been conducted by him as well as other psychologists. He also offers some strategies for defence against unwanted influence.

Beyond Fear by Bruce Schneier. Perfect security isn't possible, and we have to be understand the costs and benefits of our security measures before we adopt them. Schneier presents a commonsense approach towards security measures in a time when North Americans are a little more concerned about security than they used to be. We should be addressing the real risks rather than the perceived ones, and making sure that the security procedures we adopt actually make us safer.

Skunk Works by Ben Rich. Rich gives us a look into the world of developing the most advanced reconnaisance aircraft on the planet. These are the folks who built the U2 spyplane, the SR-71 Blackbird, and the F117-A Stealth Fighter. This book reminded me why I love engineering, and what wonderful things that can happen when you throw together a bunch of smart people and have them work towards a project they all believe in.

The Future of Freedom: Illiberal Democracy at Home and Abroad by Fareed Zakaria. The solutions to the problems of democracy is not necessarily more democracy. Zakaria argues that democracy and liberty do not always go hand-in-hand.

Amusing Ourselves to Death: Public Discource in the Age of Show Business by Neil Postman. Postman's thesis is that TV is making us dumber. In particular, he believes that it is the inherent nature of television to convey everything as entertainment. This works fine when TV is trying to entertain (e.g. sitcoms), but when TV tries to inform (e.g. news), then it fails. The news becomes a set of disjoint, context-free soundbites that don't provide us with any deep insight into what's going on, and have no effect whatsoever on our lives.

Why Men Rule by Steven Goldberg. Goldberg makes the observation that every human society ever observed has been a patriarchy (majority of positions of status and authority held by males) and argues that this must be due to physiological differences between men and women. In particular, he argues that men are generally more driven to achieve positions of higher status, and this drive is a necessary condition for the attainment of those positions. He ruffled some feathers in the sociological community where many believe that all differences between the sexes in society are due to socialization and not innate biological differences.

The Wisdom of Crowds by James Suroweicki. Suroweicki argues that all of us can be smarter than any of us. Under the proper conditions of independence and aggregation, groups of people are capable of estimating and predicting things more accurately than the best individuals of the group. He also explains why we always seem to be standing in the longest line at the grocery store.

Critical Mass by Philip Ball. Ball illustrates how the social sciences can benefit from mathematical tools used by physicists. He shows that very complex behaviour of human interaction can be simulated using some very simple principles, from free markets and corporations to traffic flows and urban growth to statecraft.

Free Culture by Lawrence Lessig. Law professor Lawrence Lessig expounds upon the problems of the current copyright system and its never-ending extensions.

The Language Police by Diane Ravitch. Ravitch exposes how public school textbooks are censored by the left and the right.

The Culture of Fear : Why Americans are Afraid of the Wrong Things by Barry Glassner. Glassner illustrates how the media tends to wildly overstate the risks of the trendy topic of the day. I would quibble with him over why it is the media does this, but he shows quite clearly that they too often mislead Americans, sometimes with serious consequences.

The world's Banker:: a Story of Failed states, Financial crises, and the Wealth and Poverty of Nations by Sebastian Mallaby. Mallaby's biography of James Wolfensohn, the current president of the World Bank. Fascinating stuff if you're unfamiliar with what the World Bank is and the challenges it faces.

American College and University: A History by Frederick Rudolph. Rudolph chronicles the history of the American college and university system, from the founding of Harvard until the first half of the twentieth century. I've long found the American university system fascinating (there are so many schools here!), and after reading Rudolph, I understand where they all came from. Also fascinating is the tension between the idea of "college" (modelled after the English system) and that of "university" (modelled after the German system).

Flow: the Psychology of Optimal Experience by Mihaly Csikszentmihalyi. Ever felt "in the zone" when were working on a challenging task? Csikszentmihalyi calls this experience "flow", and has done fascinating research on the universality of this human experience and on the conditions required to bring this state of experience about.