# 布蘭登·艾克：JavaScript、Firefox、Mozilla 與 Brave

> JavaScript 之父回顧語言的誕生、Firefox 與 Mozilla 的歷史，以及 Brave 對隱私的探索。

- 原標題：#160 – Brendan Eich: JavaScript, Firefox, Mozilla, and Brave
- 期數：第 160 期
- 釋出日期：2021-02-12
- 嘉賓 / 主題：布蘭登·艾克
- 網頁版：https://lex.qiaomu.ai/tw/ep/brendan-eich/
- 官方頁面：https://lexfridman.com/brendan-eich/
- 精讀字數：約 13939 字（閱讀約 31 分鐘）

> 本文為 lex.qiaomu.ai 基於原始訪談的 AI 改寫中文精讀，非官方翻譯；引用請註明出處並連結網頁版。

1995 年 5 月，一個人用了十天，寫出一門程式語言。今天，全世界絕大多數網頁都在跑它的程式碼。更反常的是，這個人後來說，他在這門語言上最後悔的決定，發生在十天衝刺結束之後：早期使用者跑來求他，能不能讓這門語言更"寬鬆"一點，他心一軟答應了。

這個人叫布蘭登·艾克（Brendan Eich）。那門語言叫 JavaScript。二十多年後，他自己在播客裡把這段歷史攤開來講，講得毫不留情，包括那些讓他被罵了四分之一個世紀的錯誤。

這期訪談接近三個小時，從物理系的叛逃，到十天的瘋狂編碼，到瀏覽器戰爭、開源逃生艙、追蹤經濟的意外起源，再到 Brave 想幹的事。資訊密度很高，值得慢慢拆。

## 一個物理叛逃者的編譯器啟蒙

艾克高中時沒怎麼程式設計。他有個朋友家裡有臺 Commodore PET，兩人看完《星球大戰》，朋友說，咱們寫個 Basic 程式，把死星爆炸的動畫跑一遍。他就幫著算數學，做點二維圖形。

他真正著迷的是惠普計算器。七十年代中期的 RPN 機型，科學函式齊全，做工紮實得像塊金磚。他本來想讀物理，讀了很多科幻小說，腦子裡全是曲速引擎和混合驅動。後來他發現，物理學的黃金時代已經過去了，自己生得太晚。

在聖克拉拉大學讀本科時，他開始同時啃計算機。他躲過了 Fortran 那門課，也就是那種要在穿孔卡片上寫程式的工程系課程，改學了 Pascal。Pascal 對他來說是個轉折點，因為它把人怎麼用程式抽象世界這件事講清楚。函式返回值，過程不返回，這些今天看來老派的區分，當時讓他第一次理解什麼叫結構化程式設計。

他後來還自己搞了臺帶 Unix 的機器。選了國家半導體的 1632 處理器，指令集複雜漂亮，結果這晶片 bug 太多，永遠沒能真正點起來。他挑錯了賽道。RISC 才是最後的贏家。這段折騰教會他一件事：**技術判斷可以很美，但工程上選錯平臺，你連起跑線都上不去。**

本科畢業前三年，他從物理轉到數學和計算機。他的理由很坦誠：當年他對物理太天真了，而矽谷正在為計算機瘋狂。於是他去了矽谷圖形公司（Silicon Graphics，SGI），一待七年。後來又跳去 MicroUnity，一家想做家庭媒體處理器晶片的公司。這家公司同時押注新半導體工藝、新的模擬和數位電路、軟體可升級的機頂盒，每件事都是九死一生。吉姆·克拉克（Jim Clark）後來評價說，你做十件事，每件事成功的機率是十比一，乘起來就是十億分之一。

MicroUnity 沒成，但這段經歷給了他編譯器、協議棧、記憶體模型的底子。這些東西后來全用上了。

## 1995 年 4 月，他登上了一枚已經點火的火箭

他其實錯過了 Netscape（網景）的第一班車。1994 年他本有機會去，那時他還在 MicroUnity，沒有立刻動身。1995 年 4 月，他才正式加入。IPO 是 1995 年 8 月，所以他趕上了那場人類歷史上最著名的上市之一。

真正讓他動心的是 1993 年的一塊石頭：Mosaic 瀏覽器。在那之前，他們用的是郵件、Usenet、FTP，一堆各說各話的老網際網路協議。Mosaic 把圖片塞進了網頁裡。馬克·安德森（Marc Andreessen）當時給一群人發郵件說：我覺得網頁裡應該能放圖片。等這封郵件發出來的時候，埃裡克·比納（Eric Bina）的程式碼已經寫好了。

這件事讓艾剋意識到一個規律：**在網際網路上，先發優勢大到離譜，快比完美更重要。**後來他把這條規律總結成一句被引用到爛的話，worse is better，更爛的反而更好。

他進入 Netscape 的時候，公司正在朝 IPO 衝刺，整個公司像被點燃的火箭。瀏覽器從 Mosaic 手裡搶市場，加了圖片、表格、框架、外掛，但頁面還是死的，沒有真正的動態邏輯。管理層想讓它變成一個可程式設計的瀏覽器，而不只是一個文件檢視器。

故事的另一半是 Sun。Netscape 和 Sun 談 Java 授權，想把 Java 虛擬機器嵌進瀏覽器。比爾·喬伊（Bill Joy）是中間人，也是 Java 進瀏覽器的主要推手。艾克原本的夢想是在瀏覽器裡實現 Scheme，一個他喜歡的函式式語言。結果 Sun 的交易一談，Scheme 就沒戲了。

但還有空間給一門"伴生語言"。比爾·喬伊和馬克·安德森都觀察到：微軟的產品線裡，C++ 寫元件，Visual Basic 寫膠水，兩門語言搭配，各司其職。**Java 是給拿工資、水平高的程式設計師寫的，還需要另一門給設計師、會計、業餘愛好者的語言。**這就是 JavaScript 的生態位。

## 十天，和一場關於"要不要在標記裡寫程式碼"的豪賭

1995 年 5 月上旬，艾克才從伺服器團隊轉到客戶端團隊。之前他被招進來時，客戶端沒有招聘名額，他在伺服器團隊幹了一個月，寫 HTTP 1.1 的東西。轉到客戶端後，他對馬克說，不能再等了，得趕緊做。

然後就是那十天。從週四晚上開始，一直幹到下一個週一。他沒睡夠。

他當時心裡有很多選擇。語言要不要更像自然語言，比如比爾·阿特金森（Bill Atkinson）在 HyperCard 裡做的 HyperTalk？管理層說，要看起來像 Java。於是他用了花括號，用了 C 系的表示式和語句語法，複用了 Java 的位運算子，包括無符號右移，因為 Java 沒有無符號整型，只能用運算子模擬。這些選擇後來被證明非常重要。

他堅持要的是第一類函式。原因很具體：瀏覽器是單執行緒的，所有早期瀏覽器都是單執行緒，大多數使用者根本沒準備好理解互斥鎖和執行緒。在單執行緒世界裡，你不能阻塞介面，所以你必須有回撥，有"稍後執行"。他不想搞 call/cc 那種捕獲續延的花活，他只想讓函式能當引數傳、能當值返回。Java 當時沒有這個東西，直到 Java 7、Java 8 才有了像樣的 lambda。

於是 onclick 這種寫法出現了。這個命名來自 HyperCard 的 on-event 語法。今天還有人抱怨 onmouseover、onmouseout 這些名字醜，但當年就是邊寫邊定的。

更瘋狂的一件事是：指令碼要直接內嵌在 HTML 標記裡。當時很多人覺得這是異端。一個 SGML 專家寫信罵他，說你為什麼不用標記段（marked section）？艾克回：SGML 的標記段在 HTML 里根本不存在，瀏覽器也不支援。

只好土法上馬。他用 HTML 註釋把程式碼包起來，讓不認識 script 標籤的老瀏覽器把整段當註釋忽略。而在 Netscape 2 裡，這個註釋容器又有了新語義，裡面的真程式碼會被執行。這是一種雙向隱藏的 hack。

> 沒有這個 hack，JavaScript 根本沒法起步。（布蘭登·艾克）

這種寫法談不上優雅，可它是讓新事物在舊世界裡活下來最現實的辦法。進化不講美學，講存活。

## 他賭對了第一類函式，賭錯了雙等號

十天裡他做對的事，第一類函式排第一。這一點即使放到今天看，也是 JavaScript 能活下來的關鍵。因為在瀏覽器裡，事件驅動是唯一可行的模型，而事件驅動離不開回撥，回撥離不開函式是值。

他做錯的事，一部分是十天裡被迫留下的，一部分是十天之後自己作的。

被迫留下的，是沒有垃圾回收。他趕時間，只用了類似物件池的 arena 分配，記憶體用完就沒了。後來發現有人寫遊戲、寫事件驅動的分配，記憶體很快耗盡。他趕緊補了引用計數。但引用計數在 C 裡手寫，會溢位，會下溢。溢位就洩漏，下溢就釋放了還在用的記憶體。而下溢直接意味著遠端程式碼執行漏洞。攻擊者往堆裡塞滿精心構造的字串，偽造函式表，就能在使用者開啟一個網頁的時候執行任意程式碼。這在 Netscape 2 釋出之後立刻成了現實問題。

自己作的，是雙等號。十天裡他原本定的是：兩個不同型別的物件比較，直接返回不相等。後來內部早期使用者跑來說，能不能做隱式型別轉換？資料庫欄位是字串，數字得跟它比較。他當時想討好使用者、推動採用，就答應了。

> 當人們跑來跟你說，能不能把它做得更松一點，加個可愛的功能，答案應該是不。（布蘭登·艾克）

這成了他二十多年被反覆鞭屍的痛點。他自己引用的那句話是尼克勞斯·維爾特（Niklaus Wirth）說的：**設計的本質就是捨棄。**他當時沒守住。

## Worse is better：為什麼醜的東西贏了

理查德·加布裡埃爾（Richard Gabriel）寫過一篇著名文章叫《Worse is Better》，本來是拿 Unix 和 Lisp 做對比。MIT 那幫人覺得 Lisp 是法貝熱彩蛋、是大教堂，貝爾實驗室那幫人是新澤西的農夫，寫出來的東西粗糙。結果農夫贏了。

艾克把這個邏輯搬到了整個 Web 上。HTML 不是嚴格的標記語言，它容錯，能從小錯誤裡恢復。XML 嚴格、純粹、漂亮，但它永遠沒法接納那些會打錯字的普通使用者。微軟當年在 IE 裡把 XML 硬塞進 HTML 的錯誤糾正器，做了個"雜種版"，反而讓 XML 能用。純粹的 XML 沒有未來。

JavaScript 也是同一個邏輯。這門語言談不上多漂亮。可它在正確的時間做了正確的事。艾克說得很直接：最好的語言未必是設計最漂亮的，能活下來的才算好。

> 我常說，另一個選項是根本不幹這件事。我可以對 Netscape 說，這太趕了，我做不了。那這個位置就會被 Visual Basic Script 佔掉，而且會很難看。（布蘭登·艾克）

這就是他後來在標準委員會里待了二十年的心態。你沒法回頭改早期錯誤，因為 Web 相容性是鐵律。你只能往前加東西，把好的部分一點點補進去。生物學也是這麼幹的，你不會去改 ATP 代謝，你只會在上面疊新功能。

## 標準會議上的對手，後來成了同謀

1996 年，他們把 JavaScript 送進歐洲計算機製造商協會（ECMA）做標準化。選這個機構，是因為它此前逼微軟把 Windows 3.1 的一部分 API 開放成標準，歐洲政府說，不開放標準我們就不用你的系統。這個機構有對付微軟的經驗。

但微軟也派了人來，而且派了很強的人。第一版規範的初稿，很多是微軟的肖恩·卡岑伯格（Sean Katzenberg）寫的。還有 Sun 派來的蓋伊·斯蒂爾（Guy Steele），一個人頂一群人。加布裡埃爾也被拉來寫了標準的第四節，一段介紹 JavaScript 是什麼的文字。

名字是個麻煩。Java 是 Sun 的商標，Sun 的法務很兇，連姓"Jovanovic"、域名以 Java 開頭的小公司都收到過警告信。所以標準名只能叫 ECMAScript。今天大家嘴上還是說 JavaScript，說版本號時才用 ES 加數字，而且這個數字和年份對不上，ES6 其實是 2015 年。

有一個細節很有人情味。有一次艾克修 bug 遲到，肖恩很生氣。等他到了，兩人同時看出規範裡有個"柵欄柱錯誤"，也就是差一的那種邊界錯。四目相對，氣就消了。標準會議上的敵人，很多時候也是同行。

## ES4 死了，但它的器官移植進了 ES6

1997 年，第一版標準在法國尼斯定稿。1999 年，第三版出來。之後 Netscape 被美國線上（AOL）收購，微軟靠捆綁 IE 把瀏覽器市場吃乾淨，標準和實現都慢了下來。

2003 年前後，下一代的 JavaScript 設計被交給另一位 MIT 出身的人，這個人後來在 Google，設計了 Dart。他設計的東西太超前，只以變形的方式出現在微軟的 ASP 伺服器端和 Flash 的 ActionScript 3 裡。

真正的轉折是 ES4。這一版跟 Adobe 合作，想大規模改語言，加類、加型別、加模組。結果委員會分裂。一部分人說太大了，先做增量改進，不加新語法。於是 ES4 被擱置，2009 年先出了 ES5，一個較小的版本，加了嚴格模式，加了幾個有用的 API。

但 ES4 裡的好零件，後來都被拆下來裝進了 ES6。2015 年，ES6 定稿，加上了類、模組、箭頭函式、let 和 const、Promise。這一年，JavaScript 才真正長成一門能寫大工程的語言。艾克說，他從 1996、1997 年就想加的那些函式式特性，等了將近二十年才補齊。

## TypeScript 是補丁，也是擁抱

TypeScript 是微軟做的，負責人是安德斯·海爾斯伯格（Anders Hejlsberg），他此前做過 Turbo Pascal、Delphi、C#。TypeScript 是 JavaScript 的超集。最短的 JavaScript 程式，也是合法的 TypeScript 程式。你可以一個檔案一個檔案地加型別註解，逐步獲得警告。

艾克對它的評價是：現在看是有益的。TypeScript 只在工具階段做型別檢查，不在執行時強制，這個取捨讓它在現實裡推得動。微軟在標準委員會里得不斷猜未來的語法走向，猜錯了就得回頭改。他覺得微軟總體上還算守規矩，雖然 TypeScript 本身是微軟的專有資產，不會交給標準組織。

框架生態是另一個話題。jQuery 當年之所以火，是因為原生 DOM API 太囉嗦。那些 API 是九十年代為 Java 和 JavaScript 一起設計的，物件導向、過程化、冗長，做一件小事要跳三段舞。jQuery 把它壓成一行。後來標準委員會把這些能力吸收進 querySelector 之類的 API，jQuery 的歷史使命就完成了一大半。

艾克的態度是：**框架裡真正增加價值的那部分會留下，其餘會死掉，這是好事。**一個健康的生態，靠的從來都是淘汰，保護落後只會讓它變慢。

## 讓虛幻引擎在瀏覽器裡跑 30 幀

2012 年秋天，Mozilla 做了一個 Demo。2013 年 GDC 遊戲開發者大會，他們把虛幻引擎（Unreal Engine）搬進了瀏覽器。沒有外掛，沒有 Flash，沒有 Java。現場的人看傻了。

這件事的技術路徑叫 asm.js。它是一門"JavaScript 的子集"，沒有新語法。型別是透過在支配節點位置上的強制轉換來表達的，位運算子把雙精度浮點當成整數用。編譯器只要在合適的地方識別這些模式，就能把它當作有型別的程式碼來編譯，線性時間，確定性效能，完全不碰垃圾回收器。

做這件事的人裡，有 Alon Zakai，他做了 Emscripten，把 C 和 C++ 編譯成 JavaScript；有戴夫·赫爾曼（Dave Herman），型別理論出身；有盧克·瓦格納（Luke Wagner），編譯器工程師。他們一起把艾克腦子裡的想法變成了可執行的規範。

從 2015 年開始，這項工作演化成了 WebAssembly。它有自己的二進位制語法，載入進同一個 JavaScript 虛擬機器，跑同一套編譯器階段。兩門源語言，一套執行環境。下載體積更小，解析更快，移動端尤其明顯。

回頭看，這一步很關鍵。在 asm.js 之前，很多人還在說 JavaScript 是玩具，要做重活得上 Google 的 Portable Native Client。可 PNaCl 本質上是把外掛換了個包裝，還是"新老闆，舊老闆"。asm.js 加上 WebGL 加上 Web Audio，才真正把 Flash 和 Java Applet 送進了歷史。

## 上半場：Netscape 是怎麼被碾碎的

1995 年 8 月 IPO 之後，Netscape 面對的是微軟的全面碾壓。微軟在 1994 年底就想收購 Netscape，出價太低，被吉姆·巴克斯代爾（Jim Barksdale）和吉姆·克拉克趕了出去。之後微軟決定複製。比爾·蓋茨那封著名的"網際網路浪潮"備忘錄之後，整個公司掉頭。

IE 的前幾版很爛，第二版開始讓人緊張，第三版能看出結局，第四版已經不錯了。而且它隨 Windows 免費送，這叫搭售，在反壟斷法裡是有明確說法的。Netscape 的銷售負責人拉姆·施里拉姆（Ram Shriram）有一次接完電話臉色發白，因為一家公司說，微軟剛通知他們，如果預設瀏覽器設成 Netscape，就斷掉他們的 Windows 授權。

這類事在反壟斷案裡沒被充分呈現，但它是當年真實發生的事情。

Netscape 自己也有問題。上市之後，管理層開始四處收購，想跟微軟正面硬碰。收購通常不奏效，因為你把創始團隊的熱情耗掉了，又塞進來一批想"輪到我了"的新人，他們沒做過瀏覽器，也不真正理解瀏覽器。Netscape 4 原本該是 3，一拖再拖，還先只在 Windows 上發。微軟那邊反而在進步，第四版做得相當可以，動態 HTML 的創新也是他們先推的。

微軟最終被判壟斷，但判決來得太晚。Netscape 早已經被收購，瀏覽器市場已經被吃幹。

## Mozilla：一艘沒有法人身份的逃生艙

艾克用《星球大戰》裡的比喻形容開源這件事。AOL 收購 Netscape 之後，高層說，咱們搞個開源的逃生艙吧，就像那艘救生艇，炮手不會開火，因為上面沒有生命反應，不構成威脅。

1998 年，Mozilla 專案啟動。表面上是把瀏覽器開源給全世界，實際操作起來極其困難。那套程式碼已經被亂改了好幾年，是一團毛球。更要命的是加密模組，當年 SSL 屬於"電子軍火"，美國政府不允許出口 1024 位以上強度的實現。最後是兩個澳大利亞人，蒂姆·哈德森（Tim Hudson）和埃裡克·揚（Eric Young），把 OpenSSL 從美國商務部和國安局的管轄範圍外塞回了 Mozilla 的程式碼庫。艾克說，這大概是開源之後頭幾個月裡最漂亮的一次 hack。

Mozilla 長期是一艘"沒有法人身份的海盜船"。大部分人還是 Netscape 的員工，只是掛在另一個組織名下。第一任工程經理很快走了，艾克臨時頂上，那是他第一次做管理。後來寫開源許可證的律師米切爾·貝克（Mitchell Baker）休完產假回來，說要不我來管，艾克和傑米·扎溫斯基（Jamie Zawinski）說好。

扎溫斯基一年後走了，他覺得這個專案徹底失敗，因為 Mozilla 沒能重新點燃瀏覽器市場。艾克說，那本來就不可能。Netscape 還在賣基於老程式碼的產品，Mozilla 是在做一次推倒重來，它的目標落在社會層面，跟技術指標關係不大：給開發者一塊乾淨的地。

他們的做法是：模組化程式碼庫，用 XPCOM（一種開源的元件物件模型，帶引用計數和虛擬函式表），用 JavaScript 去指令碼化這些元件，用一門自定義的標記語言 XUL 來做可移植的介面，不用表格，不用 XML。戴夫·海厄特（Dave Hyatt）、喬·休伊特（Joe Hewitt）、布萊克·羅斯（Blake Ross）這些人陸續加入，羅斯當時還是個高中生實習生。

2001 年，Netscape 裁員，米切爾被裁掉了。但下一週 Mozilla 的社群電話會上，米切爾又出現了。艾克說，這件事說明，只要專案有足夠的忠誠度，你可以超越公司和開源的邊界。真正留在 Mozilla 的人，很多是從社群裡長出來的，水平高於 Netscape 的平均招聘。**被裁掉的人第二天照樣出現在社群會議裡，這種結構在傳統公司里根本不可能存在。**

## Phoenix 改名兩次，最後叫 Firefox

2002 年 Mozilla 1.0 釋出，艾克設計了類似今天六週一個版本的路線圖。釋出之後大家發現，這套東西其實不差。但整個套件太重，有郵件、有新聞組、有編輯器，還揹著 AOL 的各種要求，工具欄上要放 AIM 按鈕、要放 ICQ 按鈕，越來越像一輛貼滿贊助商貼紙的賽車。

於是有了一個新想法：只做瀏覽器。它更簡單，只幹一件事，剩下的靠擴充套件。海厄特和羅斯做了第一版，叫 Mozilla Browser。海厄特是真正的主力，他此前在蘋果做過多卷的浮動視窗實現，是那種會把一件事迭代五遍、第五版才漂亮的人。他後來去了蘋果，是 Safari 創始團隊成員之一。

名字是個麻煩。先叫 Phoenix，結果有家公司叫 Phoenix Technologies，說不能用。改叫 Firebird，澳大利亞一個開源資料庫專案用近乎《瘋狂的麥克斯》的語氣發來抗議。再改，就叫 Firefox，紅熊貓的暱稱。這次沒人反對了，反而都很高興。

2004 年 Firefox 釋出。標籤頁、彈窗攔截、更好的 CSS 支援，使用者第一次覺得瀏覽器可以是讓人喜歡的東西。那一波還有 Web 2.0 的熱潮，Gmail、Google Maps、Craigslist、維基百科都在同一時期起來，人們第一次意識到網頁能做出這麼複雜的互動，而支撐這一切的，是 JavaScript 加圖片。

標籤頁這件事值得多說一句。微軟後來有人私下承認，當年只要在 IE 里加上標籤頁和彈窗攔截，Firefox 根本長不起來。可他們沒做。大公司動作慢，問題往往出在內部：一整條產品線、一整套考核、一堆既得利益綁在一起，改起來的成本比從零開始還高。

## 瀏覽器的錢從哪來：預設搜尋引擎

這裡有個很多人不知道的事實：Firefox 的主要收入來源，是把預設搜尋引擎賣給 Google。2004 年前後，謝爾蓋·布林派了一位工程師弗裡茨·施耐德（Fritz Schneider）來接觸 Mozilla，雙方很快意識到，搜尋和瀏覽器互相需要。

這個判斷至今成立，這就是為什麼幾乎所有搜尋引擎都想要自己的瀏覽器。預設設定本身就值錢。**使用者很少改預設值，只要預設的那個東西不爛到讓他動手。**

2014 年，Firefox2014 年，Firefox 把預設搜尋從 Google 換成 Yahoo。當時瑪麗莎·梅耶爾（Marissa Mayer）想重建搜尋團隊，但雅虎的搜尋研究團隊已經被裁光了，人去了 Google 和微軟，拼不回來。接下來一年，流量持續流失，因為使用者自己把預設改回去了。雅虎按合同付了固定費用，等於為留不住的流量買了單。

艾克從這個案例裡提煉的東西很冷峻：預設值有商業價值，但這個價值有上限，它等於"使用者懶得改"的那部分。一旦替代品明顯更好，預設值撐不住。**所有靠預設值吃飯的生意，本質上都是在跟使用者的耐心賽跑。**

## Chrome 的那張"悲傷標籤頁"

2006 年前後，Mozilla 這邊已經知道 Google 在做自己的瀏覽器。有人看到過內測。那個版本還沒有後來那種極快的 JavaScript 引擎，但它有一個東西：每個標籤頁跑在自己的作業系統程序裡。

演示的方式很絕。他們開啟一個帶 Flash 的頁面，Flash 崩了，按過去的經驗整個瀏覽器會一起掛掉。結果只出現了一張小的悲傷臉，標籤頁還在，重新整理一下就好了。這在當年是真正的安全進步。

2008 年 Chrome 釋出。它起量很慢，Google 沒有大規模預裝，但它確實推動了整個行業重新加速。艾克說，真正讓微軟認真起來的，是 Chrome。微軟後來做了 IE9，做了 Chakra 引擎，但為時已晚。

Firefox 的巔峰大約在 2011 年，之後因為 Chrome 開始下滑。這是瀏覽器戰爭的第二輪，勝負手依然是分發渠道和預設設定。

這裡有個繞不開的結構性問題。Google 一邊是 Firefox 的最大金主，一邊在做自己的瀏覽器。這種關係維持了很多年。艾克後來回憶，他和拉里·佩奇聊過這件事，佩奇的態度很坦率：你別管 Firefox 了，你自己做一個瀏覽器吧，你可以有自己的一套想法。這話聽著像建議，實際上也是宣判。**當你的收入來源同時在跟你競爭，你遲早得自己找活路。**

## Cookie 是怎麼變成追蹤工具的

Cookie 眼下的名聲很壞，它被髮明出來的時候跟追蹤毫無關係。1994 年，一位 Netscape 工程師趕時間做出來的東西，目的是讓使用者不用每次翻頁都重新登入。因為 HTTP 是無狀態協議，你從登入確認頁跳到賬戶頁，如果沒有 Cookie，你就得再登入一次。

但問題是，圖片也是從伺服器請求的。一張圖片，可以來自完全不同的域名。請求會帶上上一次的 Cookie，響應會更新 Cookie。於是只要頁面裡有圖片加 Cookie，追蹤就出現了。**一個 1x1 畫素的圖片，廣告技術行業至今還在用"畫素"這個詞指代它，就能在《紐約時報》和 ESPN 之間認出你是同一個人。**

第一次訪問時沒有 Cookie，伺服器給你分配一個編號，往資料庫裡寫一條記錄。之後你在別的網站再遇到同一個圖片伺服器，它帶著編號回來，資料庫繼續更新。你被追蹤了。這不是設計意圖，等你意識到的時候已經來不及改。

再往後，JavaScript 也能做到同樣的事。指令碼可以發請求、帶 Cookie、更新 Cookie，而且看不見。整個追蹤經濟就建立在這些 1990 年代的意外之上。

> 最後我只拿到幾件 T 恤。就這麼幾件破 T 恤。（布蘭登·艾克）

與此同時，靠這套機制長出來的是全世界最值錢的公司。

## Brave 想解決的具體問題

2015 年，艾克開始做 Brave。起點是一個很樸素的判斷：既然第三方 Cookie、追蹤指令碼、惡意廣告都是意外產生的、現在又不安全，瀏覽器就應該預設攔掉一部分。

難點在於區分第一方和第三方。這事沒法靠"來自不同域名就攔"這種簡單規則解決，很多出版商會用看似無關域名下的良性指令碼。所以必須做人和機器結合的判斷。Brave 從一開始就建了研究團隊，用機器學習來驅動攔截規則。蘋果差不多同期在做 ITP（智慧追蹤預防），也是本地機器學習。

蘋果早期的策略是：如果使用者從來沒訪問過某個第三方域名，就攔掉它的 Cookie。這在當年是真正的隱私進步。但它留了一個洞：只要你訪問過一次那個域名，Cookie 就被放行。有一家廣告技術公司就鑽了這個洞，讓廣告點選先跳一下自己的域名，落地頁之前順手種一個第一方 Cookie，從此被白名單接納。後來 Safari 補上了這個漏洞，Brave 也在持續迭代。

更難的是指紋識別。只要瀏覽器裡每個站點能存一個 bit，32 個站點就是 32 bit，就是四十多億個編號，足以給你做一個超級 Cookie。這種對抗沒有終點，只能一直打下去。

速度是副產品，但非常實在。廣告技術指令碼造成的請求鏈，業內叫"程式化瀑布"，一個接一個。攔掉之後，Brave 比 Chrome 還快，省流量，省電，因為無線模組少跑了大量請求。

艾克在這裡說了一句很實在的話：很多 Google 的工程師朋友跟他說，那些慢網站是網站自己的問題，他們會修的。他做了抽樣，發現大部分網頁就是這樣。**Google 再強，也沒法接管全世界所有出版方的技術棧。**他們試過 AMP，用搜尋排名逼出版方就範，結果出版方普遍反感，因為它損害品牌，文章頂上是 Google 的域名和框架。

## 注意力代幣：讓使用者拿七成

攔廣告只是防守。艾克想的是重新接上那條斷掉的線：品牌和代理商的錢，本來該到出版方手裡，中間被抽走太多。

《衛報》做過一次實驗，自己買自己的廣告位，投放一英鎊，最後到手 30 便士。中間商拿走了七成。而 App Store 的分成是三七開，平臺拿三成。更早的電視時代，媒體方拿八成五。分成結構這些年徹底失衡了。

更糟的是欺詐。假的《紐約時報》頁面被機器人點選，廣告主付錢，錢到了假站點，真的《紐約時報》一分沒有。而這一切都透過廣告交易平臺結算，平臺照樣收手續費。惡意軟體也走同一條路，廣告裡塞進 JavaScript 載入器，落到正規出版方的頁面上。

Brave 的方案是基本注意力代幣（Basic Attention Token，BAT）：使用者、創作者、廣告主三方。廣告目錄每天固定，投放在瀏覽器本地用輕量機器學習匹配，**Brave 看不到你的歷史、搜尋、停留時長，這些資料不出裝置。**廣告主買的是匿名的注意力，你的身份不在交易裡。廣告收入的七成給使用者，使用者可以選擇提現，也可以把它打賞給自己常看的站點和 YouTube 頻道。

最早的原型跑在比特幣上。2016 到 2017 年比特幣擁堵，手續費高，使用者買五美元的幣要付四塊五的手續費，體驗很糟。後來換到以太坊，可以用智慧合約。監管也隨之而來：一旦涉及資金拆分和提現，就要滿足瞭解你的客戶（KYC）和反洗錢的要求。所以預設模式下，Brave 不知道使用者是誰，只是把收入記在瀏覽器裡，由使用者決定流向；需要提現時才做身份驗證。

這套機制如果只在一家瀏覽器裡跑，價值有限。艾克的態度很明確：希望它能變成標準，在多個瀏覽器之間通用。廣告匹配、盲簽名驗證曝光這些技術，本來就應該進標準。他甚至提到，Google 也在推所謂的"信任令牌"，底層是 David Chaum 的盲簽名，只是不會用在廣告確認上，因為那會動到自己的生意。

> 我們拿走三成，跟 App Store 的分成一樣。如果我們做得更大，也許可以拿得更少。（布蘭登·艾克）

## Google 的創新者困境

艾克對 Google 的處境有一個具體分析。Google 不推隱私優先，背後有它的結構性原因：這家公司被生態綁住了。大量出版方不 Technical，靠一堆廣告技術供應商撐著收入，Google 如果一刀切掉這些指令碼，等於砸掉自己服務的客戶。

所以 Google 的做法是"隱私沙盒"、FLOC 這類方案，工程上很 Google，用差分隱私加噪聲把你藏進人群。但差分隱私隨著時間推移會被對抗性地剝離，噪聲加得再多，長期看也能把你從人群裡挑出來。艾克判斷，這套東西很難讓蘋果、Brave、Mozilla 一起接受。

他也沒有把話說死。他說如果 Google 聰明，可能會主動剝離 DoubleClick 之類的資產來換取監管上的緩和。反壟斷在美國和歐洲都重新回到了桌面上。當年微軟差點被拆分，法官托馬斯·彭菲爾德·傑克遜（Thomas Penfield Jackson）沒開聽證會就直接下令，上訴法院把案子打回去，最後以和解收場。**反壟斷真正的威力往往不在判決本身，而在它迫使公司花幾年時間應付官司、錯過視窗期。**微軟就是在那些年裡掉頭回去做封閉的 Windows Vista，結果 Vista 徹底失敗。

## 社交關係應該存在瀏覽器裡

訪談裡有一段很值得注意的構想。艾克說，社交網路本質上和搜尋一樣，是一箇中心化的演算法，幫你做朋友關係圖上的傳遞閉包。可你的好友關係不該被某家公司擁有，你的帖子也不該。

他的設想是：瀏覽器能不能替你記住這些關係？能不能把 Facebook 和 Twitter 的朋友合併成一個檢視？如果某天你在一個平臺被封，朋友在另一個平臺還能找到你，關係不會斷。

瀏覽器本來就是唯一同時看到你所有線上活動的地方。問題在於，瀏覽器過去二十年被中心化的力量俘獲了，主要途徑就是搜尋。拉里·佩奇很多年前就說過，用搜尋意味著把查詢交給我們，換取更好的結果。這個交換在早期是划算的，後來就未必。

他對平臺封禁的態度很直接。Parler 被下架那次，他覺得處理得很雙標：Twitter 上同樣有大量威脅暴力的內容，為什麼只有新來的被拔掉伺服器？**有權力的一方選擇性執法，看起來就像對沖基金做空 GameStop 一樣難看。**

他也不迴避另一面。平臺如果完全不加管理，會被最惡劣的人佔滿，最後毀掉整個社群和生意。所以他想要的是"使用者優先的輔助性原則"：讓使用者自己決定把哪些網路拼在一起，讓封禁和遷移的成本降下來，而不是讓一家公司替所有人決定誰能說話。

## 關於矽谷、關於死亡、關於遺產

訪談最後，萊克斯問了一個很輕也很重的問題：你創造了改變世界的東西，但人終有一死，你怎麼看？

艾克說他不太想這事。他是羅馬天主教徒，不怕死。他理解那些恐懼的人，可能缺一份超越性的信念，也可能沒有孩子，或者到了某個年紀覺得自己錯過了能做長久之事的機會。他引用泰倫提烏斯的那句話：我是人，凡是人的事，沒有一件與我無關。

至於遺產，他說得很平淡。排在第一位的是孩子和孫輩。然後是 Web 標準，是 Firefox，是 Brave。他不願意過度吹噓 Brave，但他認為 Brave 證明了一件事，而且這件事會一直有意義。

> 你可以只有幾個百分點，就能撬動整個市場。不需要所有人都跟著走。歷史上真正推動改變的，從來都是少數人。（布蘭登·艾克）

Firefox 證明了瀏覽器市場可以被重新開啟，儘管當年所有人都說不可能。這件事比任何一個產品都重要，因為它說明**既得利益者不喜歡的事，仍然可以做成一兩成。**

關於矽谷，他的判斷是悲觀的，也沒有絕望到認為一切都結束了。他說這個地方曾經給年輕人自由，讓他們敢想敢做，哪怕稅高、房租貴、路修得一塌糊塗。現在的問題是，錢把價格推高，房價推高，政治上層層腐敗，普通人正在往外走。遠端辦公可能讓很多小型的"矽谷"分散出現，奧斯汀、邁阿密，或者別的地方。

他提到一個細節很有意思。疫情之後 Google 允許遠端辦公，員工很高興，終於不用因為換組就搬家。但接著公司說，可以搬回中西部老家，薪水按當地生活成本重算。這個政策一旦推開，矽谷的高薪溢價就會慢慢攤平，人才會真正散出去。**遠端辦公最深遠的影響，可能就是把地理套利從公司手裡收回來，交還給個人。**

他講到加州的另一個層面：基礎設施的賬早就欠下了。洛杉磯當年拆掉有軌電車，波音、通用汽車和石油公司一起把高速公路推成主角，地權走廊一旦沒了就再也收不回來。今天想補，只能往地下挖，像馬斯克在做的隧道。房子不夠、路不夠、山火年年燒，這些問題疊在一起，才是人往外走的真實推力。

他不認為這是文明的終點。美國的底色是一個商業共和國，本質上是十三個殖民地長起來的，很多東西是自下而上的。真正讓這個國家特別的，是少數人可以用幾個激進的想法改變社會，就像當年寫程式碼改變世界一樣。

## 給今天還想動手的人

整場訪談裡，最實用的部分其實散落在各處。艾克反覆回到同一個判斷標準：這件事能不能讓使用者立刻看到結果，能不能在真實世界裡活下來。

- **第一門語言學 JavaScript 還是 Python，取決於你想要什麼反饋。**想要立刻看到畫面、動畫、能分享給別人玩的東西，選 JavaScript，它更容易讓你愛上程式設計。想要被語法錯誤早點攔住、少踩隱式轉換的坑，選 Python，它對初學者更嚴格。
- **至少學三到五門語言，按用途分。**動態語言做快速原型，C 或 Rust 做貼近硬體的高效能部分，Go 做服務端網路，Python 做機器學習裡的線性代數和膠水。每門語言都是一件不同的工具，別指望一把錘子幹完所有活。
- **如果你在做語言或 API 設計，早期使用者求你"放鬆一點"的時候，先說不。**艾克的雙等號就是反面教材。設計裡最難的從來都是拒絕，加功能反而容易。
- **如果你想做產品，先想清楚分發。**技術再好，預設設定和入口決定了生死。Firefox 的收入靠預設搜尋，IE 的勝利靠 Windows 預裝，Chrome 的崛起靠 Google 的分發能力。這是結構問題，跟道德無關。
- **如果你想挑戰巨頭，別指望正面贏，去改預設值。**哪怕只有百分之幾的使用者選擇你，只要他們把那幾個百分點用在最關鍵的介面上，就能改變整個生態的成本結構。
- **隱私是一組預設值，沒法單獨購買。**普通人不必理解 Cookie 和指紋識別，只需要換一個預設就幫你擋掉的瀏覽器，然後開啟看一眼，頁面還能不能用。
- **想做開源專案，先想清楚法人結構。**Mozilla 頭幾年是沒有法律實體的海盜船，靠的是社群忠誠度和一批願意留下來的人。這種模式能撐住，但它脆弱，你得提前想好下一步。
- **想做出能活二十年的東西，先接受它會帶著缺陷出生。**別指望第一版就漂亮。真正決定成敗的是它能不能先上船、能不能持續改進、有沒有人願意為它留下來。

1995 年那十天裡，一個從物理系叛逃出來的人，在趕工的間隙做了一個判斷：函式應該是值，因為它得能被回撥。這個判斷的分量遠超語法層面的漂亮，也遠超他自己後來犯的所有錯誤。二十多年過去，那十天的程式碼還在全世界每一臺裝置的瀏覽器裡跑著。

技術的歷史，很多時候就是由幾天、幾個人、幾個不肯妥協的小決定累積成的。這些決定當時看起來都像權宜之計，回頭看，全成了分水嶺。
