GOTO Conferences
AI-assisted summary of Old Is the New New • Kevlin Henney • GOTO 2018 — original source. Check the original for full context.
Source published:
Key ideas
- Software development suffers from historical amnesia, regularly rebranding foundational concepts from the 1960s and 1970s—such as lambdas, garbage collection, and iterative design—as brand-new modern paradigms. (0:15)
- The 1968 NATO Software Engineering Conference established that upfront software specification is inherently problematic and that design must be iterative, contradicting the common belief that waterfall was the early universal standard. (13:51)
- Physical computing constraints dictate that local in-memory operations outperform network calls, demonstrated by command-line Unix tools processing a 2 GB dataset 200 times faster than a distributed Hadoop cluster. (18:59)
- Jack Reeves and the 1968 NATO conference demonstrated that coding is an iterative design activity rather than manufacturing, because software replication and compilation incur negligible physical costs. (36:47)
Detailed notes
## Background Presented by Kevlin Henney and published by GOTO Conferences on YouTube on May 15, 2018, this keynote was recorded live at GOTO Chicago 2018. The presentation explores the paradox of modern software engineering: while frameworks, platforms, and industry trends churn constantly on the surface, a steady, decades-old current of foundational computing concepts remains largely unchanged underneath.
## TL;DR In this keynote, Kevlin Henney examines the software industry's chronic collective amnesia and its habit of repackaging vintage computing ideas as brand-new innovations. Tracing modern architectural paradigms, test-driven development, garbage collection, and functional programming back to milestones from the 1930s through the 1970s—including Algol 68, the 1968 NATO conference, and Unix pipes—Henney illustrates how modern teams repeatedly solve problems that were already mastered decades ago. He critiques industry tendencies toward over-engineering, unnecessary distributed systems, and excessive multithreaded synchronization, advocating instead for the virtues of small, simple implementations and clear boundaries. Ultimately, he encourages developers to study computer science history so they can stop reinventing the past and focus their energy on genuinely unique challenges.
## Atmosphere & style The talk is witty, erudite, and delightfully irreverent, blending dry British humor with profound historical scholarship. Henney commands the stage with an engaging, storytelling delivery, effortlessly pivoting from cheeky Shakespearean analogies to vintage 1970s textbooks and sharp technical critiques. Watching the session feels like an entertaining, deeply grounding wake-up call that dismantles contemporary industry hype and dogmatism with patient, undeniable historical receipts.
## Bulletin - [00:15](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=15s) Software development suffers from historical amnesia, regularly rebranding foundational concepts from the 1960s and 1970s—such as lambdas, garbage collection, and iterative design—as brand-new modern paradigms. - [13:51](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=831s) The 1968 NATO Software Engineering Conference established that upfront software specification is inherently problematic and that design must be iterative, contradicting the common belief that waterfall was the early universal standard. - [18:59](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1139s) Physical computing constraints dictate that local in-memory operations outperform network calls, demonstrated by command-line Unix tools processing a 2 GB dataset 200 times faster than a distributed Hadoop cluster. - [36:47](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2207s) Jack Reeves and the 1968 NATO conference demonstrated that coding is an iterative design activity rather than manufacturing, because software replication and compilation incur negligible physical costs.
## Key takeaways - [00:15](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=15s) Underneath constant framework and tooling churn, core computing principles remain remarkably stable across decades. - [03:28](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=208s) Garbage collection, closures, and expression-oriented syntax were already functional realities in Lisp, Algol 68, and Simula 67. - [05:56](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=356s) Richard P. Gabriel's 'Worse Is Better' concept advocates for minimal scope, extreme implementation simplicity, and speed rather than expansive, bloated feature sets. - [11:05](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=665s) Ward Cunningham proved the viability of the World Wide Web's editable wiki model using just 150 lines of Perl, emphasizing the architectural value of disposable, simple code. - [13:51](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=831s) Margaret Hamilton coined 'software engineering' during the Apollo project to assert parity with hardware engineering, while pioneers at the 1968 NATO conference explicitly rejected rigid upfront specifications. - [17:07](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1027s) Avoiding unnecessary I/O and retaining state in memory yields massive performance gains because hardware latency is bound by the speed of light. - [18:59](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1139s) Distributed systems add substantial physical latency and operational complexity, making local compute preferable whenever data fits into local RAM. - [21:12](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1272s) Human cognitive bandwidth remains the ultimate bottleneck of software development, favoring small, constrained architectures over monolithic systems. - [31:38](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1898s) Test-first development and BDD structures like Given-When-Then derive directly from 1970s practices on AWK and Tony Hoare's 1969 axiomatic logic. - [33:54](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2034s) Ward Cunningham defined technical debt as an intentional short-term borrowing strategy to speed development, which turns catastrophic only when refactoring interest is left unpaid. - [36:47](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2207s) David Parnas established in 1972 that modularity should encapsulate volatility, difficult design choices, and team disagreements rather than merely reflecting real-world nouns. - [40:34](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2434s) Alan Kay's original vision of object-oriented programming centered on dynamic message-passing and isolated state rather than rigid type inheritance hierarchies. - [41:45](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2505s) Concurrency models based on processes and message passing avoid the severe performance penalties and design pitfalls inherent in shared-memory synchronization locks. - [43:45](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2625s) Lambda calculus traces back to Alonzo Church in the 1930s, proving that modern language additions like closures are decades-old functional primitives. - [46:38](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2798s) Doug McIlroy conceived Unix pipes in 1964 as a modular coordination model, separating discrete computation units from the mechanism used to connect them.
## Detailed walkthrough ### [00:15](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=15s) The Illusion of Constant Change and Software’s Weak Sense of History
Kevlin Henney opens his talk by noting with relief that there will be no fail screens in the presentation, just for the sake of variety. He introduces the core premise of his talk, "Old Is the New New," addressing anyone who has been in the industry long enough to step back and look at broad trends: underneath the appearance of frantic and constant change, there is actually a quiet, steady continuity where very little genuinely changes over the decades. Henney observes that while keeping up with every modern technology is practically impossible, one can easily maintain an informed grasp of emerging tools by simply asking what a new tool resembles, what its few distinct differences are, and what actually requires focused attention. When older developers point out these historical roots, younger engineers are often stunned, prompting the veteran response that a supposedly breakthrough idea was actually established back in 1972 or 1974.
To frame this recurring amnesia, Henney cites a classic quotation from André Gide: “Everything has been said before, but since nobody listens we must always begin again.” Software development suffers from an exceptionally weak sense of history. Because developers do not preserve a cultural memory of past engineering solutions, the profession lives in a perpetual state of shock, constantly rediscovering and reinventing the wheel—with the faint hope that it might eventually be made round.
[02:08](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=128s) Shakespearean Origins: Memory Management in Hamlet
Delving playfully into history, Henney jokes about Shakespeare Day and claims William Shakespeare was among the earliest programmers. Since the Elizabethan era suffered from an unfortunate lack of computing hardware, Shakespeare was forced to execute his scripts using the "actor model." Beneath the dramatic surface, Henney quips, his plays were disguised architectural commentaries on technical problems that modern engineers still wrestle with every day.
Henney points to *The Tragedy of Hamlet, Prince of Denmark* as a play fundamentally concerned with memory management. When Ophelia declares, "’Tis in my memory lock'd, And you yourself shall keep the key of it," she is clearly debating the hazards of manual memory management. Conversely, Hamlet advocates for automatic garbage collection when he vows, "Yea, from the table of my memory I'll wipe away all trivial fond records." Henney dryly notes that records themselves are hardly a modern novelty, noting database migration metaphors are strewn throughout Shakespeare's lines.
[03:28](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=208s) The Forgotten Giants: Lisp, Algol 68, and Simula 67
Addressing the widespread belief that garbage collection is a recent innovation, Henney traces its lineage back decades. While Lisp was conceptualized on paper in the late 1950s, its first running implementation appeared in 1960, complete with automated garbage collection. Henney emphasizes that he only counts implementations that actually run code, as ideas on paper do not execute. Although many dismiss early Lisp as an isolated functional programming niche, garbage collection was also implemented in Algol 68 and Simula 67—languages whose release years are explicitly built into their names.
Henney highlights his personal copies of the *Lisp Programmer's Manual* and the *Algol 68* manual, describing Algol 68 as perhaps the most influential programming language that almost nobody has heard of or used. Though condemned in its day as too massive and ambitious to implement, it is vastly smaller than the languages developers use today. Far from being a rigid, primitive procedural tool, Algol 68 introduced fundamentals that contemporary programmers take for granted:
- It pioneered type abbreviations, truncating `integer` down to `int`, and establishing `char`, `long`, `short`, `struct`, and `union`. - It featured expression-oriented syntax rather than statement-oriented syntax, ensuring that control structures yielded values and eliminating the need for duplicate conditional constructs. - It introduced the `if`... `fi` block-closing syntax. - It allowed first-class, anonymous procedures to be passed around while capturing variables from their enclosing scope via closures—which modern developers celebrate as lambda expressions.
Henney laments that something went wrong in the 1970s that stripped these expressive features from mainstream procedural paradigms, forcing subsequent generations to painstakingly reinvent them decades later.
[05:56](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=356s) Patterns, Manifestos, and the Virtues of "Worse Is Better"
Henney turns to design patterns, noting that developers hear the word "pattern" and immediately fixate on the Singleton. In his view, there are only two acceptable singletons: the one that generates revenue for consultants who are called in to fix singleton-induced design problems, and single-malt whisky. He jokes that when a developer takes a dram of fine Scotch and feels the fire coat their mouth, they reach a moment of cosmic clarity and decide not to put an enormous global variable into their architecture, improving the codebase purely through inaction. In practice, Henney observes that systems invariably contain either zero singletons or two or more; having exactly one in a project is uncanny.
Reflecting on the industry's obsession with manifestos, Henney recalls running an internal software workshop to uncover a company's "vernacular architecture"—the undocumented, everyday practices and unspoken team norms. Frustrated by superficial trendiness, he wrote a "Patterns Manifesto" on the whiteboard:
> “We are uncovering better ways of developing software by seeing how others have already done it.”
Quoting Brian Foote, Henney asserts that “patterns are an aggressive disregard of originality.” True engineering progress relies on accepting that most problems have already been solved, allowing teams to focus their creative energy on the tiny sliver of a problem that is genuinely unique.
Henney connects this philosophy to Richard P. Gabriel's 1996 essay collection *Patterns of Software* and his 1990 concept of "Worse Is Better." Acknowledging that naming remains one of computing’s hardest problems, Henney calls "Worse Is Better" an ironically terrible name because people confuse it with the sloppy "good enough software" philosophy. In reality, Gabriel argued that software succeeds when built with minimal invention and minimal scope. Gabriel's counterintuitive definition of "worse" meant delivering a rock-solid, small, blazingly fast system with an intentionally minimal feature set, rather than an expansive, bloated, bug-ridden product that attempts to satisfy an expert's exhaustive list of requirements. Originating in 1990, this concept anticipated Rapid Application Development (RAD) and agile development by championing simplicity above all else.
[11:05](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=665s) Worse Is Better: Ward Cunningham's Wiki and Incremental Design
Continuing the analysis of Richard P. Gabriel's "Worse Is Better" philosophy, Kevlin Henney highlights the virtue of keeping implementations dead simple. The interface only needs to be sufficient and adequate—it does not need to be awesome—because an implementation that is truly simple gains an essential architectural property: it can be discarded, replaced, changed, and understood. Completeness should be sacrificed freely: the design needs to cover only strictly necessary situations. Henney offers Ward Cunningham's original wiki as the quintessential example. Cunningham brought an editable web to life with a Perl script of just 150 lines. While Perl itself may look like an indecipherable ancient script to modern eyes, a 150-line program was compact enough that anyone could easily comprehend it, throw it away, rewrite it, or extend it.
Henney contrasts this radical simplicity with corporate software habits. Had a typical enterprise team been tasked with creating an editable web from scratch, they would have spent 18 months in meetings and architecture reviews, producing an over-engineered behemoth that dwarfs any Java project imaginable, rather than shipping 150 lines of script. Cunningham's tiny seed was good enough to prove the concept, eventually giving birth to platforms like MediaWiki and the entire infrastructure powering Wikipedia. The same pragmatism applies to correctness and consistency: the software must be correct in all observable behaviors, but consistency is maintained by always choosing the smallest possible scope first. This deliberate focus on the smallest scope reveals that the design process is inherently incremental: developers build something tiny, revisit it, add to it, and discard what fails.
- Ward Cunningham's original wiki implementation on `c2.com` was approximately 150 lines of Perl. - Simple implementations provide leverage because they can be completely discarded or rewritten at minimal cost. - Choosing the smallest scope first transforms design into an incremental, inspectable process rather than a monolithic specification.
[13:51](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=831s) 1968: The Myth of Waterfall and the Real Origins of Software Engineering
The revelation that software design is inherently iterative is often treated as a modern discovery, but Henney demonstrates that the industry has known this for half a century. At the landmark 1968 NATO Software Engineering Conference in Garmisch, Andy Kinslow explicitly recorded the observation: "The design process is an iterative one." Celebrating the 50th anniversary of that conference, Henney asks the audience how well that "new idea" has been working out for everyone over the past five decades. He also debunks common historical misconceptions surrounding that era. The term "software engineering" was not invented at Garmisch; it was coined in the early to mid-1960s by Margaret Hamilton during her pioneering work on the Apollo flight systems. Hamilton championed fault tolerance to ensure lunar missions would survive inflight computer overloads, and she used the phrase specifically to elevate software development to equal standing with hardware and systems engineering.
```mermaid flowchart TD accTitle: Evolution of Engineering Ideas from the 1960s accDescr: Diagram tracing Margaret Hamilton's Apollo work, the 1968 NATO conference findings, and Engelbart's demo to modern paradigms.
subgraph Origins["1960s Foundations"] MH["Margaret Hamilton (Apollo Systems)<br/>Coins 'Software Engineering', fault tolerance"] NATO["1968 NATO Conference (Garmisch)<br/>Kinslow: Design is iterative<br/>Ross: Specifying upfront is deadly"] Demo["Douglas Engelbart (1968 Demo)<br/>Mouse, dynamic linking, video conferencing"] end
subgraph ModernPathways["Long-Term Impact"] Agile["Iterative & Incremental Methods<br/>(Rejection of pure waterfall)"] Systems["Modern Interactive Systems<br/>(Smalltalk, modular runtime linking)"] end
MH --> Systems NATO --> Agile Demo --> Systems ```
Similarly, the pervasive belief that early software pioneers universally advocated rigid, plan-driven development is refuted by their own recorded words. At the 1968 conference, Douglas Ross made a scathing critique of upfront specification that echoes contemporary agile critiques:
> “The most deadly thing in software is the concept which almost universally seems to be followed that you are going to specify what you are going to do and then do it and that is where most of our troubles come from.” — Douglas Ross
Henney emphasizes that the industry understood the flaws of upfront specification well before Winston Royce published his 1970 paper (which is itself frequently misattributed as the origin of the rigid waterfall method). The year 1968 was a watershed moment across computing; at the Fall Joint Computer Conference that same year, Douglas Engelbart delivered "The Mother of All Demos." Engelbart unveiled radical breakthroughs that would shape personal computing—including the computer mouse, dynamic runtime linking for modularity, and video conferencing—demonstrating them before an audience that included future innovators like Alan Kay.
- Margaret Hamilton coined the term "software engineering" while developing flight software for the Apollo space program. - Douglas Ross identified rigid upfront specification as the primary source of software trouble at the 1968 NATO conference. - Winston Royce's 1970 paper is routinely misread as an endorsement of waterfall, ignoring the fact that iterative realities were already widely acknowledged. - Douglas Engelbart's 1968 demo introduced dynamic linking, modular architectures, video conferencing, and the mouse.
[17:07](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1027s) Performance, Hardware Physics, and the Cost of Unnecessary I/O
Returning to Gabriel's 1990 characteristics, Henney addresses the mandate that the implementation must be fast. Performance is frequently sidelined as an afterthought or misunderstood by developers who defer it until the end of a project—a fatal flaw when working iteratively, where there is no literal "end." Henney points out that speed directly enhances usability: if a system executes so rapidly that latency is imperceptible to the user, the entire debate over the style, color, or shape of a loading cursor vanishes completely. Quoting a favorite engineering maxim from the mid-1990s, he notes:
> “Remember there is no code faster than no code until somebody invents a tachyon pipeline in the processor and this will remain true...” — Kevlin Henney
The companion rule, dating back to the 1980s, is that "the fastest I/O is no I/O." Henney recounts consulting for a team that had struggled for two years to squeeze a meager 10% performance gain out of their system. By questioning why data was continually round-tripped to disk and storage rather than kept in memory, Henney helped them eliminate unnecessary I/O operations entirely, resulting in an immediate threefold (300%) performance speedup.
| Engineering Principle | Historical Origin | Practical Application | |:--- |:--- |:--- | | **No code is faster than no code** | Mid-1990s | Delete redundant features; eliminate unnecessary abstractions to minimize cycle cost. | | **The fastest I/O is no I/O** | 1980s | Retain working state in local memory rather than serializing to disk or remote storage. | | **Speed equals usability** | Human Interface Design | Eliminating latency bypasses UX debates regarding progress spinners and wait cursors. | | **Respect the speed of light** | Physics of Computing | Local memory access runs in light-nanoseconds; offloading over networks incurs severe physical penalties. |
[18:59](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1139s) The Fallacy of Distributed Big Data and Dijkstra’s Metric for Code
Henney critiques the modern knee-jerk instinct to push computations and storage out onto remote networks under the guise of "big data." Citing Adam Drake's 2014 article titled *"Command-line tools can be over 200 times faster than your Hadoop cluster,"* he notes that what is labeled "big" is simply a moving target that historically meant "anything that doesn't fit in memory." Drake tackled a 2-gigabyte dataset using basic Unix command-line utilities and outperformed an entire distributed Hadoop cluster by two orders of magnitude. Two gigabytes was an astronomical amount of RAM at the end of the 1990s, but today's commodity laptops can easily manipulate that volume in memory while still leaving ample overhead to browse cat pictures.
```mermaid flowchart LR accTitle: Comparison of Execution Latency Over Distances accDescr: Physical scale diagram comparing on-chip bus speeds measured in nanoseconds to cross-network communication penalties.
subgraph LocalMachine["Local Compute (Nanoseconds)"] Laptop["Laptop Chassis<br/>~1 Light-Nanosecond (~1 GHz)"] Monitor["Display Width<br/>~3 Light-Nanoseconds"] end
subgraph RemoteNetwork["Distributed Systems (Milliseconds)"] Cloud["Remote Cluster / Planet<br/>Physical speed-of-light propagation"] end
LocalMachine -.->|"Massive Latency Penalty"| RemoteNetwork ```
Developers routinely assume that distributing a problem across an external network is inherently modern and scalable, but Henney cautions that distributed systems should be avoided whenever possible:
> “If anybody ever gives you the option to not put something out on the network, take it.” — Kevlin Henney
The constraint governing distributed architectures is an unyielding law of physics: the speed of light. Light travels roughly one foot per nanosecond; an average laptop chassis measures approximately one light-nanosecond across (corresponding roughly to a 1 GHz clock cycle), and a monitor spans around three light-nanoseconds. Routing requests across a data center or to the opposite side of the globe imposes immutable physical delays that no configuration file or cloud framework can bypass. Unless distribution is strictly mandated by scale, resilience, or compliance, keeping code and data local yields vastly superior speed and operational simplicity. Henney then transitions to Gabriel's final implementation metric—that the software must be small—introducing Edsger Dijkstra's provocative perspective on how to properly measure code volume.
- Adam Drake demonstrated that simple Unix CLI tools processed a 2 GB dataset 200 times faster than a Hadoop cluster. - "Big data" is relative; hardware evolution constantly shifts the boundary of what fits entirely within local RAM. - Physical distance imposes real clock-cycle costs: one light-nanosecond is roughly equivalent to a 1 GHz CPU cycle. - Edsger W. Dijkstra advocated viewing lines of code not as assets produced, but as liabilities incurred.
### [21:12](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1272s) The Cognitive Limits of Software Development Henney argues that the fundamental challenge of software development remains constant: cognitive bandwidth. He notes that while the industry feels like it is moving at breakneck speed, the core bottleneck—whether a human can grasp, understand, and effectively work with a system—has not changed since the 1970s. He asserts that when a system exceeds these cognitive bounds, the ability to work with it drops off dramatically. Henney suggests that this is a persistent reality, joking that he would need a return invitation to explain why this might theoretically change, but for now, it remains the defining constraint of the profession.
### [22:03](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1323s) Small Systems, Big Impact: The Lions' Commentary To illustrate the power of small, well-understood systems, Henney recounts the story of John Lions from the University of New South Wales. In the mid-1970s, due to antitrust restrictions that prevented AT&T from sharing Unix, Lions created an annotated commentary on the kernel for his students. The notes were spread via *samizdat* (clandestine photocopying) before eventually being published. Henney highlights that the entire Unix kernel in that book was only 9,500 lines of code. He contrasts this with modern enterprise systems, often describing them as having "a big honking great class" in the middle that functions like a black hole with its own gravitational field, questioning whether such massive complexity is truly necessary for simple data processing tasks.
### [23:57](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1437s) Constraints as a Creative Catalyst Henney posits that creativity is not served by a lack of boundaries, but rather by the presence of them. He uses the analogy of an artist: if you give an artist no parameters, you frustrate them. If you provide constraints—such as a specific size, a dominant color like blue, or a specific subject—the artist can produce something exceptional. He cites the late Dennis Ritchie and Ken Thompson, who noted in a 1970 paper that "the size constraint has encouraged not only economy but a certain elegance of design." Henney warns that without these boundaries, developers inevitably end up with "legacy" systems that feel like monolithic monuments—massive, difficult to understand, yet functioning simply because they are there.
### [26:36](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1596s) Aesthetic Composition and Component Philosophy Contrasting the "monolith" of a single huge stone (like Stonehenge or a monolithic software architecture) with the aesthetic of small, elegantly composed stones, Henney touches on the Unix philosophy of "programs that do one thing and do it well." He observes that while many people today equate this with the "Single Responsibility Principle" or "Microservices," these are not new concepts. He quotes a 1968 paper to show that the industry has been debating the need for small, independently testable, and modular subsystems for decades. He notes, “The difference between services and microservices is the word 'micro'.” He argues that while the scale may shrink from "milli" to "centi" to "micro," the essential challenge—getting those programs to actually work together—remains the truly hard, non-trivial part that humans have been wrestling with for fifty years.
### [30:50](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1850s) The Longevity of Software Practices Henney concludes this segment by observing that many practices currently marketed as "radical" or "new" were well-documented in early computing history. He points to Alan Perlis, who in 1968 argued that "a software system can best be designed if the testing is interlaced with the designing instead of being used after the design." Henney shares his own surprise at discovering that terms like "middleware" and "unit tests" appear in software engineering proceedings from 1968, predating his own assumptions by over a decade.
- **Key Historical Data Points:** - The original Lions' commentary on the Unix kernel comprised only 9,500 lines of code. - The foundational observation that "the size constraint has encouraged not only economy but a certain elegance of design" dates back to a 1970 paper by Ritchie and Thompson. - Concepts regarding modular, independently testable subsystems date back at least to 1968. - Terms like "middleware" and "unit tests" were already in professional circulation by 1968.
[31:38](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1898s) Test-Driven Development and Hoare Logic
Kevlin Henney turns to testing practices, tackling the modern belief that Test-Driven Development (TDD) is a novel invention of recent decades. He points back to the 1970s and the creation of AWK, a language designed by Alfred Aho, Peter Weinberger, and Brian Kernighan. Kevlin fondly recalls AWK as a concise and elegant language whose execution model revolves around pattern matching and goals—a tool that Henney notes was unfortunately sidelined when people migrated toward Perl, which a friend of his famously described as “executable line noise.” In a historical interview reflecting on the birth of AWK in the late 1970s, Alfred Aho explained their strict internal discipline, demonstrating that test-first development was alive and well long before the term existed: “We instituted a rigorous regression test for all the features of AWK: any of the three of us who put in a new feature into the language first had to write tests for the new feature.” As Henney notes, while our motivations and vocabulary refine over time, developers have a persistent habit of reinventing practices without recognizing that their core insights are decades old.
Henney connects this continuity to the ubiquitous Given-When-Then phrasing used in Behavior-Driven Development (BDD), acknowledging Dan North in the room. Henney recalls that when he first encountered the pattern, it felt deeply familiar because it mirrored the preconditions, triggers, and postconditions of classic use cases. However, Jason Gorman pointed out an even older origin: Tony Hoare’s landmark 1969 paper, *An Axiomatic Basis for Computer Programming*. Hoare triples formalize computation by stating that given a precondition, executing an operation yields a specific postcondition. This mathematical construct serves not only as formal verification logic, but as an intuitive conversational structure and recursive test design framework that continually re-emerges across generations.
- **AWK:** Created at Bell Labs in the 1970s by Alfred Aho, Peter Weinberger, and Brian Kernighan, with a mandatory test-first regression policy for all three contributors. - **Hoare Logic (1969):** Tony Hoare’s axiomatic framework established the $\{P\}\;C\;\{Q\}$ precondition-action-postcondition structure that survives modernly as Given-When-Then.
```mermaid flowchart LR accTitle: Evolution of Precondition and Postcondition Thinking accDescr: Diagram tracing Tony Hoare's 1969 logic through use cases to modern Given-When-Then testing. subgraph S1["1969: Formal Logic"] A["Hoare Triples<br/>(Precondition / Command / Postcondition)"] end subgraph S2["1990s: Requirements Modeling"] B["Use Cases<br/>(Preconditions / Triggers / Postconditions)"] end subgraph S3["2000s+: Behavior-Driven Development"] C["Given-When-Then<br/>(Test Structure & Conversations)"] end A --> B B --> C ```
[33:54](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2034s) Technical Debt and the Myth of Frozen Specifications
Moving on to software management concepts, Henney unpacks how Ward Cunningham coined the phrase *technical debt* in 1992 and how frequently it is misapplied. Cunningham never suggested that all imperfect code is inherently disastrous. Drawing a parallel to personal finance, Henney remarks that he and his wife carry debt through a mortgage—a word whose etymological root *mort* literally signals a “deal unto death”—yet taking on that debt remains an advantageous trade-off because it provides a home via structured, manageable repayments. The metaphor originally argued that early, unpolished code allows teams to validate ideas rapidly, provided they repay the principal through refactoring. As Henney quotes Ward Cunningham: “Shipping first-time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite.” The catastrophe occurs when teams neglect that repayment, allowing interest to accumulate on every minute spent working around compromised designs until systems degenerate. Henney punctuates this architectural decay by displaying a chaotic graph and quipping that it looks like typical microservices deployments, citing Alan Perlis's timeless epigram: “In the long run, every program becomes rococo, and then rubble.”
This decay is closely linked to the recurring corporate fantasy that software can be fully specified before it is built, thereby eliminating the messy reality of programming. Henney quotes Edward Berard’s 1991 assessment: “Walking on water and developing software from a specification are easy if both are frozen.” Henney references a comic from *CommitStrip* where an optimistic manager insists that one day coders will no longer be necessary because businesses will simply write a comprehensive, precise specification from which programs will generate themselves. Henney dryly notes that management has been promising this exact dream since the 1950s, overlooking the punchline of the comic: the industry already has an exact term for a project specification detailed and unambiguous enough to generate an executable program—it is called source code.
- **Technical Debt Coining (1992):** Ward Cunningham introduced the debt metaphor to advocate for intentional, short-term architectural trade-offs repaid with timely rewrites. - **Alan Perlis on Software Entropy:** Systems tend to evolve from clean beginnings into over-ornamented rococo excess, inevitably collapsing into structural rubble. - **The Specification Fallacy:** Attempting to eliminate programming by creating a completely unambiguous, exhaustive specification merely reproduces programming under a different label.
[36:47](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2207s) Software Design vs. Production and Parnas on Modularity
Henney examines the long-standing misclassification of programming as an assembly-line manufacturing activity rather than a design discipline. He cites Jack Reeves’s influential 1992 essay in the *C++ Report* (and *C++ Users Journal*), which established that code itself is the design document, not the finished manufacturing product. For decades, organizations have mismanaged development by treating coders as blue-collar production workers stamping out parts. In reality, software engineering resolved the physical manufacturing challenge long ago. As Peter Naur and Brian Randell observed in their 1968 NATO Software Engineering Conference report: “The replication of multiple copies of a software system is the phase of software manufacture which corresponds to the production phase in other areas of engineering. It is accomplished by simple copying operations and constitutes only a minute fraction of the cost of software manufacture.” Henney stresses that managing an iterative design activity requires fundamentally different expectations, metrics, and processes than managing physical replication.
To organize that design activity effectively, Henney turns to David Parnas’s seminal 1972 paper on modular decomposition. While developers frequently divide architectures along domain entities or data normalization lines, Parnas proposed that module boundaries should encapsulate instability and difficult decisions. Henney highlights Parnas’s rule: “We propose that one begins with a list of difficult design decisions or design decisions which are likely to change.” Instead of designing static abstractions based on perceived real-world nouns, architects must design around volatility, isolating points of uncertainty so that unavoidable changes do not ripple through the entire codebase. Henney jokes that this provides a practical heuristic for team disputes: whenever developers strongly disagree on an implementation strategy or run into an unresolved technical unknown, they should draw an architectural boundary right around that disagreement.
- **Jack Reeves (1992):** Reclassified coding as a pure design activity; the compiler performs the actual manufacturing step. - **NATO Conference (1968):** Peter Naur and Brian Randell identified that manufacturing in software is merely file copying, making its production cost negligible compared to other engineering disciplines. - **David Parnas (1972):** Information hiding is fundamentally about encapsulating volatility, stability variances, and high-risk architectural decisions behind stable interfaces.
[40:34](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2434s) Cohesion, Coupling, and the Essence of Object-Orientation
Turning to structural design fundamentals, Henney holds up a vintage 1970s software engineering text from Edward Yourdon and Larry Constantine, laughing at its trippy, psychedelic book cover from Powell’s Books in Portland. Beneath the dated cover art lies an enduring definition of module cohesion: “Cohesion is a measure of the strength of association of the elements inside a module. A highly cohesive module is a collection of statements and data items that should be treated as a whole because they are so closely related.” The original texts understood that arbitrary partitioning increases coupling and degrades readability, emphasizing that modern architectural debates about right-sizing services and boundaries are addressing challenges documented decades prior.
Henney extends this pattern of forgotten origins to object-oriented programming (OOP). While modern developers commonly view OOP through the lens of class hierarchies, types, and inheritance trees, its pioneer Alan Kay held a radically different view. Henney recounts Kay's perspective on what object orientation truly meant: “It means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.” Henney highlights that at its inception, object orientation was conceived as a decentralized network of autonomous entities exchanging messages, rather than the rigid, statically coupled data-holder models that eventually dominated mainstream software development.
- **Cohesion and Coupling:** Formulated during the structured design era of the 1970s by Yourdon, Constantine, and Stevens, establishing that high internal affinity minimizes destructive external dependencies. - **Alan Kay’s OOP Definition:** Focused entirely on dynamic message-passing, state isolation, and late binding rather than rigid class inheritance structures.
[41:45](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2505s) Threads, Shared Memory, and the Fallacy of Synchronization
Kevlin Henney points back to an observation made by Russel Winder in *97 Things Every Programmer Should Know*: rather than relying on threads and shared memory as our primary programming model, we can instead use processes and message passing. A process in this context simply means executing code with a protected, independent state—not necessarily a heavyweight operating system process. This concept is thoroughly battle-tested in languages like Erlang and Occam, which proved decades ago that processes are an exceptionally successful mechanism for building concurrent and parallel systems without the crippling synchronization stresses that plague shared-memory multithreading.
Henney recalls his deep skepticism when Java was first released and featured built-in synchronization across its primitive collection classes. The industry had caught thread fever, eagerly embedding threads and locks directly into core languages and standard libraries without understanding the consequences. “Synchronization is the one thing you actively want to avoid if possible,” Henney insists, pointing out the inherent irony of trying to gain performance through locking. All computers wait at the exact same speed: you can have a 3 GHz wait or a multi-core wait, but waiting is still waiting. Henney sums up the fundamental contradiction with a dry sci-fi quip: “The purpose of synchronization is to eliminate concurrency so if somebody says we're doing threads to make things faster why are you using locks to make things slower? Hmm I sense a disturbance in your understanding of the forces involved.”
- **Russel Winder's Model**: Independent, protected state with message passing over shared memory and locks. - **Languages with Prior Art**: Erlang and Occam (rooted in Tony Hoare's Communicating Sequential Processes from the 1970s). - **The Java Mistake**: Synchronizing core collections out of the box because threading sounded modern, creating decades of consultancy work and concurrency bugs. - **The Core Axiom**: Concurrency aims to run work simultaneously; synchronization explicitly stops simultaneous execution to enforce safety.
---
[43:45](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2625s) The Roots of Actors, Objects, and 1930s Lambdas
Turning to history, Henney notes that Carl Hewitt introduced the Actor model between 1970 and 1973, while Tony Hoare's Communicating Sequential Processes (CSP)—the foundation for Occam—also emerged in the 1970s. Henney reflects on his own master’s degree research, which centered on actor systems implemented in Lisp. This thread leads directly back to Alan Kay’s development of Smalltalk. Kay openly credited Lisp for Smalltalk's foundational design philosophy: the elegance of building an entire world out of a tiny, cohesive set of primitives from which larger behavior can be composed.
Henney addresses the ongoing academic and internet turf wars over whether actors constitute an object-oriented model, dismissing the controversy as political posturing: by Alan Kay’s original definition of object-oriented programming—focused on messaging and encapsulation—actors unmistakably qualify. Henney highlights a 1984 paper on data abstraction by Luca Cardelli and Peter Wegner, which was later revisited by William Cook. Cook traced the theoretical roots of object abstraction and made the striking declaration that lambda calculus was actually the very first object-oriented language. While Cook dated it to 1941, Henney notes his own research found Alonzo Church's work on lambda calculus stretching back to 1932.
```mermaid flowchart LR accTitle: Lineage of Functional and Object Primitives accDescr: Timeline showing the evolution of lambda calculus and message passing from the 1930s to modern programming languages.
subgraph Foundations["1930s – 1970s Foundations"] LC["1932 / 1941<br/>Lambda Calculus<br/>(Church)"] LISP["Late 1950s / 1960s<br/>Lisp & Algol"] ACT["1970–1973<br/>Actor Model (Hewitt)<br/>CSP (Hoare)"] ST["1970s<br/>Smalltalk (Kay)"] end
subgraph ModernAdoption["Modern Mainstream Adoption"] CPP["2011<br/>C++ Lambdas"] JV["2014<br/>Java 8 Lambdas"] JS["Modern JavaScript<br/>Closures & Lambdas"] end
LC --> LISP LISP --> ST ACT --> ST LC -.->|"theoretical basis"| CPP LC -.->|"theoretical basis"| JV LC -.->|"theoretical basis"| JS ```
Henney finds great comedy in modern language rivalries, contrasting Java developers celebrating the arrival of lambdas in 2014, C++ developers boasting they had them in 2011, and JavaScript developers asking where they fit into the conversation—all while Lisp and Algol had these capabilities in the 1960s, and Alonzo Church defined them in the 1930s. “Excel is the world's most popular functional language,” Henney reminds the room, citing Haskell co-designer Simon Peyton Jones to deflate programming dogmatism. The paradigm itself is only half the story; execution is what matters, even if developers find it galling that their corporate accounting department has been happily writing functional spreadsheets far longer than software engineers have been debating monads.
---
[46:38](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2798s) Coordination Models, Unix Pipes, and McIlroy’s Garden Hose
Software paradigms do not exist in walled silos; they form a continuous, flowing spectrum. When building larger architectures—whether microservices or distributed systems—the essential architectural task is modular separation and recombining components cleanly. Henney cites Nicholas Carriero and David Gelernter’s early 1990s work on coordination languages, which posited that any complete programming model consists of two distinct halves: a computation model (discrete units doing well-defined tasks) and a coordination model (the glue that ties them together).
The archetype of the coordination model is the Unix pipe, conceived in 1964 by Doug McIlroy. McIlroy famously envisioned connecting programs like garden hoses:
> “We should have some ways of coupling programs like garden hoses screwin another segment when it becomes necessary to massage the data in another way this is the way of i/o also what you have here is a concatenated programming model a functional model a data flow model and this was conceived of in 1964 the idea of the coordination modeling and have processes that have a very simple input-output model continuous so ongoing execution not termination based execution”
Despite the concept being crystallized in 1964, Henney notes with a laugh that “it took six years to find the pipe symbol on the keyboard,” until Ken Thompson finally implemented it into Unix in 1970.
---
[49:07](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2947s) The Timelessness of Core Ideas
Henney concludes his keynote by reflecting on the software community's collective amnesia. Developers know far more than they give themselves credit for, but industry progress is constantly dragged down because engineers mistake old concepts dressed in new jargon for genuine breakthroughs.
To illustrate this, Henney shares an anecdote about a former colleague who kept a single PowerPoint slide deck across multiple industry hype cycles: whenever a new paradigm emerged, the colleague simply ran a global find-and-replace—swapping "object" for "component," "component" for "service," and "service" for "microservice"—before pitching the exact same architectural offering to clients. Beyond being cynical, Henney argues the story is deeply revealing: underneath the endless framework churn and marketing buzzwords lies a very small, remarkably stable core of architectural principles. If developers took the time to study history, they could instantly recognize what is truly novel in an idea and stop endlessly reinventing the past.
## Notable quotes > [33:54](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2034s) Walking on water and developing software from a specification are easy if both are frozen. — Edward Berard
> [18:59](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1139s) If anybody ever gives you the option to not put something out on the network, take it. — Kevlin Henney
> [33:54](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2034s) Shipping first-time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite. — Ward Cunningham
> [26:36](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=1596s) The difference between services and microservices is the word 'micro'. — Kevlin Henney
> [33:54](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2034s) In the long run, every program becomes rococo, and then rubble. — Alan Perlis
> [05:56](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=356s) We are uncovering better ways of developing software by seeing how others have already done it. — Kevlin Henney
> [36:47](https://www.youtube.com/watch?v=AbgsfeGvg3E&t=2207s) We propose that one begins with a list of difficult design decisions or design decisions which are likely to change. — David Parnas
## Mentioned Adam Drake, Alan Kay, Alan Perlis, Alfred Aho, Alonzo Church, Andy Kinslow, Apollo flight systems, AWK, Brian Foote, Brian Kernighan, Brian Randell, Carl Hewitt, David Gelernter, David Parnas, Dennis Ritchie, Douglas Engelbart, Douglas Ross, Doug McIlroy, Edsger W. Dijkstra, Edward Berard, Edward Yourdon, Erlang, GOTO Chicago 2018, Jack Reeves, John Lions, Ken Thompson, Kevlin Henney, Larry Constantine, Lisp, Luca Cardelli, Margaret Hamilton, MediaWiki, NATO Software Engineering Conference (1968), Nicholas Carriero, Occam, Peter Naur, Peter Weinberger, Peter Wegner, Richard P. Gabriel, Russel Winder, Simon Peyton Jones, Simula 67, Smalltalk, Tony Hoare, Unix, Ward Cunningham, William Cook, Winston Royce
## Video description This presentation was recorded at GOTO Chicago 2018. #gotocon #gotochgo http://gotochgo.com
Kevlin Henney - Programming+Patterns Practice+Process @KevlinHenney
ABSTRACT Everything is changing. Everything is new. Frameworks, platforms and trends are displaced on a weekly basis. Skills are churning. And yet... Beneath this seemingly turbulent flow there is a slow current, strong and steady, changing relatively little over the decades. Concepts with a long history appear [...]
Download slides and read the full abstract here: https://gotochgo.com/2018/sessions/371
RECOMMENDED BOOKS Kevlin Henney & Trisha Gee • 97 Things Every Java Programmer Should Know • https://amzn.to/3kiTwJJ Kevlin Henney • 97 Things Every Programmer Should Know • https://amzn.to/2Yahf9U Henney & Monson-Haefel • 97 Things Every Software Architect Should Know • https://amzn.to/3pZuHsQ Henney, Buschmann & Schmidt • Pattern-Oriented Software Architecture Volume 5 • https://amzn.to/3GAPzN7
https://twitter.com/GOTOcon https://www.linkedin.com/company/goto- https://www.instagram.com/goto_con https://www.facebook.com/GOTOConferences #fundamentals #programming #SoftwareArchitecture #KevlinHenney
CHANNEL MEMBERSHIP BONUS Join this channel to get early access to videos & other perks: https://www.youtube.com/channel/UCs_tLP3AiwYKwdUHpltJPuA/join
Looking for a unique learning experience? Attend the next GOTO conference near you! Get your ticket at https://gotopia.tech Sign up for updates and specials at https://gotopia.tech/newsletter
SUBSCRIBE TO OUR CHANNEL - new videos posted almost daily. https://www.youtube.com/user/GotoConferences/?sub_confirmation=1
[Source](https://www.youtube.com/watch?v=AbgsfeGvg3E)