Not on the Shelves
Version 7 / 2024
This page explains why I write reviews of books that don’t exist and has links to other versions of this list.
Sex and Drugs and Guns and Code
Inspired by Freakonomics (which was one of the most influential pieces of propaganda written in my lifetime) and by Economics for Everyone (which tackles many of the same subjects, but focuses on social justice instead of justifying and excusing the excesses of the powerful), this book is aimed at people in tech who want to understand how the world actually works. It introduces ideas and methods that are commonplace in the social sciences and shows that “the way things are” is neither inevitable nor accidental. From the reasons racial discrimination persists despite its illogical economic inefficiency to the ways “flat” organizations actually operate, it gives readers a toolbox for thinking about society and how tech is reshaping it for both better and worse.
See this post for a recent discussion of how this book might be structured.
Software Engineering: An Evidence-Based Approach
Unlike their counterparts in physics, psychology, and engineering, most students in computer science don’t do experiments. As a result, they graduate not knowing how to collect data, clean it up, model it, and draw conclusions from it. This undergraduate-level textbook corrects that: it shows readers how to design, implement, and understand empirical studies in software engineering by recapitulating results from the literature, and uses those examples as a springboard to discuss other findings. Both quantitative and qualitative methods are covered; its larger message is that opinions about software should be based on evidence rather than hearsay and strong opinions.
Testing Research Software
I know how to test an online shopping cart, but how do you test a simulation of highly-magnetized, rapidly-rotating black holes? More prosaically, how do you check that your data analysis pipeline is probably approximately correct when you don’t know what the right answer actually is, and how can those tests tell your colleagues what your heuristics for “correct” actually are?
The JavaScript and Python versions of Software Design by Example showed readers how to design programs by working through scaled-down examples. In contrast, this book presents scaled-down versions of things like fluid flow simulators and data analysis pipelines and then shows readers how to test them. Each chapter opens with a short recap of the science and a walk-through of the untested code, then explores how that code can be checked (or modified to be checkable).
Security by Example
The first chapter of this book presents a simple implementation of a wiki designed for shared note-taking. Each of the following chapters fixes one of its security shortcomings (or one of the shortcomings introduced by an earlier fix). Some are vulnerabilities such as cross-site scripting or SQL injection; others are missing features such as basic authentication (which is later replaced by OAuth), role-based access control, the kind of logging that every sys admin wishes they had, static code analysis, and eventually the audit and emergency response procedures that such tools are meant to support.
Software Design as if Everyone Mattered
Each chapter in this undergraduate-level textbook presents a “what if?” scenario and then explores its implications for software design. What if you had crippling arthritis (which you can simulate by taping popsicle sticks to your fingers): how would you redesign a cell phone app? What if you thought your government might take a sharp turn to the right and retroactively weaponize women’s health records: (how) could you satisfy doctors’ need for information with patient safety? How would you redesign a Q&A site like Stack Overflow if you thought most people in the world didn’t speak English as their first language? (Crazy, I know, but work with me here…) The practical exercises assume enough programming skill to build simple web applications; rather than design pattern esoterica or vague principles with catchy acronyms, they focus on practical implications.
Unbreaking Software
Most programmers spend a large part of their time debugging, but most books only show working code, and never discuss how to prevent, diagnose, and fix errors. Most books ostensibly about debugging are high-level handwaving, user guides for particular debugging tools, or out of date; the one notable exception is an excellent read, but focuses on automated debugging tools and techniques, which are only one part of the story. This book fills that gap by presenting dozens of case studies showing how to find and fix real-world problems. Along the way, it presents examples of what programmers can do to handle errors gracefully, from data structure repair to automatically restarting servers.
Building Tech Together
Most textbooks on software engineering leave out most of the things real software engineers do and have only a tenuous relationship to the realities of undergraduate life. In contrast, this book focuses the science of teamwork, particularly findings that are relevant to students who are doing their first co-op placement or working in teams while time-slicing commitments to several other courses. What effect does pulling an all-nighter have on the quality of your work? How do people absorb and retain knowledge? What are some good ways to run a project meeting, and how can you get people to actually pull their weight? This book presents and justifies solutions, and by doing so teaches a lot about physiology, psychology, and organizational behavior.
Managing Research Software Projects
Your graduate degree is in ecology, but now you’re running a three-person team responsible for thousands of lines of code. This book is an overview of everything you absolutely, positively need to know that isn’t software design or version control: project management, marketing, basic finance, performance reviews, career planning, intellectual property law, and community management. Each chapter presents a handful of key ideas, a checklist of things to worry about, pointers to other resources, and “what I wish I’d known” interviews with people who can tell you what not to do.
Organizing for Institutional Change in Research
This book is for people who have been managing research projects long enough to become frustrated and furious by institutional inefficiency, inertia, and hypocrisy. Drawing on more than a century of community organizing, it explains how to figure out where power actually resides, how to build support for change, how to get into a position to make those changes, and how to avoid being co-opted so that you don’t become the next person’s problem. Rather than preaching the “why”, this book focuses on the practical “how” of being the right person in the right room on the right day to make things better a little bit at a time.
Computing and the Law: A Guide for the Perplexed
The legal aspects of software have always been complicated; the web has done nothing to make them simpler. This book seeks to help programmers understand the rules (or lack thereof) they have to live with by tracing the historical development of patents, copyrights, privacy, and professional liability from the Industrial Revolution to the present day. Aimed squarely at people with no prior exposure to legal terminology, it explains concepts clearly and provides examples for each.
The Middle and the End
Literally hundreds of books are on the market today that explain how to start a tech company. Try finding one that explains how to keep one going once it has reached steady state, or how to either hand over when it’s time to move on or wind one down if it didn’t work out. These scenarios are the norm, not endless growth, and they are the focus of this book. From sustainable business models to succession planning, it covers things that venture capitalists who make their money from cashing out before the hockey stick curve flattens would rather you didn’t know.
Now What? A Practitioner’s Guide to Error Handling
Programs can fail in a hundred different ways, but most programmers either ignore the possibility of failure or deal with it by printing a log message. This book presents examples of what they could do instead, from data structure repair to automatically restarting servers. Along the way, it catalogs the kinds of errors that programmers may encounter and shows how they can be prevented as well as managed.
Concurrent Design by Example
Software Design by Example (JavaScript, Python) described small versions of single-threaded command-line tools, but most of today’s tools are concurrent and distributed. This book looks at the design of such systems, from message queues to overlapping I/O and user interfaces. Along the way it touches on some of the same ideas as Now What?, but shows how to use things like file locking and retry protocols to prevent or ameliorate faults.
Performance Tuning
In the spirit of Jon Louis Bentley’s classic Writing Efficient Programs, this book shows readers how to model, analyze, and improve the performance of their programs. Written for undergraduates who already have a basic understanding of computer architecture, compilers, operating systems, and networks, it can be used in a capstone course that unifies ideas from these subjects.
Difference Engines
Modern version control systems handle text well, but are much clumsier when it comes to images, MP3s, spreadsheets, and other so-called “binary” files. The reason is simple: those formats are supported by tools for reading and writing, but not for differencing and merging. This survey describes a collection of open source libraries (the “engines” of the title) that can handle many of those formats in a more-or-less uniform way. Readers will enjoy the combination of theory (such as proofs of some algorithms’ performance characteristics) and practice (the design and implementation of the tools themselves).
The Architecture of Open Source Applications
The first two volumes in this series came out a decade ago; the website still gets between 500 and 1500 visitors a day, and someone sends email every month or so offering to add a new entry. Maybe it’s time to say yes…