Bret Victor Urges Technologists to Abandon Craft for Moral Principles

Bret Victor - Inventing on Principle — Rui Oliveira

Rui Oliveira

Severing a creator's immediate connection to their medium strangles ideas before they mature, turning tool design into an ethical duty rather than a business opportunity.

AI-assisted summary of Bret Victor - Inventing on Principle — original source. Check the original for full context.

Source published:

Key ideas

  • Bret Victor challenges conventional career advice by advocating for discovering and following a guiding principle—a fundamental belief about what is necessary, important, and right—rather than merely pursuing passion or mastering a craft. (0:07)
  • Victor's foundational principle is that creators need an immediate connection to what they are creating, demonstrating through prototypes that removing the compile-run delay across code, circuit design, and animation unlocks entirely new creative discoveries. (1:12)
  • The presentation frames technological invention as a form of social activism: rather than viewing broken tools as market opportunities, technologists can identify invisible cultural wrongs and fight them through principled invention, exemplified by Larry Tesler's crusade against software modes. (35:39)
  • Victor identifies three distinct career paths in technology—the Craftsman, the Problem Solver, and the Principle-Driven Pioneer—urging creators to develop actionable, binary principles that objectively evaluate whether work is right or wrong. (47:40)

Detailed notes

## Background This talk, titled "Bret Victor - Inventing on Principle," was published on YouTube by Rui Oliveira on February 22, 2012. The video has a run time of 54 minutes and 20 seconds, with no additional show notes or description provided on the page.

## TL;DR Bret Victor challenges the conventional career advice of following one's passion, advocating instead for dedicating one's work to a guiding moral principle. He presents his own core belief—that creators require an immediate connection to what they are making—and substantiates it through revolutionary prototypes spanning live code execution, dynamic game design, algorithm visualization, active circuit analysis, and performance-based animation. Victor contrasts this principled inventor archetype with traditional craftsmen and problem solvers, examining historical pioneers like Larry Tesler, Douglas Engelbart, Alan Kay, and Richard Stallman who identified invisible cultural wrongs and fought to overturn them through invention.

## Atmosphere & style The presentation carries a quiet, mesmerizing intensity, combining deadpan wit with the moral gravity of a manifesto. As Victor seamlessly builds and manipulates jaw-dropping interactive prototypes live on stage, the audience is pulled from awe at the software mechanics into deep philosophical reflection on human potential and systemic limitations. The emotional arc transitions from technical delight to a poignant sense of ethical urgency, leaving listeners feeling challenged to re-examine their own life trajectories and awaken from passive career defaults.

## Bulletin - [00:07](https://www.youtube.com/watch?v=PUv66718DII&t=7s) Bret Victor challenges conventional career advice by advocating for discovering and following a guiding principle—a fundamental belief about what is necessary, important, and right—rather than merely pursuing passion or mastering a craft. - [01:12](https://www.youtube.com/watch?v=PUv66718DII&t=72s) Victor's foundational principle is that creators need an immediate connection to what they are creating, demonstrating through prototypes that removing the compile-run delay across code, circuit design, and animation unlocks entirely new creative discoveries. - [35:39](https://www.youtube.com/watch?v=PUv66718DII&t=2139s) The presentation frames technological invention as a form of social activism: rather than viewing broken tools as market opportunities, technologists can identify invisible cultural wrongs and fight them through principled invention, exemplified by Larry Tesler's crusade against software modes. - [47:40](https://www.youtube.com/watch?v=PUv66718DII&t=2860s) Victor identifies three distinct career paths in technology—the Craftsman, the Problem Solver, and the Principle-Driven Pioneer—urging creators to develop actionable, binary principles that objectively evaluate whether work is right or wrong.

## Key takeaways - [00:07](https://www.youtube.com/watch?v=PUv66718DII&t=7s) Following a guiding principle offers a transformative alternative to conventional career advice about following passion or mastering a predefined craft. - [01:12](https://www.youtube.com/watch?v=PUv66718DII&t=72s) Creators need an immediate connection to their work; any delay or hidden state between making a decision and seeing its effect snuffs out fragile creative ideas. - [02:32](https://www.youtube.com/watch?v=PUv66718DII&t=152s) Traditional programming severs creative connection by forcing developers into a blind cycle of text editing, mental simulation, and delayed compilation. - [04:06](https://www.youtube.com/watch?v=PUv66718DII&t=246s) Direct visual manipulation and instantaneous feedback allow artists and engineers to discover unexpected behaviors and iterate rapidly. - [07:18](https://www.youtube.com/watch?v=PUv66718DII&t=438s) Bidirectional inspection between code and rendered canvas eliminates the cognitive overhead of mentally tracking which line of syntax produces which output. - [11:23](https://www.youtube.com/watch?v=PUv66718DII&t=683s) Designing dynamic systems embedded in time requires mapping time to space, allowing creators to see past and future trajectories simultaneously. - [16:24](https://www.youtube.com/watch?v=PUv66718DII&t=984s) The idea of skilled software engineers as people who are 'good at playing computer' is a failure of tooling; computers should execute code live and reveal state automatically. - [23:11](https://www.youtube.com/watch?v=PUv66718DII&t=1391s) Electrical schematic capture and modern programming environments still suffer from obsolete historical constraints inherited from paper sketches, punch cards, and teletypes. - [29:06](https://www.youtube.com/watch?v=PUv66718DII&t=1746s) Replacing discrete keyframe interpolation with direct performance interfaces enables creators to capture physical intuition and nuanced timing in digital media. - [35:39](https://www.youtube.com/watch?v=PUv66718DII&t=2139s) Principle-driven inventors do not treat broken tools as commercial opportunities or research topics; they see them as moral wrongs and assume personal responsibility to correct them. - [38:08](https://www.youtube.com/watch?v=PUv66718DII&t=2288s) Larry Tesler's creation of modeless text editing (including cut, copy, and paste) was not an incremental technical feat, but an activist campaign against an accepted cultural wrong. - [42:05](https://www.youtube.com/watch?v=PUv66718DII&t=2525s) Pioneers like Douglas Engelbart, Alan Kay, and Richard Stallman were driven by grand moral and social principles rather than the pursuit of software features or gadgets. - [47:40](https://www.youtube.com/watch?v=PUv66718DII&t=2860s) Technology careers broadly fall into three archetypes: the Craftsman (honing a skill), the Problem Solver (addressing field-defined issues), and the Principle-Driven Pioneer (fighting for an unrecognized cause). - [50:02](https://www.youtube.com/watch?v=PUv66718DII&t=3002s) Finding a personal principle requires broad experimentation across varied disciplines, using different experiences as diagnostic mirrors to analyze what one genuinely cares about. - [51:38](https://www.youtube.com/watch?v=PUv66718DII&t=3098s) Actionable guiding principles must avoid vague platitudes like 'make things simple' and instead provide sharp, objective tests that unambiguously cleave design decisions into right and wrong.

## Detailed walkthrough ### [00:07](https://www.youtube.com/watch?v=PUv66718DII&t=7s) Following a Principle Instead of Passion

Bret Victor opens his talk by setting expectations with deadpan humor, contrasting his presentation with the preceding session: unlike that speaker, he has no prizes to hand out, announcing instead, “I'm just going to tell you how to live your life.” He explains that early in a career, people receive endless advice about “following your passion” or “doing something you love.” Victor advocates for an entirely different path: discovering and following a guiding principle—a fundamental belief about what is necessary, important, and right—and using that principle to direct all of one's life's work.

He outlines the talk in three distinct parts: 1. The personal principle that guides his own creative and technical work, illustrated through concrete software prototypes. 2. The lives and motivations of other historical figures who lived by distinct guiding principles. 3. A reflective takeaway intended to prompt the audience to consider their own core beliefs and choose how they wish to direct their careers.

As Victor emphasizes: > “I'm going to talk about something kind of different I'm going to talk about following a principle finding a guiding principle for your work something you believe is important and necessary and right and using that to guide what you do.”

---

[01:12](https://www.youtube.com/watch?v=PUv66718DII&t=72s) The Core Principle: An Immediate Connection for Creators

Victor grounds his philosophy in the primacy of ideas. To him, bringing ideas into the world is among the most essential human activities. In the form of great art, literature, inventions, or scientific discoveries, ideas take on independent lives that lend meaning to the human experience. Having spent years designing, using, and meditating on creative software, Victor has sought to understand the ideal environment required for ideas to take root and flourish.

This obsession crystallized into a single foundational principle: > “Creators need an immediate connection to what they're creating so that's my principle creators need an immediate connection to what they create and what I mean by that is when you're making something if you make a change or you make a decision you need to see the effect of that immediately there can't be a delay and there can't be anything hidden readers have to be able to see what they're doing.”

```mermaid flowchart LR accTitle: Immediate Connection vs Traditional Loop accDescr: Comparison between the disconnected edit-compile-run cycle and the immediate connection model.

subgraph Traditional["Traditional Edit-Compile Cycle (Broken Connection)"] direction TB T1["Mental Model / Imagination"] -->|"Blind Code Edit"| T2["Text Editor"] T2 -->|"Wait: Compile & Run"| T3["Rendered Output"] T3 -.->|"Delayed Correction"| T1 end

subgraph Immediate["Victor's Principle (Immediate Connection)"] direction TB I1["Creator Mind"] <-->|"Continuous Direct Feedback"| I2["Code & Visual Sync"] end ```

---

[02:32](https://www.youtube.com/watch?v=PUv66718DII&t=152s) The Flaw in Conventional Coding

Victor examines traditional programming through the lens of this principle. Under standard conditions, a developer writes lines of code inside a plain text editor, laboriously simulating the program's execution inside their head. To see what actually happens, the programmer must break concentration, invoke a compiler or runtime, and inspect the resulting output. Victor demonstrates this using a standard JavaScript program rendering a landscape with mountains and a tree onto an HTML5 canvas.

Whenever an artist-programmer notices an error or conceives of an adjustment, they must context-switch back to the code, modify the syntax blindly, recompile, rerun, and check the output again. Because the vast majority of time is spent typing invisibly in a text editor without continuous sensory feedback from the canvas, the tool fundamentally severs the creative connection. To resolve this violation, Victor built a custom coding environment side-by-side with the rendering canvas, ensuring absolute synchrony: any modification typed into the code updates the drawing instantly with zero compile-run overhead.

---

[04:06](https://www.youtube.com/watch?v=PUv66718DII&t=246s) Direct Manipulation and Serendipitous Discovery

Once visual feedback becomes instantaneous, the interaction model can expand beyond typing characters on a keyboard. Victor demonstrates how numeric parameters can be adjusted dynamically: pointing a cursor at an integer controlling the length of the tree branches and holding down the Control key turns the value into a dial. Dragging the value up and down allows him to watch the branches stretch and contract in real time, enabling him to converge visually on an aesthetically pleasing balance.

This live manipulation exposes unforeseen phenomena that could never emerge from static compilation. Victor inspects a `for` loop that draws 16 pink blossoms onto each branch. As he scrubs the blossom count up and down around 20, the rapid movement produces a shimmering, organic vibration across the canvas that resembles wind rustling through foliage.

Reflecting on this unexpected discovery, Victor underscores the role of continuous feedback in artistic insight: > “How would I ever have discovered that if I had to compile and run between every change so much of art so much of creation is Discovery and you can't discover anything if you can't see what you're doing.”

---

[05:31](https://www.youtube.com/watch?v=PUv66718DII&t=331s) Live Autocomplete and Color Modification

Victor demonstrates that adding new code should be just as immediate as tweaking numbers. Moving to the end of his `drawSky` function, he intends to paint a sun. As soon as he begins typing `context.fill`, a specialized autocomplete menu surfaces available drawing primitives (`fillCircle`, `fillRect`, `fillText`). Rather than forcing the programmer to memorize API documentation or guess the behavior from a function signature, cycling through the autocomplete items immediately renders the visual result directly on the canvas preview.

After selecting `fillCircle`, he interactively adjusts the $X$ and $Y$ coordinates alongside the radius. When specifying color with `context.fillStyle`, the editor defaults to white. By holding Control over the color token, a visual color palette pops up. While browsing yellow hues for the sun, Victor notices that the initial pure white circle against the blue sky unexpectedly looked like a moon. Shifting the surrounding sky color to black instantly transforms the setting into a nighttime scene—an effortless creative pivot triggered purely by seeing the unintended intermediate state.

As Victor notes: > “Hey look it's nighttime so having this immediate connection allows ideas to surface and develop in ways that would be impossible before.”

---

[07:18](https://www.youtube.com/watch?v=PUv66718DII&t=438s) Bidirectional Navigation Between Code and Canvas

Even with live execution, a cognitive barrier persists: developers still have to mentally track which line of text produces which visual artifact. To eliminate this mental mapping, Victor implements bidirectional inspection using the Option key: - **Code to Canvas:** Holding down the Option key turns the mouse cursor into a magnifying glass. Scrubbing down lines in a function selectively highlights the exact graphical element drawn by that line on the canvas—such as differentiating between two identical calls to `drawMountain`. - **Canvas to Code:** Hovering the magnifying glass over any pixel in the rendering causes the editor to instantly jump to and highlight the exact line of source code responsible for drawing that pixel (e.g., jumping from the mountain, to the tree, to an individual blossom).

This tight two-way correspondence turns navigation into an effortless visual gesture. Victor shows how rapidly he can tweak an entire composition: clicking the sun to enlarge its radius, jumping straight to the tree to elevate its base, and clicking the mountain to alter its ridge line within fractions of a second.

Victor states the critical stakes of immediate iteration: > “If there's any delay in that feedback loop between thinking of something and seeing it and building on it then there's there's whole world of ideas which which will just never be these are thoughts that we can't think.”

---

[09:33](https://www.youtube.com/watch?v=PUv66718DII&t=573s) The Fragility of Ideas and Moral Conviction

Victor shifts from software mechanics to the deeper emotional rationale behind his work. Ideas, he explains, do not arrive fully formed; they begin as tiny, fragile intuitions that need an environment where a creator can patiently nurse, protect, and guide their development. When a creative environment introduces lag or opacity, these fragile concepts are snuffed out before they ever have the chance to mature.

For Victor, fixing tools is not a matter of usability conventions: > “And because ideas are so precious to me when I see this principle violated when I see ideas stillborn or stunted because the Creator couldn't see what they're doing I feel that's wrong and not wrong in the sense of violating some UI guideline or going against some best practice but wrong in a deeper sense than that.”

---

[10:22](https://www.youtube.com/watch?v=PUv66718DII&t=622s) Bringing Immediate Connection to Interactivity and State

Recognizing that the static landscape drawing had no persistent state, time, or user input, Victor turns to the challenge of applying his principle to dynamic systems. To demonstrate this, he brings up a playable 2D platforming game.

The screen shows a small player character who runs around the platforms, jumps, and dies upon hazards, with the physics, collision logic, and motion code displayed directly beside the game view. In the lower corner sits an immobile turtle character whose behavioral logic is incomplete. Victor announces that he will live-code the turtle's movement across the level by writing an update expression for each clock tick—setting `turtle.x += turtle.direction * (1/60) * speed`—setting up a demonstration of how live state, historical time scrubbing, and interactive debugging can obey the same absolute law of immediate connection.

[11:23](https://www.youtube.com/watch?v=PUv66718DII&t=683s) Controlling and Visualizing Time in Game Design

Bret Victor continues tweaking his platformer game live on screen. Inspecting an enemy turtle's behavior, he shows how tweaking the speed variable changes everything: a positive value makes it walk forward, zero freezes it, and a negative value makes it walk backwards. He notes that while these are mechanics he could reuse for other enemies, "Turtles are supposed to be slow," so he settles on an appropriate walking pace. Higher up in the script, collision logic dictates that when the player character lands on the turtle, the player receives an upward vertical velocity bounce while the turtle is temporarily stomped flat before getting back up.

```mermaid flowchart LR accTitle: Mapping Time to Space in Platformer Jump Tuning accDescr: Diagram illustrating how interactive timeline scrubbing and trajectory path visualization solve design blindness. subgraph Iteration["Traditional Live Tuning"] A["Pause Game State"] --> B["Scrub Timeline Slider"] B --> C["Simulate Ahead with Recorded Inputs"] end subgraph Spatialization["Mapping Time to Space"] C --> D["Toggle Motion Path Trail"] D --> E["Past Path (Where He's Been)"] D --> F["Future Path (Where He's Going)"] F --> G["Tweak Bounce Code in Real Time"] G --> H["Visual Arc Aligns Directly with Passage"] end ```

The design problem arises when Victor tests the level design: he wants the player to bounce off the turtle directly into a narrow lower passageway to solve puzzles elsewhere before returning for the star, rather than overshooting onto the high platform above. The turtle is initially too bouncy. Victor lowers the bounce parameter in code, but now it is underpowered. Even though live code editing eliminates recompilation and restarting, he still cannot directly observe whether the jump clears the obstacle.

To resolve this blind spot, Victor pauses gameplay and demonstrates a scrubber interface that rewinds through time. Because previous keyboard strokes are preserved, the engine can re-simulate the player's path forward using the updated logic. Yet Victor rejects this as insufficient: "This is not good enough. I need to be able to see changes immediately. I need to be able to see immediately whether or not my bounciness is correct. None of this stuff. And if you have a process in time and you want to see changes immediately, you have to map time to space."

Victor enables a trajectory path button. With time mapped directly to space, the screen renders two paths: a trailing line showing where the avatar has already traveled, and a projected forward path visualizing the character's exact future trajectory based on recorded inputs. As he drags the bounce variable in the code editor, the spatialized future arc bends dynamically on screen. He dials it until the curve slips precisely into the lower slot, hits play, and the avatar lands the maneuver effortlessly. He emphasizes:

> “If you're designing something embedded in time, you need to be able to control time. You need to be able to see across time; otherwise you're designing blind.”

[14:38](https://www.youtube.com/watch?v=PUv66718DII&t=878s) Immediate Feedback and Game Mechanic Discovery

With direct control over variables and mechanics, Victor shows how fast prototyping turns into gameplay invention. By dialing the gravity constant slightly into negative values, the character floats off the ground, allowing him to balance mid-air through micro-adjustments. He points out that this single manipulation could form the entire core mechanic of an independent game. In fact, tinkering with almost any isolated statement yields viable design concepts.

As a demonstration, Victor comments out the line handling leftward movement; the character can only step right. While seemingly trivial or silly, he points out that indie designer Terry Cavanagh built the acclaimed title *Don't Look Back* around that exact restriction. Cavanagh explored another mechanic in his hit platformer *VVVVVV* (spelled as the letter V six times), where jumping is omitted entirely in favor of inverting gravity so the player falls upward toward the ceiling or downward to the floor. Victor recreates this behavior on screen, sketching out inverted terrain challenges where obstacles must be cleared by flipping gravity back and forth. Immediate manipulation of code parameters exposes rich gameplay possibilities that would otherwise remain hidden behind slow compile-and-test loops.

- In Terry Cavanagh's *Don't Look Back*, directional movement limitations form an expressive narrative and gameplay mechanic. - Cavanagh's *VVVVVV* strips out the jump button, basing the entire puzzle-platforming challenge on gravity inversion between floors and ceilings.

[16:24](https://www.youtube.com/watch?v=PUv66718DII&t=984s) Abstract Programming and the Myth of "Playing Computer"

Victor shifts focus from visual graphics and game design to abstract algorithmic programming. Both the recursive art tree and the platformer level were naturally visual domains where code mapped cleanly to pictures on screen. To test whether his core principle holds for purely symbolic logic, he examines how developers implement generic data structures and algorithms, taking binary search as a baseline case.

He gives a brief refresher on the mechanics of binary search: given a sorted array and a target key, the algorithm tracks two pointers—the lower and upper bounds of the search space. By inspecting the midpoint of this window, the search discards half the remaining candidates each step depending on whether the middle item is larger or smaller than the key, narrowing until the item is located.

``` Binary Search Mental Model: Array: [ A, B, C, D, E, F ] Indices: 0 1 2 3 4 5 ^ Mid (Subdivide range based on comparison) ```

Looking at conventional syntax on a screen, Victor laments that ordinary source code displays only syntax keywords like `array`, concealing the underlying data structures. Programmers are forced to execute mental models of array indices, state flags, and step-by-step memory updates:

> “And to a large extent, the people that we consider to be skilled software engineers are just those people that are really good at playing computer. But if we're writing our code on a computer, why are we simulating what a computer would do in our head? Why isn't the computer just do it and show us?”

[18:04](https://www.youtube.com/watch?v=PUv66718DII&t=1084s) Writing Binary Search Without a Blindfold

Victor demonstrates a coding environment designed around instant state inspection. Declaring a function signature `binarySearch(key, array)`, the environment immediately prompts the programmer on the right half of the canvas: provide concrete example inputs so the computer can execute the logic live. He provides an array `['A', 'B', 'C', 'D', 'E', 'F']` and sets the target search key to `'D'`.

As he writes each line of code, the right side displays the evaluated values alongside the symbolic statements: 1. Setting `low = 0` displays `low = 0`. 2. Setting `high = array.length - 1` immediately evaluates to `high = 5`. 3. Calculating the midpoint with `mid = (low + high) / 2` instantly outputs `2.5`.

Because `2.5` is an invalid array index, Victor catches the bug the moment he finishes typing it. He wraps the expression in `Math.floor(...)` to yield index `2`, remarking: “I caught that bug literally the second I typed it, instead of writing the entire function and 20 unit tests.”

Victor pastes in the comparison conditional: because the midpoint element (`'C'`) is smaller than the key (`'D'`), the display highlights the active execution branch adjusting `low = mid + 1`. He verifies alternative branches by momentarily altering the search key to smaller values or directly to `'C'`, observing the return statement execute on the very first probe.

```mermaid flowchart TD accTitle: Iteration Columns for Binary Search Execution accDescr: Columns showing the concrete variable values across the three execution iterations of binary search. subgraph Iteration1["Iteration 1 (Mid: C)"] I1A["low = 0, high = 5"] --> I1B["mid = 2 ('C')"] I1B --> I1C["'C' < 'D' -> low = 3"] end subgraph Iteration2["Iteration 2 (Mid: E)"] I2A["low = 3, high = 5"] --> I2B["mid = 4 ('E')"] I2B --> I2C["'E' > 'D' -> high = 3"] end subgraph Iteration3["Iteration 3 (Match Found)"] I3A["low = 3, high = 3"] --> I3B["mid = 3 ('D')"] I3B --> I3C["Match found -> return 3"] end Iteration1 --> Iteration2 Iteration2 --> Iteration3 ```

Wrapping the body inside a loop (`while (true)`), the environment unrolls the loop into three side-by-side vertical columns: - **Column 1:** The window spans indices 0 through 5. The value `'C'` is too small, pushing `low` up to 3. - **Column 2:** The narrowed window spans indices 3 through 5. The value at index 4 (`'E'`) is too large, pulling `high` down to 3. - **Column 3:** `low` and `high` converge at index 3 (`'D'`), hitting the return statement and terminating the search.

When Victor alters the test key to `'G'`, an element absent from the array, the loop columns run off indefinitely without returning. Inspecting the runaway columns, he pinpoints the exact iteration where the algorithm fails: an iteration where `low` exceeds `high`, signaling that the search range has collapsed. Seeing the invalid state directly on screen, he changes the loop condition to `while (low <= high)` and appends a sentinel return value for missing keys. The view snaps to three clean iterations followed by the failure sentinel. Victor describes this experience as writing algorithms without a blindfold, reiterating that while this software conference setting inspired programming demonstrations, his principle extends far beyond software into every medium of creative work.

[23:11](https://www.youtube.com/watch?v=PUv66718DII&t=1391s) Visualizing Circuit Dynamics: Replacing Hidden Voltages with Live Data

Bret Victor turns to electrical engineering to demonstrate that the need for immediate connection spans far beyond software. Finishing the drawing of a schematic on screen, he sets a value to 1.2 and jokes, “and now we have a working circuit I mean I assume it's a working circuit I don't actually see anything working here.” This highlights a shared flaw between writing code and schematic capture: the practitioner is trapped working inside a static representation, completely divorced from the underlying data. In electrical circuits, the variables are the voltages across wires changing over time. On a physical lab bench, an engineer would at least probe individual nodes using an oscilloscope or observe physical outputs like blinking LEDs.

```mermaid flowchart TD accTitle: Evolution of Circuit Representations accDescr: Transitions from static schematics to real-time interactive data-driven representations.

subgraph Step1["Static Schematic"] A["Squiggly Symbols<br/>No visible data"] end

subgraph Step2["Probed Waveforms"] B["Voltage Plots at Nodes<br/>Oscilloscope traces"] C["Ghosting Comparisons<br/>Drag parameter slider"] end

subgraph Step3["Data-Dense Representation"] D["Components as Current Plots<br/>Badges identify type"] E["Simultaneous View<br/>Voltage + Current over time"] end

Step1 --> Step2 --> Step3 ```

To eliminate the mental simulation of invisible electrons, Victor expands the circuit view to display voltage waveforms at every single node simultaneously. Instead of forcing the engineer to imagine circuit behavior, the environment exposes the dynamic data directly: - **Direct scrubbing and live simulation**: Users can run the simulation in real time or simply scrub the cursor across waveforms to inspect behavior at specific temporal moments. - **Node comparison through ghosting**: Mousing over any node casts a semi-transparent shadow (ghost waveform) over all other node plots, allowing instant differential comparisons across the entire topology. - **Immediate change feedback**: Dragging a slider on a 70k resistor updates all circuit waveforms in real time, leaving a ghosted trace of the previous waveform behind to visually highlight the difference before and after the change. As Victor summarizes: “Two golden rules of information design show the data show comparisons that's all I'm doing here.”

[26:32](https://www.youtube.com/watch?v=PUv66718DII&t=1592s) Rethinking the Medium: From Paper Symbols to Active Data

Displaying voltage alone remains inadequate because analog engineering fundamentally revolves around the interplay between two distinct data types: voltage and current. Victor takes the schematic interface a step further by spreading the elements out and replacing every passive component symbol with a live plot of the current flowing through it over time. Each component is represented as a blue box containing its current waveform, tagged with a small icon badge in the corner indicating whether it is a resistor, capacitor, or transistor.

```mermaid flowchart LR accTitle: Historical Constraints on Programming Representations accDescr: Diagram tracing historical hardware constraints to modern programming paradigms.

subgraph PunchCards["1950s Punch Cards"] A["FORTRAN & ALGOL"] --> B["Batch processing<br/>Submit cards & wait"] end

subgraph Teletypes["1970s Teletypes"] C["C & Unix<br/>Ritchie & Thompson"] --> D["Typewriter that types back<br/>Terminal consoles & REPLs"] end

subgraph Modern["Present Day Problem"] B -.-> E["Baked-in assumption:<br/>Code is static text"] D -.-> E end ```

Victor argues that traditional schematic drawings—full of squiggly lines—exist only because they were convenient to sketch with pencil on paper:

> “So when you have a new medium you have to rethink these things you have to think how can this new medium allow us a more immediate connection to what we're making how can this new medium allows to work in such a way we can see what we're doing and it's really the same situation with programming.”

He traces the limitations of modern software development back to obsolete hardware environments: - **FORTRAN and ALGOL (Late 1950s)**: Built around punched cards, where programmers handed stacks of cards to machine operators and waited hours for results. The concept of interactivity simply did not exist, cementing the idea that a program is merely a static textual manifest submitted to a compiler. - **C and Unix (Teletype Era)**: Dennis Ritchie and Ken Thompson designed C using teletypes—essentially electronic typewriters with no visual displays. Modern terminal emulators, shell consoles, and REPLs (read-eval-print loops) remain direct descendants of these physical teletype constraints, mistaking command-line turn-taking for true interactivity.

[29:06](https://www.youtube.com/watch?v=PUv66718DII&t=1746s) Breaking the Keyframe Paradigm: Animation via Tactile Performance

Victor shifts focus to creative arts to demonstrate that the principle of immediate connection applies far beyond engineering. In traditional digital animation tools such as Adobe Flash, animating an object—like an autumn leaf drifting down from a tree—relies on keyframing. The animator manually defines static positions at discrete intervals (e.g., placing the leaf at frame 20, then frame 40) and assigns an interpolation tween to connect the dots. The workflow forces the artist to guess blindly in time and space, resulting in unnatural, rigid motion: “and it looks ridiculous it looks like billiar balls bouncing back and forth.”

While a human can effortlessly express the gentle, floating flutter of a falling leaf using their hand, mouse-driven keyframe interfaces provide no mechanism to capture that physical intuition. To overcome this, Victor presents a custom multi-touch iPad tool designed for performing animation live like a musical instrument: - **Bimanual control**: The performer operates with both hands simultaneously, selecting active layers with the left thumb while guiding on-screen movement and trajectories with the right hand. - **Layered multi-pass recording**: The trajectory of the leaf is recorded in real time on the first pass; scrubbing backward, Victor introduces a rotation widget to layer in natural rocking and an impromptu mid-air flip that “felt right in the moment it wasn't even planned.” - **Coordinated scene camera motion**: To pan across the canvas, Victor groups foreground, mid-ground, and background layers into a single list, assigns a horizontal dragging constraint, and reduces background sensitivity to create dynamic parallax depth. - **Intuitive temporal pacing**: Pauses and transitions are executed by feel rather than frame counting: “I don't know how many frames I waited I don't know how long it was I went when it felt right.” - **Character puppetry**: Scrubbing to the landing point, he animates a rabbit hopping away across a winter landscape, toggling between distinct poses in sync with the hop trajectory.

Victor completed the entire finished animation in just two minutes, illustrating the power of immediate connection when software enables artists to perform their intent directly into the medium.

[34:16](https://www.youtube.com/watch?v=PUv66718DII&t=2056s) Trapped Ideas and the Guiding Principle

Bret Victor recalls an animation project featuring a leaf falling from a tree, describing how he spent an entire day in Adobe Flash trying to keyframe the leaf's movement without success. That failure marked the end of the project: while he still keeps the storyboards and occasionally plays the music he composed for it, the animation itself remains permanently trapped in his head. This experience leads him to reflect on the millions of creative works, life-saving scientific discoveries, and world-changing inventions that remain similarly locked inside millions of human minds because creators lack an environment that provides immediate feedback. Ideas cannot simply emerge fully formed; they must be grown and nurtured, and when tools sever the creator's immediate connection to their work, these ideas either fail to emerge at all or emerge stunted.

```mermaid flowchart TD accTitle: Ideas Stunted by Disconnected Tools accDescr: Diagram showing how creative and critical ideas become locked in the mind when tools lack immediate connection versus how they flourish with immediate feedback.

subgraph Problem["Without Immediate Connection"] A["Idea in Creator's Mind"] --> B["Opaque / Indirect Tool"] B --> C["Idea Stunted or Locked in Head"] end

subgraph Solution["With Immediate Connection"] D["Idea in Creator's Mind"] --> E["Environment with Immediate Feedback"] E --> F["Idea Matures and Flourishes"] end ```

Every prototype and demonstration shown throughout the talk emerged directly from recognizing violations of this single principle—that creators need an immediate connection to what they are making—and attempting to resolve them. Victor explains that he was simply following this guiding compass wherever it pointed.

- The inability to keyframe a falling leaf in Flash caused an entire creative project to be abandoned, leaving only storyboards and musical recordings behind. - Victor asserts that artistic projects, world-changing inventions, and life-saving scientific discoveries share the same fundamental requirement: they must be grown within an environment that allows immediate nurturing. - As Bret Victor explains his methodology: “So I have this principle that creators need an immediate connection, and all of those demos that I just showed you simply came from me looking around, noticing places where that principle was violated, then trying to fix that.”

[35:39](https://www.youtube.com/watch?v=PUv66718DII&t=2139s) Not Opportunity, but Responsibility

Victor addresses the deeper motivation behind his work: why he adopts this principle in the first place. When he witnesses a tool constraining a creator or forcing an idea to be compromised, he does not view that breakdown as a commercial or academic opening—he does not see an opportunity to launch a startup, design a product, publish research, or simply enjoy making things. Instead, he views ideas as inherently precious. Seeing them die causes genuine pain, appearing not merely as an inconvenience but as an injustice and a moral wrong. If there is anything he can do to correct it, he considers it an ethical duty rather than an entrepreneurial prospect.

```mermaid flowchart LR accTitle: Technologist Motivations Comparison accDescr: Flowchart contrasting opportunistic motives with principle-driven responsibility when encountering broken tools.

subgraph Typical["Opportunistic Mindset"] V1["Tool Flaw / Inefficiency"] --> O1["Start a Business"] V1 --> O2["Build a Product"] V1 --> O3["Academic Research"] end

subgraph Activist["Principle-Driven Mindset"] V2["Creator Constrained / Idea Dies"] --> M["Moral Wrong / Injustice"] M --> R["Personal Responsibility: Fight by Inventing"] end ```

He emphasizes that words such as *injustice*, *responsibility*, and *moral wrong* rarely surface in technical communities. Instead, they are traditionally reserved for social causes such as fighting censorship, gender discrimination, or environmental destruction. When people observe civil rights violations, they do not interpret them as business opportunities; rather, historical activists dedicated their entire lives to combating those wrongs. Victor argues that this activist lifestyle should not be restricted to social organizing: technologists can similarly recognize an unacknowledged wrong, articulate a vision of a better reality, and dedicate their careers to fighting for a principle through invention.

- Traditional technical motives dismissed by Victor: starting a business, shipping a product, publishing research papers, or the hedonistic "joy of making things." - Victor distinguishes conventional social activism from technical activism: social reformers typically fight by organizing, whereas technologists can fight by inventing. - As Bret Victor summarizes his moral stance: “I see a tragedy, to me it feels like a moral wrong, it feels like an injustice, and if I think there's anything I can do about it, I feel it's my responsibility to do so—not opportunity, but responsibility.”

[38:08](https://www.youtube.com/watch?v=PUv66718DII&t=2288s) Larry Tesler and the Fight Against Modes

To illustrate what it looks like to live by a technical principle, Victor turns to Larry Tesler and his work during the mid-1970s at Xerox PARC. At that time, personal computing was nascent, yet Tesler and his colleagues foresaw its transformative power to alter human thought and daily life. However, software interfaces of that era were strictly modal. In a typical text editor, a user could not simply type text onto the screen like on a typewriter; they had to navigate command mode, enter insert mode with keys like `I` or append mode with `A`, press `Escape` to return to command mode, or press `M` to enter a dedicated move mode. Tesler pioneered software user studies and observed that even after weeks of training, many people could never grow comfortable using computers.

```mermaid flowchart TD accTitle: Larry Tesler's Modeless Text Editing Paradigm accDescr: Contrast between modal editing workflows and Tesler's modeless Gypsy interface.

subgraph Modal["Early 1970s Modal Interface"] CMD["Command Mode"] -->|"press 'i'"| INS["Insert Mode"] INS -->|"press 'Esc'"| CMD CMD -->|"press 'm'"| MOV["Move Mode"] end

subgraph Modeless["Tesler's Modeless Paradigm (Gypsy)"] TYP["Typing always inserts text ('W' always produces 'W')"] SEL["Modeless Selection (Click and Drag)"] CCP["Universal Cut, Copy, and Paste"] end ```

Believing that the complexity of modes posed an existential threat to the dream of personal computing, Tesler adopted the personal mission and principle: *No person should be trapped in a mode*. Tesler campaigned under the slogan “Don't mode me in,” which he wore printed on his T-shirt. This conviction led directly to his creation of the Gypsy text editor, which established modern document editing: - Typing directly placed characters onto the screen via an insertion point (typing `W` always produced the character `W`). - Selecting text occurred modelessly by clicking and dragging across characters, mirroring a physical highlighter. - Manipulating content was achieved by inventing the commands cut, copy, and paste, liberating users from rigid mode-switching.

Tesler found that people who had never encountered a computer before could become proficient with Gypsy within roughly thirty minutes. His modeless paradigm spread throughout the desktop user interface then being developed at Xerox PARC, ultimately becoming an invisible foundation of modern computing. Tesler's personal identity remained inextricably linked to this battle: his car license plate read "NO MODES" for over thirty years, his personal website is `nomodes.com`, and his Twitter handle was `@nomodes`.

- Larry Tesler pioneered the formal methodology of software user testing while at Xerox PARC in the mid-1970s. - With Gypsy, novices achieved operational comfort on a computer in approximately half an hour. - As Bret Victor notes of Tesler's uncompromising commitment: “Larry made it his personal mission to eliminate modes from software, and he formed a principle: no person should be trapped in a mode.”

[42:05](https://www.youtube.com/watch?v=PUv66718DII&t=2525s) Inventing Cultural Change vs. Accumulating Technology

Victor challenges the superficial historical framing that merely credits Larry Tesler with inventing cut, copy, and paste or solving a technical puzzle. Unlike Thomas Edison—who stumbled onto audio recording technology, built the phonograph, and subsequently drafted an ad hoc list of use cases without cultural intent—Tesler acted in direct response to a cultural condition. Furthermore, framing Tesler's work as merely "solving the problem of modeless text manipulation" misses the mark because that problem existed exclusively inside Tesler's head. For the rest of the computing community, modes were accepted as natural and inevitable, no more problematic than having two arms.

```mermaid flowchart LR accTitle: Accidental Invention versus Principled Invention accDescr: Comparing the technology-first approach of Thomas Edison with the principle-first approaches of Elizabeth Cady Stanton and Larry Tesler.

subgraph Edison["Edison: Technology-First"] E1["Stumbles on Audio Tech"] --> E2["Builds Phonograph"] --> E3["Invents Use Cases to Patent"] end

subgraph Principled["Tesler & Stanton: Principle-First"] P1["Recognizes Invisible Wrong"] --> P2["Envisions Transformed World"] --> P3["Fights Cultural Status Quo"] end ```

Tesler’s true accomplishment was recognizing an unacknowledged wrong embedded in the culture and fighting to dismantle it. Victor compares Tesler's trajectory directly to that of suffragist Elizabeth Cady Stanton: 150 years earlier, Stanton insisted that women had a right to vote at a time when society deemed the idea absurd and regarded disenfranchisement as an invisible, natural fact of life. While Victor disclaims any comparison between the societal magnitude of women's suffrage and text editing, he insists their underlying operational architectures were identical: both individuals identified an accepted wrong, envisioned a world without it, and dedicated themselves to a principle—Stanton fighting by organizing, and Tesler fighting by inventing.

Victor connects this principle-driven drive to Douglas Engelbart, who invented interactive computing—placing dynamic text on screens, navigating information non-linearly, manipulating on-screen elements, and creating the mouse—at a time when real-time interaction was virtually non-existent. Engelbart was not motivated by gadgets; his explicit, foundational goal was to augment the human intellect to help mankind solve urgent global crises by enabling knowledge workers to harness collective intelligence.

- The conventional historical narrative reduces Tesler to the inventor of cut, copy, and paste, obscuring his activist motivation. - Elizabeth Cady Stanton serves as an analogy for recognizing invisible cultural wrongs and enduring public skepticism to establish a new norm. - Douglas Engelbart entered the computing field solely on the hunch that digital machines could realize his grand vision of augmenting human intellect to address humanity's most pressing problems. - As Bret Victor captures the essence of this principled posture: “Both of them recognized a cultural wrong, they envisioned a world without that wrong, and they dedicated themselves to fighting for a principle: she fought by organizing, he fought by inventing.”

[45:25](https://www.youtube.com/watch?v=PUv66718DII&t=2725s) Alan Kay and Richard Stallman: Computing as Literacy and Freedom

Bret Victor turns to two monumental figures in computer science whose careers were defined not by narrow technical domains, but by crusading moral visions. First is Alan Kay, who ran the Learning Research Group at Xerox PARC. Kay’s lab was responsible for the modern graphical desktop interface—introducing concepts like overlapping windows, icons, and command menus—as well as pioneering object-oriented programming with Smalltalk. Victor highlights that Kay's driving ambition was never simply about making better computers. Quoting Kay directly, Victor describes his overarching goal: “His goal and I quote was to amplify human reach and bring new ways of thinking to a faltering civilization that desperately needed it.”

Kay chose to pursue this civilizational intervention through children. Influenced heavily by child development theorists like Jean Piaget, Maria Montessori, and Jerome Bruner, Kay believed that if children became fluent in computing—treating programming as a fundamental literacy on par with reading and writing—they would grow into adults equipped with new modes of critical thought, resulting in a fundamentally more enlightened society. Everything Kay invented emerged as a direct consequence of following that pedagogical principle.

Victor then contrasts Kay with Richard Stallman, perhaps the most prominent figure in software activism. Stallman founded the GNU Project (which forms the core utilities of modern Linux operating systems) and the Free Software Foundation, wrote GCC and the GNU General Public License (GPL), and authored numerous foundational tools. Stallman’s guiding principle is that software must be free, as in freedom of speech, not price. Stallman views software freedom not as a technical preference or business model, but strictly as a matter of moral right and wrong, maintaining an uncompromising stance in his life to defend that boundary. Both Kay and Stallman dedicate their lives to fighting against a mainstream authority that fails to recognize the systemic wrongs they perceive, continuing to battle because the world remains far from their ideals.

- **Alan Kay at Xerox PARC**: Desktop GUI (windows, icons, menus), object-oriented programming (Smalltalk). - **Kay's pedagogical roots**: Adopted theories from Jean Piaget, Maria Montessori, and Jerome Bruner on how children construct mental models. - **Richard Stallman**: Founder of GNU Project and Free Software Foundation; author of GCC, GPL; champion of software freedom as an absolute moral mandate.

---

[47:40](https://www.youtube.com/watch?v=PUv66718DII&t=2860s) Three Paths: The Craftsman, the Problem Solver, and the Principle-Driven Pioneer

Victor makes it clear that he is neither commanding nor advising everyone in the audience to adopt an activist lifestyle. Rather, his point is that choosing to live by a principle is a genuine option that nobody talks about—especially within technology. Society and career counselors push individuals to define themselves entirely by a craft or a skill set: you pick a major in college, receive a job title like "software engineer," and specialize into roles like "database engineer" or "front-end engineer," executing whatever tasks are handed to you. That path—the path of the Craftsman—focuses on honing a skill toward personal excellence, and it is honorable and valuable.

The second familiar archetype is the Problem Solver, exemplified by academic researchers and commercial entrepreneurs. In this model, fields exist with established lists of open problems or market needs; the individual selects a problem, works on it, publishes or ships a solution, and moves on to the next. But Victor argues that innovators like Larry Tesler do not fit into either category. When Tesler attacked software modes at Xerox PARC, there was no recognized field of "user experience design" to contribute to, nor was he tackling an open industry problem; the problem existed only in Tesler's own head because no one else realized modes were harmful.

```mermaid flowchart TD accTitle: Three Life Paths in Technology accDescr: Diagram contrasting the Craftsman, Problem Solver, and Principle-Driven life paths.

subgraph Craftsman["1. The Craftsman (Most Common)"] C1["Defined by a Skill"] --> C2["Pursues Mastery & Excellence"] C2 --> C3["e.g., Front-end Engineer, Database Specialist"] end

subgraph ProblemSolver["2. The Problem Solver"] P1["Defined by the Field's Needs"] --> P2["Picks Known Open Problems"] P2 --> P3["e.g., Academics, Startup Entrepreneurs"] end

subgraph PrincipleDriven["3. Principle-Driven (Activist)"] PR1["Defined by an Underlying Cause"] --> PR2["Identifies Unseen Systemic Wrongs"] PR2 --> PR3["e.g., Larry Tesler, Alan Kay, Richard Stallman"] end ```

Victor argues that labeling Larry Tesler simply as a "computer scientist" or "UX designer" misses his true historical impact. Drawing a sharp historical parallel, Victor observes: “I'm sure if you look at Wikipedia it'll say that he's a computer scientist or user experience something, but to me that's like saying Elizabeth Cady Stanton was a community organizer; no, Elizabeth Cady Stanton established the principle of women's suffrage, that's who she was, that was the identity she chose, and Larry Tesler established the principle of modelessness.”

---

[50:02](https://www.youtube.com/watch?v=PUv66718DII&t=3002s) Self-Discovery and the Search for a Guiding Principle

Discovering one's guiding principle is not an instantaneous event; it is an arduous, reflective process of self-discovery that can take years. Victor shares his personal journey, revealing that it took him an entire decade—his entire twenties—before he could articulate the principle that guided his work. When he was younger, he felt a deep internal pressure to live according to a principle, but he caught only isolated glimmers of what mattered to him without seeing the larger unifying picture, an experience he found intensely distressing.

To break through that ambiguity, Victor engaged in a wide variety of activities: making different kinds of artifacts, studying disparate fields, and gathering a broad corpus of life experiences. He used these diverse encounters as diagnostic mirrors to analyze his own reactions, asking himself whether a domain resonated with him, repelled him, or left him indifferent. By looking for the common thread in the things that provoked strong reactions, he gradually uncovered what he truly cared about. He warns that confining oneself too early to a single narrow technical specialty makes it much harder to gather the wide range of experiences necessary to find one's principle.

> “What I had to do was just do a lot of things: make many things, make many types of things, study many things, experience many many things, and use all these experiences as ways of analyzing myself.” — Bret Victor

---

[51:38](https://www.youtube.com/watch?v=PUv66718DII&t=3098s) Formulating Actionable Principles: Tesler's Modelessness and Victor's Immediacy

Victor cautions that a principle cannot just be a vague platitude or warm sentiment. In modern technology culture, people constantly profess desires to "make software easier to use," "delight users," or "make things simple." While well-intentioned, these phrases are useless as guiding principles because they offer no concrete criteria for decision-making. A genuine principle must embody a sharp, specific insight that objectively cleaves the world into right and wrong.

| Vague Good Intention | Actionable Guiding Principle | Objective Test Applied to Work | |:--- |:--- |:--- | | "Make software simple" | **Larry Tesler**: *No person should be trapped in a mode.* | Watch a user editing text and ask: *Is this person currently in a mode?* If yes, the software is wrong and must change. | | "Creators need powerful tools" | **Bret Victor**: *Creators need an immediate connection to what they create.* | Watch a programmer write a line of code and ask: *Did they immediately see the effect of that change?* If no, the environment is wrong and must change. |

Victor explains that every live coding, animation, and circuit simulation demonstration presented in his talk was not conceived as a one-off software gimmick. Each prototype was the direct, inevitable outcome of strictly applying his test: if a creator changes a value and cannot immediately see the result, the system is fundamentally broken. When a principle provides a binary, objective test, it illuminates the designer's path and removes uncertainty about whether the work being done is right.

> “Larry Tesler likes simplicity, but his principle was the specific nugget of insight: no person should be trapped in a mode.” — Bret Victor

---

[53:18](https://www.youtube.com/watch?v=PUv66718DII&t=3198s) The Choice to Wake Up: A Call to Action

Victor concludes his address by reminding the audience of the fundamental autonomy every individual possesses over their life and career. While default paths exist—drifting along, accepting established job descriptions, and sleepwalking through a career by taking the world as it currently is—no one is obligated to settle for them.

He challenges the room to look closely at the world, detect the systemic wrongs that others simply take for granted, and construct a proactive vision for what a better world ought to look like. Victor leaves the audience with a direct call to personal reflection:

> “So after this talk, I'd like you to take a little time and think about what matters to you, what you believe in, and what you might fight for. Thank you.” — Bret Victor

## Notable quotes > [11:23](https://www.youtube.com/watch?v=PUv66718DII&t=683s) If you're designing something embedded in time, you need to be able to control time. You need to be able to see across time; otherwise you're designing blind. — Bret Victor

> [51:38](https://www.youtube.com/watch?v=PUv66718DII&t=3098s) Larry Tesler likes simplicity, but his principle was the specific nugget of insight: no person should be trapped in a mode. — Bret Victor

## Mentioned Bret Victor, Terry Cavanagh, Dennis Ritchie, Ken Thompson, Larry Tesler, Thomas Edison, Elizabeth Cady Stanton, Douglas Engelbart, Alan Kay, Jean Piaget, Maria Montessori, Jerome Bruner, Richard Stallman, Xerox PARC, Adobe, Free Software Foundation, Don't Look Back, VVVVVV, Gypsy, Smalltalk, GNU Project, GCC, GNU General Public License (GPL), FORTRAN, ALGOL, C, Unix, Adobe Flash

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

中文简报

Bret Victor敦促技术人员摒弃纯粹技艺,转向道德原则 切断创作者与其媒介之间的即时联系会在构想成熟前将其扼杀,这使得工具设计成为一项道德责任,而非单纯的商业机会。 Bret Victor向“追随激情”这一传统职业建议发起挑战,主张将工作奉献给指导性的道德原则。他阐述了自己的核心信念——创作者需要与所创造的事物保持即时联系,并通过涵盖实时代码执行、动态游戏设计、算法可视化、主动电路分析和基于表演的动画等革命性原型来证实这一信念。Victor将这种秉持原则的发明家典范与传统手艺人及问题解决者进行了对比,审视了Larry Tesler、Douglas Engelbart、Alan Kay和Richard Stallman等历史先驱,他们发现了隐蔽的文化弊病,并致力于通过发明来纠正这些错误。 Bret Victor对传统职业建议提出质疑,主张去发现并遵循指导原则——即关于什么是必要、重要且正确的根本信念——而不仅仅是追求激情或精通某项技艺。 (0:07) Victor的基本原则是创作者需要与所创之物保持即时联系;他通过原型演示证明,消除代码、电路设计和动画中的“编译-运行”延迟,能解锁全新的创造性发现。 (1:12) 该演讲将技术发明定义为一种社会行动主义形式:技术人员无需将有缺陷的工具视为市场机会,而是可以找出隐蔽的文化弊病并通过秉持原则的发明与之抗争,正如Larry Tesler反对软件模式的抗争所展示的那样。 (35:39) Victor指出了技术领域的三个不同职业路径——手艺人、问题解决者和原则驱动的先驱,并敦促创作者建立可操作的、非黑即白的原则,以客观评估工作是对还是错。 (47:40)

Reading summary

Bret Victor argues that rather than pursuing passion or craft specialization, technologists should anchor their careers to a guiding principle—a moral conviction regarding what is necessary and right. Applying his principle that creators require an immediate connection to what they make, Victor contends that disconnected tools stunt creative, scientific, and technical ideas before they can mature. Immediate Sensory Connection in Creative Tools (1:12) Victor identifies a fundamental defect across creative mediums: traditional tools sever the feedback loop between a creator's intent and its observable outcome. In conventional programming, developers simulate execution mentally, typing static text blindly before compiling and running the code. To restore immediate connection, Victor presents environments where code modifications update visuals instantaneously. Draggable parameters replace static numbers, live autocompletion renders graphical primitives directly, and bidirectional inspection allows creators to click pixels to highlight corresponding code lines and vice versa. He demonstrates that immediate feedback extends beyond visual graphics to dynamic systems and abstract logic. In game development, spatializing time—rendering past paths and projected future trajectory arcs—enables real-time physics tuning without trial-and-error playtesting. For abstract algorithms like binary search, displaying live variable values and unrolled iteration columns alongside code allows programmers to catch off-by-one errors and loop failures the moment they are typed, replacing blind mental simulation with immediate visual confirmation. Overcoming Obsolete Hardware and Static Representations (26:32) Victor argues that mainstream software practices reflect historical hardware limitations rather than optimal design choices. FORTRAN and ALGOL originated in 1950s batch-processed punch cards where interactivity was impossible, embedding the assumption that programming is static text submitted to a compiler. Similarly, command-line terminals and REPLs descend from 1970s teletypes used during the creation of C and Unix, mistaking typewriter-style turn-taking for true interactivity. Static, paper-era representations also limit other engineering and creative fields. In electrical engineering, traditional schematics inherited from pencil drawings hide circuit dynamics; Victor replaces passive component symbols with live plots of current over time and renders simultaneous voltage waveforms across all nodes. In digital animation, where standard keyframing in tools like Flash produces rigid motion by forcing animators to guess positions across frames, Victor introduces a multi-touch tablet interface where artists perform character motion and parallax camera transitions live, capturing physical intuition directly. Technical Invention as Moral Activism (35:39) When creators are constrained by defective tools, Victor regards the failure not as a business opening or an academic problem, but as an injustice and a moral wrong. While society traditionally associates activism with social reform—such as Elizabeth Cady Stanton's campaign for women's suffrage through community organizing—Victor asserts that technologists can similarly confront invisible cultural wrongs through invention. He highlights historical figures whose contributions were driven by moral principles rather than opportunistic engineering. Larry Tesler observed that modal text editors alienated novices, establishing the principle that "no person should be trapped in a mode" and creating modeless text editing with cut, copy, and paste. Likewise, Douglas Engelbart developed interactive computing specifically to augment human intellect against urgent global crises, Alan Kay treated computing as a pedagogical literacy to elevate civilization, and Richard Stallman established the GNU Project and GPL to defend software freedom as a strict ethical mandate. Navigating Career Archetypes and Actionable Principles (47:40) Victor distinguishes three career paths in technology: the Craftsman, who refines mastery within an established skill; the Problem Solver, who addresses recognized open problems defined by academia or industry; and the Principle-Driven pioneer. Pioneers like Tesler operated outside recognized fields because the wrongs they addressed existed initially only in their own minds, unacknowledged by peers who treated harmful constraints as natural facts of life. To guide work effectively, Victor emphasizes that a principle cannot be a vague platitude like "make software simple." Actionable principles must provide an objective, binary test that determines whether an artifact is right or wrong—such as evaluating whether a user is trapped in a mode or whether an author can immediately see the effect of an edit. Formulating such a principle requires broad experimentation across diverse domains; Victor notes it took him a decade of self-analysis to identify the unifying conviction behind his work. Victor concludes by urging technologists to look beyond passive career defaults and established job descriptions. He frames adopting a principle as a conscious choice to identify unacknowledged cultural flaws, envision a transformed world, and actively fight for it through targeted invention.

精炼阅读摘要

Bret Victor 在演讲中主张,技术从业者不应仅停留在“追随热情”或磨炼既有技能,而应确立一条指导终身工作的核心原则;他以自身的原则——“创作者必须与其创造物建立即时连接”为例,论证技术发明可以成为纠正文化隐性不公的道义责任。 即时连接原则与传统媒介盲区的突破 (1:12) Victor 认为灵感与思想最初极为脆弱,若缺乏能够即时反馈的培育环境,概念往往会胎死腹中。然而,传统编程从 20 世纪 50 年代穿孔纸带(FORTRAN、ALGOL)和 70 年代电传打字机终端(C 与 Unix)承袭而来,迫使程序员将注意力耗费在纯文本编辑与心智模拟(即在脑中“扮演计算机”)上,编辑、编译与运行之间的延迟彻底切断了创作者的感知。在电气工程中,电路图仅展示静态符号而掩盖实时电压与电流;数字动画(如 Adobe Flash)中的关键帧插值则迫使创作者在时空之间盲目猜测,导致动作僵硬失真。 针对这些结构性缺陷,Victor 展示了一系列通过消除延迟激发偶发灵感(Serendipity)的原型工具。在图形编程中,将数值变为可拖拽滑块、提供实时绘制预览与代码/画布双向导航,不仅消除了编译等待,还意外发现了类似风吹花瓣颤动的动态美感;在算法教学中,把二分查找的变量状态展开为并列列视图,能在键入浮点中点索引 2.5 或死循环发生的数秒内捕获缺陷;在电路设计中,直接在元件上叠加波形对比与电流实时绘图;在多点触控动画工具中,创作者以双手实时表演动作与视角平移,两分钟内便完成了原本需要耗时数天手工调帧的落叶与兔子跳跃动画。 将时间映射至空间:动态系统的实时掌控 (11:23) 当创作系统引入状态演变、物理碰撞与时间维度时,仅有静态即时渲染仍不足够。Victor 在调试一款 2D 平台跳跃游戏时指出,即便利用户能实时调整跳跃弹性或乌龟移动速度,若缺乏跨越时间审视因果的能力,设计者依然处于“盲人摸象”的境地。仅仅依靠录制按键并来回拖动时间轴游标,依然无法即时判定跳跃弧线能否准确穿过狭窄通道。 解决时序过程盲区的核心在于“将时间映射到空间”。Victor 在原型中直接投射出角色根据既往输入推演出的未来运动轨迹线;当他在代码中拖拽弹性系数时,屏幕上的物理抛物线随之实时弯曲伸缩,使数值能够精确对齐关卡开口。这种对机制的即时操纵降低了试错门槛,使微调重力常数为负值或禁用左移键等探索,能够直接转化为类似 Terry Cavanagh 在《VVVVVV》或《Don't Look Back》中所展示的独立核心游戏机制。 原则驱动的技术发明与激进主义传统 (35:39) Victor 强调,当他看到创作者因工具缺陷而受限、思想被迫妥协时,他并未将其视作创办公司、发表论文或享受造物乐趣的“商业与学术机会”,而是视为一种深层的道德错误(moral wrong)与不公,并产生纠正它的责任感。他指出,技术界习惯将“不公”与“道德责任”留给社会运动,但技术人员同样可以通过“发明”来展开斗争。 历史上深具影响力的计算机先驱往往属于原则驱动的活动家。施乐帕克研究中心(Xerox PARC)的 Larry Tesler 确立了“人不应被模式(Mode)困住”的原则,为了对抗软件模式对个人电脑普及的阻碍,Tesler 发明了 Gypsy 文本编辑器,引入直接打字、点击拖拽选中文本以及剪切、复制、粘贴指令,使初学者在 30 分钟内即可上手;这一抗争成为现代 GUI 的基石,Tesler 甚至在车牌上印了 30 余年的“NO MODES”。同样,Douglas Engelbart 为扩充人类智力以解决全球危机而发明了交互式计算与鼠标;Alan Kay 依据发展心理学理论将编程视作同读写并列的基础素养,以启迪后代思维为原则发明了桌面 GUI 与 Smalltalk;Richard Stallman 则将软件自由(free software)确立为绝对的道德边界,创建了 GNU 与 GPL。Victor 指出,这些先驱如同当年主张女性参政权的 Elizabeth Cady Stanton 一样,是在整个文化尚未意识到不公存在时,独自构想并践行了一个消除该缺陷的新世界。 技术人生的三种路径与可执行原则的提炼 (47:40) Victor 将技术生涯概括为三种典型路径:第一种是“工匠”(Craftsman),以特定技能为中心,追求精湛手艺与卓越(如前端或数据库工程师),这是最普遍且体面的道路;第二种是“问题解决者”(Problem Solver),依据学术界或市场现存的公开难题清单攻坚克难;第三种则是“原则驱动者”(Principle-Driven),其身份不依赖于特定学科或现成问题,而是由其所捍卫的底层理念所定义。 然而,确立指导原则不能依赖诸如“让软件易用”、“取悦用户”或“追求简单”等模糊的善意说辞,因为它们缺乏客观的决策判准。一个可操作的原则必须提供清晰非黑即白的测试标准:Tesler 的原则是具体的“人不应陷入模式”,评估标准是“用户此时是否处于模式中”;Victor 自身的原则是“创作者需要即时连接”,评估标准是“修改代码或参数后是否能立刻看到结果”。若测试未通过,则系统必然存在错误。Victor 透露,自己花费了整整十年(整个 20 岁阶段)广泛尝试各类创作、学科与经历,通过将这些实践作为反观自身反应的“诊断镜”,才最终明确了自己的核心原则。 Victor 总结道,沿袭现成工种与行业默认规范本质上是在职业生涯中“梦游”;他呼吁听众主动停下反思,从习以为常的技术与社会现实中识别那些未被察觉的系统性缺陷,明确自身真正坚信并愿意为之奋斗的核心原则,自主决定如何度过技术生涯。

Detailed notes — zh

## Background 该视频由 Rui Oliveira 于 2012 年 2 月 22 日发布在 YouTube 平台上,记录了 Bret Victor 的著名演讲《Inventing on Principle》(依原则而发明)。页面未提供具体的官方简介与演出说明,整场演讲长达 54 分钟。 ## TL;DR Bret Victor 在演讲中提出了一种截然不同的职业与人生范式:不单随波逐流追随激情,而是确立坚定的“指导原则”并以此指引一生的创作。他以自己坚持的原则——“创作者需要与其所创造之物建立即时连接”——为主线,现场展示了即时反馈的编程环境、游戏物理时空映射、抽象算法展开、电路波形集成以及双手演奏式动画等革命性原型。随后,他通过 Larry Tesler、Doug Engelbart、Alan Kay 和 Richard Stallman 等先驱的生平,指出真正的技术变革者并非被动解决既有问题的工匠,而是用发明创造作为武器向文化认知不公宣战的技术激进分子,并号召听众打破社会默认设限,找寻值得为之奋斗一生的核心原则。 ## Atmosphere & style 整场演讲呈现出一种极其罕见的冷静、庄重与崇高感,既有严谨精巧的工程技术展示,又流淌着强烈的哲学反思与道德批判力量。Victor 的语调平实克制却暗藏锋芒,在演示那些惊艳颠覆的原型工具时没有浮夸的煽动,而是让工具与数据本身说话,营造出令人屏息凝神的震撼体验。随着话题从编程技术逐步跃升到社会不公与人生使命,全场氛围从智识上的新奇转向深沉的心灵叩问,给听众带来直击灵魂的觉醒感与沉思空间。 ## Bulletin - [01:12](https://www.youtube.com/watch?v=PUv66718DII&t=72s) Bret Victor 提出创作者需要与其创作物建立“即时连接”(Immediate Connection),当修改发生时必须零延迟看到效果,否则将因盲目心算扼杀无数微弱而珍贵的新思想。 - [04:06](https://www.youtube.com/watch?v=PUv66718DII&t=246s) Victor 展示了将即时连接原则推向极端的可视化系统:涵盖动态调整代码参数即时生成画面、时间映射至空间显示未来轨迹、具象示例驱动算法排查死循环,以及双向点击穿透代码与像素。 - [26:32](https://www.youtube.com/watch?v=PUv66718DII&t=1592s) 现代主流编程工具严重受困于 1950 年代打孔卡片和电传打字机的历史包袱;真正的交互式计算媒介应直接以原生动态数据(如电路波形)和直觉演奏(如多点触控动画)为基础。 - [37:40](https://www.youtube.com/watch?v=PUv66718DII&t=2260s) 对比“工匠”与“问题解决者”,Victor 倡导一种“技术激进主义”的原则追随者人生道路:如同 Larry Tesler 和 Doug Engelbart,将洞察到的深层隐形错误视为道德责任,通过发明创造去重塑世界。 ## Key takeaways - [00:00](https://www.youtube.com/watch?v=PUv66718DII&t=0s) 超越常规的“追寻激情”职业建议,Victor 倡导以坚定不移的“指导原则”为核心来度过一生并指引所有工作。 - [01:12](https://www.youtube.com/watch?v=PUv66718DII&t=72s) 核心原则是“创作者需要与其创作物保持即时连接”,任何割裂或延迟都会阻碍人类思维的自然涌现。 - [02:32](https://www.youtube.com/watch?v=PUv66718DII&t=152s) 传统编程迫使开发者在文本编辑器中“盲人摸象”,而代码与渲染结果绝对同步的实时画布能带来偶然而珍贵的艺术发现。 - [07:16](https://www.youtube.com/watch?v=PUv66718DII&t=436s) 双向悬停与点击定位消除了大脑在代码行与屏幕像素之间维持心理映射的认知负担。 - [13:19](https://www.youtube.com/watch?v=PUv66718DII&t=799s) 在处理包含时间维度的动态系统(如游戏物理)时,必须将时间映射到空间(如运动轨迹线),才能让创作者直接看见并操控未来。 - [16:24](https://www.youtube.com/watch?v=PUv66718DII&t=984s) 人类大脑不应被浪费去模拟计算机的运算,具象示例驱动和循环展开能让二分查找等抽象算法的执行状态与边界 Bug 显式暴露。 - [22:45](https://www.youtube.com/watch?v=PUv66718DII&t=1365s) 即时连接原则超越软件开发;在电路设计中,直接用活生生的实时波形模块替代抽象符号图纸能彻底消除推演盲区。 - [26:32](https://www.youtube.com/watch?v=PUv66718DII&t=1592s) 现代终端与 REPL 本质上是对半个世纪前电传打字机和打孔卡片的历史仿真,亟需立足现代计算媒介重新审视其交互形式。 - [29:06](https://www.youtube.com/watch?v=PUv66718DII&t=1746s) 传统基于关键帧与补间的动画软件剥离了身体直觉,而双手实时“表演”录制能将创作过程转化为如乐器演奏般的即时反馈。 - [34:16](https://www.youtube.com/watch?v=PUv66718DII&t=2056s) 面对创作工具造成的阻碍,不应仅将其视为商业机会或技术挑战,而应视作扼杀人类潜能的道德过错与责任。 - [37:00](https://www.youtube.com/watch?v=PUv66718DII&t=2220s) 技术激进主义与社会激进主义本质相通:社会运动家通过组织群众抗争,而技术发明家则通过创造全新范式的工具来消灭压迫。 - [38:14](https://www.youtube.com/watch?v=PUv66718DII&t=2294s) Larry Tesler 将“任何人都不该被困在模式中”作为毕生原则,发明剪切、复制、粘贴与无模式输入,正面反抗了当时被习以为常的技术文化束缚。 - [41:59](https://www.youtube.com/watch?v=PUv66718DII&t=2519s) Doug Engelbart、Alan Kay 与 Richard Stallman 等先驱的发明均源自对宏大社会愿景与深刻是非道德原则的执着追求。 - [47:40](https://www.youtube.com/watch?v=PUv66718DII&t=2860s) 人生拥有三种不同路径:精进技能的“工匠”、满足现有市场痛点的“问题解决者”,以及依循内在信念重塑世界的“原则追随者”。 - [50:02](https://www.youtube.com/watch?v=PUv66718DII&t=3002s) 寻找个人原则需要长达数年的广泛实践体验与深刻自省,以此构建起探查内心共鸣与反感的参照库。 - [51:38](https://www.youtube.com/watch?v=PUv66718DII&t=3098s) 真正的原则不能是“让软件易用”等模糊口号,必须包含能够非黑即白判断是非、直接指导行动的具体洞见。 - [53:18](https://www.youtube.com/watch?v=PUv66718DII&t=3198s) 社会充斥着既定的默认选择,但每个人都有权拒绝随波逐流,选择为你所坚信并希望改变的事业而战。 ## Detailed walkthrough ### [00:00](https://www.youtube.com/watch?v=PUv66718DII&t=0s) 演讲开篇:依原则而行,而非仅随激情 Bret Victor 在掌声中登台,一开场便半开玩笑地声明,自己不像上一环节的讲者那样有奖品可发,而是要来谈谈“如何度过你的一生”。他指出,绝大多数人在谈论职业规划时,翻来覆去讲的都是“追寻你的激情”(follow your passion)或者“做你所爱的事”。然而,他希望探讨一种截然不同的生活方式:依循原则而行(following a principle)。 所谓依原则而行,就是为自己的工作找到一个指导原则——一种你坚信是极其重要、必不可少且完全正确的信念,并用它来指引自己所做的一切。Victor 将整场演讲拆解为三个主要部分:首先阐释指引他自身大量工作的核心原则,并展示在这一原则下诞生的工具与原型;其次介绍其他同样以此方式生活的前辈与同行,剖析他们的信念与原则;最后,他强调这些案例只是脚手架,目的是帮助在座的每一个人思考自己真正坚信什么,以及自己想要怎样度过一生。 正如 Bret Victor 所断言:“I'm going to talk about following a principle, finding a guiding principle for your work, something you believe is important and necessary and right, and using that to guide what you do.” - 职业建议的常规套路:跟随激情、做喜欢的事。 - Victor 提倡的替代路径:确立指导原则,将其作为行动和选择的核心指南。 - 演讲的三段结构:个人原则与原型演示、历史先驱的原则案例、启发听众找寻属于自己的原则。 ### [01:12](https://www.youtube.com/watch?v=PUv66718DII&t=72s) 核心原则:创作者需要与其创作物保持即时连接 在 Victor 眼中,思想(ideas)具有至高无上的地位。他认为将思想带入现实世界是人类最伟大的事业之一;伟大的思想会化身为伟大的艺术、故事、发明与科学理论,进而脱离创作者拥有自己的生命,反过来赋予人类生活以意义。多年来,他投身于设计和使用各类创意工具,反复推敲究竟怎样的环境才能让思想健康生长。 在这一思考过程中,他确立了自己的基本原则:“Creators need an immediate connection to what they're creating.”(创作者需要与其所创造之物建立即时连接)。Victor 解释道,所谓即时连接,意味着当你在创作某样东西时,只要做出了一处修改或做出了一个决定,就必须能够立即看到其产生的效果;绝不能有任何延迟,也不能有任何隐匿的信息,创作者必须对自己的行为一览无余。紧接着,他准备展示一系列这一原则被严重违背的场景,以及他为此构建的原型方案。 ```mermaid flowchart LR accTitle: 核心创作反馈回路 accDescr: 展示创作者做出修改到立即看到效果的闭环流程,强调无延迟与无隐藏状态。 subgraph Loop["即时反馈闭环"] A["创作者修改 / 决策"] -->|"零延迟生效"| B["即刻呈现可见效果"] B -->|"启发新思想"| A end ``` ### [02:32](https://www.youtube.com/watch?v=PUv66718DII&t=152s) 传统编程的断裂与即时反馈画布 为了揭示该原则在现实中受到的破坏,Victor 从最普及的创造方式——编程(coding)切入。在传统编程范式下,程序员在文本编辑器中输入一行行代码,全靠大脑在脑海里苦苦想象每一行代码到底会产生什么效果,接着经历编译与运行,最终在屏幕上看到结果。他现场展示了一个用 JavaScript 在 HTML5 Canvas 上绘制一棵树的小场景:如果画面有瑕疵,或者产生新灵感,就必须切回代码编辑器修改,再次编译、重新运行,周而复始。 这种模式下,程序员绝大部分时间都是在文本编辑器里“盲人摸象”,完全切断了与最终创作物之间的连接。为了打破这种隔阂,Victor 展示了他自己开发的可视化编程环境:屏幕右侧是代码,左侧是实时画面,代码被划分为绘制天空、绘制山脉与绘制树木等部分。在这个环境里,只要在右侧修改代码中的任何字符,左侧画面瞬间刷新同步。这里不再有“编译并运行”的等待动作,代码与图像永远保持绝对同步。 Bret Victor 犀利地批判了传统编程的现状:“Most of my time is spent working in the code, working in a text editor blindly without an immediate connection to this thing which is what I'm actually trying to make.” ### [04:06](https://www.youtube.com/watch?v=PUv66718DII&t=246s) 突破键盘输入:数值微调、偶然发现与即时自动补全 在打通了代码与画面的即时连接后,交互形态也随之发生飞跃——修改代码不再局限于键盘打字。Victor 演示了直接用鼠标操控代码中的数值:按住 Control 键并把光标悬停在代表树枝长度的数值上,左右拖拽就能实时增减数值,直观对比大树枝与小树枝在美学上的微妙差异,直到找到最符合艺术直觉的那个点。 更神奇的体验来自于动态调试的过程。在一段生成每根树枝上 16 朵粉色花朵的 `for` 循环中,Victor 将数值在 20 左右来回滑动调整,屏幕上的树枝顿时呈现出一种奇妙的微光闪烁效果,如同风吹拂过整棵树木。Victor 直言,自己在第一次看到这个现象时,脑海中立刻萌生了将其做成动态动画的念头。他指出,如果每次改动都需要漫长的“编译并运行”,这种偶然而珍贵的艺术发现就永远不会发生;艺术与创造的本质就在于探索与发现,如果看不清自己的一举一动,发现就无从谈起。 随后,他又展示了如何向画布添加新图形。在天空函数后,他键入 `context.fill`,输入法弹出的自动补全列表不再是冷冰冰的文本,而是直接将 `fillCircle`、`fillRect`、`fillText` 的实际效果实时绘制在画面上。当他选定 `fillCircle` 并通过鼠标拖拽调出太阳的位置与半径后,他调用 `context.fillStyle` 并通过 Control 键唤出调色盘。当调出白色时,原本画太阳的代码瞬间呈现出一轮明月的效果,画面立刻变成了静谧的夜空。这种即时的交互反馈,让思想以不可预测的方式自然涌现。 Bret Victor 总结道:“So much of art, so much of creation is discovery, and you can't discover anything if you can't see what you're doing.” - 交互式数值调整:按住 Control 键悬停于数字上拖拽,所见即所得地调整树枝长度与花瓣数量。 - 动态意外发现:拖动循环次数数值产生如同风吹树木的流光动画效果。 - 具象化自动补全:补全菜单实时渲染图形原形,无需查阅文档或猜测 API 含义。 - 调色板呼出:在代码颜色字段直接通过快捷键唤出取色器,将黄色的太阳秒变白色的月亮。 ### [07:16](https://www.youtube.com/watch?v=PUv66718DII&t=436s) 消除心智映射:双向悬停高亮与敏捷导航 即便是实现了实时更新,Victor 指出当前界面仍然存在一个深层认知负担:创作者的大脑必须在左边的像素画面和右边的代码行之间建立并维持映射关系。仅凭肉眼扫视代码,很难迅速判断某一行到底画了什么。 为了消除这层心智摩擦,Victor 演示了反向透视功能: 1. **从代码定位画面**:按住 Option 键,光标变成放大镜,鼠标滑过任意一行代码,左侧画面中由该行代码绘制的部分便会即时高亮。例如在绘制两座山的代码前,鼠标一扫便能分清哪行画前山、哪行画后山。 2. **从画面定位代码**:反向操作同样成立,按住 Option 键在画面上的任意像素移动,右侧代码编辑器就会像磁石一样立即自动跳转并定位到绘制该像素的具体代码行(例如绘制天空、树干或花瓣的代码)。 这种双向直接对应让界面的导航体验变得极其敏捷:想把太阳改大一点,鼠标点中太阳,编辑器跳转,拉动数字改大;想抬高树木,点击树木对应跳转拉高;想升高远山,同样一点即达。创作意图与执行完全重合,延迟被压缩到了人类思维反应的极限之内。 Bret Victor 严肃地指出:“If there's any delay in that feedback loop between thinking of something and seeing it and building on it, then there's whole world of ideas which will just never be. These are thoughts that we can't think.” ### [09:33](https://www.youtube.com/watch?v=PUv66718DII&t=573s) 思想的脆弱性与向动态交互(游戏引擎)的拓展 在一阵沉默后,Victor 重新回到哲学层面的思考。他强调,思想在诞生之初往往微弱、渺小且极其脆弱;为了让它生根发芽、走向成熟,创作者必须拥有一个能够悉心呵护、喂养和塑造其生长的环境,而“即时连接”原则就是这一环境的基石。因此,当他看到这个原则遭到违背,看到原本可能成为伟大事物的思想因为创作者“无法看清自己在做什么”而夭折、畸形时,他感受到的不仅是糟糕的 UI 设计或违反了行业最佳实践,而是一种更深层次的、道德层面的“错误”(wrong)。 随后,Victor 提出了新的技术挑战:刚才展示的绘图环境是一个无状态的纯静态渲染系统,其中既没有随时间推移的物理演进,也没有用户交互。在包含状态、时间和交互的复杂程序中,如何坚守“即时连接”原则? 为此,他展示了一个全新的平台跳跃游戏原型(Platform Game)。画面中有一个小人,可以自由奔跑、跳跃、跌落死亡,右侧是控制其运动、跳跃和物理碰撞的底层代码。在画面下方,还有一只动作尚未写完的静止乌龟。Victor 当场开始实时为这只小乌龟编写逻辑:在每个时钟周期(tick)里,乌龟的 X 轴坐标累加其移动方向乘以六十分之一秒(1/60 秒)的时间步长,再乘以移动速度。这标志着他将要把即时反馈的探索,从静态画面直接推进到拥有连续时间轴与交互逻辑的动态系统之中。 面对思想被工具扼杀的现象,Bret Victor 这样表明心迹:“When I see this principle violated, when I see ideas stillborn or stunted because the creator couldn't see what they're doing, I feel that's wrong — and not wrong in the sense of violating some UI guideline or going against some best practice, but wrong in a deeper sense than that.” ### [11:23](https://www.youtube.com/watch?v=PUv66718DII&t=683s) 调整乌龟弹力与时间倒流机制 Bret Victor 继续演示他的平台跳跃游戏原型。在代码中,乌龟的移动速度可以自由调节:速度可以是正数让它向前走,也可以是负数让它倒退,但他认为乌龟就应该慢吞吞的,于是设定了一个较低的速度。接着他指向处理碰撞的代码:当主角踩在乌龟头上时,乌龟会被踩扁并在片刻后恢复,同时主角获得向上的垂直速度(y velocity)弹入空中。 这里的关卡设计意图是:玩家不能直接跳上高处平台,而是必须借助乌龟反弹进入下方一条狭窄的通道,绕路解密后再回头拿到星星。然而当前的弹性太大了,主角直接跳到了上方。Bret Victor 在运行时直接调小了代码中的弹力数值,但再次尝试后发现弹力又太小,跳不进通道。虽然无需重新编译即可实时修改代码很方便,但这依然无法让他立刻判断主角究竟能否完成那次跳跃。为此,他暂停了游戏,并拉动顶部的时间滑块倒流回跳跃前的状态。在重放过程中,系统会沿用先前录制的键盘输入操作,同时运行修改后的新代码来重新模拟运动轨迹。 ```mermaid flowchart LR accTitle: "游戏开发中的时间控制流程" accDescr: "展示从传统修改代码到时间倒流再到时空映射的可视化演进过程" subgraph Step1["传统尝试"] A["暂停并修改代码"] --> B["重新运行测试"] end subgraph Step2["时间滑块"] B --> C["录制输入并时间倒流"] C --> D["按新参数向前重放"] end subgraph Step3["时空映射"] D --> E["绘制未来轨迹 (Trail)"] E --> F["拖动数值即时调整未来"] end ``` ### [13:19](https://www.youtube.com/watch?v=PUv66718DII&t=799s) 将时间映射到空间:所见即未来 仅仅能够倒流时间对 Bret Victor 而言依然不够理想。他认为创作者必须能够立刻看到改动的结果,而不需要一次次手动倒带和重播。 > “And if you have a process in time and you want to see changes immediately, you have to map time to space.”(Bret Victor 强调) 为了实现这一点,他在主角踩中乌龟并暂停游戏后,点击了一个显示角色轨迹(Trail)的按钮。屏幕上随即绘制出一条清晰的移动路径:角色身后的轨迹代表他去过的地方,而倒带后展现在他面前的轨迹则直观地代表了他将要前往的路径,即角色的“未来”。当 Bret Victor 在代码编辑器中拖动调整弹性参数时,屏幕上的轨迹线随之实时变形与伸缩。他只需要看着轨迹线的弧度对准缝隙,就能直接找到那个精确的数值,按下播放后角色分毫不差地滑入了通道中。 > “Creators need to be able to see what they're doing. If you're designing something embedded in time, you need to be able to control time, you need to be able to see across time, otherwise you're designing blind.”(Bret Victor 说道) - 时间如果不能在屏幕上展开为空间维度,设计师就只能在脑海中盲目猜测运动过程。 - 轨迹线(Trail)将动态的物理模拟静态化、空间化,使得原本随时间推移才能观测到的状态变化变成了可直接编辑的视觉实体。 ### [14:38](https://www.youtube.com/watch?v=PUv66718DII&t=878s) 探索游戏机制与特里·卡瓦纳的游戏设计 有了这种立即可视化的反馈环境,探索代码本身就成了一种充满乐趣的创作过程。Bret Victor 随手将重力参数改成了轻微的负值,角色便开始晃晃悠悠地向上漂浮。他指出,光是围绕这种“重力操纵”的机制,就足以衍生出一整款完整的独立游戏。 他进一步演示,哪怕只是随手注释掉代码的第一行——禁止角色向左移动,让他只能向右走——也能催生出极具创意的玩法。著名独立游戏制作人特里·卡瓦纳(Terry Cavanagh)就曾围绕这一概念制作了一款名为《别回头》(*Don't Look Back*)的杰作。不仅如此,特里·卡瓦纳还制作过另一款代表作《VVVVVV》(由六个字母 V 组成),该游戏完全去掉了跳跃按键,唯一的机制是让角色颠倒重力,在天花板与地面之间上下穿梭。Bret Victor 现场通过修改几行参数,让自己的角色也能吸附在天花板上行走,还原了这种关卡障碍的通过方式。这种环境的核心价值在于:只要创作者脑海中冒出一个念头,就能在产生的瞬间立刻上手尝试。 ### [16:24](https://www.youtube.com/watch?v=PUv66718DII&t=984s) 抽象算法的可视化:拒绝在脑中“扮演计算机” 前面展示的树木生成与平台跳跃游戏都属于图形化极强的程序,只需观察画面就能获得直观反馈。Bret Victor 提出一个更深层的问题:对于更为抽象的通用算法,我们该如何贯彻“看见自己在做什么”这一原则? 他以最经典的二分查找(Binary Search)算法为例。二分查找的基本逻辑非常清晰:在一个有序数组中通过不断折半查找目标键值(key),维护 `low` 和 `high` 两个上下界指针,取中间值比对并逐步缩小范围。然而,当它变成代码出现在传统编辑器中时,人们看到的只有抽象的字符。 > “And to a large extent, the people that we consider to be skilled software engineers are just those people that are really good at playing computer. But if we're writing our code on a computer, why are we simulating what a computer would do in our head? Why doesn't the computer just do it and show us?”(Bret Victor 质问道) 在传统开发中,程序员必须在脑子里虚拟出一个数组,逐行心算变量状态。Bret Victor 认为,所谓“优秀的软件工程师往往只是极其擅长在脑子里模拟计算机的人”,但这本身是一种荒谬的倒退——代码明明是写在性能强大的计算机上的,为什么反倒让人类去干计算机最擅长的心算工作? ### [18:07](https://www.youtube.com/watch?v=PUv66718DII&t=1087s) 具象示例驱动的交互式二分查找 Bret Victor 展示了他为编写抽象算法构建的原型界面。在左侧声明函数 `function binarySearch(key, array)` 时,右侧工作区立刻给出提示:这个函数接收具体是什么样的参数?它需要具体的数据作为支撑。 他在右侧提供了一组具体范例:有序数组 `['A', 'B', 'C', 'D', 'E', 'F']`,目标键值设置为 `'D'`。随后他在左侧开始写逻辑: 1. 输入 `low = 0`,右侧立刻显示 `low = 0` 的具象状态; 2. 输入 `high = array.length - 1`,右侧即刻求值显示 `high = 5`; 3. 计算中点索引 `mid = (low + high) / 2`,右侧立刻暴露出结果是 `2.5`。 > “And I caught that bug literally the second I typed it, instead of writing the entire function in 20 unit tests.”(Bret Victor 指出) 他立刻加上了 `Math.floor` 向下取整,中点顺利变为 `2`。这种即时反馈让他无需等到写完整段逻辑并运行几十个单元测试之后才发现下标不是整数。紧接着,他粘贴进条件分支代码(比对数组中点值与目标值的大小),右侧清晰地高亮了实际走通的分支路径,并展示出指针的新状态。 ```mermaid flowchart TD accTitle: "二分查找循环的多列可视化展开" accDescr: "展示算法在具体范例下三次循环迭代的状态列" subgraph Iter1["第 1 次迭代"] A1["范围: low=0 ('A'), high=5 ('F')"] --> B1["中点: mid=2 对应 'C'"] B1 --> C1["'C' < 'D': 调整 low = 3"] end subgraph Iter2["第 2 次迭代"] A2["范围: low=3 ('D'), high=5 ('F')"] --> B2["中点: mid=4 对应 'E'"] B2 --> C2["'E' > 'D': 调整 high = 3"] end subgraph Iter3["第 3 次迭代"] A3["范围: low=3, high=3"] --> B3["中点: mid=3 对应 'D'"] B3 --> C3["找到目标 'D' 并返回索引 3"] end Iter1 --> Iter2 Iter2 --> Iter3 ``` ### [20:18](https://www.youtube.com/watch?v=PUv66718DII&t=1218s) 循环展开与直观排查死循环 当他在外层包裹上 `while (1)` 循环后,界面的右侧横向排列展开了三个并列的列,分别对应循环的第 1 次、第 2 次和第 3 次迭代。每一列都巨细靡遗地展示了该轮迭代中所有变量的值和执行分支,没有任何状态被隐藏。通过在输入端切换不同的查找键,整个算法在各次迭代中的分支走向一目了然,使人能够迅速建立起对算法运作规律的直觉。 为了测试边界条件,Bret Victor 尝试查找一个不存在于数组中的元素 `'G'`。系统立刻显示算法陷入了无限循环,无法返回结果。观察展开的迭代列可以发现,前几次循环都很正常,但到了某一步时,`low` 的值竟然超过了 `high`,搜索区间彻底崩塌。在传统环境中,这个死循环可能导致程序卡死,但在该工具中,异常状态直接暴露在眼前。他一眼看出循环的不变量条件必须是 `low <= high`,随即将其填入 `while` 语句中,并补上了找不到元素时返回哨兵值的逻辑。原本需要脑补推理的复杂调试,在透明的数据流面前变得如同肉眼检视一般自然。 ### [22:45](https://www.youtube.com/watch?v=PUv66718DII&t=1365s) 原则超越编程:普适于一切创作 在演示完二分查找的实现后,Bret Victor 进行了阶段性的总结。他再次重申了核心原则:“创作者必须能够看到他们正在做的事情,并且在创作过程中必须拥有即时连接。” 尽管他在演讲的前半部分使用了“绘制交互式树木”、“平台跳跃游戏物理调节”以及“二分查找算法实现”这三个纯代码的实例,但这仅仅是因为身处一个软件工程会议的场合。 > “To me, this principle has nothing to do with programming in particular; it has to do with any type of creation.”(Bret Victor 郑重声明) 他明确表示,这一原则绝非软件开发或编程工具所独有,它关乎人类所有类型的创造行为。为了证明这一点,他准备将话题拓宽,进一步展示代码之外其他创作领域的实例。 ### [23:11](https://www.youtube.com/watch?v=PUv66718DII&t=1391s) 电路设计中的隐形数据与即时波形可视化 为了展现“即时连接”(immediate connection)原则在整个工程领域中的广泛适用性,Bret Victor 转向了一个完全不同的工程分支:电子电路。他在屏幕上补完了一张手绘风格的电路原理图,连上最后一根导线和阻值为 1.2 的元件。电路理论上已经闭合工作,但在静止的图纸上却看不出任何动静。Victor 直言,这与编写传统代码面临的困境如出一辙:人被困在一个静态的符号表征中,而真正核心的变量值和数据流却完全不可见。在电路中,这些变量就是每根导线上随时间变化的电压。如果是在真实的实验台上搭建物理电路,工程师至少还能拿起示波器的探头到处测一测,看看不同节点上的实际波形;而在计算机里绘图时,这种感知却被彻底剥夺了。 ```mermaid flowchart LR accTitle: 电路表征的演进层次 accDescr: 从静态原理图到电压可视化,再到电压与电流一体化数据块的演化过程。 subgraph S1["传统静态表征"] A["纸面符号原理图<br>(数据完全隐形)"] end subgraph S2["初级动态增强"] B["示波器探头探测<br>(单点局部观察)"] C["展开所有节点<br>(全电路线路电压波形)"] end subgraph S3["数据原生表征"] D["元件替换为电流波形块<br>(电压与电流交互一体化)"] end A --> B B --> C C --> D ``` Victor 随即演示了环境应当如何提供反馈。他先调出一条线路的电压随时间变化曲线,屏幕上立刻清晰地显现出高低交替的振荡波形,同时上方两个作为指示灯的 LED 也随着模拟运行在实时闪烁。然而,设计这类电路需要理解每一根导线上的电压及其在整个网络中的动态交互过程。面对这种复杂度,工程师面临两条路:“要么设计环境直接展示给你看,要么你就得在脑子里去模拟;而我的大脑有更重要的事情要做,不想拿去模拟电子的运动。”于是,他将整个电路在画布上拉开间距,直接在每一个节点旁嵌入该处的实时电压波形图。 更进一步,Victor 展示了交互探索的威力:只要将鼠标悬停在任意一个节点上,该节点的波形阴影就会同时投射覆盖到全电路其他所有波形上,使任意两个节点的相位和电平对比一目了然。当他用光标拖拽一个 70k 的电阻数值时,所有波形即时扭曲重算,同时界面还会保留拖动前的波形残影作为基准参考线。Victor 指出,这正是信息设计的两条黄金法则:展示数据(show the data),展示对比(show comparisons)。 - 传统静态电路图无法呈现各节点随时间动态变化的电压变量。 - 在改进界面中,鼠标悬停于任一节点即可在所有其他波形上叠加该节点的半透明阴影,实现零摩擦的跨节点波形对比。 - 直接点击并拖动元件数值(如 70k 电阻)可实现全电路波形的毫秒级实时联动重算,且保留修改前的阴影轨迹供直观比对。 ### [26:32](https://www.youtube.com/watch?v=PUv66718DII&t=1592s) 从纸面符号到以数据为介质:反思编程工具的历史包袱 仅展示电压依然不够完整。在模拟电路设计中存在两种根本的数据类型:电压与电流。单纯观察电压无法看清流经各个元器件的电流大小,而模拟电路的核心正是电压与电流之间的相互交织。Victor 再次展开电路布局,直接用记录元件内部实时电流曲线的蓝色矩形模块彻底替代了原本的电阻、电容等抽象符号。每个矩形方块仅在角落保留一个小图标标识其元件类型,方块本身则完全由正在波动的电流波形构成。整张电路图不再由毫无生气的小弯曲折线堆砌,而是直接由活生生的物理数据搭建而成,消除了任何需要在大脑中硬扛的虚拟推演。 借此范例,Victor 引导观众反思底层工具的演化源头:电路图上那些波浪线和符号究竟因何而生?答案非常朴素:因为它们最适合用铅笔在纸上绘制。但现代计算机绝不是一张死板的纸,面对全新的计算媒介,人们必须重新审视这些理所当然的形式,思考新媒介如何赋予人更即时的连接与可视性。 这种由旧介质历史局限所导致的认知束缚,在计算机编程领域表现得尤为顽固: - 现代人对“计算机程序”的主流认知——即写好一份纯文本定义清单然后喂给编译器——直接沿袭自 1950 年代后期的 Fortran 与 ALGOL。那些语言最初完全是为打孔卡片(Punch Cards)设计的:程序员把指令打在一叠纸卡上交由机房操作员处理,随后只能离开等待输出,整个流程根本不存在“交互性”的概念,而这一前设至今仍深植于编程体系之中。 - C 语言最初是在电传打字机(Teletype)上设计出来的。在 Ken Thompson 与 Dennis Ritchie 的历史照片中看不到任何图形显示器,Ritchie 本质上是在对着一台能自动回打字符的高级打字机工作。 - 现代开发者依然习惯使用的控制台、终端窗口(Terminal)乃至交互式命令行(REPL / Interactive Top Level),本质上只是在现代化屏幕上对半个世纪前电传打字机的模拟仿真;人们误以为 REPL 就是真正的“交互式编程”,仅仅是因为那曾是电传打字机所能达到的极限。 ### [29:06](https://www.youtube.com/watch?v=PUv66718DII&t=1746s) 突破传统关键帧补间:用双手演奏动画 为了证明“即时连接”绝不仅限于软件或硬件工程,而是适用于一切人类创造性活动,Victor 将话题切换到了艺术创作领域——手绘动画。在以 Flash 为代表的传统动画软件中,制作一段树叶从枝头飘落的短片通常依赖“关键帧”(Keyframes)和“补间”(Tweening):创作者在时间轴第 20 帧插入一个关键帧并放置叶片,在第 40 帧再插入一个并调整位置,最后让软件自动连线补齐中间帧。Victor 当场演示了这个过程并直言其弊端:“我完全是在瞎猜;我看不到运动,也感觉不到节奏,我只是在时间和空间里乱扔东西。”其结果如同两颗台球在生硬地来回反弹,完全丧失了自然飘落的有机质感。人脑明明清楚一片落叶如何摇曳,甚至能用手掌在空中直接比划出那段轻柔的运动轨迹,但传统软件却根本无法接收这双手传达的直觉。 ```mermaid flowchart TD accTitle: 交互式动画表演创作流程 accDescr: 使用 iPad 多点触控应用通过双手表演录制落叶、镜头平移与兔子跳跃的全流程。 subgraph Phase1["第一阶段:落叶表演"] A1["左手滚轴推进时间<br>右手运笔表演轨迹"] A2["调出旋转控制器<br>补录叶片摇摆与即兴翻转"] A1 --> A2 end subgraph Phase2["第二阶段:镜头推拉"] B1["框选图层并调整远景灵敏度<br>(形成视差视差效果)"] B2["根据落叶触地的心里节奏<br>手势拖曳平移进入雪景"] B1 --> B2 end subgraph Phase3["第三阶段:角色动画"] C1["等待起跳时机手势位移"] C2["沿途拨动关键姿态卡牌<br>(完成兔子跳跃变形)"] C1 --> C2 end Phase1 --> Phase2 Phase2 --> Phase3 ``` 随后,Victor 展示了他在 iPad 上构建的原型应用录屏。在没有预设关键帧参数的情况下,创作者全程依靠双手协同操作:左手拇指随时切换图层或控制时间滚轮,右手则像演奏乐器一样直接“表演”动画。创作过程紧凑而流畅: 1. **落叶轨迹与翻转**:右手捏住叶片,随着时间推进直接划出飘落轨迹;随后倒回时间轴,调出旋转控制工具,在叶片脱离枝头的瞬间手势录入旋转摆动,并在空中随性添加了一记顺应直觉的即兴翻转。 2. **多图层视差平移**:将前景、中景与背景全部框选编组,调低远景图层的移动灵敏度以生成视差效果;随后倒放至片头重新体会整体节奏,在落叶触地后稍作停顿,凭借身体感觉平滑向右拖动镜头,缓缓过渡到冬日雪景。 3. **角色动作与姿态切换**:镜头定格后,等待合适的节奏节点将小兔子向前拖拽跳跃,并在腾空至落地的精确瞬间快速切动物理姿态库中的不同卡牌,瞬间完成兔子蹦跳的完整动画。 整段长达数十秒的复杂场景在短短 2 分钟内便彻底制作完成。Victor 总结道:“我用自己的双手把它当成乐器一样演奏出来,在短短两分钟内完成,在我与我想要创造的东西之间建立起了极为即时的连接。”这个工具的灵感,正是来源于他数年前尝试制作一段类似落叶动画时所遭遇的创作痛苦。 - 传统基于关键帧与补间的制作模式剥离了时间感与动态直觉,迫使创作者在时间和空间参数上靠猜测盲调。 - Victor 设计的触控动画工具将双手角色解耦:一手控制时间轴推移与工具切换,另一手负责空间轨迹与形变的物理表演录制。 - 镜头横移不需要在参数面板敲入毫秒数值,而是依靠创作者感知落叶触地后的节拍停顿,实时用手势拖曳完成带有远近视差的推拉镜头。 - 整个创作流程摒弃了冰冷的配置面板,创作者如同乐手即兴演奏一般,在瞬间捕捉灵感与微调动作细节。 ### [34:16](https://www.youtube.com/watch?v=PUv66718DII&t=2056s) 被锁在头脑中的想法:不是“机会”,而是“道德责任” 布雷特·维克多(Bret Victor)回想起自己曾经想做的一部动画短片:画面中一片树叶从树上飘落。为了在 Flash 中给那片树叶打关键帧,他整整耗费了一整天的时间,却始终无法做出想要的效果,那个项目最终只能就此夭折。时至今日,他依然保留着当年的分镜脚本,偶尔还会弹奏自己为那部作品谱写的配乐,但作品本身却永远被锁闭在了他的大脑深处。这件事让他不断联想到,世界上究竟还有多少数以百万计的绝妙构思,正同样被死死禁锢在无数人的脑海里——这不仅关乎动画或艺术创作,更关乎改变世界的发明以及拯救生命的重大科学发现。任何想法的孕育都需要适宜的土壤;如果缺乏一个让创作者能够通过“即时连接”(Immediate Connection)去悉心浇灌的环境,许多想法根本无法破土而出,或者在萌芽时便走向畸形。 维克多指出,前面演示的所有原型工具,本质上都源自他在周围环境中敏锐地捕捉到了这项原则被践踏的痕迹,并试图去修正它。然而,整个故事中最核心的部分在于:他为什么要确立这样的原则?当他目睹创作者被工具束缚、构想被迫妥协时,他的第一反应绝不是将其视为商机。他不会兴奋地搓着手说“太好了,这下有做产品、开公司、搞科研或是发表论文的机会了”,他也完全不是为了享受“创造事物本身的乐趣”。对他而言,想法是极其神圣而珍贵的: > “当看到想法在无声中消亡时,我感到无比痛心;我看到的是一场悲剧,在我的感受里,这是一种道德过错,一种不公;如果我认为自己有能力为此做点什么,我便觉得这是我的责任——不是机会,而是责任。”(Bret Victor) - **树叶坠落的动画困境**:整整一天的 Flash 关键帧调试无果,导致整部作品胎死腹中,唯有分镜与配乐留存。 - **思维与工具的断层**:缺乏即时反馈的创作环境,会扼杀或扭曲包括艺术创作、重大发明与科学突破在内的一切原始构思。 - **行动驱动力的本质**:拒绝将创作障碍视为世俗意义上的“商业机会”或“纯粹技术难题”,而是视其为必须承担的“道德责任”。 --- ### [37:00](https://www.youtube.com/watch?v=PUv66718DII&t=2220s) 技术激进主义:用发明代替组织去战斗 “不公”(Injustice)、“责任”(Responsibility)与“道德过错”(Moral Wrong),这绝不是人们在计算机或工程技术领域通常能听到的词汇。这类字眼向来紧密关联着社会议题——例如对抗言论审查、性别歧视或是环境破坏。面对公民权利遭到践踏的现场,绝大多数正常人绝不会冷眼旁观并将其视作“有利可图的机会”。纵观人类历史,正是那些率先指认社会沉疴并将纠正不公视为己任的先行者,选择了一种投身于信念的激进主义(Activist)生活方式。 维克多在这场演讲中最想传达的核心观点,便是这种“激进主义”的生活方式绝非社会运动家的专属特权。作为一名技术专家,你同样可以敏锐地洞察世界现存的技术缺陷与认知桎梏,描绘出一个更美好的未来图景,并将一生奉献给某项坚定不移的原则: > “社会活动家通常通过发动组织来战斗,但你完全可以通过发明创造来战斗。”(Bret Victor) ```mermaid flowchart TD accTitle: 技术激进主义与社会激进主义的路径对比 accDescr: 展示面对被忽视的文化错误时,社会激进分子与技术发明家各自采取的不同行动路径与共同归宿。 subgraph Problem["认知阶段"] A["洞察被文化习以为常的深层不公"] --> B["确立不可妥协的核心指导原则"] end subgraph Action["行动路径"] B --> C["社会激进主义路线<br/>(如 Elizabeth Cady Stanton)"] B --> D["技术激进主义路线<br/>(如 Larry Tesler / Doug Engelbart)"] C --> E["发起社会运动、组织群众抗争"] D --> F["重构交互范式、发明全新工具"] end subgraph Goal["终极诉求"] E --> G["消除系统性压迫,解放人类潜能"] F --> G end ``` --- ### [38:14](https://www.youtube.com/watch?v=PUv66718DII&t=2294s) 拉里·泰斯勒与“消灭模式”的抗争 为了阐释何为“以发明为武器的激进主义”,维克多列举了计算机交互先驱拉里·泰斯勒(Larry Tesler)的生平。20 世纪 70 年代中期,在施乐帕洛阿尔托研究中心(Xerox PARC)工作期间,个人电脑的概念还处于绝对的蛮荒期。当时泰斯勒和他的同事们坚信个人计算具有颠覆性的潜能,能够彻底重塑人类思考与生活的方式。然而,当时所有的软件界面几乎全盘基于“模式”(Modes)来构建。以文本编辑器为例,用户无法像在传统打字机上那样敲击按键就直接在屏幕上显示字符;系统默认处于“命令模式”(Command Mode),如果想输入文字,必须先按 `I` 键切换到“插入模式”,输完后再按 `Escape` 键退回;追加文字需要按 `A`,移动文本则需要按下 `M` 键进入专属的移动模式。 作为软件用户研究(User Studies)的开拓者,泰斯勒在长期观察普通人操作计算机的过程中震惊地发现:即便经过了系统的培训和长达数周的高频使用,大量用户依然无法在计算机前感到自如,而繁琐的“模式切换”正是将人们阻隔在计算世界之外的罪魁祸首。在泰斯勒看来,模式的复杂性成了阻碍个人计算愿景落地的巨大障碍与威胁。于是,他将消灭模式确立为自己毕生的个人使命,并立下一条原则:“任何人都不该被困在模式之中”(No person should be trapped in a mode)。 泰斯勒将“不要模式化束缚我”(Don't mode me in)印在自己的 T 恤上,将其作为日常口号,并贯彻到了自己的全部设计中。最终,他打造出了著名的文本编辑器 Gypsy,奠定了现代文本编辑交互的基石: - **无模式文本输入**:屏幕上设立固定的插入光标,用户只要敲击键盘上的 `W` 键,屏幕上就绝对且无条件地呈现字母 `W`。 - **点击并拖拽选择(Click and Drag)**:发明了类似荧光笔划线的高亮选择,这也是拖拽交互最早的应用之一。 - **剪切、复制与粘贴(Cut, Copy, Paste)**:选中内容后执行剪切,随后在任何需要的时候执行粘贴,用户无需在专属的操作模式之间来回横跳。 当泰斯勒再次观察初学者使用这套系统时,那些生平从未见过计算机的人——在当时这代表了绝大多数人——仅用半个小时就能完全上手。这一无模式的设计理念迅速渗透到了当时 PARC 正在孵化的整个桌面图形界面之中,深刻到让今天的用户觉得这一切生来如此、理所当然。泰斯勒对这一事业的执着绝非夸大其词:在长达 30 年的时间里,他汽车的个性化车牌号始终是“NO MODES”;他建立的个人网站域名是 `nomodes.com`,甚至连推特账号也直接叫 `@nomodes`。 --- ### [41:59](https://www.youtube.com/watch?v=PUv66718DII&t=2519s) 重新定义发明:文化反思而非纯粹的技术解题 维克多深刻剖析了人们对泰斯勒功绩的传统认知误区。普通的人物传记往往会平铺直叙地写道:“拉里·泰斯勒发明了剪切、复制和粘贴。”但在维克多看来,这种陈述极具误导性。这种发明与托马斯·爱迪生(Thomas Edison)发明留声机有着本质的不同:爱迪生基本上是在摆弄技术时偶然撞见了音频记录的物理机制,随后将其工程化,并列出一长串可能应用该技术的商业清单——爱迪生在发明之初根本没有任何特定的文化反思或人文诉求。与此相反,泰斯勒所做的一切,完全是对当时特定技术文化语境中某种压抑人性的现象所做出的正面反抗。 另一种常见的行业叙事是:“拉里·泰斯勒攻克了无模式文本操作这一难题。”维克多同样认为这种说法完全偏离了重心: > “因为他所解决的那个问题,完完全全只存在于他自己的头脑之中;对于当时的其他所有人来说,根本没有人认为那是个问题。”(Bret Victor) 在当时的计算机界,软件存在模式就如同人类拥有两只手臂一样,被视为不可动摇的既成事实和自然法则。泰斯勒真正做出的首要贡献,是识别出了一种“在既有文化中早已被彻底合理化、甚至变得完全隐形的错误”。 这与历史上的重大社会变革惊人地相似。150 年前,当伊丽莎白·卡迪·斯坦顿(Elizabeth Cady Stanton)挺身而出高呼“女性应当享有投票权”时,全社会都认为她不可理喻、大逆不道。在那个时代,性别歧视已深深嵌入社会运转的肌理,变得无人察觉,她必须率先洞察这种不公并向其宣战。斯坦顿与泰斯勒的内核是完全一致的: - **相同的起点**:指认被大众习以为常的文化毒瘤; - **相同的构想**:描绘一个彻底根除该错误的理想世界; - **相同的奉献**:将毕生精力投入到捍卫某项原则的战斗中; - **唯一的不同**:斯坦顿选择通过社会运动去组织战斗,而泰斯勒选择通过技术发明去战斗。 这种以原则为驱动的特质,同样闪耀在道格·恩格尔巴特(Doug Engelbart)身上。恩格尔巴特近乎以一己之力发明了交互式计算系统——包括将信息投射于屏幕、非线性导航浏览、多重视角切换以及指针操纵。在那个计算机实时交互宛如天方夜谭的年代,后人大多只记住了他是鼠标的发明人,却忽略了他自始至终无比明确的终极诉求:“让人类有能力去解决全球面临的紧急危机”。恩格尔巴特坚信必须构建一套强大的信息工具,让“知识工人”(Knowledge Workers)能够汇聚并激发群体智慧;他之所以投身计算机领域,仅仅是因为他有一种直觉——唯有这种新兴的技术载体,才有可能承载他那宏大的人文愿景。 ### [45:25](https://www.youtube.com/watch?v=PUv66718DII&t=2725s) 愿景与行动主义:Alan Kay 与 Richard Stallman 的原则之路 Bret Victor 进一步举出计算机历史上的两位巨擘,证明那些带来颠覆性变革的发明并非源于偶然的职业选择,而是来自对深层理念的执着追求。第一位是 Alan Kay,他曾在施乐帕洛阿尔托研究中心(Xerox PARC)领导实验室,现代图形桌面界面的核心构件——窗口(Windows)、图标(Icons)、命令菜单(Menus)以及面向对象编程(OOP)等,都诞生于他及其团队之手。Alan Kay 的宏大目标正是:“放大人类的认知能力,为一个急需转变的摇摇欲坠的文明带来全新的思维方式”(“amplify human reach and bring new ways of thinking to a faltering civilization that desperately needed it”)。他选择的切入路径是儿童。Alan Kay 坚信,如果孩子们能够熟练运用计算机思维——让编程成为一种像读写一样普遍的基础读写能力(literacy)——那么他们长大后就会具备全新的批判性思维和认识世界的方式,从而构建一个更加开明、启蒙的社会。这与当年文字读写能力的普及对人类文明带来的蜕变完全一致。Alan Kay 所做的一切发明,都源自他对这一愿景的追求,源自他从让·皮亚杰(Jean Piaget)、玛丽亚·蒙特梭利(Maria Montessori)以及杰罗姆·布鲁纳(Jerome Bruner)等儿童认知发展心理学先驱那里汲取的原则。 另一位代表人物是软件激进主义(Software Activism)的象征——Richard Stallman。Stallman 发起了 GNU 计划(构成了现代任何 Linux 系统的核心基石),创立了自由软件基金会(Free Software Foundation),编写了 GCC、GPL 协议等无数重要工具。他的核心原则是软件必须自由——“此自由意在自由权利,而非免费”(“software must be free as in Freedom”)。Stallman 始终明确强调,软件自由是一个关乎道德是非的问题,而且他在自己的个人生活中采取了极其不妥协的姿态去践行这一信念。 Bret Victor 强调,这些极具影响力的人物将整个人生奉献给了为特定理想而战的道路,他们内心拥有极度明确的是非观念。他们常常是在对抗权威或根本不认为现状有任何不妥的主流群体。直到今天,现实世界距离他们的理想依然相去甚远,在他们眼中,这个世界仍处于危机之中,因此他们从未停止战斗。 - **Alan Kay 的原则与理论来源**: - 核心愿景:以计算机为媒介普及新思维,重塑文明; - 认知理论奠基人:让·皮亚杰(Jean Piaget)、玛丽亚·蒙特梭利(Maria Montessori)、杰罗姆·布鲁纳(Jerome Bruner); - 核心产物:图形用户界面(窗口、图标、菜单)、面向对象编程语言 Smalltalk 等。 - **Richard Stallman 的原则与软件自由**: - 核心信念:软件代码的自由分享与修改是道德和伦理层面的正义问题; - 核心产物:GNU 操作系统组件、GCC 编译器、GPL(通用公共许可证)、自由软件基金会(FSF)。 ### [47:40](https://www.youtube.com/watch?v=PUv66718DII&t=2860s) 三种人生道路:工匠、问题解决者与原则追随者 在剖析了这些历史人物后,Bret Victor 明确澄清自己的意图:“我并不是说你必须这样生活,我不是说你应该这样生活,我想说的是,你可以这样生活,这种生活方式是对你敞开的一种选择。”(“What I'm saying is that you can, that this lifestyle is an option that's available to you, and it's not one that you're going to hear about much.”)然而,这种生活方式极少会被人提及。学校里的职业规划顾问绝不会建议学生在技术领域发起一场个人的社会运动,相反,整个现实世界都在试图让人们用“技能”来定义自己。大学里划分的专业、职场上的工种都在强化这一点:你是一名软件工程师,继而细分为数据库工程师或前端工程师,被动地接收别人分派的前端界面去实现。Bret Victor 称追求技艺精湛的道路为“工匠之道”(The Craftsman),这是世界上最普遍的一条路。 另一条常被谈及的道路是“问题解决者之道”(The Problem Solver)。在 Bret Victor 看来,商业创业(Entrepreneurship)与学术研究(Academic Research)本质上是这枚硬币的两面:某一个领域已经存在,里面罗列着一系列未解决的问题或未被满足的市场需求,你走进去挑出一个问题,攻关并做出贡献;过了一段时间,你再挑出另一个问题,重复这一过程。这两条道路都非常有价值且值得尊重,但 Larry Tesler 当年所走的完全不是这两条路。Tesler 并不是在为用户体验设计领域做贡献,因为当时根本就没有这个领域;他也不是在解决一个公认的未决难题,因为那个问题原本只存在于他自己的头脑里,外界甚至不承认“模式限制”是一个问题;他更不是用某种专业技能来标榜自己。 “在维基百科上,可能会把他写成计算机科学家或用户体验专家,但对我而言,这就像说伊丽莎白·卡迪·斯坦顿(Elizabeth Cady Stanton)是一名社区组织者一样——不,伊丽莎白·卡迪·斯坦顿确立了女性选举权原则,那就是她的身份,那是她选择的认同;而 Larry Tesler 确立了无模式交互的原则。”Bret Victor 强调,Tesler 并非被动适应技术,而是拥有某种内在信念,并凭此将外部世界拉向了自己的愿景。 ```mermaid flowchart TD accTitle: 三种人生路径的对比 accDescr: 图表展示工匠、问题解决者与原则追随者三种不同的人生驱动模式 subgraph CraftsmanPath ["工匠之道 (The Craftsman)"] A1["由技能定义自我<br/>(例如:前端/数据库工程师)"] --> A2["追求技艺精益求精"] A2 --> A3["实现他人指派的需求"] end subgraph SolverPath ["问题解决者之道 (The Problem Solver)"] B1["进入现有领域/市场"] --> B2["挑选已知难题或市场痛点"] B2 --> B3["创业或学术研究,做出增量贡献"] end subgraph PrinciplePath ["原则追随者之道 (The Principle Follower)"] C1["洞察到某种不被主流认可的'错误'"] --> C2["确立指引性原则与理想愿景"] C2 --> C3["重塑世界与工具,为原则而战"] end ``` ### [50:02](https://www.youtube.com/watch?v=PUv66718DII&t=3002s) 原则的探索:自我发现与广泛经验的积累 Bret Victor 指出,一个人可以选择遵循原则而活,但这种人生状态也可能在不知不觉中选择你。确立原则往往不可能一蹴而就,因为寻找原则本质上是一场深刻的自我发现之旅——去探寻自己的生命究竟要为何而活、作为一个人到底要坚守什么。 Bret Victor 坦言,自己花了整整十年的时间,贯穿了整个二十几岁的青年时期,才真正让内心的核心原则凝固成型。年轻时,他虽然隐约觉得自己必须以某种带有使命感的方式生活,也偶尔能捕捉到那些对自己真正重要的吉光片羽,却始终看不清全貌。这种找不到方向的迷茫令他深感痛苦和焦虑。当时他所能采取的办法,就是海量地去尝试不同的事物:动手制作各式各样的作品、广泛涉猎完全不同类型的领域、研习多元的知识并积累极其丰富的体验。 他将这一漫长的过程视为剖析自我的参照镜:把每一段具体经历拿来拷问内心——这件事是让我产生强烈共鸣,还是让我厌恶反感,抑或只是让我无动于衷?他借此构建起一个充满强烈情感反应的“体验库”,继而抽丝剥茧去理解底层的共通规律,寻找究竟是什么神秘成分让自己对某些事物产生如此剧烈的反应。最后他提醒听众,如果过早地将自己局限在单一技能的机械练习中,就极难获得对原则追寻而言不可或缺的广阔阅历。 ### [51:38](https://www.youtube.com/watch?v=PUv66718DII&t=3098s) 原则的核心属性:具有具体洞见的判断标准 Bret Victor 针对“原则”提出了极其严苛的标准:原则绝不能仅仅是某种泛泛而谈的宽泛想法。现实中经常能听到很多人宣称自己的目标是“让软件更易于使用”、“取悦用户”或者当下最流行的“把事物变简单”。这些口号虽然听上去很美好,也能提供大致的行进方向,但它们因为太模糊而根本无法指导具体的行动(“too vague to be directly actionable”)。 相比之下,真正的原则必须包含具象而深刻的洞见: - **Larry Tesler 的洞见**:他同样喜欢“简单”,但他的原则是极其精准的定论——“任何人都不应被困在某种模式之中”(“no person should be trapped in a mode”)。这一原则拥有强大力量,因为它赋予了他一套看待世界的全新标尺,以近乎客观的方式将世界划分为对与错。当他看到一个人在屏幕上选中一段文字时,他只需问一个非黑即白的问题:“这个人现在处于某种模式中吗?是还是否?”如果答案是肯定的,他就必须想方设法将其消灭。 - **Bret Victor 自己的洞见**:他也认同“创作者需要强大的工具”,但这句口号无法指导实际研发。他的原则被精准收窄为“创作者需要即时的反馈连接”(Immediate Connection)。在开发编程工具时,他所面对的检验标准无比明确:“当你修改这一行代码时,你是否立即看到了修改带来的效果?是还是否?”如果不是,他就必须采取行动做出改变。 演讲中所展示的所有令人震撼的原型系统与实时反馈演示,全部来自对这一定量标准的严格践行。正如 Bret Victor 所言:“如果你恪守的原则蕴含着某种具体的洞见,它就会指引你,你将永远清楚地知道自己正在做的事情是否正确。”(“So if your guiding principle embodies a specific insight, it will guide you, and you'll always know if what you're doing is right.”) ### [53:18](https://www.youtube.com/watch?v=PUv66718DII&t=3198s) 做出选择:拒绝默认路径,为你相信的事业而战 在演讲的最后两分钟,Bret Victor 将话题从技术与原则升华到了人生的自主权上。他指出,一个人在生命中最重要的一项觉醒,就是意识到生活中的方方面面本质上都是一种选择。 社会中充斥着太多现成的“默认选项”(default choices)。人们可以选择在生活中随波逐流(sleepwalk through your life),沿着社会为你预设好的既定轨道按部就班地走下去,选择默默接受现实世界的一切现状。但他以极其坚定而富有感染力的语调提醒全场:“但是,你并非必须如此。”(“But you don't have to.”) 如果在这个世界上,存在某些你发自内心觉得不合理、不能接受的错误,并且你对一个更加美好的世界怀有清晰的愿景,你完全可以去追寻属于你自己的指引性原则,并投身于一场崇高事业的抗争之中。演讲在掌声中平实而庄严地收尾: > “在这场演讲结束后,我希望你们能花一点时间,认真思考一下究竟什么对你才是真正重要的,你坚信什么,以及你愿意为什么而战。谢谢大家。” > (“So after this talk, I'd like you to take a little time and think about what matters to you, what you believe in, and what you might fight for. Thank you.”) ## Notable quotes > [01:12](https://www.youtube.com/watch?v=PUv66718DII&t=72s) Creators need an immediate connection to what they're creating. — Bret Victor > [04:06](https://www.youtube.com/watch?v=PUv66718DII&t=246s) So much of art, so much of creation is discovery, and you can't discover anything if you can't see what you're doing. — Bret Victor > [13:19](https://www.youtube.com/watch?v=PUv66718DII&t=799s) Creators need to be able to see what they're doing. If you're designing something embedded in time, you need to be able to control time, you need to be able to see across time, otherwise you're designing blind. — Bret Victor > [07:16](https://www.youtube.com/watch?v=PUv66718DII&t=436s) If there's any delay in that feedback loop between thinking of something and seeing it and building on it, then there's whole world of ideas which will just never be. These are thoughts that we can't think. — Bret Victor > [37:00](https://www.youtube.com/watch?v=PUv66718DII&t=2220s) 社会活动家通常通过发动组织来战斗,但你完全可以通过发明创造来战斗。 — Bret Victor > [34:16](https://www.youtube.com/watch?v=PUv66718DII&t=2056s) 如果我认为自己有能力为此做点什么,我便觉得这是我的责任——不是机会,而是责任。 — Bret Victor > [51:38](https://www.youtube.com/watch?v=PUv66718DII&t=3098s) So if your guiding principle embodies a specific insight, it will guide you, and you'll always know if what you're doing is right. — Bret Victor > [53:18](https://www.youtube.com/watch?v=PUv66718DII&t=3198s) 认真思考一下究竟什么对你才是真正重要的,你坚信什么,以及你愿意为什么而战。 — Bret Victor ## Mentioned Bret Victor, JavaScript, HTML5 Canvas, Terry Cavanagh, Don't Look Back, VVVVVV, Fortran, ALGOL, C 语言, Ken Thompson, Dennis Ritchie, Adobe Flash, iPad, Larry Tesler, Xerox PARC, Gypsy, Thomas Edison, Elizabeth Cady Stanton, Doug Engelbart, Alan Kay, Smalltalk, Jean Piaget, Maria Montessori, Jerome Bruner, Richard Stallman, GNU, Free Software Foundation, GCC, GPL [Source](https://www.youtube.com/watch?v=PUv66718DII)

Source quotes

[1:12] Bret Victor: Creators need an immediate connection to what they're creating. [4:06] Bret Victor: So much of art, so much of creation is discovery, and you can't discover anything if you can't see what you're doing. [13:19] Bret Victor: Creators need to be able to see what they're doing. If you're designing something embedded in time, you need to be able to control time, you need to be able to see across time, otherwise you're designing blind. [7:16] Bret Victor: If there's any delay in that feedback loop between thinking of something and seeing it and building on it, then there's whole world of ideas which will just never be. These are thoughts that we can't think. [37:00] Bret Victor: 社会活动家通常通过发动组织来战斗,但你完全可以通过发明创造来战斗。 [34:16] Bret Victor: 如果我认为自己有能力为此做点什么,我便觉得这是我的责任——不是机会,而是责任。 [51:38] Bret Victor: So if your guiding principle embodies a specific insight, it will guide you, and you'll always know if what you're doing is right. [53:18] Bret Victor: 认真思考一下究竟什么对你才是真正重要的,你坚信什么,以及你愿意为什么而战。

Source quotes

[11:23] Bret Victor: If you're designing something embedded in time, you need to be able to control time. You need to be able to see across time; otherwise you're designing blind. [51:38] Bret Victor: Larry Tesler likes simplicity, but his principle was the specific nugget of insight: no person should be trapped in a mode.

Original transcript

[0:00] [Applause] [0:07] so um unlike the previous session I [0:09] don't have any prizes to give out I'm [0:11] just going to tell you how to live your [0:13] life this talk is actually about a way [0:16] of living your life that most people [0:18] don't talk [0:20] about as you approach your career you'll [0:23] hear a lot [0:24] about following your [0:27] passion or doing something you love [0:30] I'm going to talk about something kind [0:31] of different I'm going to talk about [0:33] following a [0:36] principle finding a guiding principle [0:38] for your work something you believe is [0:40] important and necessary and right and [0:43] using that to guide what you [0:45] do the three parts of this talk I'm [0:48] first going to talk about the principle [0:49] that guides a lot of my work going try [0:52] to give you a taste of what comes out of [0:53] that and I'm going to talk about some [0:56] other people that have lived this way [0:58] what their principles are what they [0:59] believe in [1:00] but these are all just examples to help [1:03] you think about what you believe in and [1:07] how you want to live your [1:10] life so to begin with [1:12] me ideas are very important to me I [1:15] think that bringing ideas into the world [1:18] is one of the most important things that [1:19] people do and I think that great ideas [1:23] in the form of great art stories [1:27] inventions scientific theories these [1:29] these things take on lives of their own [1:32] which give meaning to our lives as [1:33] people so I think a lot about how people [1:36] create ideas and how ideas grow and in [1:39] particular what sorts of tools create a [1:43] healthy environment for ideas to [1:45] grow and I've spent a lot of time over [1:47] the years making creative tools using [1:50] creative tools thinking about this a lot [1:52] and here's something I've come to [1:54] believe [1:56] creators need an immediate connection to [2:00] what they're creating so that's my [2:01] principle creators need an immediate [2:03] connection to what they create and what [2:06] I mean by that is when you're making [2:08] something if you make a change or you [2:10] make a decision you need to see the [2:12] effect of that immediately there can't [2:14] be a delay and there can't be anything [2:16] hidden readers have to be able to see [2:18] what they're doing so now I'm going to [2:21] show you a series of cases where I [2:23] noticed that that principle is violated [2:25] and I'll show you what I did about that [2:27] and then I'm going to talk about the [2:28] larger the larger context which I do [2:30] this [2:32] work so to begin with let's think about [2:34] coding here's how coding works you type [2:37] a bunch of code into a text editor kind [2:39] of imagining in your head what each line [2:41] of code is going to do and then you [2:44] compile and run and something comes out [2:47] so in this case it's just JavaScript [2:48] drawing to a canvas and it draws this [2:51] little scene with a [2:52] tree but if there's anything wrong with [2:55] the scene or if I if I want to make [2:57] changes if I have further ideas I have [3:00] to go back to the code and I edit the [3:02] code compile and [3:04] run see what it looks like anything [3:07] wrong I go back to the code most of my [3:09] time is spent working in the code [3:11] working in a text editor blindly without [3:13] an immediate connection to this thing [3:16] which is what I'm actually trying to [3:19] make so I feel this goes against this [3:21] principle I have that creators need an [3:23] immediate connection they're making so I [3:26] tried to come up with a coding [3:27] environment that I thought might be more [3:29] in line with this principle [3:32] have so what I have here is I've got [3:36] this picture on the side and the code on [3:39] this side and this this part draws the [3:42] sky and this draws the mountains this [3:44] draws the [3:45] tree and when I make any change to the [3:48] code the picture changes [3:51] immediately so the code and the picture [3:53] are always in sync there's no compile [3:55] and run I just change things in the code [4:00] and I see things change in the [4:04] picture and now that we have this [4:06] immediate connection between the code in [4:08] the picture we can start thinking about [4:09] ways of changing the code other than [4:11] typing so for example this number here [4:13] is the the length of the branches if I [4:16] want to control that number I just point [4:17] my mouse to it hold down the control key [4:19] and I can dial it up and [4:22] down so I can see what it looks like for [4:24] big branches or small branches and I can [4:27] kind of converge on what feels right to [4:29] me artistically [4:31] and this works for any number of the [4:32] code I just point to it dial it up and [4:34] down and some of these numbers here I I [4:36] know what they do but still kind of [4:38] surprising to see them do [4:40] it and other ones are just um completely [4:47] surprising so down here I've got um I've [4:50] got this for Loop where I'm counting to [4:51] 16 I'm putting 16 little pink blossoms [4:54] on every branch and I can turn that down [4:57] for Less Blossom or turn it up for more [5:00] but look at what I'm doing here I'm just [5:03] kind of moving that number up and down [5:05] around 20 or so and it has this really [5:07] interesting shimmering effect it kind of [5:09] looks like the the wind is blowing [5:10] through the [5:12] tree and the first time I saw this I [5:14] immediately started thinking about how I [5:16] could use this effect for an [5:19] animation how would I ever have [5:21] discovered that if I had to compile and [5:22] run between every [5:24] change so much of art so much of [5:26] creation is Discovery and you can't [5:29] discover anything if you can't see what [5:30] you're [5:31] doing so I've shown you adjusting the [5:33] code let's add some code so I'd like to [5:36] put a sun up here in the sky so I go to [5:38] the end of the draw Sky function and I [5:41] want to fill a circle so I start typing [5:44] context fill Circle and as soon as I [5:46] start typing I get this autocomplete [5:48] list of the different fill methods so [5:50] those are the different things I could [5:51] type there fill Circle fill wct fill [5:54] text and as I move up and down this [5:56] autocomplete list I immediately see what [5:59] what each of them is [6:01] doing so I don't have to imagine what it [6:03] would do from the method name I don't [6:05] have to look at the [6:06] documentation I just see it see it [6:09] immediately so I want the circle and I'm [6:12] going to adjust the x coordinate and the [6:15] y coordinate change the radius of [6:19] it and that looks about right probably [6:22] should be yellow so I'm going to set the [6:24] fill style context fill style same auto [6:27] complete as before choose fill Style F [6:30] gives me white by default um and I can [6:35] change that color code the same way I [6:36] change any number point to it hit the [6:38] control key and you got color palette so [6:42] I can choose nice yellow for my my [6:47] son although the white was kind of [6:49] interesting I [6:51] thought kind of didn't expect that but [6:54] with white it now looks like the Moon [6:55] instead right [6:59] Hey look it's [7:04] nighttime so having this immediate [7:05] connection allows ideas to surface and [7:08] develop in ways that would be impossible [7:16] before but there's still a problem here [7:18] I think which is I've got this picture [7:21] and I've got this code over here and I [7:22] have to maintain the mapping between the [7:24] two in my head so I've got all these [7:27] lines of code and just looking at this [7:29] line I don't immediately know what it [7:31] does so here's what I can do I can hold [7:35] down the option key my cursor changes to [7:37] a magnifying glass and now as I roll [7:39] over each line of code it's highlighting [7:41] in the picture what's being drawn in [7:44] that [7:45] line so if I want to know what's going [7:48] on in this function I just kind of roll [7:50] down the function and see what what see [7:52] what [7:55] highlights so here I've got two calls to [7:57] draw a mountain I don't know which is [7:59] which well that's that mountain and [8:00] that's that [8:01] mountain and this has to work the other [8:03] way too that if I see part of the [8:05] picture I need to know what code was [8:07] responsible for drawing it so I do the [8:09] same thing I hold down the option key [8:12] and now as I move over each pixel of the [8:13] picture you'll see on the right it's [8:16] jumping to the line of code that Drew [8:18] that [8:19] pixel so that Drew the sky and that Drew [8:22] the tree I drew the [8:26] blossom so this is really important for [8:28] maintaining that map but it's also [8:30] really useful just for navigating around [8:33] so you know I want to make the I want to [8:34] make the Sun a little bit bigger so I [8:36] jump there make this sun a little bigger [8:38] I want to bring up the tree a little bit [8:39] so I jump there bring up the tree a [8:42] little bit I want to bring up the Mounds [8:43] a little bit so I jump there bring up [8:45] the mountains a little bit and I can [8:47] make these changes as quickly as I think [8:48] of [8:50] them and that is so important to the [8:52] creative process to be able to try ideas [8:55] as you think of them [8:59] if there's any delay in that feedback [9:01] loop between thinking of something and [9:03] seeing it and building on it then [9:06] there's there's whole world of ideas [9:09] which which will just never [9:13] be these are thoughts that we can't [9:15] think [9:33] ideas are very important to me and the [9:36] thing about [9:37] ideas is that ideas start [9:40] small ideas start out tiny and weak and [9:43] fragile in order to develop and mature [9:47] ideas need an environment where the [9:48] Creator can nurture them and kind of [9:51] take care of them feed them and shape [9:53] their growth and to me that's what this [9:55] principle of immediate connection is all [9:56] about [9:59] and because ideas are so precious to [10:01] me when I see this principle [10:04] violated when I see ideas stillborn or [10:07] stunted because the Creator couldn't see [10:08] what they're doing I feel that's [10:11] wrong and not wrong in the sense of [10:14] violating some UI guideline or going [10:16] against some best practice but wrong in [10:18] a deeper sense than [10:20] that and I'll come back to this but I [10:22] want to show you another example of [10:23] following this principle so in this code [10:26] here there's no State there's no [10:28] persistent state so there's no time [10:30] there's no [10:31] interactivity and I was thinking about [10:33] how would we handle those aspects of [10:35] coding in a way that's in line with this [10:38] principle I have creators need an [10:39] immediate [10:41] connection so what I have here is a [10:44] little platform game so here's my little [10:46] guy he can run around he can jump he can [10:51] die and the code for him is over here so [10:54] this code makes them run around this [10:56] makes them jump this makes them collide [10:58] with things [11:00] and down here I've got some code for [11:03] this little turtle and the turtle is not [11:05] doing much right now because I haven't [11:07] finished writing his code so I'm just [11:09] going to do that right now say on each [11:11] tick his Exposition plus equals his [11:15] Direction times the time interval 160th [11:18] of a second times some speed which um I [11:23] don't know could be fast could be [11:26] slow if it's negative he walks backwards [11:33] and these are all ideas I can use for [11:34] other enemies but um I think Turtles are [11:37] supposed to be slow so that's a good [11:40] speed for a [11:41] turtle and then up here I've got some [11:44] code that says when my guy collides with [11:47] the turtle he gets some y velocity so he [11:49] bounces into the air and the turtle gets [11:52] stomped so that looks like that and the [11:56] turtle gets up after a bit [12:01] the problem is I don't want the player [12:03] to be able to get up here yet I want the [12:05] player to bounce off the turtle and go [12:07] through this little passageway down here [12:10] and I'll have to go around and you know [12:11] solve puzzles and whatnot to come back [12:13] and get the star so the turtle is too [12:16] bouncy right now now of course I can [12:18] just turn that down in the [12:20] code and now I can try it but now it's [12:24] not bouncy [12:25] enough and so while it's nice that I can [12:27] kind of adjust the code while it's [12:29] running instead of having to stop and [12:31] recompile and find my place again I [12:33] can't immediately see what I need to see [12:36] which is whether or not he can make that [12:39] jump so here's what I'm going to do I'm [12:42] going to bounce off the turtle and pause [12:44] the game so I pause the game and now [12:47] there's this slider up here which lets [12:50] me rewind through [12:56] time and now I can rewind to back before [12:59] I made the jump and changed the code to [13:02] make him less bouncy and now when I move [13:04] it forward it's going to simulate [13:05] forward using the same input controls [13:07] the same keyboard commands are recorded [13:08] as before but the new [13:17] [Music] [13:19] code this is not good [13:24] enough I need to be able to see changes [13:26] immediately I need to be able to see [13:28] immediately whether or not my bounciness [13:31] is [13:33] correct none of this [13:35] stuff and if you have a process in time [13:38] and you want to see changes immediately [13:40] you have to map time to [13:42] space so here's what I'm going to do [13:45] going to bounce off my turtle pause the [13:47] game and now hit this button here which [13:50] shows my guy's [13:52] Trail so now I can see where he's been [13:56] and when I rewind [13:59] this Trail in front of him is where he's [14:01] going to be this is his [14:03] future and when I change the code I [14:06] change his [14:09] future so I can find exactly the value I [14:12] need so that when I hit play he slips [14:14] right in [14:25] there so creators need to be able to see [14:27] what they're doing if you're designing [14:28] something beded in time you need to be [14:30] able to control time you need to be able [14:32] to see across time otherwise you're [14:34] designing [14:38] blind as I was playing with this I [14:40] noticed it's fun to play with gravity so [14:42] I can make gravity a little negative and [14:44] he starts to float up in the [14:46] air and I can kind of play with that and [14:48] try to get to try to stay [14:51] there and you could probably make an [14:53] entire game around just just this [14:56] mechanic here this gravity manipulation [14:59] in fact I bet I could fiddle with any [15:02] part of this code and come up with an [15:03] idea for a game even if I just if I just [15:07] comment out the first statement in the [15:10] code now my guy can't move left he can [15:12] only move [15:14] right which sounds kind of silly but [15:17] Terry Kavanaugh actually made a [15:18] beautiful game around that concept [15:19] called Don't Look [15:22] Back ter Kavanaugh um he made another [15:25] really wonderful game which you might [15:27] have seen called V as letter v six times [15:31] and the way that game works is that you [15:34] can't jump instead you can only flip up [15:36] play down and you fall up instead of [15:39] falling down so it kind of works like [15:41] this that You' fall go on the ceiling or [15:43] you can walk around on the ground and so [15:46] you'd have these levels which kind of [15:48] look like this and you'd kind of walk [15:51] around and you have to learn how to [15:52] navigate train like [15:55] this and so if you had like a [15:59] something like that you wouldn't be able [16:00] to jump over it you'd have to like flip [16:01] over and flip over and you got an [16:03] amazing amount of gameplay about out of [16:05] this [16:05] concept so again being able to try ideas [16:09] as you think of [16:24] them this example and the last one with [16:26] the tree these are both very visual [16:29] programs we able to see our changes just [16:31] by seeing how the picture changes so I [16:33] was thinking about how we could do more [16:36] abstract coding that's more in line with [16:38] this principle how can we write a [16:40] generic algorithm in such a way that we [16:41] can see what we're [16:43] doing so as an example let's take a look [16:46] at binary search um super quick [16:49] refresher on how binary search works you [16:51] have an array of values that are in [16:52] order and you have a key which is the [16:55] value that you're trying to locate [16:56] within the array and we keep track of [16:58] two variables which are the lower and [17:00] upper bounds of where you think that [17:02] value could possibly be right now it [17:04] could be anywhere and you look right in [17:06] the middle of that range what you find [17:08] is too small then the key has to be [17:11] after that you look in the middle of the [17:13] range what you find is too big the key [17:14] has to be before that and you kind of [17:16] keep subdividing your range until you [17:18] narrow in on the value you're looking [17:21] for and in code binary search looks like [17:25] this and from my perspective you can't [17:27] see anything here [17:29] you can't see anything I see the word [17:30] array but I don't actually see an [17:33] array and so in order to write code like [17:35] this you have to imagine an array in [17:37] your head and you essentially have to [17:38] play computer you have to simulate in [17:41] your head what each line of code would [17:43] do on a computer and to a large extent [17:46] the people that we consider to be [17:47] skilled software Engineers are just [17:49] those people that are really good at [17:50] playing [17:51] computer but if we're writing our code [17:54] on a [17:55] computer why are we simulating what a [17:58] computer would do in our head why isn't [18:00] the computer just do it and show [18:04] us so let's write binary [18:07] search [18:10] function binary search takes a key and [18:14] an array and then over here on this side [18:17] it's saying okay it takes key in an [18:18] array such as what give me an example we [18:22] need something to work with here so for [18:24] instance my array might be a b c D [18:30] EF and let's say for instance we're [18:32] looking for the [18:33] D so now let's start coding um the lower [18:37] bound starts out at zero over here it [18:40] says low equals zero nothing amazing [18:42] there upper bound starts out at the end [18:45] of the array so high equals array length [18:48] minus one and over here it says High [18:51] equals [18:52] 5 so I have my abstract formula in the [18:56] code over here it's giving me the [18:58] concrete value corresponding to these [19:01] example arguments so I don't have to [19:04] maintain this picture in my head it's [19:06] just showing it to [19:08] me so now I need the the index in the [19:12] middle of the array so I'm going to take [19:13] the average of those two mid equals low [19:16] plus High over two [19:18] and well that's obviously not right 2.5 [19:22] is not a valid array index so I guess I [19:25] need to round this [19:26] off so I'm going to add the floor [19:28] function and it rounded down to two and [19:30] I caught that bug literally the second I [19:32] typed it instead of writing the tire [19:34] function in 20 unit [19:36] tests so now I get the value out of the [19:42] array and then I need to subdivide my [19:45] range which so there's an if statement [19:47] which I'll just paste in [19:49] here so in this case the the value I [19:52] found is less than the key so it's [19:54] taking this first branch of the F [19:55] statement it's adjusting the lower bound [19:59] of course if the key was [20:01] smaller then it would take the spren of [20:03] the F statement and adjust the upper [20:04] bound or if the key was C then we would [20:09] have just happened to find it on the [20:10] first shot and we'd return the index so [20:13] this is the first [20:15] iteration of this [20:18] algorithm and now what we need to do is [20:20] Loop we've subdivided the array we need [20:22] to keep subdividing until we narrow in [20:25] on what we're looking for so we need to [20:27] loop I will just Loop while one do all [20:34] this and now what we have are three [20:37] columns corresponding to three [20:39] iterations of this Loop so this First [20:42] Column here is exactly what you saw [20:43] before low and high span the entire [20:45] array we found a c it was too low so we [20:49] adjust our lower bound Loop up to here [20:52] second iteration bounce are tighter we [20:54] found an e adjust the upper bound third [20:57] iteration Loop up to here low and high [21:00] are the same we've narrowed it down to a [21:02] single candidate is indeed the key we're [21:04] looking for and we return its index so [21:07] there's nothing hidden here you see [21:09] exactly what the algorithm is doing at [21:11] every point and I can go up to here and [21:14] try different keys so I can see how the [21:16] algorithm behaves for these different [21:18] input [21:19] arguments and by looking across this [21:22] data I can develop an intuition for how [21:24] this algorithm works so I'm trying [21:27] different Keys here and say I try [21:29] looking for a [21:31] G and this looks a little different it's [21:34] not actually [21:36] returning and the reason for this is I'm [21:39] looking for a key which is not actually [21:41] in the array and the only way of [21:43] breaking out of this Loop is by finding [21:45] the key so it's kind of stuck here [21:48] looping [21:49] forever so we can take a look at this [21:51] and see what went wrong where where's [21:53] this algorithm going off the rails these [21:55] first few iterations look fine but this [21:58] this iteration looks weird because low [22:01] is greater than high where our range is [22:04] completely [22:06] collapsed so if we get to this point [22:08] then we know the key can't be found so I [22:10] see this faulty condition here I say oh [22:12] that's not right low has to be less than [22:13] or equal to [22:14] high okay well I'll just put that over [22:17] as the condition of my while statement [22:18] low less than or equal to high and then [22:21] that would break out of the loop and I [22:23] would return some Sentinel to say that [22:25] could be found so here we have three [22:28] itation of the loop couldn't be found we [22:30] return the non-filing [22:32] value so that's what it might be like to [22:34] write an algorithm without a blindfold [22:45] on so I've got this principle again that [22:49] creators need to be able to see what [22:51] they're doing that they need this [22:52] immediate connection to what they're [22:53] making and I've tried to show this [22:55] principle through three coding examples [22:58] but that's just because this is a [22:59] software engineering conference I [23:00] thought I was supposed to talk about [23:01] programming but to me this principle has [23:04] nothing to do with programming in [23:07] particular it has to do with any type of [23:10] creation so I'd like to show you a [23:11] couple more demos just to show you the [23:13] breadth of what I have in mind [23:16] here so to begin with let's take a look [23:18] at a different branch of [23:21] engineering so here I have an electronic [23:23] circuit that I drew um I'm not quite [23:25] done drawing it so let me finish up [23:28] there [23:31] and [23:32] 1.2 and now we have a working [23:36] circuit I mean I assume it's a working [23:38] circuit I don't actually see anything [23:39] working [23:40] here so this is exactly the same as [23:43] writing code that we work in this static [23:45] representation but what we actually care [23:47] about is the data the values of the [23:50] variables and we can't see that here now [23:52] in a circuit the variables are the [23:55] voltages on these different wires so [23:57] each of these wires has a voltage that's [23:59] changing over time and we have to be [24:01] able to see that now if I was building [24:03] the circuit on a lab bench building it [24:05] physically I could at least take an [24:07] oscilloscope and kind of poke around and [24:09] see what's going on in the different [24:10] wires what's going on here or here so at [24:13] the very least I should be able to do [24:15] that so what I have here is a plot of [24:19] the voltage on this wire over time we [24:21] can see it's high it's low high and low [24:24] so this is clearly oscillating if I [24:27] built this physically also I would [24:29] actually be able to see the circuit [24:30] doing something so in this case I've got [24:32] these two LEDs up here these are LEDs [24:35] little lights presumably they're there [24:37] for a reason I can hit play and watch it [24:41] simulate out in real time so now you can [24:43] see what the circuit's [24:50] doing in order to design a circuit like [24:52] this you have to understand the voltage [24:54] on every wire you have to understand how [24:58] the voltages are changing throughout the [24:59] entire circuit and just like coding [25:02] either environment shows that to you or [25:05] you simulate it in your head and I have [25:07] better things to do with my head than [25:09] simulate what electrons are doing so [25:11] what I'm going to do I'm going to spread [25:13] these out a little bit so same circuit [25:15] just spread out a little bit and I'm [25:17] going to add the voltage at every node [25:20] so now you can see every voltage [25:22] throughout the circuit and I can even [25:25] hit play and watch it all kind of [25:26] simulate out in real time [25:29] although what I prefer to do is just [25:32] move my mouse over it and I can kind of [25:36] look in areas that are interesting to me [25:37] and see what the values [25:39] are I can compare any two nodes so if [25:42] you look at say the node over here while [25:44] I Mouse over this one you can see the [25:46] shadow of the one I'm mousing over is [25:48] overlaid on that the shadow of the one [25:50] I'm mousing over is actually overlaid on [25:51] all of them and so I can compare any two [25:54] modes just by mousing over one of them [25:56] and looking at the other one [25:59] and again I can immediately see the [26:02] results of my changes so I've got the [26:04] 70k resistor here I want to change its [26:06] value I just click and drag it and now I [26:08] see the waveforms changing [26:11] immediately and you'll notice that when [26:13] I click and drag it leaves behind the [26:16] shadow of the waveform before I started [26:18] dragging so I can compare I can [26:21] immediately see the results of my [26:24] changes two golden rules of information [26:26] design show the data show comparisons [26:30] that's all I'm doing here but even this [26:32] isn't quite good enough what we're [26:34] seeing here are the voltages but in [26:36] electronics there's actually two data [26:38] types there's voltage and there's [26:39] current and what we're not seeing is the [26:41] current flowing through each of these [26:43] components and in order to design a [26:44] circuit you need to understand both the [26:46] voltage and the current you need to [26:48] understand the interplay between the two [26:49] that's what analog design is so what I'm [26:52] going to do is spread these out a little [26:53] bit more and now I'm going to replace [26:55] each of these [26:57] components with with a plot of the [26:59] current going through it over time so [27:02] each of these blue boxes represents a [27:04] component and you can see which [27:05] component it is because has a little [27:07] badge in the corner a little icon but [27:10] now you can see everything that's going [27:12] on in the circuit and see how the [27:14] current changes you can see how voltage [27:17] and the current changes there's nothing [27:19] hidden there's nothing to simulate in [27:21] your head so what we have here is a [27:25] different way of representing a circuit [27:28] just in general you could draw any [27:30] circuit with these blocks but instead of [27:32] being made out of little squiggly [27:33] symbols it's made out of data and I [27:36] think it's important to ask why do we [27:39] have these squiggly symbols in the first [27:41] place why do they exist they exist [27:44] because they're easy to draw with pencil [27:45] on [27:46] paper this is not paper so when you have [27:50] a new medium you have to rethink these [27:51] things you have to think how can this [27:53] new medium allow us a more immediate [27:55] connection to what we're making how can [27:57] this new medium allows to work in such a [27:59] way we can see what we're doing and it's [28:01] really the same situation with [28:02] programming our current conception of [28:04] what a computer program is a list of [28:07] textual definitions that you hand to a [28:08] compiler that's derived straight from [28:10] Fortran and alol in the late 50s those [28:14] languages were designed for Punch [28:16] Cards so you would type your program [28:18] onto a stack of cards and hand it to the [28:21] computer operator it's the guy in the [28:22] bottom picture and you would come back [28:25] later so there was no such thing as [28:27] interactivity back then and that [28:29] assumption is baked into our current [28:31] Notions of what programming [28:34] is C was designed for [28:36] teletypes so that's Ken Thompson and [28:39] Dennis Richie up there Richie made C and [28:42] there are no video displays in this [28:44] picture Richie is basically typing on a [28:46] fancy typewriter that types back to him [28:49] and anytime you use a console or [28:51] terminal window you're emulating a [28:54] teletype and even today people still [28:57] think of a reppel or an interactive top [28:59] level as being interactive programming [29:02] because that's the best that you could [29:03] do on a [29:06] teletype so I have one more demo I want [29:08] to show because I want to emphasize that [29:11] this principle mediate connection is not [29:13] even about engineering it's about any [29:15] type of creation so I want to move to a [29:17] different field [29:19] entirely so let's think about [29:21] animation so I've got this painting here [29:24] with the tree and leaf on it and I want [29:28] to make a little video with the leaf [29:30] kind of drifting down the tree and the [29:33] normal way of doing this in a [29:35] conventional animation package like [29:36] flash is through key [29:39] frames so you basically say where you [29:41] want the leaf to be at different points [29:43] in time and then you hit play and see [29:44] what it looks [29:45] like [29:47] so I'm I'm going to say okay at frame 20 [29:51] I'm going to create a key [29:52] frame and the leaf should be [29:55] there then frame 40 [29:58] create a key frame and leave me there [30:00] and I am just totally guessing here I [30:02] cannot see the motion I cannot feel the [30:04] timing I'm just throwing things in time [30:07] and [30:12] space and so I've got this slea at [30:14] different points in time I'm going to [30:15] add a tween which tells flash to connect [30:17] the [30:19] dots and then I'm going to hit play and [30:21] see what it looks [30:25] like and it looks ridiculous it looks [30:27] like billiar balls bouncing back and [30:32] forth and the thing is I kind of know [30:35] what I want right it's a leaf I want [30:38] Leaf drifting down from a tree and I can [30:41] even kind of perform that see with my [30:42] hand Leaf drifting down from a [30:45] tree but Flash doesn't know how to [30:47] listen to my [30:48] hand but maybe there's a new medium that [30:52] does know something about listening to [30:54] my [30:55] hand so what I'm going to show you here [30:58] is a little app I made for performing [31:01] animation and we're not really set up to [31:03] um do a live demo off the iPad so I'm [31:05] just going to play you a video of me [31:07] making a [31:10] video the way the scene's going to play [31:12] out is um the leaf is going to kind of [31:13] drift down from the tree and the scene's [31:15] going to pan over and the rabbit's going [31:16] to do something and um two things one [31:21] this going to move pretty quickly and [31:23] second I'm going to be using both hands [31:26] at almost all times [31:29] so I've got these different layers the [31:30] background the mid-ground the foreground [31:32] I'm choosing which layer to move using [31:33] my left thumb I'm going to move my leaf [31:37] to its position move my bunny off stage [31:40] and start time rolling now I'm going to [31:43] perform the leaf drifting down from the [31:48] tree run it back check out that how that [31:51] looked the motion looks pretty good but [31:53] the leaf kind of needs to rock back and [31:55] forth so I'm going to pull out a [31:57] rotation controller run it back find [31:59] where the leaf is about to break off and [32:02] record the rotation and I add a little [32:05] flip there just because it felt right in [32:07] the moment it wasn't even [32:08] planned stop because I want to pan over [32:11] so I want to drag a whole bunch of [32:12] layers at once I grab all the layers [32:13] into a list I turn down the sensitivity [32:15] of the background layers so they'll move [32:16] slower for a kind of Parallax effect I [32:18] only want to move horizontally so I pull [32:20] out a horizontal dragger and check out [32:22] how it looks um I don't quite like The [32:24] Parallax so I adjust the sensitivi a [32:26] little bit try out again I like that [32:30] better so I get ready to go [32:34] I run it back to the beginning so I can [32:36] kind of get back into the rhythm of the [32:39] piece the leaf hits I wait a beat and I [32:44] start panning and I don't know how many [32:45] frames I waited I don't know how long it [32:47] was I went when it felt [32:49] right so I pan over to this winter scene [32:52] and kind of slow down and [32:53] stop and then I run it back because I [32:56] want to do something for my bunny throw [32:58] away those tools CU I'm done with [33:00] them [33:02] and wait until I think my bunny should [33:05] move and he hops away and I've got a few [33:09] different poses from a bunny so I pull [33:11] those out and then I find the point [33:14] where the bunny is about to take off the [33:17] ground which is right there I switch his [33:21] pose and I kind of toggle between the [33:22] poses as he hops away and then I run it [33:25] back cuz I want to check out how it [33:27] looks and I'm just going to bring that [33:28] up full screen for you this is the [33:49] piece so I made that in 2 minutes [33:51] performing with my hands like a musical [33:53] instrument very immediate connection [33:55] between me and what I was trying to [34:06] make one of The Inspirations for this [34:09] tool was an animation that I tried to [34:11] make several years ago not that one but [34:15] it also began with a leaf drifting down [34:16] from a tree and I spent all day in [34:19] flashh trying to key frame that [34:22] leaf could do [34:24] it and so that was the end of that you [34:27] know I I still have my [34:29] storyboards sometimes I play the music I [34:31] wrote for the piece but the piece itself [34:33] is locked in my [34:36] head and so I always think about the [34:39] millions of pieces that are locked in [34:41] millions of [34:43] heads and not just animation and not [34:45] just art but all kinds of ideas all [34:50] kinds of ideas including critically [34:52] important ideas world changing [34:54] inventions life-saving scientific [34:56] discoveries these are all IDE [34:58] ideas that must be grown and without an [35:02] environment in which they can grow where [35:03] their creator can nurture them with this [35:05] immediate connection many of these ideas [35:08] will not [35:09] emerge or they'll emerge [35:12] stunted so I have this principle that [35:15] creators need an immediate connection [35:17] and all of those demos that I just [35:19] showed you simply came from me looking [35:22] around noticing places where that [35:24] principle was [35:26] violated then trying to fix that that's [35:29] really all I did I just followed this [35:32] guiding principle and it guided me to [35:35] what I had to [35:39] do but I haven't said much about the [35:42] most important part of the story which [35:43] is [35:45] why why I have this principle why I do [35:51] this when I see a violation of this [35:53] principle I don't think of that as an [35:55] opportunity [35:58] when I see creators constrained by their [36:01] tools their ideas compromised I don't [36:04] say oh good an opportunity to make a [36:05] product or an opportunity to start a [36:08] business or an opportunity to do [36:10] research or contribute to a [36:12] field I'm not excited by finding a [36:14] problem to solve I'm not in this for the [36:16] the joy of making [36:19] things ideas are very precious to [36:21] me and when I see ideas [36:24] dying it hurts [36:28] I see a [36:30] tragedy to me it feels like a moral [36:32] wrong it feels like an injustice and if [36:34] I think there's anything I can do about [36:36] it I feel it's my responsibility to do [36:39] so not opportunity but [36:43] responsibility now this is just my thing [36:45] I'm not asking you to believe in this [36:46] the way that I do my point here is that [36:49] these words that I'm [36:51] using [36:52] Injustice responsibility moral [36:56] wrong these AR the words we normally [36:58] hear in a technical [37:00] field we do hear these words in [37:03] association with social causes so things [37:06] like [37:07] censorship gender discrimination [37:09] environmental destruction we all [37:11] recognize these things as moral [37:14] wrongs most of us wouldn't witness a [37:16] civil rights violation and think oh good [37:18] an [37:18] opportunity I hope [37:20] not instead we've been very fortunate to [37:23] have had people throughout history who [37:26] recognize these social wrongs [37:28] and saw it as their responsibility to [37:30] address them and so there's this [37:32] activist lifestyle where a person [37:34] dedicates themselves to fighting for a [37:38] cause that they believe [37:39] in and the purpose of this talk is to [37:43] tell you that this activist lifestyle is [37:46] not just for social activism as a [37:49] technologist you can recognize the wrong [37:51] in the world you can have a vision for [37:53] what a better world could be and you can [37:56] dedicate yourself to fighting for a [37:58] principal social activists typically [38:01] fight by organizing but you can fight by [38:06] inventing so now I'd like to tell you [38:08] about a few other people who have lived [38:10] this way starting with Larry [38:14] tesler Larry has done a lot of wonderful [38:17] things in his life but the work I'm [38:19] going to tell you about he did in the [38:20] mid-70s at Z [38:22] Park and at the time there really wasn't [38:25] a such thing as personal computers the [38:27] notion of personal Computing was very [38:28] young and Larry and his colleagues at [38:31] Park felt that it had transformative [38:33] potential that personal Computing could [38:35] change how people thought and lived and [38:39] I think all of us in this room would [38:40] agree that they turned out to be right [38:41] about that but at the time software [38:45] interfaces were designed around [38:48] modes so in a text editor for instance [38:51] you couldn't just type and have words [38:54] appear on the screen like on a [38:55] typewriter you would be in command mode [38:57] if you wanted to insert text you'd have [38:59] to press I to go into insert mode and [39:01] Escape back out to command mode or maybe [39:02] you hit a to go into impend mode or if [39:04] you want to move text around you hit M [39:05] to go into move mode and You' have to [39:06] select and You' be in mode to select and [39:08] move things around and [39:11] Larry would watch people using the [39:15] computer Larry actually pioneered the [39:17] concept of software user studies another [39:19] thing that he did but he would watch [39:21] people using the software and he found [39:23] that many people even after training and [39:26] weeks of use many people were not [39:28] becoming comfortable with the [39:29] computer and he believed that it was [39:33] these modes that were to blame that the [39:35] the complexity of modes was a kind of [39:37] barrier that many people couldn't [39:39] couldn't cross and so this kind of [39:42] represented a a [39:44] threat to this dream of what personal [39:47] Computing could [39:48] be so Larry made it his personal mission [39:50] to eliminate modes from software and he [39:52] formed a principle no person should be [39:55] trapped in a mode [39:58] his slogan that he would go around [39:59] saying was don't mode me in and he had [40:00] it printed on his [40:02] T-shirt and this principal informed [40:05] everything that he did he he thought [40:07] about it with all the work that he did [40:09] and eventually he came up with a text [40:11] editor called Gypsy which essentially [40:14] introduced text editing as we know today [40:16] there was an insertion point and when [40:19] you typed words appeared on the [40:21] screen to select text he invented [40:24] modeless selection with click and drag [40:26] so you just click and drag Dr over the [40:28] text you want to select like using a [40:29] highlighter one of the first uses a drag [40:32] to move text around he invented these [40:35] commands that he called cut copy paste [40:37] you select and cut later on you paste in [40:40] whenever you're ready you're never [40:42] trapped in a mode you're never to [40:43] switching between modes when you hit the [40:45] W key on the keyboard you get W on the [40:47] screen [40:48] always and he would watch people using [40:51] his software and he found that someone [40:53] who had never seen a computer before [40:55] which was most people back then could be [40:57] up and running like half [40:59] hour so this was clearly a [41:01] transformative change in enabling people [41:03] to connect with [41:04] computers and his ideas about [41:08] modess spread to the rest of the desktop [41:10] interface which was then being invented [41:12] at park at the same time and today [41:14] they're so ingrained in the Computing [41:15] experience that we kind of take them for [41:19] granted now I said that Larry made [41:23] elimination of modes his personal [41:25] mission that's actually his words and if [41:28] you think he's exaggerating here's [41:30] Larry's license plate for the last 30 [41:33] [Music] [41:36] years nowadays of course Larry has a [41:38] website at no [41:40] mod.com and he's on Twitter it's no [41:45] modes and so like I said Larry has done [41:48] a lot of amazing work in his career but [41:50] his [41:50] self-identity is clearly associated with [41:53] this [41:55] cause and so so I'd like to ask what [41:59] what exactly did Larry do like how would [42:02] we best describe what Larry [42:05] did a typical [42:07] biography might say Larry Tesla invented [42:10] cut copy [42:11] paste which is true but I think that's [42:14] really misleading because this invention [42:17] was very different than um say Thomas [42:20] Edison inventing the [42:22] phonograph Edison basically just [42:24] stumbled over the technology for audio [42:25] recording and he built it out as Y and [42:28] yeah he came up with like a list of [42:30] possible applications for this [42:31] technology but he didn't have any [42:33] cultural intent whereas what Larry did [42:36] was entirely a reaction to a particular [42:38] cultural [42:40] context so another thing that you might [42:42] hear is that Larry tesler solved the [42:45] problem of modess text manipulation [42:48] solved the problem and you know [42:49] obviously that's true you worked on this [42:51] problem for a long time eventually [42:54] solved it but I think that's really [42:55] misleading too [42:57] because this problem that he solved only [43:01] existed in his own [43:03] head nobody else saw this as a [43:06] problem for everybody else modes were [43:08] just how computers worked there wasn't [43:11] anything wrong with them anymore than we [43:13] think there's something wrong with [43:14] having two arms it's just kind of was a [43:16] fact of [43:17] life so the first thing that Larry did [43:20] was that he recognized a wrong that had [43:23] been unacknowledged in the [43:25] culture and the thing is that's how many [43:28] great social changes began as well so [43:31] 150 years ago Elizabeth Katy Stanton had [43:34] to stand up and say women should vote [43:37] and everybody else said like that's [43:39] crazy what are you talking about today [43:41] we recognize gender discrimination as a [43:43] wrong back then it was part of society [43:46] it was [43:47] invisible she had to recognize it and [43:50] she had to fight it and to me that's a [43:53] much closer model to what Larry did than [43:56] the Thomas said model of inventing a [43:58] bunch of random technology so could [43:59] patent [44:00] it now to be clear I'm not making any [44:02] judgments about the relative importance [44:04] or impact of these two people I'm just [44:05] talking about their motivations and [44:08] their approach both of them recognized a [44:11] cultural wrong they invisioned a world [44:13] without that wrong and they dedicated [44:16] themselves to fighting for a [44:18] principle she fought by organizing he [44:20] fought by [44:22] inventing and many other seminal figures [44:24] in Computing had similar motivations [44:27] so certainly Doug [44:29] angelart uh Doug engelbart basically [44:32] invented interactive Computing the [44:34] concept of putting information on a [44:37] screen navigating through it looking at [44:40] information in different ways pointing [44:42] to things and manipulating them he came [44:43] up with all this at a time when [44:45] real-time interaction with the computer [44:47] was just almost unheard of today he's [44:49] best known as the inventor of the mouse [44:51] but what he really invented was this [44:52] entirely new way of working with [44:54] knowledge his explicit goal from the [44:56] beginning [44:57] was to enable mankind to solve The [45:00] World's urgent [45:01] problems and his vision he had this [45:04] vision of what he called knowledge [45:06] workers using complex powerful [45:08] information tools to harness their [45:10] collective [45:11] intelligence and he only got into [45:13] computers because he had a hunch that [45:14] these new fangle computer things could [45:16] help him realize that Vision everything [45:18] that he did was almost single mindedly [45:21] driven by pursuing this [45:25] Vision here's alen k alen k ran the lab [45:28] at Zar Park where we got the desktop [45:31] interface so things like Windows and [45:33] icons command menus he also invented [45:36] object-oriented programming lots of [45:38] other [45:39] things his goal and a quote was to [45:43] amplify human reach and bring new ways [45:45] of thinking to a faltering civilization [45:47] that desperately needed it isn't that [45:50] great his approach was through children [45:53] he believed that if children became [45:55] fluent in thinking in the of the [45:57] computer meaning if um if programming [46:00] was a form of basic literacy like [46:02] reading and writing then they'd become [46:04] adults with new forms of critical [46:05] thought new ways of understanding the [46:06] world and we'd have this more [46:08] enlightened Society similar to the [46:11] similar to the um the difference that [46:14] literacy brought to society and [46:16] everything that he did everything he [46:18] invented came out of pursuing this this [46:21] Vision this goal with [46:23] children and following principles that [46:26] he adopted from p and monor Jerome [46:30] Bruner these people who had studied how [46:32] children [46:35] think and the figure probably most [46:37] widely associated with software [46:39] activism is Richard stalman [46:42] stalman started the G new project which [46:44] today makes up a big chunk of any Linux [46:46] system he also started the free software [46:48] Foundation wrote GCC GPL many many other [46:52] things his principle is that software [46:55] must be free as in Freedom and he has [46:57] very precise meaning associated with [46:59] that [47:00] statement he's always been very clear [47:02] that softare freedom is a matter of [47:03] moral right and wrong and he's taken a [47:05] particularly uncompromising approach in [47:07] his own life to [47:09] that all of these tremendously [47:11] influential people dedicated their [47:14] lives to fighting for a particular ideal [47:17] with a very clear sense of right and [47:19] wrong often really fighting against an [47:22] authority or mainstream that did not [47:24] recognize their wrong as being wrong and [47:26] today the world is still very far from [47:28] any of their ideals and so they still [47:30] see a world in crisis and they keep [47:33] fighting they're always [47:40] fighting now I'm not saying that you [47:42] have to live this [47:43] way I'm not saying that you should live [47:46] this [47:46] way what I'm saying is that you can that [47:50] this life style is an option that's [47:51] available to you and it's not one that [47:53] you're going to hear about much your [47:55] career counselor is not going to come [47:56] back to you and say you should start a [47:57] personal crusade in a social field they [48:00] might but not in [48:03] technology instead the world will try to [48:05] make you define Yourself by a [48:08] skill that's why you have a major in [48:11] college that's why you have a job title [48:13] you are a software [48:15] engineer and you'll probably specialize [48:17] to be a database engineer or front-end [48:19] engineer you'll be given front ends and [48:21] ask to engineer them and that could be [48:23] worthwhile and [48:25] valuable and if want to spend your life [48:28] pursuing excellence and practicing a [48:31] skill you can do that that is the path [48:33] of the Craftsman that is the most common [48:36] path the only other path you really hear [48:38] about much is the path of the problem [48:39] solver so I see entrepreneurship and [48:42] academic research is kind of two sides [48:43] to that coin there's a field there's a [48:46] set of problems in that field or needs [48:48] in the market you go in you choose one [48:51] you work it you make your contribution [48:52] there maybe later on you choose another [48:55] problem you work it you make your cont [48:56] rtion [48:57] there again that can be worthwhile [49:00] valuable and if that's what you want to [49:01] do then you can take that path but I [49:04] don't see Larry Tesla on either of those [49:07] paths I wouldn't say that he was [49:09] contributing to the field of user [49:11] experience design because there was no [49:13] such thing he didn't choose some open [49:15] problem to solve he came with some [49:16] problem that only existed in his own [49:18] head no one else even [49:20] recognized and certainly he did not [49:22] Define himself by his craft he defined [49:25] himself by his cause [49:27] by the principle he fought to [49:30] upheld I'm sure if you look at Wikipedia [49:32] it'll say that he's a computer scientist [49:34] or user experience something but to me [49:38] that's like saying Elizabeth ktie [49:39] Stanton was a community organizer no [49:42] Elizabeth Katy Stanton established the [49:44] principle of women's suffrage that's who [49:47] she was that was the identity she chose [49:50] and Larry tesler established the [49:52] principle of modess he had this Vision [49:55] he brought the world to that vision [50:02] so you can choose this [50:03] life or maybe it'll end up choosing you [50:06] it might not happen right away it can [50:09] take time to find a principle because [50:12] finding a principle is essentially a [50:13] form of self-discovery that you're [50:14] trying to figure out what your life is [50:16] supposed to be about what you want to [50:18] stand for as a [50:20] person took me like a [50:23] decade 10 years before any real [50:26] understanding of my principal solidified [50:28] that was my 20s when I was young I I [50:31] felt I had to live this way but I would [50:33] get little glimmers of What mattered to [50:35] me but no big picture it was really [50:38] unclear and this was very distressing [50:40] for me what I had to do was just do a [50:43] lot of [50:44] things make many things make many types [50:47] of things study many things experience [50:50] many many things and use all these [50:53] experiences as ways of analyzing myself [50:56] taking all these experiences and saying [50:58] does this resonate with me does this [51:00] repel me do I not care building up this [51:03] Corpus of experiences that I felt very [51:05] strongly about for some reason and [51:07] trying to make sense of it trying to [51:08] figure out why what is the secret [51:10] ingredient in all these experiences that [51:12] I'm reacting to so [51:14] strongly now I think everyone's [51:16] different and all those guys I talked [51:18] about they have their own origin stories [51:19] which you can read [51:21] about I will just say that confining [51:24] yourself to practicing a single skill [51:26] can make it difficult to get that broad [51:28] range of experience which seems to be so [51:31] valuable for this sort of [51:35] work and [51:38] finally if you choose to follow a [51:41] principle a principle can't just be any [51:43] old thing you believe in you'll hear a [51:45] lot of people say that they want to make [51:47] software easier to use or they want to [51:49] Delight their users or they want to make [51:51] things simple that's a really big one [51:53] right now everyone wants to make things [51:54] simple and those are nice thoughts [51:57] they maybe give you a little kind of [51:59] give you a direction to go in but [52:00] they're too vague to be directly [52:03] actionable Larry tesler likes Simplicity [52:06] but his principle was the specific [52:08] nugget of insight no person should be [52:10] trapped in a mode and that is a powerful [52:13] principle because it gave him a new way [52:15] of seeing the world it divided the world [52:17] to right and wrong in a fairly objective [52:20] way so he could look at somebody [52:22] selecting text and ask is this person in [52:24] a mode yes or no if yes you had to do [52:28] something about that and likewise I [52:31] believe that creators need powerful [52:33] tools it's a nice thought that doesn't [52:36] really get me [52:37] anywhere my principle is that creators [52:40] need this immediate connection so I can [52:42] watch you changing a line of code and I [52:44] can ask did you immediately see the [52:46] effect of that change yes or no if no I [52:50] got to do something about that and again [52:53] all those demos that I showed you came [52:56] out of me doing that of me following [52:59] this principle and letting it lead me to [53:02] exactly what I need to do so if you're [53:04] guiding a principle embodies a specific [53:07] Insight it will guide you and you'll [53:10] always know if what you're doing is [53:18] right there are many ways to live your [53:21] life that's maybe the most important [53:23] thing you can realize in your life is [53:24] that every aspect of your life is a [53:25] choice [53:28] with are default [53:30] choices you can choose to sleepwalk [53:32] through your life and accept the path [53:34] that's been laid out for you you can [53:36] choose to accept the world as it [53:38] is but you don't have [53:41] to if there's something in the world you [53:43] feels are [53:44] wrong and you have a vision for what a [53:47] better world could [53:48] be you can find your guiding [53:51] principle and you can fight for a [53:54] cause so after this talk I'd like you to [53:57] take a little time and think about what [53:59] matters to you what you believe [54:02] in and what you might fight [54:05] for thank you