Some of the most influential ideas in software development have come not from books, but from essays. These essays are classic reads that have shaped the way developers think about the field; they are excellent complements to the laws of software development.

Each essay below includes a short description indicating what it is about.

Being Glue

by Tanya Reilly, 2019

Reilly describes the essential, less glamorous - and often less-promotable - work of holding a team together: onboarding, unblocking others, reviewing designs, and noticing what gets dropped. Done deliberately, this glue work builds technical leadership skills; done unconsciously, it can be career limiting, pushing capable engineers into less technical roles or even out of the industry.

Choose Boring Technology

by Dan McKinley, 2015

McKinley argues that every new technology comes with an innovation cost, and that a team’s budget for new ideas is limited. By choosing boring, well-understood technology for most problems, teams keep that budget for the few places where a novel tool provides a decisive advantage.

What Every Computer Scientist Should Know About Floating-Point Arithmetic

by David Goldberg, 1991

A foundational tutorial on floating-point arithmetic that explains how numbers are actually represented on computers, why seemingly straightforward computations can produce surprising results, and how careful rounding and summation techniques can mitigate the errors. It remains the standard reference for understanding floating-point behavior in nearly every programming language.

Go To Statement Considered Harmful

by Edsger W. Dijkstra, 1968

Dijkstra argues that the goto statement is a major source of errors in programs, because it abandons the one-to-one correspondence between the dynamic progress of a program and the static structure of the text in which it is expressed. He contends that the quality of a program is inversely proportional to the number of gotos it uses, and advocates for higher-level control structures that make the flow of control explicit and verifiable.

The title of the essay itself is influential, and in recent years others have picked up on the formula and used “XYZ considered harmful” as an attention-grabbing title. Perhaps the crowning example of such essays is Eric Meyer’s “Considered Harmful” Essays Considered Harmful.

No Silver Bullet

by Fred Brooks, 1986

Brooks argues that no single breakthrough will ever yield an order-of-magnitude improvement in software productivity, reliability, or simplicity. He distinguishes essential complexity, inherent in the problem itself, from accidental complexity, introduced by the tools and methods used to solve it, and argues that progress must come from attacking the essential complexity step by step rather than from any one silver bullet.

A Note on Distributed Computing

by Jim Waldo, Geoff Wyant, Ann Wollrath, Sam Kendall, 1994

This position paper argues that distributed computing differs from local computing in kind, not just in degree. Latency, memory access, concurrency, partial failure, and access are fundamentally different in a distributed system, so modeling remote interactions as ordinary procedure calls hides exactly the problems that most often bite. The authors recommend designing distributed systems explicitly around those differences instead of pretending they do not exist.

Out of the Tar Pit

by Ben Moseley and Peter Marks, 2006

Moseley and Marks argue that complexity - rather than correctness, performance, or any other factor - is the single greatest difficulty in building software, and that most of it is accidental. They trace much of that accidental complexity to the management of state and control, and advocate functional programming together with a relational approach to state to reduce software to its essential complexity.

The Twelve-Factor App

by Adam Wiggins, 2011

A methodology for building software-as-a-service applications that aims to minimize the time it takes to onboard new developers, maximize portability between execution environments, and enable continuous deployment. The twelve factors - from a single codebase and explicit dependency declaration, through configuration via environment variables, stateless processes, and use of logs as event streams - capture modern best practices for building applications that are declarative, portable, and easy to scale.