Rich Hickey Urges End to In-Place Data Updates as Storage Expands

The Value of Values with Rich Hickey — InfoQ

InfoQ

Software architectures must abandon mutable state for immutable values because overwriting records destroys historical facts, forcing enterprises to mine raw operational logs to reconstruct the past.

AI-assisted summary of The Value of Values with Rich Hickey — original source. Check the original for full context.

Source published:

Key ideas

  • Place-Oriented Programming (PLOP)—the practice of overwriting memory addresses or database records—is an obsolete paradigm born of hardware constraints from an era before storage capacity expanded a millionfold. (2:01)
  • Values are strictly immutable and semantically transparent, aggregating cleanly into larger values without the non-composable locking and cloning policies required by mutable objects. (8:06)
  • Facts are inherently historical documentation of what occurred; because the past cannot be altered, updating or overwriting a fact in place is an architectural category error. (20:08)
  • The Big Data boom is largely driven by businesses mining raw developer execution logs with MapReduce to recover the historical trends and rates of change that standard CRUD databases destructively erase. (24:27)

Detailed notes

## Background Published on YouTube by InfoQ on October 8, 2012, this keynote speech from JaxConf 2012 features Clojure creator and Datomic founder Rich Hickey. The talk analyzes how modern software engineering thinks about values in light of rising system complexity and the emergence of Big Data.

## TL;DR Rich Hickey critiques the industry's widespread reliance on 'Place-Oriented Programming' (PLOP), where mutable memory locations and destructive database updates repeatedly overwrite information. He redefines genuine information as an accumulation of immutable, semantically transparent values and time-bound facts that document what happened in the past. Highlighting the irony that developers insist on immutable version control and append-only logs for themselves while forcing destructive CRUD models onto business users, Hickey argues that modern hardware has entered a boundless 'Space Age' where new facts should always occupy new space rather than destroying existing data.

## Atmosphere & style The presentation is intellectually sharp, philosophical, and dryly humorous, anchored by Hickey's signature method of consulting dictionary etymologies to deconstruct industry dogma from first principles. Hickey paces his delivery with brisk momentum, guiding the audience through Socratic thought experiments that make standard object-oriented practices feel unexpectedly absurd. Watching it feels like a patient yet uncompromising wake-up call that challenges developers to unlearn decades of obsolete hardware habits.

## Bulletin - [02:01](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=121s) Place-Oriented Programming (PLOP)—the practice of overwriting memory addresses or database records—is an obsolete paradigm born of hardware constraints from an era before storage capacity expanded a millionfold. - [08:06](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=486s) Values are strictly immutable and semantically transparent, aggregating cleanly into larger values without the non-composable locking and cloning policies required by mutable objects. - [20:08](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1208s) Facts are inherently historical documentation of what occurred; because the past cannot be altered, updating or overwriting a fact in place is an architectural category error. - [24:27](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1467s) The Big Data boom is largely driven by businesses mining raw developer execution logs with MapReduce to recover the historical trends and rates of change that standard CRUD databases destructively erase.

## Key takeaways - [00:11](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=11s) Software engineering often mistakenly models facts as mutable storage locations accessed via get and set operations, corrupting the true definition of information. - [02:01](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=121s) Place-Oriented Programming (PLOP) defines any architecture where incoming new information overwrites and destroys older information, across both in-memory objects and durable databases. - [04:26](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=266s) In-place mutation made engineering sense when hardware was constrained to kilowords of memory, but persisting with it after a millionfold increase in capacity is unjustified. - [06:12](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=372s) Real-world memory and record-keeping systems—such as associative human recall and double-entry accounting ledgers—are inherently additive and never rely on destructive overwriting. - [08:06](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=486s) Values are defined by immutability and semantic transparency, establishing the comparability necessary for sound programmatic logic and equality testing. - [11:18](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=678s) Programming with immutable values eliminates defensive copying, provides deterministic reproducibility for automated tests, and allows trivial data fabrication without bespoke class hierarchies. - [13:16](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=796s) Object-oriented specificity has failed to deliver promised code reuse, instead producing boilerplate code explosions and increased defect rates by inventing new types for every problem. - [14:23](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=863s) Aggregates of immutable values automatically remain immutable values, whereas mutable objects require manual synchronization and cloning policies that fail to compose across abstraction layers. - [16:15](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=975s) Observing immutable values requires zero coordination or global read locks, allowing safe multi-threaded perception and clean inter-process boundary traversal like JSON or XML. - [20:08](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1208s) By definition and Latin etymology, a fact represents an event that occurred in the past; because history cannot be changed, facts are immutable values bound to time. - [21:28](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1288s) Conflating mechanical execution constructs (such as conveyor belts or queues) with the information model itself is an architectural mistake, as place has no legitimate role in modeling facts. - [24:27](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1467s) Software developers demand complete, immutable temporal histories for their own source code repositories and system logs, yet deny those exact historical capabilities to business users. - [24:27](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1467s) Big Data mining via tools like MapReduce emerged as an inefficient workaround for businesses trying to extract historical trends from noisy operations logs because primary databases only retained current state. - [27:55](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1675s) In the modern era of practically boundless memory and cloud storage, information architectures must adopt the principle that new facts always require new space.

## Detailed walkthrough ### [00:11](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=11s) Defining Information and the Myth of the "Fact"

Rich Hickey opens the keynote by asking the audience how many of them work in "IT," joking that it stands for Information Technology or perhaps other things. As with his other keynotes, he consults his dictionary to ground the discussion in first principles. According to the dictionary, "information" derives from "inform," which means to convey knowledge via facts in order to give shape to the mind. Therefore, information simply consists of facts.

```mermaid flowchart TD accTitle: The Misguided Conception of Facts as Storage Places accDescr: Diagram illustrating the erroneous framing of facts as mutable storage locations with get/set operations versus genuine immutable information. subgraph ErroneousView["The Erroneous Mental Model"] P["Place / Location"] -->|"controls change"| O["Operations: get() / set()"] O -->|"overwrites"| F["'Fact' (as mutable storage)"] end subgraph AuthenticView["The Authentic Nature of Facts"] I["Information / Knowledge"] -->|"composed of"| AF["Immutable Facts"] AF -->|"gives shape to"| M["The Mind"] end ```

Hickey then intentionally leads the audience down a garden path by offering an absurd, programming-skewed definition of a fact: he defines a fact as a place where information is stored, complete with `get` and `set` operations that control how the fact can change, where conveying a fact simply means passing its location. Pausing to ask how many people feel uncomfortable with this characterization, Hickey calls out the absurdity directly: “This is not true right this is wrong everything I just said was wrong dead wrong and you should be uncomfortable this is not what facts are right so are facts places?”

[02:01](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=121s) Place-Oriented Programming (PLOP)

Turning back to the dictionary, Hickey notes that a "place" is a particular delimited portion of space with specificity to its named location. Programmers deal with places constantly: memory addresses and disk sectors are physical places with specific addresses whose contents can be replaced with new contents. The critical problem is whether software engineers are actually building systems centered around *information* when they rely so heavily on these places.

In modern programming—particularly object-oriented programming—mutable objects are fundamentally nothing more than thin abstractions draped over memory places. They expose methods, like getters and setters, to manipulate those places. On the persistence and durability side, the exact same pattern appears: database tables, documents, and records are treated as places governed by updates where new values overwrite old ones. Hickey coins an acronym for this dominant paradigm: **PLOP** (Place-Oriented Programming). He remarks, “You can tell when it's going on because anytime new information replaces old information you're doing Place oriented programming.”

- **In-Memory PLOP:** Mutable objects wrapping memory addresses, exposing mutating methods. - **Durable PLOP:** Database tables, documents, and records that implement updates in place. - **The PLOP Indicator:** Anytime incoming, new information overwrites and destroys old information, a system is practicing Place-Oriented Programming.

[04:26](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=266s) The Historical Rationale and the Millionfold Shift

Place-oriented programming was not invented out of malice or ignorance; in the early days of computing, hardware constraints gave developers no other choice. Hickey recalls a talk by Guy L. Steele Jr. describing programming on a machine with a meager four kilowords of memory. In that era, programmers had to know the exact physical address of every instruction and variable: even-numbered addresses starting at 2000 served as jump tables, specific locations held data, and code segments were repeatedly repurposed for data whenever they were not actively executing. Because memory and disks were tiny and wildly expensive, manipulating places in situ made total engineering sense.

However, Hickey emphasizes that the key qualifier is that it *used* to make sense. Over his programming career, hardware storage and memory capacity have grown by a factor of one million. To highlight the absurdity of sticking with primitive architectural patterns despite this transformation, he asks the audience to imagine how few physical rules would still apply if an automobile were suddenly made a million times larger. As Hickey points out, “What other thing in life you know has the same facts about it um remain true when the size of something changes by a millionfold imagine if your car was a million times bigger than it is what rules would still be would still apply what characteristics would still be true almost nothing but yet we're we're retaining decisions we made when things were much much smaller and and moving forward with them.”

[06:12](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=372s) Believing Our Own Myths: Real Memory and Real Records

The terms "memory" and "records" held rich human meanings long before electronic computers repurposed them. In computing, memory was reduced to volatile RAM addresses and records were flattened into mutable slots in database tables. The danger is that programmers have repeated these technological analogies for so long that they have begun to believe their own myths, ignoring how memory and record-keeping actually function in the real world.

Human memory is fundamentally an associative, open system rather than an address-based block of storage. If an acquaintance acquires a new email address, your brain does not locate the specific neurons storing the old address and overwrite them. Similarly, historical record-keeping on stone tablets or papyrus never involved chiseling down marble or applying erasers whenever new facts emerged. In commerce, double-entry accounting ledgers were designed explicitly around append-only operations: bookkeepers never erased ledger entries to fix mistakes; they created correcting entries. Overwriting and erasing are computational artifacts born of hardware scarcity, not reflections of actual record-keeping.

- **Human Memory:** An associative, open-ended biological system, not a grid of fixed address slots. - **Historical Records:** Carved in stone or inked on papyrus; never smoothed over or erased when conditions changed. - **Ledger Accounting:** Relies exclusively on append-only correcting entries to preserve an accurate historical audit trail.

[08:06](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=486s) Redefining Values: Immutability, Comparability, and Semantic Transparency

To steer the discipline back toward genuine information systems, Hickey turns to the core topic of the keynote: values. The dictionary defines "value" first as relative worth, and second as a magnitude, quantity, or number used to measure something else (such as the number 42). While programmers are comfortable with numeric values, the broader and more critical definition centers on comparability and relative worth. Measurement cannot exist in an absolute vacuum; it requires comparing one thing against another.

```mermaid flowchart LR accTitle: The Two Primitives of Values in Programming accDescr: Diagram highlighting immutability and semantic transparency as the foundational properties of programming values. subgraph ValueCharacteristics["Essential Properties of a Value"] direction TB IM["Immutability"] -->|"guarantees stability for"| C["Comparability & Logic"] ST["Semantic Transparency"] -->|"exposes meaning directly"| E["Equality Testing"] end ValueCharacteristics --> Dec["System Decision-Making"] ```

To test the concept, Hickey asks whether a string is a value. The answer depends entirely on immutability: an immutable string is a value, whereas a mutable string is not. Few developers who have worked in environments with mutable strings ever want to return to them. Although a string does not denote a numeric magnitude, an immutable string is directly comparable, and comparability is the bedrock of logic, equality, and sound decision-making. Hickey distills the concept for programming into two fundamental pillars: values are strictly immutable, and values are semantically transparent. Explaining why this distinction matters so profoundly against the backdrop of object-oriented encapsulation, Hickey concludes: “A value is about saying compare me to something else I'm telling you what my what my um what my precise meaning or significant is significance is right on the label right on the outside that's what a value is.”

[11:18](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=678s) Sharing, Reproducibility, and Ease of Fabrication

Rich Hickey moves directly into the core propositions that demonstrate why values are fundamentally good. Because his presentation was originally planned for an hour, he accelerates the pace to outline the characteristics that make values so valuable. The primary characteristic is that values can be freely shared without defensive friction. When working with an immutable entity, one can hand it to another component or thread without worrying about whether it will be modified or corrupted. Because neither side can mutate it, neither party has to worry about the other.

Values are also the foundation of reproducible results. Defining a function in terms of pure values guarantees that invoking it with identical inputs always yields the exact same answer. By contrast, if a function is defined around mutable "places," the result is completely dependent on whatever happens to reside in that place at that particular moment in time. This distinction is critical for automated testing. Hickey criticizes modern software practices where teams write extensive test suites against mutable state, pointing out that such tests fail to provide real guarantees because their outcomes depend entirely on whether the system can successfully reset a mutable place back to a specific prior state.

Values are extraordinarily easy to fabricate out of thin air across any programming environment. A developer can effortlessly construct a string, a list of numbers, a nested list, or a map of lists in virtually any language. Creating an ad-hoc instance of a bespoke, language-specific interface or class hierarchy, however, requires jumping through immense structural hoops. When data is represented as values, writing programs that generate other programs or automatically synthesize tests becomes straightforward.

> “So many people are running tests now of of places they don't tell you anything they don't tell you anything they're all conditional upon your ability to bring that place back to the same place to the same value right” — Rich Hickey

- **Frictionless sharing:** Handing an immutable value to another consumer eliminates shared-state bugs and defensive copying. - **True reproducibility:** Value-based functions behave deterministically, unlike place-oriented functions whose return values depend on volatile state. - **Fabrication simplicity:** Generic literals (primitives, maps, lists) can be instantiated instantly without class scaffolding, enabling metaprogramming and test generation.

---

[13:16](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=796s) Generic Reusability and the Failure of Object-Oriented Specificity

Values are inherently language-independent and generic. The fundamental concepts of strings, lists, numbers, and key-value maps exist entirely independent of Java, Clojure, or any other programming environment. Hickey argues that software engineering often overlooks the crushing costs of specificity. In the object-oriented paradigm—especially within statically typed environments like Java—every distinct idea receives a brand-new class.

This obsession with bespoke modeling produces an explosion of boilerplate code. Hickey notes the historical irony: object-oriented programming was sold on the promise of code reuse, yet it has achieved the exact opposite by incentivizing developers to invent brand-new, isolated types for every single problem. This massive accumulation of rigid, specialized code directly inflates surface area and bug density.

```mermaid flowchart TD accTitle: The Cost of Specificity versus Generic Values accDescr: Comparing how object-oriented bespoke classes multiply bugs compared to language-independent values.

subgraph OO["Object-Oriented Specificity"] O1["New Domain Concept"] --> O2["New Custom Class / Interface"] O2 --> O3["Explosion of Boilerplate Code"] O3 --> O4["Diminished Reuse & Increased Bugs"] end

subgraph Val["Value-Oriented Generics"] V1["New Domain Concept"] --> V2["Standard Generic Aggregates\n(Maps, Lists, Sets)"] V2 --> V3["Broad Reuse Across Systems"] V3 --> V4["Language-Independent Data"] end ```

> “Objects were supposed to support reuse they've done the exact opposite thing especially in typed languages you get very little reuse because you make a new thing every time and what does more code mean more code equals more bugs right away” — Rich Hickey

---

[14:23](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=863s) Value Aggregates and the Composition Breakdown of Objects

A crucial property that developers often fail to grasp is that values aggregate into values. While programmers widely accept that a number like 42 or an individual string should be immutable, they frequently balk at the idea of immutable collections. Hickey stresses that a collection composed of immutable values is itself an immutable value, carrying all the same guarantees as primitive scalars. Since no modern developer would willingly choose to work with mutable strings again, he questions why anyone still tolerates mutable collections.

When dealing with mutable objects in concurrent environments, developers must manually design locking policies and cloning semantics—work that Hickey compares to scribbling rules onto an informal "napkin." The fatal architectural flaw is that mutable locking and cloning policies do not compose:

| Architecture Layer | Values Composition | Mutable Objects Composition | |:--- |:--- |:--- | | **Atomic Elements** | Inherently thread-safe, immutable primitives. | Requires bespoke synchronization and locking semantics. | | **Aggregates / Composites** | Aggregates remain immutable values; all safety rules compose automatically. | Lock policies completely fall apart; developers must redesign synchronization from scratch. | | **Cloning Semantics** | Trivial (no-op or reference reuse; values cannot change). | Ambiguous ("it depends"); expensive deep copies vs. hazardous shallow copies. |

> “This composite of all these things for which I have lock policies now no longer has a lock policy I have to come up with a new one I have to come up with a new cloning policy and everything else over again values aggregate to values all the benefits apply to aggregates” — Rich Hickey

---

[16:15](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=975s) Perception, Memory, and Coordination Across Boundaries

Hickey shifts focus to how systems perceive, remember, and convey information. When conveying an immutable value to someone else, you transmit the exact data you saw. By contrast, pointing someone to a mutable "place" conveys nothing about the underlying information, because by the time the recipient inspects that place, its contents may have altered completely.

The same problem plagues perception. In order to perceive an aggregate composed of mutable places, an application must effectively freeze the world:

```mermaid flowchart LR accTitle: Perception in Places versus Values accDescr: Diagram contrasting locking the world to inspect mutable places versus leisurely observing an immutable value.

subgraph Places["Perception via Mutable Places"] P1["Request Observation"] --> P2["Acquire Global Lock\n('Stop the World')"] P2 --> P3["Read Mutating Memory"] P3 --> P4["Release Lock\n(Risk of Inconsistent Reads)"] end

subgraph Values["Perception via Values"] V1["Receive Value"] --> V2["Read and Reason at Leisure"] V2 --> V3["Consistent Observation Guaranteed\n(Zero Locking)"] end ```

Remembering state presents an identical obstacle: storing a naked reference to a mutable object fails because the underlying data can change underneath you, forcing developers into messy cloning routines. Hickey challenges the audience to think beyond a single process and look at distributed architectures. Across networks, developers have already discarded object-RPC paradigms like CORBA and DCOM in favor of value representations like JSON or XML.

Values eliminate the need for heavy-handed coordination like "read transactions," which Hickey notes violate physical intuition: in the physical world, looking at something does not require stopping time for everything else. Furthermore, programming with values grants "location flexibility"—allowing services, threads, or components to be rewritten in different languages or moved onto separate physical servers without breaking client contracts.

> “In physics we just look at each other we we don't have to stop everything in order to look at things so when we're programming with values and using values especially in storage we again have reduced coordination” — Rich Hickey

- **Perception without coordination:** Observing an immutable value requires zero locks, avoiding the "stop-the-world" pauses mandatory for mutable memory. - **Failures of object IPC:** Complex distributed object schemes (CORBA, DCOM) failed, replaced universally by generic value formats (JSON, XML). - **Location flexibility:** Value-driven boundaries enable shifting execution across threads, processes, and programming languages without altering core semantics.

---

[20:08](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1208s) The True Nature of Facts: Time-Bound Values

Hickey ties the value proposition directly back to the concept of Information Technology and the definition of a fact. He reveals that treating facts as mutable places was an industry lie. While conventional intuition suggests that facts change over time—such as a country changing its head of state—facts themselves never change, because real facts inherently incorporate time.

Consulting the dictionary and etymology, Hickey points out that the word "fact" derives from a Latin past participle meaning "something that happened" or something known to have existed. A fact represents an event that occurred in reality, not a volatile storage location that can be erased or overwritten. While a country may inaugurate new presidents or a user may register new email addresses, the historical fact that Bill Clinton was President remains perpetually true. Because facts describe what occurred, building information systems that discard past facts in favor of only the most recent state fundamentally undermines the purpose of information.

> “Fact means something that happened something known to have happened or existed it comes from Latin and it comes from a past participle in Latin that means something that happened a fact is something that happened it's not a place it's not something you can change right Bill Clinton was President the fact that he was President will always be a fact” — Rich Hickey

[21:28](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1288s) Why You Cannot Update a Fact

Information exists to inform people and convey knowledge, but knowledge is fundamentally derived from facts. When humans make decisions, they compare different moments in time, correlate facts, and evaluate changes across temporal baselines. Rich Hickey asks the audience to consider a thought experiment: imagine having to navigate the world knowing only the present value of every property or attribute, with zero memory of what came before. Decision-making under those conditions would be disastrous, yet the software industry routinely builds enterprise systems that do exactly that—remembering only the single most recent overwrite. Hickey points out the fundamental contradiction of calling these systems decision-support infrastructure: “And the reason why you can't update a fact is because you can't change the past and that's what facts are: they're documentation of the past.”

True information systems must be fundamentally about maintaining, manipulating, and presenting facts to provide real leverage to human decision-makers. While programming languages legitimately need process-oriented constructs to orchestrate execution, developers conflate those operational mechanics with information modeling. Programs naturally have parts that act like little industrial machines—with loading docks where data arrives, conveyor belts that transport it, and sorters that route pieces to different bins. While building machine-like language constructs is useful for running workflows, applying that mechanical metaphor to information itself is an architectural category error. Hickey stresses that constructs tied to physical memory locations have no business being part of an information model: “One of the big takeaways should be that place—that all of your constructs related to place—have no role at all in an information model.”

```mermaid flowchart LR accTitle: Mechanical Process vs Fact Accumulation accDescr: Contrasting machine-like processing pipelines with historical fact retention over time.

subgraph Process ["Process: The Machine Metaphor"] A["Loading Dock"] --> B["Conveyor Belt"] B --> C{"Sorter"} C --> D["Output A"] C --> E["Output B"] end

subgraph Information ["Information: Fact Model"] F["Fact at T0"] --> G["Fact at T1"] G --> H["Fact at T2"] end ```

[24:27](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1467s) Programmer IT vs. Business IT: The Irony of Big Data

Hickey highlights that software engineers already instinctively understand the value of historical values because they reject update-in-place for their own tooling. When programmers manage their own primary artifact—source code—they do not use a raw file-system directory where every new edit overwrites the previous version without a paper trail. Nor would any developer accept a version control system stripped of dates, times, and commit logs. The same holds true for operations infrastructure: developers do not maintain a single-variable log that continually overwrites itself to say merely that the last latency was five milliseconds. They log continuously, appending every event with a precise timestamp because running a system without historical context is impossible.

```mermaid flowchart TD accTitle: Programmer IT versus Business IT accDescr: Comparing the immutable logging of programmer IT with the destructive updates forced onto business systems.

subgraph DevTooling ["Programmer IT (What We Build for Ourselves)"] VCS["Version Control: Complete Commit History + Timestamps"] Logs["System Logs: Continuous Append-Only Records + Timestamps"] end

subgraph BusinessTooling ["Business IT (What We Hand to Customers)"] DB["CRUD Database: Destructive In-Place Overwrites (Only Current State)"] end

subgraph BigDataConsequence ["The Big Data Reaction"] Mine["Business mines raw operations logs with MapReduce to recover lost history"] end

DB -.->|"Missing history forces"| Mine Logs -->|"Accidental historical record"| Mine ```

This divergence reveals the real driving force behind the Big Data phenomenon. Hickey contends that much of Big Data is simply business users realizing that the operational logs kept by programmers are vastly superior to the transactional databases built for the business. Business stakeholders look at developers and say: “That database you have I like better than the one you gave me, because the one that you gave me only remembers the last thing I told it, and your database, your logs, they know everything that happened in our business.” Desperate to identify trends and rates of change, companies turn to mining developer logs with MapReduce. Hickey views this as an embarrassing, reactive workaround: raw logs are cluttered with low-level execution noise and lack leverageable schema structure, reflecting the industry's failure to build proper, append-only business databases in the first place.

- Developers depend on complete temporal records for source code and application monitoring, yet deny business users those exact capabilities in business software. - Decision-making fundamentally requires calculating rates of change, spotting trends, and aggregating historical metrics—operations made impossible by destructive updates. - Mining raw execution logs is an inefficient stopgap caused by storing business facts in place-oriented database engines.

[27:55](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1675s) Entering the Space Age: Retiring Place-Oriented Programming

Hickey argues that modern computing has officially crossed into the "Space Age." Historically, definitions of space have unified both physical extent and temporal duration: "the unlimited expanse in which all things are located and all events occur." In modern computing environments, developers no longer hit the physical boundaries of local storage: allocating memory with `new` succeeds indefinitely without immediate failure, and cloud storage like Amazon S3 never reports that it is full. When resources are virtually boundless, software is no longer constrained to operating within a fixed physical "place." Hickey urges developers to adopt a radically simple architectural rule: “Information systems should have a different approach: they should say that new facts require new space.”

```mermaid flowchart LR accTitle: Space-Oriented Information Architecture accDescr: How modern systems allocate new storage space for each successive fact rather than overwriting existing memory.

subgraph Space ["Unbounded Space (Memory / S3 / Distributed Storage)"] direction TB F1["Fact T0 (Immutable Value)"] F2["Fact T1 (Immutable Value)"] F3["Fact T2 (Immutable Value)"] end

F1 --- F2 --- F3 GC["Storage Garbage Collection handles reclamation asynchronously"] -.-> Space ```

The historical justification for place-oriented programming—such as $5,000 five-megabyte hard drives where every byte had to be conserved by overwriting existing memory—has been completely obsolete for years. Just as garbage collection automated the reclamation of dead memory references without forcing developers to manually overwrite active data, modern storage systems can manage persistence without destructive in-place updates. Hickey laments that the industry continues to design brand-new programming languages and databases that stubbornly cling to obsolete, place-oriented paradigms:

- Hardware economics have eliminated the storage constraints that originally forced engineers to mutate memory in place. - In-memory garbage collection patterns are shifting down the stack into persistent distributed storage engines. - Developers already accept the Space Age for their own logs and source repositories; they must now extend the same respect for historical values to the business applications they construct.

## Notable quotes > [27:55](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1675s) Information systems should have a different approach: they should say that new facts require new space. — Rich Hickey

> [21:28](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1288s) And the reason why you can't update a fact is because you can't change the past and that's what facts are: they're documentation of the past. — Rich Hickey

> [21:28](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1288s) One of the big takeaways should be that place—that all of your constructs related to place—have no role at all in an information model. — Rich Hickey

## Mentioned Rich Hickey, Clojure, Datomic, Guy L. Steele Jr., Bill Clinton, Java, CORBA, DCOM, JSON, XML, Amazon S3, MapReduce, JaxConf

## Video description In this keynote speech from JaxConf 2012, Rich Hickey, creator of Clojure and founder of Datomic gives an awesome analysis of the changing way we think about values (not the philosphoical kind) in light of the increasing complexity of information technology and the advent of Big Data. The broad subject of the talk makes it worth watching for almost anyone in the programming world, and was one of the highlights of the JaxConf lineup.

If you like the talk, check out Hickey's other appearance at JaxConf2012 here: http://marakana.com/s/rich_hickey_on_deconstructing_the_database,1261/index.html

[Source](https://www.youtube.com/watch?v=-6BsiVyC1kM)

中文简报

Rich Hickey呼吁随存储扩展终结就地数据更新 软件架构必须放弃可变状态转向不可变值,因为覆盖记录会破坏历史事实,迫使企业只能挖掘原始操作日志来重构过去。 Rich Hickey批评了业界对“面向位置编程”(PLOP)的普遍依赖,在这种模式下,可变内存位置和破坏性数据库更新会反复覆盖信息。他将真正的信息重新定义为不可变、语义透明的值以及记录过去发生事件的时间绑定事实的累积。Hickey指出,讽刺的是开发者为自己坚持使用不可变版本控制和仅追加日志,却将破坏性的CRUD模型强加给企业用户;他认为现代硬件已步入存储空间无限扩大的“空间时代”,新事实应始终占用新空间,而非销毁现有数据。 面向位置编程(PLOP)——即覆盖内存地址或数据库记录的做法——是一种过时的范式,源于存储容量暴增百万倍之前的硬件限制。 (2:01) 值严格不可变且语义透明,能够干净地聚合成更大的值,而无需可变对象所要求的那种不可组合的锁定与克隆策略。 (8:06) 事实本质上是对已发生事件的历史记录;因为过去无法更改,就地更新或覆盖事实属于架构层面的范畴谬误。 (20:08) 大数据热潮很大程度上是由企业使用MapReduce挖掘开发人员的原始执行日志所推动的,旨在找回标准CRUD数据库破坏性擦除的历史趋势与变化率。 (24:27)

Reading summary

Rich Hickey argues that modern software engineering remains trapped in "Place-Oriented Programming," an obsolete paradigm born of hardware scarcity where data is destructively overwritten in memory and database locations. He asserts that authentic information systems must instead treat data as immutable, time-indexed values and append-only facts to support sound decision-making and simplify concurrent architectures. The Legacy of Place-Oriented Programming (2:01) Hickey characterizes mainstream software development as "Place-Oriented Programming" (PLOP), where software entities—ranging from in-memory objects with getters and setters to relational database records—are treated as mutable memory locations whose contents are routinely overwritten. While this model made engineering sense when hardware was severely constrained, such as early machines running on four kilowords of memory or five-megabyte hard drives costing $5,000, storage and memory capacities have since expanded by a factor of one million. Hickey contends that maintaining architectural models rooted in physical scarcity is anachronistic. In the physical world, human memory functions as an associative, open biological network rather than an address grid, and historical record-keeping—such as double-entry bookkeeping ledgers or inscriptions on stone and papyrus—relied on append-only records and correcting entries rather than destructive erasure. Defining Values: Immutability and Generic Reuse (8:06) Hickey defines a value through two central pillars: strict immutability and semantic transparency, where meaning is directly exposed for comparison rather than hidden behind encapsulation. Because immutable entities cannot change, they can be freely shared across execution threads without defensive copying, enable deterministic and reproducible function results, and streamline testing by removing the need to reset mutable environmental states. Crucially, values aggregate into values: an immutable collection provides the exact same thread-safety guarantees as an individual scalar. In contrast, Hickey argues that object-oriented programming often defeats reuse by creating bespoke, highly specialized classes for every domain concept, which multiplies boilerplate and bug density. Furthermore, mutable objects fail when composed: developers are forced to design informal, bespoke locking and cloning policies that break down and must be reinvented as soon as objects are nested into composites. Coordination-Free Perception and Boundary Decoupling (16:15) Inspecting mutable places introduces severe architectural friction. To perceive an aggregate composed of mutable places, a system must acquire locks and temporarily "stop the world" to prevent concurrent writes from yielding inconsistent reads. Values eliminate coordination entirely: an immutable value can be observed at leisure without freezing time, aligning with physical intuition. This value orientation also provides critical decoupling across system boundaries. Distributed systems have largely abandoned distributed-object paradigms like CORBA and DCOM in favor of language-independent value formats like JSON and XML. Communicating with generic values grants systems location flexibility, allowing services to be refactored across threads, processes, and network boundaries without breaking interface semantics. Facts as Immutable History and the Business IT Irony (20:08) Tracing the etymology of "fact" to a Latin past participle meaning "something that happened," Hickey emphasizes that facts are inherently time-bound records of past events that cannot logically be updated. While systems require machine-like operational processes (such as queues and routing sorters) to execute workflows, treating information models as mutable places confuses process with data and deprives decision-makers of essential historical baselines. Hickey highlights an industry double standard: software engineers demand complete historical context for their own tooling—refusing to work without version control, commit logs, and append-only operational traces—yet construct destructive CRUD databases for business clients. He views the Big Data trend, where enterprises use MapReduce to extract business events from raw operational server logs, as an inefficient workaround for transactional databases that continuously destroy historical facts through in-place overwrites. Hickey concludes that computing has entered a boundless "Space Age" where elastic memory and cloud storage platforms like Amazon S3 eliminate the physical justification for overwriting data. He urges software engineers to retire place-oriented architectures in favor of systems where new facts require new space, relying on persistent append-only storage and asynchronous garbage collection to preserve historical context.

精炼阅读摘要

Rich Hickey 认为,现代软件工程因沿袭早期硬件匮乏时期的“面向位置编程”(PLOP)模式,错误地将事实视为可被覆写的存储位置;他主张信息系统应当建立在不可变的“值”与结合时间的事实之上,以契合算力与存储暴增的现代现实。 面向位置编程的历史成因与硬件跃升 (2:01) 软件行业长期习惯于将事实定义为具备 get 和 set 操作的存储位置。在内存中,这体现为包裹着内存地址的可变对象;在持久化层面,则表现为以原地更新覆盖旧数据的数据库表和记录。Hickey 将这种范式称为“面向位置编程”(PLOP),其核心特征在于任何新信息的到来都会直接覆写并破坏旧信息。 这种设计源于计算早期的物理限制。以 Guy L. Steele Jr. 描述的 4 kilowords 内存设备为例,程序员必须精确掌握每条指令与变量的物理地址,因资源极度匮乏且昂贵,就地修改内存是当时唯一合理的工程妥协。然而 Hickey 指出,在其职业生涯中,存储与内存容量已经增长了一百万倍。继续沿用体量小百万倍时制定的架构决策,犹如给扩大了一百万倍的汽车套用原有的物理规则一样不合时宜。 人类认知中的不可变记录与真实记忆 (6:12) 计算机术语中的“记忆”与“记录”在电子计算机诞生前已有明确含义,但技术人员长期受技术隐喻误导,忽略了现实世界的运作方式。人类记忆本质上是联想式的开放系统,而非按固定地址槽位切分的物理网格;当认识的人更换电子邮件地址时,人脑绝不会去定位并覆写原本存储旧地址的脑神经元。 在物理历史记录中,古代人用石头雕刻或在莎草纸上书写,发生新事件时从不磨平石板或擦除字迹;商业领域的复式簿记也是纯粹的“仅追加”模式,会计纠错依赖冲销记录而非物理擦除账目。Hickey 强调,覆写与擦除只是由早期硬件短缺催生的计算副产物,并不能代表真实的信息记录方式。 不可变之值的本质特征与工程优势 (8:06) Hickey 将“值”定义为具备两大基础支柱:严格的不可变性(Immutability)与语义透明性(Semantic Transparency)。值意味着可以直接对外宣称自身含义并支持无歧义的比较,而可比性正是逻辑推演、相等性验证与系统决策的根基。与此相对,面向对象范式倾向于为每个领域概念创建孤立的专属类与样板代码,既无法兑现代码复用的承诺,又增加了系统的错误密度。 不可变的值具备卓越的工程特性:它们可以跨线程自由共享,无需防御性复制;基于纯值定义的函数具备完全的可重现性,避免了针对可变状态测试时的脆弱假设;通用标量与复合结构(如嵌套映射、列表)极易随意构造。更为关键的是,值构成的集合依然是不可变的值,其安全性规则可以自动复合;而可变对象在组合后,既有的加锁与克隆策略将彻底失效,迫使开发者重新设计复杂的同步逻辑。 事实的时间属性与业务决策系统的缺陷 (20:08) 从词源学来看,“事实”(Fact)源自拉丁语过去分词,意为“已经发生的事情”或已知存在的事物。因为过去无法被修改,真实的事实天然带有时间维度且不可更新。尽管现实中的状态会随时间推进,但历史事实永远成立。Hickey 指出,编程语言中类似传送带、装卸站与分拣机等机械处理流程是合法的操作机制,但将这类物理机制套用到信息模型上则属于严重的范式归类错误。 软件开发者在自身工具体系中早已摒弃原地更新:版本控制系统必须保留完整的提交历史与时间戳,运维排障必须依赖仅追加的日志系统。然而,开发者却将破坏性覆写的 CRUD 数据库提供给业务人员。Hickey 认为,大数据技术的流行在很大程度上是业务人员的无奈倒逼——由于业务数据库仅记录最后一次覆写的现状,无法反映变化率与历史趋势,企业不得不动用 MapReduce 等工具从开发者杂乱的操作日志中低效地逆向挖掘历史事实。 告别位置限制进入充裕的存储时代 (27:55) 现代计算已经进入资源几乎无边界的“太空时代”(Space Age),内存分配通常不会立即耗尽,云存储亦不会提示磁盘已满。在存储资源极大丰富的背景下,系统架构不应再受限于固定的物理位置,而应践行“新事实需要新空间”的原则,将历史事实以不可变形式保留,并将清理回收交由底层的异步存储垃圾回收机制处理。 早期诸如 5000 美元仅能购买 5 兆字节硬盘的经济制约早已不复存在,但当下的软件行业依然在设计大量顽固依托位置覆写的编程语言与数据库。Hickey 呼吁,软件工程师应当正视存储经济学的彻底变革,像尊重自身源码与运维日志那样,将不可变的值与时间序列引入业务信息系统的构建中。 Rich Hickey 总结认为,位置概念属于物理执行层,绝不应侵入信息建模。当硬件限制已消除百万倍,信息系统应当全面淘汰原地覆写,转向由不可变的值、时间与持续累积的事实构成的现代体系。

Detailed notes — zh

## Background 该视频由 InfoQ 于 2012 年 10 月 8 日在 YouTube 平台发布。内容为 Clojure 创造者兼 Datomic 创始人 Rich Hickey 在 JaxConf 2012 上的主题演讲,页面描述指出,面对信息技术日益增长的复杂性与大数据的兴起,Hickey 深入剖析了软件工程界对待“值”(Values)的思维转变。 ## TL;DR Rich Hickey 尖锐批判了计算机行业长期沉溺的“场所导向编程”(PLOP)——即受限于早期微型硬件而形成的就地覆写(update-in-place)习惯。他正本清源地指出,信息是由内嵌时间戳的客观“事实”构成的,而事实在本质上是不可变、语义透明的“值”。通过剖析程序员自身使用的版本控制和只追加日志,Hickey 揭示了大数据浪潮实则是业务对原地覆盖数据库的抗议,并呼吁在硬件容量暴涨百万倍的今天,工程师应彻底告别物理位置覆写,拥抱基于不可变事实构建的面向信息架构。 ## Atmosphere & style 整场演讲风格犀利、幽默且极具思想穿透力,Hickey 善于从词源学切入,用荒谬的反讽击碎台下开发者的工程直觉。现场伴随着观众心照不宣的笑声与沉思,演讲节奏层层推进,从底层内存机制自然升华到认知哲学与商业本质。听者能鲜明感受到一位大师级系统架构师对软件行业固步自封的焦灼与忧虑,以及那种打破思想钢印、重构计算世界底层常识的智力震撼。 ## Bulletin - [02:01](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=121s) Rich Hickey 批判软件行业仍深陷“场所导向编程”(PLOP),指出在硬件容量激增百万倍的今天,程序员依然沿用几十年前为 4k 机器设计的内存与磁盘就地覆写(update-in-place)模式。 - [08:06](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=486s) “值”(Value)被定义为具备不可变性与语义透明性的实体,不可变值在聚合后天然保留值属性,能彻底消除面向对象编程中组合时锁策略与克隆机制崩溃的难题。 - [20:08](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1208s) 事实本质上就是值且内置了时间维度,过去发生的事不可篡改,新信息的到来只应追加新事实,绝非对旧历史的原地抹除。 - [24:27](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1467s) 软件工程师在版本控制和日志系统上始终坚守不可变与追加模式,却在业务系统与数据库设计中倒退回覆盖更新,催生了业务端被迫从低效运行日志中挖掘历史的大数据乱象。 ## Key takeaways - [00:11](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=11s) “信息”(Information)的本义是通过不可变的事实塑造心智,但软件界却误将其扭曲为带 get 和 set 操作的存储容器与地址引用。 - [02:01](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=121s) “场所导向编程”(PLOP)以就地修改(in-place update)为核心,其根源是早期硬件极度匮乏时程序员被迫反复复用有限物理内存与磁盘扇区的妥协产物。 - [05:30](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=330s) 现实中的生物记忆是开放联想系统,人类传统簿记数百年来亦坚持以追加更正分录代替橡皮擦抹除,计算机的内存与记录概念盗用并曲解了这些自然机制。 - [08:06](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=486s) 值的核心判定在于不可变性(Immutability)与语义透明性(Semantic Transparency),它的核心价值是供外部进行等价比较与逻辑推理,而非提供方法封装与隐藏状态。 - [11:18](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=678s) 纯粹基于值定义的函数具备天生的确定性与可重现性,而针对可变“场所”运行的自动化测试极度脆弱,完全依赖于重置上下文环境的复杂能力。 - [13:16](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=796s) 过度特异性的面向对象类设计导致代码恶性膨胀与 Bug 激增;相反,通用值模型支持无损聚合,“值的聚合依然是值”,在并发下无需重新发明锁与克隆逻辑。 - [16:15](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=975s) 在网络与分布式通信中,传递纯数据值(如 JSON/XML)全面取代了对象远程调用(CORBA/DCOM),证实了不可变接口在降低系统协调开销与实现位置灵活性上的巨大优势。 - [20:08](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1208s) 事实(Fact)源于过去,天然内嵌了时间属性;任何声称能“修改事实”的就地更新操作,在逻辑上都是对客观历史记录的破坏与信息维度的自我阉割。 - [21:28](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1288s) 有效的决策支持系统必须依赖跨时间的趋势分析与历史比对,将系统只保留为“当前最新状态”的快照使其彻底丧失了真正的信息价值。 - [24:27](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1467s) 程序员自身使用的核心生产力工具(Git、SVN 等版本控制系统和仅追加的运行日志)均建立在不可变时间序列之上,暴露出行业为客户构建就地覆写数据库的双重标准。 - [26:45](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1605s) “大数据”浪潮本质上是业务人员对破坏历史的传统数据库的抗议,业务端被迫转向未被破坏的系统日志,但靠在噪音充斥的日志上跑 MapReduce 是一种被动低效的妥协。 - [27:55](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1675s) 在云存储和海量内存的“太空时代”,物理空间成本不再是瓶颈,系统架构应践行“新事实需要新空间”的原则,依靠底层存储垃圾回收而非破坏性覆写来管理数据演进。 ## Detailed walkthrough ### [00:11](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=11s) 重新审视“信息”与所谓的“事实” Rich Hickey 以一个面向听众的简单提问拉开演讲序幕:“在座的各位谁在 IT 行业工作?”台下几乎所有人都举起了手。他接着追问 IT 究竟代表什么——大家脱口而出是“信息技术”(Information Technology)。但究竟什么是“信息”?Hickey 幽默地坦白,他在准备主题演讲时其实就靠翻字典,因为字典里有所有答案。根据字典定义,信息(information)源于动词“通知/告知”(inform),其本意是通过“事实”(facts)来传递知识,其目的则是“塑造心灵”(to give shape to the mind);因此,信息归根结底就是事实。 随后,Hickey 故意抛出了一段听起来合乎计算机日常直觉、实则荒谬至极的反讽论述。他假意定义道:“事实就是存储信息的地方,绝妙之处在于每条信息都有一个专属位置;事实拥有诸如 get 和 set 这样的操作来控制其变化,而且传递事实极其简单,只要传递它的地址或位置即可。”看到现场观众脸上浮现出的犹疑与尴尬,Hickey 随即揭晓谜底:“现在有多少人觉得不舒服?我也觉得很不舒服。这不是真的,对吧?这是错的。我刚才说的每一句话都错得离谱,你们理应感到不舒服,因为事实根本就不是这个样子的。” - “信息”(Information)的词源是 inform,即借由事实传达知识以塑造心智。 - 软件工程界常将事实扭曲为“存有 get 和 set 方法的存储地址”,这种混淆让程序员误把容器当成了内容本身。 --- ### [02:01](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=121s) 什么是“场所导向编程”(PLOP)及其历史成因 Hickey 深入剖析了程序员为何会把“事实”错误地等同于“场所”(Place)。查阅字典可知,“场所”是空间的某个特定部分,具有严格的边界和明确的指定性。在日常编程中,场所无处不在:内存地址和磁盘扇区就是最典型的场所,它们拥有固定地址,里面的内容可以被随意覆盖和替换。然而,用这些内存地址与磁盘位置搭建出来的系统,真的能被称为前文所定义的那种“信息系统”吗?在面向对象编程盛行的当下,可变对象(mutable objects)本质上只不过是对物理场所的一层微小抽象,它们上面附带的各种方法正是用来就地修改数据的;而在持久化层面,数据库表、文档和记录同样被当成一个个场所,依赖于就地更新(update in-place)的机制。 为了准确命名这种设计范式,Hickey 提出了一个词——PLOP(Place-Oriented Programming,场所导向编程)。“只要出现新信息替换旧信息的情况,你就是在进行场所导向编程。” ```mermaid flowchart LR accTitle: 场所导向编程的数据就地覆盖模型 accDescr: 展示场所导向编程中新数据直接覆写旧数据并导致历史丢失的过程。 subgraph PLOP["场所导向编程 (PLOP)"] A["旧数据/旧事实 (Old Fact)"] -->|"Update In-Place (覆写)"| B["固定场所 (内存地址 / 磁盘记录)"] C["新数据 (New Information)"] -->|"替代"| B B -.->|"历史状态被抹除"| D["信息丢失"] end ``` 这种做法之所以根深蒂固,是因为早期计算机硬件极度匮乏。Hickey 提到 Guy Steele 曾在一场演讲中回忆,当年他们在一台仅有 4k 字(words)内存的计算机上写程序,程序员必须精确知道每一个地址的用途:2000 开始的偶数地址做跳转表,另一块地址存数据,其他地址放代码;如果某段地址暂时不用来执行代码,就赶紧拿来临时存放数据。内存和磁盘极度昂贵且容量狭小,以“就地操纵场所”为核心的编程方式在当时不仅合理,而且是唯一的生存法则。 - PLOP 的核心特征:新信息直接抹去并覆盖旧信息(in-place update)。 - 软件抽象层未能掩盖场所属性:可变对象抽象了内存地址,数据库记录与文档抽象了磁盘扇区。 - 历史成因:早期硬件极度受限(如 Guy Steele 提到的 4k 机器),不得不反复覆用有限的物理单元。 --- ### [05:30](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=330s) 百万倍增长的鸿沟:被误解的“记忆”与“记录” Hickey 强调,场所导向编程的关键在于它“曾经合理”,但那种严苛的硬件限制早已不复存在。在他从事编程的岁月里,内存与磁盘的容量已经增长了整整一百万倍(a millionfold)。他打了个生动的比方:如果你的汽车突然变大了一百万倍,原先适用于它的物理规律和操作规则还能有几条依然成立?几乎一条都不会剩下。然而,软件行业却仍然死守着微型时代做出的决策不放,继续让 PLOP 统治整个领域。 究其根源,是因为计算机行业盗用了在计算机发明之前就已存在的人类词汇——“记忆/内存”(Memory)和“记录”(Record),并在几十年后彻底相信了自己编造的狭隘神话。Hickey 带领听众正本清源,重新审视这两个词在自然界与人类社会中的真实机制: ```mermaid flowchart TD accTitle: 真实记忆与计算机PLOP记忆的机制对比 accDescr: 对比生物记忆/人类簿记与PLOP基于地址覆写的本质区别。 subgraph Reality["现实世界真实运作方式"] R1["人类记忆:开放、联想式系统"] --> R2["朋友换新邮箱:增加新联想,不抹除旧脑细胞"] R3["传统簿记:石板/纸草/复式记账"] --> R4["账目变动:追加更正分录,禁止涂抹擦除"] end subgraph PLOPMyth["计算机界的神话 (PLOP)"] P1["RAM 内存芯片地址"] --> P2["就地更新指针与字段内容"] P3["数据库物理行/记录槽位"] --> P4["直接 Overwrite 覆写旧数据"] end ``` 真实的记忆是一个开放系统(open system)和联想系统(associative system),而非基于物理寻址的覆写机制。当你的朋友更换了新邮箱地址,你的大脑绝不会跑到特定神经元里把旧地址强行擦掉换上新的;同样,在计算机出现之前,人类在石板上雕刻、在莎草纸上写字,面对新信息绝不会拿砂纸把大理石磨平重新雕刻。传统的复式簿记系统几百年来从不允许使用橡皮擦,会计人员记录变更唯一的方式就是写入一笔“更正分录”(correcting entry),历史永远被完整保留。 - 硬件容量在 Hickey 的职业生涯中实现了百万倍的跨越,但底层架构思维却停留在资源极度匮乏的原始阶段。 - 生物学记忆是开放、关联式的,从来不是基于固定物理地址的内容替换。 - 商业簿记史的铁律:会计依托流水账与复式记账追加更正项,绝不依赖物理抹除(no erasers)。 --- ### [08:06](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=486s) 什么是“值”:不可变性与语义透明 在厘清了事实与场所的误区后,Hickey 切入本次演讲的核心主题——“值”(Values)。查阅字典,“值”的第一层含义是“相对价值/相对意义”(relative worth),这揭示了值必须具备可比性;第二层含义则是程序员最熟悉的度量或量度,比如数字 42,用来衡量事物的大小。但 Hickey 提醒大家,更深层次的“值”关乎意义与可比性,因为世界上不存在绝对的度量,任何度量都必须依托与其他事物的对比而存在。 为了把抽象的概念拉回代码,Hickey 现场做了一个调查:“字符串(String)是一个值吗?”台下有人举手赞成,有人举手反对,还有老练的开发者选择等待那个标准答案——“视情况而定”(It depends)。Hickey 追问到底取决于什么?答案正是:“它是否不可变。”如果一个字符串是不可变的,它就是一个值;如果是可变的,它就绝不是值。Hickey 反问:“有多少人在字符串是可变类型的语言中写过代码,又有谁愿意回到那个时代?”全场无人愿意倒退。字符串虽然不像数字那样表示数量大小,但不可变字符串赋予了系统可比性(comparability),而逻辑推理与系统决策的根基正是这种可比性:今天的状态与昨天相比是否一致?当前数据是否与预期相符? 在演讲的结尾部分,Rich Hickey 抛开字典的宏观定义,给出了编程语境下“值”的两大决定性特征: 1. **不可变性(Immutable)**:值不能被就地改变。 2. **语义透明(Semantically Transparent)**:值的存在目的就是毫无保留地向外界展现其自身,以便进行比较与相等性测试。 正如 Rich Hickey 所言:“值不是关于封装某种东西、提供方法并去执行操作;一个值是在表达‘拿我去跟别的东西比较吧,我的精确含义和重要性就直接写在我的外表标签上’,这就是值。”(“value is not about encapsulating something and methods and doing things; a value is about saying 'compare me to something else, I'm telling you what my precise meaning or significance is right on the label, right on the outside'—that's what a value is.”) - 字符串的本质判定:唯有不可变字符串(Immutable String)才具备作为“值”的资格。 - 可比性(Comparability)与等价判定(Equality test)是计算机进行逻辑推理、条件判断与状态溯源的基石。 - 值的两大支柱:不可变性(Immutability)与语义透明性(Semantic Transparency),它彻底摒弃了隐藏状态与方法副作用的传统面向对象封装模式。 ### [11:18](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=678s) 值的固有优势:共享、可重现性与易构造性 Rich Hickey 解释道,本次演讲的核心目的是剖析“值”的价值主张(value propositions of values),阐明为什么使用“值”会让编程变得更好。原本一小时的内容被压缩后节奏非常快,但他首先提炼出值最核心的若干特征。首先,值是天然可共享的。当你持有一个不可变的值时,完全可以放心地把它交给其他人,双方都不需要担心对方会篡改数据或者引发冲突,因为彼此引用的都是同一份不可变的值。 其次,值天然支持可重现的结果(reproducible results)。如果一个函数完全基于纯粹的值来定义,每次使用相同的值调用它,输出必然完全一致;而如果函数是围绕“位置”(places,即存放可变状态的内存单元)来定义的,每次运行的结果就会完全取决于该位置当前存放的内容。这种可重现性对测试至关重要。Rich Hickey 犀利地批评了当前主流的测试现状:“现在有太多人都在针对‘位置’跑测试,那些测试根本说明不了任何问题,说明不了任何问题;它们完全取决于你是否有能力将那个‘位置’重置回完全相同的状态、完全相同的‘值’。” 此外,值极其易于构造(easy to fabricate)。在任何编程语言中,开发者都可以随手从零捏造出一个值:一个字符串、一个字符串列表、一串数字、嵌套的数字列表,乃至嵌套列表的映射表(map)。这种普适性带来了巨大的元编程和测试优势。相反,如果代码依赖于某个语言内部特定的复杂接口,在其他语言或自动化测试环境中想要随手捏造一个测试实例几乎寸步难行。如果系统不是围绕值构建的,编写自动生成代码的程序或自动生成测试的程序就会变得异常困难。 - **自由共享无负担**:不可变性消除了共享带来的安全隐患与同步防御。 - **决定性与测试可靠性**:基于值的计算保证幂等与确定性,避免测试陷入对外部可变上下文环境重置的脆弱依赖。 - **极度轻量与可伪造**:通用的原始数据结构可以随时随地实例化,极大降低代码生成与自动化测试的门槛。 --- ### [13:16](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=796s) 泛用性与聚合性:超越面向对象的特异性与锁困境 值的另一个关键属性是语言无关性(language independent)与通用性(generic)。列表、字符串、数字、哈希表等概念完全超越具体的编程语言,它们是高度通用的逻辑抽象。Rich Hickey 警示大家,现代软件设计往往忽视了追求“过度特异性”(specificity)所付出的惨痛代价。在类似 Java 这样的典型面向对象语言中,开发者习惯为每个新想法都写一个专属的新类,为每种新事物都创建一个新封装,进而引发代码量的恶性爆炸。关于这一点,Rich Hickey 直击面向对象的痛处并说道:“对象本应支持代码复用,结果它们起到了完全相反的作用,尤其在类型化语言中,你几乎得不到任何复用,因为你每次都在发明全新的东西,而更多代码意味着什么?更多代码立竿见影地等同于更多 Bug。” ```mermaid flowchart TD accTitle: 对象组合与值聚合的复杂度对比 accDescr: 展示面向对象模型在组合时导致锁策略和克隆语义失效,而值模型在聚合时自然保留不可变属性。 subgraph OOP["面向对象(基于位置与可变对象)"] O1["独立类 A<br/>(自定义锁策略与深拷贝)"] O2["独立类 B<br/>(自定义锁策略与深拷贝)"] Comp["组合对象 Composite(A, B)"] Fail["锁策略失效<br/>克隆语义崩溃<br/>必须全盘重新设计"] O1 --> Comp O2 --> Comp Comp --> Fail end subgraph VAL["值模型(不可变数据聚合)"] V1["不可变值 A"] V2["不可变值 B"] VComp["聚合数据结构 [A, B]"] Keep["继承全部优势<br/>天然线程安全<br/>无锁、免复制"] V1 --> VComp V2 --> VComp VComp --> Keep end ``` 更核心的洞见在于:“值聚合之后依然是值”(values aggregate to values)。开发者普遍接受单个数字 42 或一个不可变字符串是一个值,但往往面对不可变集合时就觉得难以想象。Rich Hickey 强调,既然现代程序员早已没有人愿意再去摆弄可变字符串,那又为何还要在集合层面忍受可变集合?不可变集合拥有一致的优良属性。相比之下,如果采用可变对象,在并发环境下就必须为每个类设计一套锁策略(locking policy)和克隆语义(cloning semantics);然而一旦把几个各自定义了锁策略的对象组装成一个复合对象,原先的锁策略和克隆语义并不能自动复合,而是全盘失效,迫使工程师不得不在白纸上为复合结构重新发明一套同步与复制逻辑。但在值的世界里,不可变组件聚合而成的整体依然是不可变值,所有的优势原封不动地传递给聚合体。 - **特异性的代价**:无节制地创建特化类导致代码膨胀与 Bug 激增,阻碍真正的数据复用。 - **聚合保持性**:不可变元素的集合依然是不可变值,其安全性和简洁性具有数学归纳般的传递性。 - **组合崩溃难题**:可变对象的并发锁策略和拷贝机制不具备组合性(composability),在系统组装时极度脆弱。 --- ### [16:15](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=975s) 传递、感知与记忆:系统层面的不可变接口与位置灵活性 在系统交互与通信中,值的优势展现得淋漓尽致。Rich Hickey 指出,当你想传递信息时,发送一个“值”可以确保接收方看到的内容与你感知到的内容完全一致;反之,如果你传递的是一个指向“位置”的引用,你实际上什么信息都没有传达,因为对方读取该位置时,其内容可能已经被修改得面目全非。这在数据感知(perception)上体现为严重的协调开销:如果要观察一组基于“位置”的可变对象,为了确保读取一致,程序不得不发出“请全世界停下来”的指令,通过粗暴的锁机制冻结变更;否则转头看下一个位置时,上一个位置可能已经突变。在记忆(memory)机制上同样如此:程序在运行中遇到一个对象若想记录下来,光存一个引用是无效的,必须将其深克隆(clone),而克隆具体怎么做完全是个不可控的黑盒。 Rich Hickey 呼吁开发者“跳出单机与单进程的局限”,将视线放大到整个系统架构。在系统间通信领域,行业事实上早已全面投奔了值驱动的设计——CORBA 和 DCOM 等基于远程对象引用的技术早已被历史淘汰,取而代之的是纯粹承载值的 JSON 和 XML。这种将值作为接口协议的做法,极大解耦了网络两端的系统。 关于大型系统中的事务与读取开销,Rich Hickey 痛批了违背常理的读取锁:“在物理世界中我们彼此相望,我们根本不需要叫停一切才能看清对方;因此,当我们基于值进行编程,并将值用于数据存储时,我们再次降低了协调开销,并赢得了位置灵活性(location flexibility)。” 当系统由传递值的独立进程组成时,无论把其中某个组件用更快的语言重写,还是迁移到单独的线程或物理机,都极其轻而易举。相反,若在语言内部充斥着特定于运行时的可变对象引用与复杂接口绑定,这些“恶劣的设计”就会将代码牢牢锁死在单一语言、单一线程和单一机器中。 - **精确通信与零快照成本**:传递值即传递确凿的事实,避免读取脏数据与加锁等待。 - **分布式接口标准的演进**:RPC 时代对象传递(CORBA/DCOM)的惨败印证了跨网络传递纯数据值(JSON/XML)的正确性。 - **物理视角的读事务反思**:依赖锁机制的“读事务”违背直觉,不可变值使得读取无需协调,兼得并发吞吐与架构部署的位置灵活性。 --- ### [20:08](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1208s) 事实即值:将时间融入信息与事实的本质 回到信息技术(Information Technology)的本源,Rich Hickey 重新审视了“事实”(facts)的定义。他首先明确断言:“关于事实的第一个事实是:事实就是值,它们不是‘位置’。”他调侃说演讲开篇展示的可变幻灯片根本就是个谎言。许多人直觉上认为事实是在不断改变的——例如一个国家原本有一位总统,后来换了一位新总统,这难道不是事实被改变了吗? Rich Hickey 强调事实绝不会被修改,因为**事实本身就内嵌了时间(facts incorporate time)**。他查阅词典指出,语言词汇的词源揭示了一切:“事实(Fact)”源自拉丁语的过去分词,意为“已经发生的事情”或“已知存在的事物”。Rich Hickey 强调:“事实就是已经发生的事情,它不是一个你可以去更改的位置;比尔·克林顿曾是总统,他曾是总统这件事将永远是一个事实。我们可以迎来新总统,那是一条全新的事实,就像你可以拥有一个新的电子邮箱地址一样。” 在信息系统的构建中,仅仅记录“最近的事实(recent facts)”是极其狭隘且不足的。如果系统只保留当前覆盖后的最新状态,就等于彻底抛弃了历史事实与时间维度。唯有认识到事实是内嵌时间、永恒不变的值,才能真正理解信息的本质,并构建出忠实记录客观世界的健全系统。 - **事实的不可变性**:事实是内嵌时间戳的历史记录,发生即成为永恒,具有与值完全一致的不可篡改特征。 - **更新的本质是累加**:新事件的出现只是产生了“新的事实”,而非对“旧事实”的原地擦除与改写。 - **状态覆盖对信息的破坏**:将数据库等同于只保留当前快照的可变位置,本质上是对系统信息维度的自我阉割。 ### [21:28](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1288s) 信息系统的本质:事实、时间与决策支持 信息的根本目的在于“告知”(inform)并传递知识,而知识源于对事实的归纳与推演。在现实世界中,人们做决策时必须依赖多维度对比:对比不同的时刻、对比两个不同的事物,以及在不同时间点上组合事实。Rich Hickey 设问:如果一个人只知道世界上每项属性或状态在“当前这一瞬间”的取值,其决策能力会变成什么样?答案显而易见:“那将糟糕透顶,绝对是一场灾难。”然而荒谬的是,软件行业目前所构建的绝大多数系统,却恰恰只保留最新的一组事实,对历史一无所知,却标榜自身是“决策支持系统”。 这一设计缺陷的核心症结在于混淆了更新与事实的定义。事实是对过去事件的记录,而过去是无法篡改的。Rich Hickey 斩钉截铁地指出:“The bottom line is you can't update a fact, right? And the reason why you can't update a fact is because you can't change the past and that's what facts are: they're documentation of the past.”如果真正构建面向“信息”的系统,系统底座必须以维护、操作并向用户展示事实为核心。虽然程序必然包含处理流程——就像工厂里的流水线机器,有装卸码头、传送带和分类分流逻辑——但工具与信息有着本质差异。行业最大的失误,就是把适用于机械过程的“位置”(Place)概念强加到了信息模型之上。 - 信息的决策价值取决于时间维度:比较过去与现在、识别发展趋势、衡量变化速率、跨时段累加数据。 - 事实的不可变性:任何对事实的所谓“原地更新”(update-in-place)在逻辑上都是不成立的,因为过去的发生无法撤销。 - 过程与信息的严格剥离:机器过程用于搬运和流转,但信息本身绝不是机器;内存地址或存储位置纯粹是计算机硬件的物理产物,在业务信息模型中没有任何存在的理由。 ```mermaid flowchart TD accTitle: Information and Fact vs Place-Oriented Processing accDescr: 区分机器处理过程与不可变事实信息模型的系统流向图 subgraph Process["机械处理过程(Process / Machine)"] A["输入流 / 外部事件"] --> B["传送带 / 流水线处理"] B --> C["分流与路由转换"] end subgraph Facts["不可变事实模型(Information / Facts)"] D["时刻 T1 发生的事实"] E["时刻 T2 发生的事实"] F["时刻 T3 发生的事实"] end subgraph Decision["决策支持能力(Decision Support)"] G["趋势分析 / 变化率计算 / 历史比对"] end C -->|"追加记录新事实"| F D & E & F --> G ``` --- ### [24:27](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1467s) 程序员的双重标准:从我们自身的 IT 工具看版本控制与日志 程序员其实心知肚明这一理念的正确性,因为在构建供自己使用的 IT 基础设施时,程序员从未采用过“原地覆盖”的愚蠢方案。程序员日常的核心资产是源代码,运营核心是运行系统并维护其状态信息。回顾开发人员为自身打造的工具:在版本控制领域,没有人会直接用一个操作系统文件夹做版本管理,每次写了新代码就直接把旧文件覆盖掉;更没有人会使用一个连时间戳和提交日期都没有的版本控制系统。离开这些时间序列信息,没有任何软件团队能够理清项目的演变并作出正确的工程决策。 在生产系统运维上更是如此。系统运行时,工程师会进行巨量、详尽的日志记录(Logging)。Rich Hickey 调侃道:有谁会用一个“原地更新”的日志系统?又有谁会接受一条日志里只写着“最后一次延迟是 5 毫秒”,然后把上一条覆盖掉?这种设想引得现场哄堂大笑。任何正常的日志都会在每行记录中附带精确的时间戳。工程师在排查故障、观测系统行为时,完全依赖对历史事件在时间线上的回溯。这证明人类本能地知道,一旦丢失了不可变的时间事实序列,任何分析与决策都无从谈起。 - 版本控制实践:Git、SVN 等系统均通过不可变的快照与时间序列记录代码演进,绝不允许破坏性覆盖。 - 运维监控实践:日志(Logs)是严格的“仅追加”(append-only)数据结构,时间戳是每条事件的必备属性。 - 逻辑断层:工程师为自己开发工具时极其明智地恪守了“保留历史、记录时间、事实追加”的准则,却在为企业客户设计业务数据库时倒退回原地覆盖修改的陈旧模式。 --- ### [26:45](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1605s) 大数据的真相:业务日志对传统数据库的降维打击 当前所谓“大数据”(Big Data)浪潮的本质,在很大程度上源于业务人员对程序员发出的讽刺性抗议。业务端实际上是在对研发团队说:你们给自己运维用的那套数据库(日志),比你们卖给我用来做业务的数据库好用得多。因为为业务设计的数据库每次只记录最新的一条信息,一旦发生更新,历史记录灰飞烟灭;而工程师的系统日志,却完整、忠实地记录了企业运转中发生过的每一笔交易、每一次点击和每一个时刻。面对原地更新后空空如也的业务数据库,业务人员只能回过头来求助程序员,试图从海量日志里挖掘有价值的商业情报。 然而,Rich Hickey 指出,依靠在原始日志上跑 MapReduce 是一种被动且低效的补救手段。日志中混杂了大量底层运行时的噪音和无用堆栈信息,格式脆弱且难以高效利用。信息技术本应掌握更高级的数据建模方式,设计出既具备关系型数据库的表达与检索能力,又具备日志那样的不可变、带时间戳特性的新型数据库。行业之所以陷入在垃圾日志中掘金的尴尬境地,完全是因为长久以来未能将业务事实与时间维度原生融入核心存储系统之中。 > “I will contend that a certain percentage of big data is this: it's businesses telling programmers, 'That database you have, I like better than the one you gave me, because the one that you gave me only remembers the last thing I told it, and your database, your logs, they know everything that happened in our business.'” — Rich Hickey --- ### [27:55](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1675s) 告别“位置”走向“太空时代”:新事实需要新空间 从词源学和物理学的视角来看,“空间”(Space)在最古老的定义中就从来不是一个单纯的静态几何概念,而是始终同时包容了“地点”(Place)与“时间”(Time)。在早期的计算机体系中,5MB 的硬盘售价高达数千美元,受制于极其昂贵的物理介质,程序员被迫在极其有限的固定“位置”上反复覆盖抹写旧数据。但在现代计算环境下,资源边界已经被彻底打破:如果在内存中调用 `new` 永不失败,如果 Amazon S3 永远无法被填满,那么系统实际上不再运行于受限的“位置”之中,而是运行在辽阔无垠的“空间”(Space)之中。 既然物理成本的束缚已经灰飞烟灭,信息系统的设计哲学就应当彻底转变:**新事实需要新空间(New facts require new space)**。系统每产生一条事实,就应当在新的空间中追加写入,而不是去覆盖过往的事实。随着这种范式的推进,内存领域成熟的垃圾回收(Garbage Collection)机制必然会扩展到持久化存储领域:存储系统将自动管理历史价值与冷热数据,而不再要求上层应用为了节约空间而牺牲不可变性。 - 物理资源现实的逆转:曾经极其昂贵、仅有数兆字节且动辄耗资数千美元的磁盘已成为历史,现代云存储与大内存使得持续追加存储在经济上完全可行。 - 空间概念的跃升:当资源边界不可见(如 S3 的近乎无限扩展),编程模型应顺理成章地告别边界限制与原地修改,拥抱真正的“太空时代”(Space Age)。 - 存储层进化的必然方向:持久化存储将迎来类似 JVM 垃圾回收的治理策略,由底层基础设施自动化处理废弃状态,上层业务数据则始终享有不可变的事实视图。 --- ### [30:02](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1802s) 终局总结:重塑面向信息的程序架构 在演讲的结尾,Rich Hickey 表达了深切的忧虑与紧迫的呼吁。令人沮丧的是,整个行业至今仍在大量设计制造基于“位置”的新工具——新诞生的编程语言和数据库依然延续着几十年前就已失去存在依据的原地更新模式。这种做法在至少五到十年前就已经脱离了硬件发展的现实。固守旧模式让软件系统白白丧失了不可变值带来的并发安全、易于推理、可回溯等海量红利。 业务层面对时间感知、历史趋势分析的迫切需求已经通过大数据浪潮暴露无遗;软硬件基础设施的资源储备也已准备就绪。唯一的阻碍在于开发者的思维定势。程序员必须停止在自己的工具(源码管理与日志)里享用“太空时代”的先进红利,却转头给业务系统制造充斥着原地覆写隐患的落后架构。Rich Hickey 最终呼吁全场工程师从根本上摈弃“基于位置的编程”,全面转向以不可变值和纯粹事实为核心的“面向信息的软件构建方法”。 > “What I would recommend is that you try to take an information-oriented approach to the way you build your programs.” — Rich Hickey ## Notable quotes > [21:28](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1288s) The bottom line is you can't update a fact, right? And the reason why you can't update a fact is because you can't change the past and that's what facts are: they're documentation of the past. — Rich Hickey > [13:16](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=796s) 对象本应支持代码复用,结果它们起到了完全相反的作用,尤其在类型化语言中,你几乎得不到任何复用,因为你每次都在发明全新的东西,而更多代码意味着什么?更多代码立竿见影地等同于更多 Bug。 — Rich Hickey > [20:08](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=1208s) 事实就是已经发生的事情,它不是一个你可以去更改的位置;比尔·克林顿曾是总统,他曾是总统这件事将永远是一个事实。 — Rich Hickey > [02:01](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=121s) 只要出现新信息替换旧信息的情况,你就是在进行场所导向编程。 — Rich Hickey > [16:15](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=975s) 在物理世界中我们彼此相望,我们根本不需要叫停一切才能看清对方;因此,当我们基于值进行编程,并将值用于数据存储时,我们再次降低了协调开销,并赢得了位置灵活性。 — Rich Hickey > [08:06](https://www.youtube.com/watch?v=-6BsiVyC1kM&t=486s) value is not about encapsulating something and methods and doing things; a value is about saying 'compare me to something else, I'm telling you what my precise meaning or significance is right on the label, right on the outside'—that's what a value is. — Rich Hickey ## Mentioned Rich Hickey, Guy Steele, Bill Clinton, Clojure, Datomic, JaxConf 2012, InfoQ, Java, Amazon S3, MapReduce, Git, SVN, CORBA, DCOM, JSON, XML ## Video description In this keynote speech from JaxConf 2012, Rich Hickey, creator of Clojure and founder of Datomic gives an awesome analysis of the changing way we think about values (not the philosphoical kind) in light of the increasing complexity of information technology and the advent of Big Data. The broad subject of the talk makes it worth watching for almost anyone in the programming world, and was one of the highlights of the JaxConf lineup. If you like the talk, check out Hickey's other appearance at JaxConf2012 here: http://marakana.com/s/rich_hickey_on_deconstructing_the_database,1261/index.html [Source](https://www.youtube.com/watch?v=-6BsiVyC1kM)

Source quotes

[21:28] Rich Hickey: The bottom line is you can't update a fact, right? And the reason why you can't update a fact is because you can't change the past and that's what facts are: they're documentation of the past. [13:16] Rich Hickey: 对象本应支持代码复用,结果它们起到了完全相反的作用,尤其在类型化语言中,你几乎得不到任何复用,因为你每次都在发明全新的东西,而更多代码意味着什么?更多代码立竿见影地等同于更多 Bug。 [20:08] Rich Hickey: 事实就是已经发生的事情,它不是一个你可以去更改的位置;比尔·克林顿曾是总统,他曾是总统这件事将永远是一个事实。 [2:01] Rich Hickey: 只要出现新信息替换旧信息的情况,你就是在进行场所导向编程。 [16:15] Rich Hickey: 在物理世界中我们彼此相望,我们根本不需要叫停一切才能看清对方;因此,当我们基于值进行编程,并将值用于数据存储时,我们再次降低了协调开销,并赢得了位置灵活性。 [8:06] Rich Hickey: value is not about encapsulating something and methods and doing things; a value is about saying 'compare me to something else, I'm telling you what my precise meaning or significance is right on the label, right on the outside'—that's what a value is.

Source quotes

[27:55] Rich Hickey: Information systems should have a different approach: they should say that new facts require new space. [21:28] Rich Hickey: And the reason why you can't update a fact is because you can't change the past and that's what facts are: they're documentation of the past. [21:28] Rich Hickey: One of the big takeaways should be that place—that all of your constructs related to place—have no role at all in an information model.

Original transcript

[0:02] [Music] [0:11] uh so the value of [0:14] values who here Works in [0:18] it everybody I think right uh what does [0:22] that mean what does that stand for [0:24] it Information Technology yes so uh [0:31] yeah or other things so uh so what do we [0:33] mean when we say [0:34] information uh as you may know from my [0:37] other Keynotes all I do to make a [0:39] keynote is I use my [0:41] dictionary because my dictionary has all [0:43] the answers my dictionary says [0:45] information is based on the word [0:48] inform which means to convey knowledge [0:50] via facts and the purpose of that is to [0:53] give shape to the mind and information [0:57] is just those facts that's what [0:59] information is information is [1:02] facts so what's a [1:05] fact a fact is a place where information [1:08] is [1:10] stored and what's great about that is [1:13] that there's a place for every piece of [1:17] information and facts have [1:19] operations like get and set and they may [1:22] have other [1:23] operations and uh those operations [1:25] control how facts can [1:28] change and the other great thing about [1:31] facts is that they're they're it's easy [1:33] to convey them to convey a fact we just [1:35] convey its [1:38] location how many people are [1:40] uncomfortable right [1:43] now I am this is not true right this is [1:47] wrong everything I just said was wrong [1:50] dead [1:51] wrong and you should be uncomfortable [1:54] this is not what facts [1:55] are right so are facts places well [2:01] what's a [2:02] place again back to the dictionary a [2:05] place is a particular portion of space [2:08] and space is an important word uh we're [2:10] going to dig into [2:12] later uh and in particular the the part [2:16] about place that matters is the fact [2:17] that it's sort of delimited right there [2:20] there is a specificity to the to the U [2:24] to the location named by a place or vice [2:27] versa and we know about places right we [2:29] have [2:30] good uh examples of places in our [2:33] everyday work in programming right [2:35] memory addresses our places dis sectors [2:38] or places they have you know [2:40] addresses and we can go to them and we [2:42] can substitute their contents with other [2:45] contents and we're very familiar with [2:47] this notion of a place but I think it's [2:51] quite important to think about whether [2:54] or not with these memory addresses and [2:56] dis locations we're actually building [2:59] information [3:01] systems that are about information as we [3:04] just defined it in particular we use [3:08] memory and we use objects typically [3:12] especially at this conference and [3:15] mutable objects are nothing more than [3:17] abstractions over places they're little [3:20] abstractions that are over places [3:23] especially you know well in particular [3:25] mutable objects and they have methods [3:27] just like the thing I talked before [3:28] about about facts having methods and [3:32] objects have methods and this is the [3:35] this is the core thing we're Building [3:36] Systems out of and on the other side on [3:38] the on the durability side we have the [3:41] same kinds of Notions we have tables and [3:43] documents and records all of which are [3:46] places all of which have an update [3:48] notion right the notion of going to the [3:50] place and setting it to be a new [3:53] value right these are the these are the [3:56] underpinnings from which we build [3:58] systems but we [4:00] we're sort of making abstractions on top [4:02] of them that don't hide what they're [4:05] about and and I have a word for this I [4:07] or a term for this which I call plop [4:10] Place oriented programming which is what [4:12] this is and you can tell when it's going [4:15] on because anytime new information [4:18] replaces old information you're doing [4:20] Place oriented [4:23] programming there's a reason we do Place [4:27] oriented programming because way back in [4:30] the early days of computers we had to do [4:32] Place oriented programming right I saw a [4:35] guy steel to give a great talk where he [4:37] was talking about working you know [4:38] building these systems on a a a computer [4:41] that had four kilow words of memory and [4:45] every piece of memory you knew the [4:47] address you knew that the even number [4:48] addresses starting at 2000 were used for [4:51] a jump table these other addresses over [4:53] here were used for data and other parts [4:56] of the addresses were used for code and [4:57] sometimes they were used for more than [4:58] one thing because you knew like right [5:00] now no one's using this for code so we [5:02] can use it for data and vice versa you [5:04] had to do it right there wasn't enough [5:06] capacity to do anything else computer [5:08] memories were really small discs were [5:10] very small everything was very [5:13] expensive right so we adopted an [5:16] approach to programming that was based [5:18] around the manipulation of places it [5:20] totally made [5:22] sense um and and the key word there the [5:25] key aspect of that is it made sense it [5:28] used to make sense [5:30] right those limitations are gone in the [5:33] time that I've been doing programming [5:36] the capacity of these two things have [5:38] increased a [5:40] millionfold a [5:42] millionfold what other thing in life you [5:45] know has the same facts about it um [5:47] remain true when the size of something [5:49] changes by a millionfold imagine if your [5:51] car was a million times bigger than it [5:53] is what rules would still be would still [5:56] apply what characteristics would still [5:58] be true almost nothing but yet we're [6:01] we're retaining decisions we made when [6:03] things were much much smaller and and [6:06] and moving forward with them so why does [6:09] plops still rule it's the key question [6:11] here right when we talk about Place [6:13] oriented programming we ofer talking [6:14] about these two things memory and [6:17] Records right um these words had [6:19] meanings before we had computers [6:22] yeah right and we've we've taken them [6:25] over we've said uh you know memory means [6:29] addresses in in RAM chips and Records [6:32] mean you know slots in in database [6:35] tables uh and worse than just taking [6:37] over these words because obviously [6:38] there's a limitation to the number of [6:40] words and the analogies roughly hold [6:42] right the analogies between memory and [6:45] memory and your head roughly hold U but [6:48] the problem is we we've now been doing [6:50] this for so long that we believe our own [6:53] myths about what these things mean but [6:55] we should go back to the facts of memory [6:58] and Records right the fact of memory is [7:00] that it's an open system right if your [7:03] friend gets a new email address right [7:06] that doesn't go into your brain and find [7:09] your friend's email address cells and [7:12] replace his email address in that part [7:14] in you know those neurons in your brain [7:16] that's not how brains work that's not [7:17] how memory Works memory is essentially [7:20] an open system and it's an associative [7:22] system it is not an address based [7:26] system right same thing recordkeeping we [7:29] used to keep records before we had [7:30] computers what did we do you know we [7:33] took out the stone tablets and we [7:34] chiseled a thinger we took out the [7:35] Papyrus and we wrote stuff down right [7:38] when we had new information what did we [7:39] do we did not go and like Smooth over [7:43] the marble and chisel new stuff we [7:44] didn't go to the Papyrus and take out [7:47] erasers and things like that and people [7:48] built accounting systems before there [7:50] were computers and they didn't use [7:51] erasers either right what did they use [7:54] double entry accounting and Ledger based [7:55] accounting they only made correcting [7:57] entries they did not go back with AAS [7:59] ERS that's not the way things worked [8:02] before we had [8:04] computers so this talk is about values [8:07] so it's another term we should Define [8:09] and again we just go back to the [8:11] dictionary there's some very interesting [8:13] definitions for Value right uh first is [8:16] relative worth and relative is ends up [8:18] being a very critical aspect of values [8:21] right because the next thing is the one [8:23] we probably are most familiar with [8:25] especially in computers right because [8:26] this next definition is the one that [8:28] applies like 42 right it's a magnitude [8:31] it's a number it's something we use to [8:34] measure something else and that notion [8:35] of a value I think is the one we're most [8:37] readily able to adapt uh but again the [8:41] bigger notion of value is about meaning [8:43] and about comparability and about [8:46] relative worth that's the bigger notion [8:48] of value right because um because you [8:50] when you measure something you have to [8:52] measure it in terms of something else [8:54] there's no absolute [8:56] measurements right so the comparing part [8:58] is important [9:00] so the question right now is is a string [9:03] of value how many people think it [9:06] is I love doing the answer the questions [9:08] by raising your hands because not [9:10] everybody has hand apparently how many [9:12] think string is not a [9:15] value how many people think it [9:17] depends right you always wait for it [9:20] depends right it's the best answer just [9:22] so you hold out for it right what does [9:25] it depend [9:27] on is it immutable [9:29] right if the string is immutable it's a [9:31] value if it's not immutable it's not a [9:33] value right how many people worked in [9:35] programming languages or still do where [9:37] strings were [9:39] mutable how many people want to go [9:42] back no we don't like this and and it [9:46] ends up that this uh that this equality [9:49] notion of value because right now string [9:50] doesn't measure something right it's not [9:52] a magnitude or an amount it doesn't [9:54] correspond to that definition of value [9:56] um but it ends up that an immutable [9:59] string is a comparable thing right and [10:02] comparability is where we derive um our [10:05] ability to do logic and to make [10:07] decisions right until we can say is this [10:09] the same as it was yesterday is it [10:11] greater or less than what it was you [10:13] know does the string label this thing [10:16] correctly you know according to my [10:18] understanding of it um or anything else [10:20] we do with information that [10:22] comparability and equality test is sort [10:24] of at the bottom and that goes back to [10:25] that other notion of value so we really [10:28] don't we really do not want to go [10:30] back right so now we want to sort of [10:32] talk about values not from the [10:34] dictionary definition but very [10:35] specifically in terms of what we do in [10:37] programming and and there are lots of [10:39] nuances to this but for the purpose of [10:41] this talk given it's a half hour I'm [10:43] just going to focus on two values are [10:46] immutable right and values are [10:48] semantically transparent is the purpose [10:51] of a value is to expose itself to you so [10:54] you can do that comparison and that [10:56] equality test right value is not about [10:59] encapsulating something and methods and [11:02] and doing things right a value is about [11:04] saying compare me to something else I'm [11:07] telling you what my what my um what my [11:10] precise meaning or significant is [11:13] significance is right on the label right [11:15] on the outside that's what a value is [11:18] about so you know the reason to give [11:21] this talk is to talk about sort of the [11:22] propositions of the value propositions [11:25] of values what makes values good um and [11:28] originally this was an hour long so this [11:30] is going to go a little bit fast but [11:32] there's a bunch of characteristics of [11:34] values that are [11:37] valuable the first is that values can be [11:39] shared right if you have a value if you [11:41] have an immutable thing can you give [11:43] that to somebody else and not [11:44] worry yes you don't have to worry do [11:47] they have to worry about you now because [11:48] you both now refer to the same value [11:51] anybody have to worry no right so values [11:54] can be shared that's very very [11:57] valuable values support reproducible [12:00] results right if you define a function [12:02] in terms of values every time they call [12:04] that function with the same values will [12:06] you get the same answer yes if you [12:09] define a function in terms of places [12:10] every time you run that function will [12:12] you get the same answer no right it [12:14] depends on what's in the place right [12:16] reproducible results really matter they [12:18] allow you to run tests and reproducible [12:20] tests so many people are running tests [12:22] now of of places they don't tell you [12:24] anything they don't tell you anything [12:26] they're all conditional upon your [12:27] ability toing bring that place back to [12:29] the same place to the same value right [12:34] another critical aspect of values is [12:35] that they're easy to fabricate right you [12:38] can make up a value from scratch in any [12:41] programming language quite readily right [12:43] can you make a string in any programming [12:45] yeah can you make a list of strings sure [12:46] a list of numbers yeah a list of a list [12:48] of numbers yeah a map of a list of [12:50] numbers yeah right can I make an [12:52] instance of your fancy interface in any [12:56] other language no right it's not easy to [12:59] fabricate that it's not easy to make [13:01] programs that write programs it's not [13:02] easy to make programs that write tests [13:05] if your if your programs are not based [13:07] around values so the fact that values [13:09] are easy to fabricate um is [13:13] important all [13:16] right values are language independent [13:19] Right started to talk about that already [13:21] right the notion of a list or a string [13:23] or a number or a map this has nothing to [13:27] do with the programming language those [13:28] things I just said nothing at all right [13:30] nor any of the Aggregates of those [13:32] things has nothing to do with that [13:34] they're [13:35] generic right these ideas the the [13:37] Notions of values are [13:39] generic right uh and I think it's it's [13:43] something that we don't think about [13:45] often enough in our programming designs [13:47] and our systems about the actual costs [13:50] of specificity right we love specificity [13:53] we use Java every new idea gets a new [13:56] class every new thing gets a new thing [13:59] right what does that cause to [14:00] happen you get this explosion of code [14:04] just a tremendous explosion of code [14:06] objects were supposed to support reuse [14:08] they've done the exact opposite thing [14:09] especially in typed languages you get [14:12] very little reuse because you make a new [14:13] thing every time and what does more code [14:16] mean more code equals more [14:19] bugs right away another interesting [14:23] thing about values is values aggregate [14:24] to values and this is something I really [14:27] want you to focus on right we talked [14:29] about 42 we talked about a string we [14:30] talked about sort of atomic thing right [14:32] but a list of immutable things is itself [14:36] an immutable thing and so on and so [14:39] forth so as you build Aggregates those [14:41] bigger things are also values and I [14:44] think that we tend to stop we say of [14:45] course string should be immutable but an [14:47] immutable collection I can't even [14:50] comprehend it but you should right it [14:52] has all the same um desirable attributes [14:56] that that immutable string did nobody [14:57] here wanted to program with mutable [14:59] strings anymore why do you want to [15:01] program with mutable collections anymore [15:03] you shouldn't and there's really [15:05] important um uh benefits you get from [15:08] doing this for instance compare it to [15:11] objects if you have an object and you [15:13] want to share it what do you have to do [15:15] you have to define the object you have [15:16] to find an interface for it and [15:17] everything else but then you have to do [15:19] what what if it's in a concurrent [15:21] environment what do you have to have for [15:22] that [15:23] object some sort of locking policy right [15:26] very very difficult thing in fact a lot [15:28] of languages don't give you any [15:29] resources for defining it well right [15:31] it's like there's this napkin and on it [15:33] we've defined how we're going to use [15:34] this object right but if you've done [15:37] that and there's also other kinds of [15:38] problems like how do you copy it what [15:40] what are the cloning semantics whatever [15:42] you let's say you've done that work and [15:43] you've done that work for every one of [15:45] your classes right and now you build [15:48] something that's a composite of those [15:50] things do you get a lock policy from [15:52] combining them no it all falls away you [15:55] have to do it all do over again this [15:57] composite of all these things for which [15:59] I have lock policies now no longer has a [16:02] lock policy I have to come up with a new [16:03] one I have to come up with a new cloning [16:04] policy and everything else over again [16:07] values aggregate to values all the [16:09] benefits apply to [16:12] Aggregates um there are other um [16:15] benefits you get from values and we see [16:16] these all the time right values are easy [16:18] to convey right if I have some piece of [16:21] information I think is useful I can send [16:23] you that value and I know I've [16:24] communicated to you what I was seeing [16:27] right if I see something interesting and [16:30] I communicate to you the place where I [16:32] saw it what have I actually conveyed to [16:35] you nothing right not the information [16:38] that's for sure because you can go look [16:40] at that place and see something totally [16:41] different from what I saw it works the [16:43] other way as well right when I want to [16:46] perceive something right if it's a value [16:49] I can take my time and look at it right [16:51] especially if it's a set of values right [16:53] if it's a composite thing if I want to [16:56] perceive something that's based around [16:57] places how how do I do that there's a [17:00] bunch of places I want to sort of look [17:02] at it what do I have to [17:04] do I have to stop the world please stop [17:08] while I look at these places because [17:09] otherwise I'll look at one and as I turn [17:11] my head to the other something will have [17:12] changed by the time I've sort of [17:14] perceive the whole thing I don't know [17:15] that I had anything consistent I don't [17:17] know that I'm making a decision based on [17:19] anything [17:20] consistent and this also goes to memory [17:22] right how do you remember anything if [17:24] you encounter an object during the the [17:26] course of your program running and you [17:28] want to remember it what what do you [17:31] do do you just store the [17:35] reference not good enough right what do [17:38] you have to do clone it how do you do [17:42] that depends exactly it's a [17:46] pends okay so the other thing I want you [17:49] to do is start thinking bigger bigger [17:51] than your box bigger than your process [17:53] right because these value propositions [17:55] extend to your [17:57] systems right and in particular values [18:00] make the best interfaces now here I [18:03] don't think we have any arguments I [18:04] think we're already doing this right [18:06] what do you send around on the [18:08] wires anybody still using corba or [18:12] decom no no they died for good reasons [18:16] right we now use values right we send [18:19] around Json or XML or you know if you [18:22] have to but both are both are um [18:24] representations of values and that [18:27] allows us to build interfaces to things [18:30] that are easy to change on both ends the [18:33] other aspect of values that's very [18:34] interesting especially in the large but [18:36] it's also true in the small right we [18:37] talked about how do I perceive something [18:39] I have to lock the world down that [18:41] applies in the large as well how many [18:43] people ever have heard of read [18:45] transactions yeah how many people like [18:47] read [18:48] transactions no right the whole idea is [18:52] is counterintuitive and violates physics [18:56] right in physics we just look at each [18:57] other we we don't have to stop [18:59] everything in order to look at things so [19:02] when we're programming with values and [19:04] using values especially in storage we [19:06] again have reduced [19:08] coordination and another benefit we get [19:11] is location flexibility right if in the [19:13] small you build a system and the system [19:16] is defined in terms of uh processes that [19:18] are communicating values and you decide [19:21] you know what that part of the system um [19:23] I want to rewrite that in a faster [19:24] language or I want to run it on a [19:26] different [19:26] box is that straightforward to do if [19:29] you're using objects and specific things [19:32] related to your programming language if [19:33] I if I'm passing Java interfaces it's [19:35] easy for me to rewrite or let's say Ruby [19:37] interface is it easy for me to write [19:38] rewrite that in Java no right right we [19:43] we know we we don't do this in the large [19:45] right in the large we don't do this in [19:46] the large we communicate values but in [19:48] the small in our programming language we [19:49] start doing icky things and those icky [19:52] things keep us from being able to move [19:55] stuff we can't move it to another thread [19:57] we can't move it to another language we [19:58] can't move it to another box but if [20:00] we're using values we can that I would [20:03] call location [20:04] flexibility so let's get back to inform [20:08] uh information technology and back to [20:10] facts so the first fact about facts is [20:13] that facts are values right they're not [20:17] they're not places right that slide up [20:20] front was a [20:21] lie everybody's sitting there saying but [20:24] don't facts change right don't we have a [20:26] president at one time then we have a new [20:27] president [20:29] president [20:30] no they don't because facts incorporate [20:35] time how is that what does that mean [20:38] again the dictionary knows [20:41] everything because what does fact mean [20:43] fact means something that [20:46] happened something known to have [20:48] happened or existed it comes from Latin [20:51] and it comes from a past participle in [20:53] Latin that means something that happened [20:56] a fact is something that happened [20:59] happen it's not a place it's not [21:01] something you can change right Bill [21:03] Clinton was President the fact that he [21:05] was President will always be a fact we [21:09] can have new presidents that's a new [21:11] fact just like you can have new email [21:13] addresses right the other thing about [21:15] facts is that it's very important when [21:18] you consider facts that it's [21:21] insufficient for you to consider recent [21:24] facts and again we'll get back to the [21:26] whole point of information right [21:28] information is to inform right so that [21:31] people can uh convey [21:34] knowledge but knowledge is derived from [21:37] facts right when we when we try to make [21:39] decisions we compare times we compare [21:42] two different things we combine facts [21:45] and especially we use different time [21:47] points [21:48] imagine if you only knew the present [21:52] value of any property or attribute in [21:54] the world how good would your [21:56] decision-making capability be [21:59] be it would be awful it would be [22:02] absolutely terrible and yet we are [22:05] building systems that only know the most [22:07] recent set of facts we don't know [22:09] anything else but we're supposed to be [22:11] making information and decision-making [22:13] support systems right so the bottom line [22:17] is you can't update a fact right and the [22:20] reason why you can't update a fact is [22:22] because you can't change the past and [22:24] that's what facts are they're [22:25] documentation of the [22:26] past so let's go back and sort of [22:29] revisit what would it mean to build [22:31] information systems that are about [22:33] information it would mean that the [22:35] systems would be fundamentally about [22:37] facts they would be about maintaining [22:39] facts manipulating facts right and [22:42] presenting facts to users to give them [22:44] leverage right so they can make [22:46] decisions now we think we're doing this [22:48] right when we're in Information [22:49] Technology we think we're building [22:51] systems that are decision support [22:53] systems right but we're not using [22:56] infrastructure that's fact oriented [22:59] right in in in the most bottom level [23:03] notion before you even get to the [23:05] temporal aspect of facts we should [23:07] certainly be building systems that are [23:08] value [23:10] oriented now that's not to say the [23:12] programming languages shouldn't have [23:14] process oriented constructs of course [23:16] they should but we don't distinguish [23:18] them right if you look at any program [23:20] it's going to have sort of two two [23:22] different parts right there's going to [23:24] be the part of your program that's sort [23:25] of like a machine right it's got a [23:28] loading dock and stuff comes in you put [23:30] it on the conveyor belt and it moves and [23:32] then it gets sorted and gets split and [23:34] some stuff goes over here and some other [23:35] stuff goes over there right all programs [23:37] have this aspect of themselves which is [23:39] process oriented and it's sort of like a [23:41] machine right and we build programming [23:44] languages that make allow us to use [23:46] constructs that are analogous to Little [23:48] Machines they do stuff the problem is we [23:51] apply that technology to everything [23:53] including to information and information [23:56] is not a little machine [23:58] it's not at all like a machine and so [24:01] you have to separate out these process [24:03] constructs and in particular one of the [24:05] big takeaway should be that place right [24:08] that all of your constructs related to [24:10] place have no role at all in an [24:12] information model right they are [24:15] artifacts of the way computers work they [24:17] have nothing to do with what your [24:18] software is supposed to be accomplishing [24:20] if your software is supposed to be [24:21] accomplishing information [24:24] management and decision support so one [24:27] of the great things about this talk is I [24:31] think you all already know this right [24:35] right because we do decision- making [24:37] right we know what it takes to support [24:39] our own decision making we're constantly [24:42] comparing the present to the Past right [24:44] we're trying to spot Trends we're trying [24:46] to see the rate of change we need to add [24:49] stuff up that's happened over time we [24:51] almost always need a temporal aspect [24:54] right so how can I tell you I know this [24:56] is true well it's it's really [24:58] straightforward we're programmers we [25:00] have stuff to do we have our own little [25:02] businesses right we make stuff what do [25:05] we [25:06] make what are we act what's our concrete [25:09] artifact we make source code right and [25:12] then we have an operations aspect to [25:14] what we do what do we do we run our [25:17] programs and we maintain information [25:18] about both these things let's look at [25:22] programmer it let's look at our own it [25:24] systems the ones we build for ourselves [25:28] Source control is it updated in place [25:31] how many people use a a directory on the [25:33] file system for Source control and when [25:35] you have a new when you have a new edit [25:36] to your program you just put it in the [25:39] directory you really don't want to raise [25:41] your [25:43] hand no of course not it's not update in [25:46] place anybody use a source control [25:47] system that doesn't have dates and times [25:48] on stuff no of course not how would we [25:52] possibly know what we were doing how [25:53] could we possibly make the decisions we [25:55] need to do to run our little software [25:57] business business if we didn't have this [25:59] information no [26:01] way okay what about our operations it we [26:05] run our systems what do we do with our [26:07] running [26:08] systems we log we log and log and log we [26:13] we keep track of everything that's [26:14] happening right anybody use an update in [26:17] place log anyone use a log that says the [26:19] last latency was [26:21] five yeah [26:24] no anybody use a log that doesn't put [26:26] time stamps on every entry no of course [26:30] not how could we possibly understand [26:32] what our systems were [26:34] doing right if we didn't have this [26:36] information how could we make decisions [26:38] we know there's no way no way so we [26:42] don't do [26:43] this [26:45] so big data it's all [26:48] connected what is Big Data I will [26:51] contend that a certain percentage of big [26:53] data is this it's businesses telling [26:56] programmers that data database you have [26:59] I like better than the one you gave me [27:01] because the one that you gave me only [27:02] remembers the last thing I told it and [27:04] your database your logs they know [27:06] everything that happened in our business [27:08] you know everything you have times for [27:10] everything let's go mine that find so [27:13] find some good business decision-making [27:15] information because my database it [27:17] doesn't have it it doesn't remember the [27:18] last it doesn't remember anything other [27:20] than the last thing right the logs have [27:24] all the information the logs have the [27:25] time stamps but I think it's really sort [27:27] of shame here because we're being [27:29] reactive in this area right mining logs [27:33] we know much better ways to represent [27:35] information we know how to store [27:36] information in ways that's leverageable [27:39] right logs are not that map reduce over [27:41] logs are not that logs are full of crap [27:43] too right they're full of stuff about [27:45] the program operation itself there is [27:47] business value information in there we [27:49] haven't built databases to store that [27:51] yet um but that's our that's sort of our [27:53] fault so I think we're moving into what [27:56] I would like to call the space [27:58] age right one more definition space the [28:02] Unlimited expans in which all things are [28:05] located and all events [28:07] occur what's really interesting about [28:09] the definition of space is that it has [28:11] always if you go back to the oldest [28:13] definitions in the oldest languages the [28:16] definition of space has always [28:17] Incorporated both place and time it's [28:22] never been something that applied only [28:23] to one or the other of those two things [28:26] it's always connected the two and [28:27] there's a certain physics aspect to that [28:30] so if new never fails if you can call [28:33] new day after day 247 over and over and [28:36] over again you are not running in a [28:40] place you're running in [28:42] space you're not seeing the edges of [28:45] things you're not delimited you need new [28:47] stuff you get it right if S3 never fills [28:51] up that's not the [28:53] cloud that's space right if every time [28:56] you want to put a file on S3 it says [28:58] sure are you worried about the edge of [29:01] of it right most of the times we don't [29:03] worry about the edge of space I mean [29:04] maybe you do but I [29:07] don't so Information Systems should have [29:11] a different approach they should say [29:13] that new facts require new space right [29:17] this should be the end of place oriented [29:19] programming we've had the facilities to [29:21] do this for a very long time right if [29:23] you could afford to do this why would [29:25] you do anything else anybody feel like I [29:27] wish I could log but I [29:29] can't my disc is only 5 [29:31] megabytes everybody anybody ever have a [29:33] 5 megabyte disc cost thousands of [29:36] dollars yeah it's not that's not that's [29:39] not that way anymore [29:40] right right so you can afford to do this [29:44] right lots of interesting things will [29:45] happen when you take this approach a lot [29:47] of the things that happen in memory with [29:49] garbage collection are going to happen [29:50] with storage right there will be G [29:54] garbage but that's okay right these are [29:57] things that we're learning about how to [30:00] manage so to [30:02] summarize unfortunately I think we [30:05] continue to use Place oriented [30:07] programming um and the rationale is gone [30:10] and the the sadder thing is we continue [30:12] to make new things that are like this [30:15] brand new programming languages and [30:17] brand new databases right that still [30:19] take this approach still use a place [30:22] orientation that's been invalid for at [30:25] least a decade but certainly for the [30:26] last five years right the rationale is [30:29] gone we're missing out on all those [30:33] benefits I listed before and I could [30:36] talk to you about any one of those [30:37] benefits for an hour there's a huge [30:39] number of benefits to to using values we [30:43] recognize them right look at our [30:44] information systems for that we use for [30:46] ourselves we're proving we already know [30:48] this right we don't overwrite our logs [30:51] we don't override our source control [30:52] we're already we're in the space age for [30:55] ourselves but we need to be in the space [30:57] age for the businesses we're supporting [30:59] right there's definitely demand for this [31:01] this whole big data push and Mining logs [31:03] and everything else and tracking [31:05] everything and keeping the time of [31:06] everything businesses know there's [31:08] tremendous value here they want it the [31:11] demand is quite obvious we have the [31:13] resources to do it and I think that the [31:16] challenge is to make sure that we do and [31:20] what I would recommend is that you try [31:22] to take an information oriented approach [31:25] to the way you build your programs [31:29] [Applause] [31:36] [Music] [31:42] thanks