布兰登·艾克:JavaScript、Firefox、Mozilla 与 Brave
Brendan Eich: JavaScript, Firefox, Mozilla, and Brave
JavaScript 之父回顾语言的诞生、Firefox 与 Mozilla 的历史,以及 Brave 对隐私的探索。
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 年,Firefox
2014 年,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 年那十天里,一个从物理系叛逃出来的人,在赶工的间隙做了一个判断:函数应该是值,因为它得能被回调。这个判断的分量远超语法层面的漂亮,也远超他自己后来犯的所有错误。二十多年过去,那十天的代码还在全世界每一台设备的浏览器里跑着。
技术的历史,很多时候就是由几天、几个人、几个不肯妥协的小决定累积成的。这些决定当时看起来都像权宜之计,回头看,全成了分水岭。
本集资源与出处
- 视频在 YouTube 收看
- 音频官方 MP3 直链来自 lexfridman.com 官方播客 RSS
- 官网Lex Fridman 官网本集页面
- 文稿HappyScribe 版文稿