← 回到天際線 寫程式的人第 10 層 / 31

EP 1602021-02-122:59:19

十天寫出 JavaScript,之後的瀏覽器大戰

Brendan Eich

JavaScript 創造者回顧十天寫出這個語言的過程,從瀏覽器大戰一路談到他想用 Brave 重新設計網路廣告的分潤方式。

Brendan Eich: JavaScript, Firefox, Mozilla, and Brave | Lex Fridman Podcast #160在 YouTube 看 ↗

重點5 條

  1. 十天寫出如今最普及的語言之一:Eich 回顧 1995 年在 Netscape 只花十天寫出 JavaScript 初版的過程,包括管理層要求語法要神似 Java、命名一波三折(Mocha → LiveScript → JavaScript),以及後來才補上的垃圾回收與那個惡名昭彰的 `==` 隱式轉型。
  2. 從瀏覽器大戰到標準化:從 Netscape 對抗 Internet Explorer,到他參與催生 ECMA 標準、經歷 ES4 夭折與 ES6 的成功,他認為 JavaScript 活下來,一半靠 first-class functions 與夠簡單的核心,一半靠他在標準組織裡長年傾聽開發者。
  3. Firefox 怎麼從 Netscape 的廢墟裡長出來:Mozilla 一度是沒有法人身分的「海盜船」,Mitchell Baker 被裁員之後照樣帶著社群往前走,團隊才把瀏覽器從 Netscape 4 的爛攤子重寫成後來的 Firefox。
  4. asm.js 到 WebAssembly:他講述怎麼把 C/C++ 編譯進瀏覽器、用 Unreal Engine 的移植證明 C++ 遊戲引擎能在瀏覽器裡以每秒 30 格跑起來,最終演變成各瀏覽器共同支援的 WebAssembly。
  5. Brave 想解決的問題:從 cookie 與追蹤腳本這些意外形成的機制講起,到廣告科技產業把大部分利潤吃掉,他解釋 Brave 想用封鎖追蹤加上 Basic Attention Token,建立一個使用者、創作者、廣告主三方分潤的替代模式。

時間軸30 段

01 01:50
少年物理夢與程式啟蒙

Eich 說高中沒寫太多程式,是看完《星際大戰》後幫朋友用 Commodore PET 寫模擬死星壕溝戰的 BASIC 小程式,他負責數學;他原本主修物理,迷 1970 年代中期的 HP RPN 計算器,在 Santa Clara University 因為讀理學院而躲過寫 Fortran 打孔卡的命運,改用 Pascal 與早期的 C 編譯器,從程序抽象開始愛上寫程式。

02 07:18
科學裡「模型 vs 實驗」的張力

被問到理論物理為何許久沒有重大突破,Eich 認為問題出在理論蓋過了實驗——很多數學模型沒有真的對照現實檢驗,就被拿去當政策工具,或是一大堆彼此競爭的理論沒人去淘汰;他說經濟學也是如此,連所謂的硬科學也不例外。談到 P 對 NP,他說這在實務上用處不大,多半只出現在密碼分析與抗量子密碼這類討論裡,而量子運算能不能規模化本身也還是大問題。

03 11:46
JavaScript 起源故事開場

Eich 在 Silicon Graphics 待了七年後,被朋友 Jeff Weinstein 找去 MicroUnity 待了三年——那是 90 年代初一家想同時做新半導體製程、新類比數位電路與機上盒媒體處理器的野心公司,最後因為同時押注太多高風險的事而沒有成功。1994 年 Netscape 剛成立時,他因為在 SGI 認識創辦人,本來有機會加入卻錯過,隔年(1995 年 4 月)才正式加入。他用 Richard Gabriel 的〈worse is better〉說明網路世界先上線、搶到位置的一方會贏;JavaScript 帶著倉促留下的缺陷還是勝出,就是這個道理。

04 20:05
從 Scheme 到夥伴語言

Eich 說他當初是被找去 Netscape「在瀏覽器裡做 Scheme」,但公司很快跟 Sun 談起 Java 授權,Scheme 的機會就沒了;微軟那時正準備全力抄 Netscape,公司裡的氣氛更急。Bill Joy、Marc Andreessen 和他都看出,除了給專業工程師寫元件的 Java,還需要一個讓設計師、業餘寫手把元件黏起來的夥伴語言。語言內部叫 Mocha,行銷部門想用 JavaScript,也短暫叫過 LiveScript,直到 1995 年 12 月才拿到商標授權定案。他一進公司先被放在伺服器團隊做 HTTP/1.1,管理層要求新語言外觀要像 Java,也就是 C 的大括號語法,資料型別也要能跟 Java 對接。

05 28:53
堅持要有 first-class functions

即使被要求外觀像 Java,Eich 仍堅持要有 first-class functions:瀏覽器是單執行緒程式,得用回呼(callback)處理使用者互動才不會卡住畫面,而 Java 當時還沒有這種特性。onclick 這類事件命名受 Bill Atkinson 在 HyperCard 裡的 HyperTalk 啟發。他認為 JavaScript 活下來、Java 在瀏覽器裡沒落,原因之一是 Java 被關在外掛的方框裡,很難跟網頁互動;後來微軟把 Java 踢出 Windows,Outlook Web Access 改用 ActiveX 元件呼叫伺服器,這個元件後來演變成 XMLHttpRequest。

06 33:18
Flash 的起源

Eich 說 Netscape 當年本來可以買下 Flash 卻沒買(他說買了大概也會搞砸)。Flash 最早叫 Future Splash,Jonathan Gay 等人曾主動接洽 Netscape,但負責篩選技術夥伴的行銷主管態度強硬,把他們打發走了;他們後來把公司賣給 Macromedia,一家肯在工具上投資的公司。他說自己其實佩服 Flash 的技術,尤其是把動畫處理成時間的不可變函式;也認為那些喊著「Web 做不到,要另起爐灶」的人最後都失敗了,因為 Web 這張網路的價值太大。

07 36:21
十天裡的取捨

Lex 請他還原那幾天怎麼做出來的。Eich 說 Marc 是他的後盾,也主張程式要直接寫在網頁裡;這在當時算異端,一位 SGML 專家還寫信罵他該用 marked section。他改用 HTML 註解把程式碼藏起來,讓舊瀏覽器忽略、新版 Netscape 執行,他說少了這招 JavaScript 根本起不來。十天裡他沒空寫垃圾回收,先用 arena(記憶體池)配置頂著,跑久了就會把記憶體用光,1995 年夏天才倉促補上參考計數;但執行環境是用 C 寫的,計數一旦下溢,就可能變成遠端執行程式碼的漏洞。回頭看,他最自豪的是 first-class functions;最失策的是十天之後才加的隱式轉型:早期使用者要拿數字跟字串直接比,他「像個傻瓜一樣」答應了,`==` 從此不再是乾淨的等價關係。

08 46:02
Marc Andreessen 的角色

Eich 回憶常跟 Marc Andreessen 在 Palo Alto 一家小餐館碰面討論方向,那時沒明講,但大家都知道微軟要來了。Andreessen 喊出「Netscape 加 Java 會殺死 Windows」,卻仍看重 JavaScript,也很早設想瀏覽器需要圖形能力,一度想找人來做,只是後來跟 Sun 談成 Java 授權就沒做。Lex 問到 IE 為什麼能贏,Eich 的答案是通路:作業系統綁著瀏覽器,這比什麼都重要,Netscape 裡的人早就覺得自己完了。但他也說 Netscape 早期把 beta 版開放給外部開發者的做法很關鍵,早期使用者(例如做藝廊網站的 Bill Dortch)已經在用 JavaScript 做出單頁應用的雛形。

09 53:12
標準化的動盪

Eich 說 Netscape 帶頭做 HTML 創新時,W3C 還耗在 SGML 與後來的 XML 路線上;他認為 XML 太嚴格,微軟嘴上說支援 XML,IE 預設卻把它丟進 HTML 的容錯解析器。W3C 那時運作不太順(Netscape 也沒跟它合作),Netscape 的標準專家 Carl Cargill 就找上歐洲標準組織 ECMA;微軟派出很強的 Katzenberger,寫了規格的大部分初稿。標準名稱叫 ECMAScript,是因為 Java 商標屬於 Sun,一位微軟代表還開玩笑說這名字聽起來像皮膚病。第一版標準 1997 年在法國尼斯定案。

10 1:00:15
ES3 到 ES6 與 TypeScript

Eich 說十天裡來不及做的東西在 1996、97 年陸續補上,第三版標準 1999 年完成;此後 Netscape 賣給 AOL,標準停擺,到 2003 年已經凍結。他把 JavaScript 2 交給 Waldemar Horwat 設計,但它只以變形的樣子出現在微軟 ASP.NET 伺服器端(沒撐多久)與 Flash 的 ActionScript 3。ES4 最後被擱置,當年受歡迎的部分到 2015 年併進 ES6 才算修成正果。他也談到微軟的 TypeScript:它是 JavaScript 的超集合,任何合法的 JavaScript 程式都是 TypeScript 程式,開發者可以漸進地加上型別標註,他認為這很聰明。

11 1:07:04
jQuery 與框架生態系

Eich 認為 jQuery 流行,反映出 90 年代設計的 DOM API 太物件導向、太囉唆;後來 HTML5 那波標準補上 fetch API、querySelector 這些更精簡的寫法,很多事用原生 JavaScript 就做得到。被問到框架該不該更快被淘汰,他說「也許應該」。他說 DOM 標準在微軟減少投入網路之後停滯多年,直到 Ian Hickson 等人推動 HTML5,才把過去的事實標準整理下來。

12 1:11:59
Flash 退場,asm.js 登場

Eich 認為 Jobs 宣布 iPhone 不支援 Flash 才是致命一擊,但 Flash 拖到最近一年才從主流瀏覽器消失;網頁這邊得補上影片、WebGL、Web Audio 才取代得了它。Mozilla 接著發現 JavaScript 可以當編譯目標:Alon Zakai 做出以 LLVM 為基礎、把 C/C++ 編成 JavaScript 的編譯器,Dave Herman 與 Luke Wagner 再把他的做法整理成子集合 asm.js——不加新語法,靠位元運算子轉型,就能型別檢查、編出效能穩定的程式碼。團隊到 Epic Games 四天就把 Unreal Engine 移植到瀏覽器,Tim Sweeney 本來不認為能這麼快;在 GDC 2013 展示時全場震驚:沒有外掛、沒有 Flash、沒有 Java。

13 1:18:12
WebAssembly 誕生

Eich 說展示了 Unreal Engine 之後,Google 放棄自己的 Native Client 路線只是時間問題;各家在 2015 年春天達成共識,在 asm.js 驗證過的基礎上,做出能載入同一個 JavaScript 虛擬機、共用垃圾回收器與記憶體管理的二進位格式,也就是 WebAssembly。他說二進位格式很重要,尤其在行動裝置上:JavaScript 就算壓縮傳輸,也得先展開進記憶體,再解析像 function 這種八個字元的關鍵字。

14 1:19:32
從 Animorphic 到 V8

Eich 回憶 1997 年被 Netscape 借去幫 Sun 評估收購 Animorphic——那是 David Ungar 與一群史丹佛語言迷的圈子,Ungar 把 Smalltalk 簡化成 Self,發展出「多型內嵌快取」:先猜型別,猜對就直接跑機器碼,猜錯才退回直譯器。他當時沒空把這套用在 JavaScript 上,Animorphic 被 Sun 買下後做出 Java HotSpot。約 2006 年他得知 Google 在做瀏覽器,也發現做 V8 的正是 Animorphic 出身的 Lars Bak;他看得出 Lars 不喜歡 JavaScript,卻還是得做。同一時期 Mozilla 做 TraceMonkey、Apple 也在做自己的 JIT,大家一起把 JavaScript 變快。

15 1:23:28
JavaScript 為何最流行

Eich 認為一方面是 first-class functions、沿用 C 運算子的好部分、核心夠簡單,讓它有種內在的好,人們隔著那些怪癖也感受得到;另一方面是他在標準組織裡長年傾聽開發者。一位朋友在 Hacker News 寫過:Sun 的 Java 是專家寫給專家的,而他一個人做好幾個人的工作,讓 JavaScript 撐過被當成 Mickey Mouse 語言的那幾年。Lex 把 C++ 比作華爾街、JavaScript 比作 WallStreetBets;Eich 接著說 JavaScript 比較平民,不要求證照就讓人進來,C++ 則是比較小眾的老手圈子。

16 1:27:59
WallStreetBets 現象與寡頭政治

Lex 問到 WallStreetBets 帶起的散戶軋空,Eich 說經濟學原本是道德哲學的一支,後來脫離了這個根,變成好像一切都會自己運轉,對 WallStreetBets 這種現象也沒有好的模型。他把美國現況類比柏拉圖五種政體裡的「寡頭政治」,認為金錢利益長期影響政治人物,現在看到的是對寡頭的反撲,帶著一種駭客精神,但他不確定會不會成功。

17 1:31:19
JavaScript 是否吞噬整個運算世界

被問到 JavaScript 已經用在後端與 TensorFlow.js,未來會不會幾乎所有運算都跑在它上面,Eich 說這對一些人來說像反烏托邦的噩夢。他提到以搞笑技術演講聞名的 Gary Bernhardt(講過〈Wat〉)的推論:進出核心的系統呼叫很貴,而軟體層的隔離越來越便宜,最後所有東西都可能收斂到 JavaScript 這種輕量隔離環境裡;他認為這「不是完全不可信」。

18 1:33:22
給初學者的語言建議

被問到初學者該學哪些語言,Eich 說做機器學習的線性代數可以看看 APL 這一系;Python 長期缺少像樣的 JIT,走的是「不夠快就寫 C 外掛」的路。他是 Mozilla 內部 Rust 的執行贊助人,當初是受夠了 C/C++ 造成的遠端執行漏洞;他也稱讚 Go 很成功,尤其在伺服器端。Lex 說他常在 Python 與 JavaScript 之間猶豫要推薦哪個當入門語言;Eich 認為 Python 會在語法檢查階段就擋下拼錯的地方,對初學者比較好,JavaScript 則會自動把數字包成物件,寫錯了不會被擋,只會冒出不知從哪來的 undefined。

19 1:39:46
Netscape 對 Internet Explorer

Eich 說微軟做 IE4 時已經找了很多優秀的人,包括老朋友 Scott Isaacs,做出不少創新的 DHTML API;反觀 Netscape 上市後亂收購一堆公司,第一線人才逐漸燒盡,Netscape 4 原本該叫 3,一路延期才改名,還只先出 Windows 版。他回憶 1997 年去看 IE4 預覽,微軟展示了類似 Netscape layers 的東西和 VML,他當下就跟同行的朋友說「我們完了」。那一輪大戰以壟斷收場,他猜可能是反壟斷訴訟、歐洲的監管,或單純不想跟標準打交道,微軟就讓 IE 爛在那裡,留下大量安全漏洞;直到 Mozilla 與 Firefox 加上分頁、封鎖彈出視窗,創新才回來。

20 1:44:59
Firefox 命名史與 Mozilla 誕生

Eich 說 mozilla/browser 專案 2002 年叫 Phoenix,因跟 Phoenix Technologies 商標衝突改叫 Firebird,又因一個開源資料庫專案抗議而改名 Firefox;Firefox 其實是小熊貓的別名,想保留「火」的意象又要夠獨特。往回講 Mozilla 的誕生:Netscape 高層決定把瀏覽器開源當逃生艙,他用《星際大戰》的比喻:砲手不會打沒有生命跡象、不構成威脅的逃生艙。1998 年開源後,在澳洲布里斯本的 Tim Hudson 與 Eric Young,在美國管轄之外把他們的加密程式庫(後來的 OpenSSL)放進 Mozilla,是頭幾個月最漂亮的一招。Mozilla 當時沒有法人身分,像一艘海盜船;Mitchell Baker 寫了開源授權,後來也接下管理的位子。團隊決定把舊程式重寫成模組化架構,用開源版的 COM 元件加上 JavaScript 橋接,介面則用自訂的標記語言 XUL 來寫。

21 1:50:57
Mozilla 內部動盪

Eich 說 2001 年一次裁員把 Mitchell Baker 裁掉(他說不知道是有意還是無意),但隔週的社群電話會議她照樣出現,證明開源專案只要有足夠的向心力,就能超越公司的界線;他形容在 Netscape 裡不喜歡 Mozilla 的,多半是最弱的工程師。2002 年的 Mozilla 1.0 像一套臃腫的 90 年代套裝軟體,於是 Dave Hyatt 與還是高中年紀實習生的 Blake Ross 做出只有瀏覽器的 mozilla/browser。他也回憶被叫去 AOL 在維吉尼亞州 Dulles 做巡迴展示,見識東岸企業文化,以及 AOL 與 Time Warner 合併後很快就不順;Hyatt 2001 年去了 Apple,成為 Safari 創始團隊成員之一。

22 1:58:51
Google 搜尋交易與 Chrome 悄悄誕生

Lex 說 Firefox 當年是最酷的東西,那時正好碰上第一屆 Web 2.0 大會,以及 Wikipedia、Gmail、Google Maps 這波熱潮。Eich 說 2004 年初 Google 主動接觸他談搜尋與瀏覽器合作,這成為 Mozilla 最主要(至今仍是)的收入來源。他在飛機上還聽到一位微軟員工說,當初只要加上彈出視窗封鎖與分頁,就能把 Firefox 扼殺在搖籃裡。2005 年 Larry Page 問起 Apple 的 WebKit,Eich 反而建議他:要做就自己做瀏覽器,不用顧慮 Firefox。到 2006 年他已知道 Google 在動工,早期展示的重點是把每個分頁放進獨立行程,讓 Flash 當掉時只出現一個難過表情的分頁,而不是整個瀏覽器崩潰。Firefox 一路成長到 2011 年左右,之後因為 Chrome 開始下滑。

23 2:06:03
Yahoo 交易失敗,隱私浪潮興起

Eich 說 Mozilla 在 2014 年 12 月中把預設搜尋引擎從 Google 換成 Yahoo,但 Yahoo 的搜尋團隊早已被裁、回不去了,許多使用者發現後自己改回 Google。他說據外界報導(他沒有內部消息),合約似乎是固定付款,所以 Mozilla 照樣拿到錢;這說明預設值要夠好,使用者才不會自己動手改。Lex 說現在像是瀏覽器的第三階段;Eich 說各家互相借鏡,特別是在追蹤保護上,隱私是一波正在升起的浪潮。他認為 Apple 從 Steve Jobs 時代就把 Safari 當隱私品牌經營,比 Firefox 更早有無痕視窗,也很早就擋第三方 cookie。

24 2:09:23
cookie 怎麼變成追蹤工具

Eich 解釋 cookie 是存在瀏覽器裡、依網站名稱索引的一小塊資料,讓人不必每換一頁就重新登入;Netscape 的 Lou 在 1994 年、他加入之前倉促做出來。但網頁裡的圖片可以從別的伺服器載入,請求會帶著 cookie,同一個像素伺服器嵌在不同新聞網站上,就能把你的瀏覽紀錄串成個人檔案。他強調這不是刻意設計的,等他進 Netscape 已經來不及改:他記得 Lou 想做叫「twinkies」的改版,可能也想解決第三方的問題,被當時的主管擋下。後來 script 也能像圖片一樣從外部載入,追蹤從此連圖片都不需要。

25 2:13:17
Brave 的核心構想

Eich 說他想讓瀏覽器預設就擋掉這些意外留下的追蹤機制,難處在分辨第一方與第三方:不少出版商會引用看似不相關網域的正常腳本,所以 Brave 從一開始就建立研究團隊,用人工加機器學習決定擋什麼。Apple 差不多同時在做「智慧防追蹤(ITP)」,同樣用瀏覽器本地端的機器學習。早期 Safari 的第三方 cookie 封鎖有個漏洞:只要使用者造訪過某廣告網域,它的 cookie 就放行,AppNexus 就要廣告主在點擊時先導頁過去騙取白名單。他也提到指紋辨識與「超級 cookie」,並說在標準組織裡,Google 已經成了新的微軟。

26 2:17:53
廣告科技與 Basic Attention Token

Eich 說 2015、16 年時,擋廣告的瀏覽器被出版商當成敵人,到 2017、18 年大家才意識到擋廣告的浪潮擋不住。他批評廣告科技產業分潤極不合理,舉英國《衛報》自己買下自家廣告版位的實驗為例:投入 1 英鎊,只有 30 便士回到出版商手上,其餘七成被中間廠商拿走;同一套廣告交易系統還會放行詐騙流量與夾帶惡意程式的廣告。他解釋 Brave 想把使用者、創作者、廣告主三方直接連起來,一開始用比特幣試做,後來轉用以太坊做出 Basic Attention Token:瀏覽器在本地端用機器學習比對使用者的興趣,從固定的廣告目錄裡挑廣告,Brave 看不到這些資料;使用者可提領收益(需實名認證)或轉贈給創作者。

27 2:32:07
若 Brave 的理念普及

Eich 開玩笑說如果 Brave 真拿下 95%,他會要求重新計票;他認為 Brave 真正的價值在使用者的信任,以及把好的做法推進網路標準。Brave 把七成廣告收入分給使用者,自己抽三成,跟 App Store 的比例一樣;他也設想取代 Patreon 抽 5% 的中心化模式,改由瀏覽器抽 3%,而且 Brave 無法審查。他批評 Google 的 AMP 把出版商都吸進自己的框架,也認為使用者應該擁有自己的朋友關係,瀏覽器可以幫你把不同平台上的朋友串起來,被某個平台封鎖也找得到人。

28 2:39:32
中心化封鎖與 Parler

Lex 問到 Robinhood 限制帳戶、Parler 被 AWS 下架這類中心化的權力。Eich 說寡頭若控制了國家就很難對抗,但網路總會繞過審查;他也說完全不管內容的平台會被極端分子占據、毀掉自己的名聲,所以他要的是以使用者為主、能跨平台找回人的介面。談到 Parler,他說那次下架很過分:Parler 本身設計得不好,但 Twitter 上至今也找得到威脅暴力的推文卻沒被下架,看起來像掌權的既有勢力選擇性地拿掉新進者。他也說,反壟斷的懲罰反而讓微軟轉身離開網路,退回 Windows Vista 這條封閉路線,結果 Vista 失敗。

29 2:46:14
矽谷還值不值得留下

Eich 說有親友在近幾個月搬去德州,也有很多人往佛羅里達、邁阿密去。他認為加州因封城債台高築、稅負最高,森林管理不當導致野火年年發生,加上州長被看到違反自己的防疫規定用餐,這種「說一套做一套」會讓人失去信任。他認為矽谷的優勢來自史丹佛與天使投資人網絡形成的網路效應,但這也會隨時間鬆動。他也談到疫情帶來遠距工作後,Facebook 允許員工搬回家鄉,但會依當地生活成本調整薪水。Lex 認為就算矽谷沒落,別處也會冒出新的據點;Eich 同意人會更流動、可能冒出新據點,但不確定矽谷是不是已經過了保存期限。

30 2:55:00
尾聲:死亡與人生遺產

被問到會不會想到自己終將老去,Eich 說他是天主教徒,並不害怕死亡;他認為很多人對死亡感到不安,是因為缺乏信仰上的超越感,或者沒有小孩、覺得自己還沒完成什麼能留下來的事。談到希望留下什麼樣的遺產,他說比起 JavaScript,更在乎自己的孩子與孫輩,其次才是網路標準,以及 Firefox 和 Brave 這些他參與過的計畫——他認為 Firefox 證明了不需要多數人,一小群「領先使用者」也能扭轉一個市場,這種精神也延續到 Brave 上。