我在 Chrome 上工作已经大约 10 年了。这里有一些故事,肯定是在那十年的距离中被我自己的记忆所美化的。将它们全部视为只有 60% 正确。我想我至少可以在我完全忘记它们之前把它们写下来。
我做了什么。我从 2007 年到 2012 年早期就在 Chrome 上工作,这几乎涵盖了我 20 多岁的后半段时间。当然,我的生活中还有其他事情在发生——包括,例如,我的婚礼——但就我一生所做的任何事情而言,更大的世界关心的是,Chrome 是我 20 多岁时所用的东西。如今,它拥有超过 25 亿用户。去咖啡馆看到我旁边的人在他们的屏幕上显示“我的”软件,这仍然是一种奇怪的感觉。
我加入这个项目的目标是让 Linux Chrome 成为现实,这意味着在最终领导 Linux 团队之前,首先在仅限 Windows 的 Chrome 上工作了几年。不可避免地,当一个项目是新的时,你最终会接触到它所有的东西——我记得写过代码让你点击它时“星形”按钮亮起,例如,这只需要一个新的状态布尔值和一个额外的图像资源— 但我最大的持久遗产之一是我们最终拥有的构建系统。
在那些年的大部分时间里,我都在写一个关于 Chrome 的博客,里面有很多技术细节。在那里查看我的第一篇公开帖子。我关于离开原因的告别帖子更多地讲述了我的个人历史。
为什么我在那里?我加入 Google 和 Chrome 时认为自己是自由软件社区的一员。在大学里,我们使用了一些疯狂的技巧,包括将 Windows 计算机与 Linux 计算机一起运行只是为了获得一个可用的浏览器,因为 Web需要仅适用于 Windows 的 Internet Explorer。正如 Brad 在那里写道:“我已经等待 Mozilla [pre-Firefox 开源版本] 不烂了一年多了”。我记得在我的宿舍里未能让 Mozilla 在 Linux 上构建并且心想有一天我可以解决这个问题。 Chrome 正是给了我这个机会。
具有讽刺意味的是,我认为我最终处于相反的位置:我从痛苦的经历中了解到为什么 Linux 上面向用户的软件(无论是 Mozilla 还是我的)通常都不是很好的结构性原因。同样地,我了解到免费软件是如何从给予和感激的地方产生的,并最终成为企业的另一种武器。回想起来,这是一个古老的比喻,我试图“从内部改变系统”,但最终被它吞噬了。
为什么谷歌在那里?回想起来,今天的成功是显而易见的,但在当时,Google 开发浏览器似乎真的很疯狂。 (当时这甚至是公司内部反复出现的笑话,说它永远不会发生。)
历史肯定会揭露一个关于篡夺网络控制权的马基雅维利阴谋,但当时这个故事非常简单,至少向像我这样天真的棋子解释是这样。谷歌希望网络取得成功,甚至有一个团队为 Firefox 做出贡献。 Google 希望对产品有更大的影响力,Mozilla 对此(有理由)感到不自在,所以我们走自己的路。很容易从中看出某种巨大的冲突,但我仍然没有看到。据我所知——它发生在我的时代之后——WebKit 分支是同一件事:他们希望 WebKit 做苹果没有做的事情,最终它太多了。
还有第二个次要情节是关于微软如何越来越多地转向恶劣的做法来报复谷歌,以及担心使用 IE 来拉一些反谷歌的恶作剧。当时我认为 Windows 更新正在重置您的搜索引擎,但 Microsoft 一直在做这种事情。您可以将 Valve 在基于 Linux 的操作系统上的尝试看作是对 Windows 应用程序商店的类似防御。我知道今天的微软应该会再次变得很酷或其他什么,但我仍然记得 90 年代,我经常被公司的恶毒和小公司提醒。
第三,即使 Chrome 彻底失败,人们也希望它能在其他浏览器下点燃一把火,我认为确实如此;在 v8 发布之前,没有人真正关心 JavaScript 基准测试。 (你可以将 Google Fiber 解释为尝试同样的事情,尽管我对此没有太多了解。)人们很容易忘记当时的网络有多糟糕,但 Chrome 在 IE7 和 IE8 之间的三年暂停期间出现了。
为什么会成功?显然,谷歌将资源(工程/广告)投入其中是一个重要组成部分。但同样的情况是,谷歌将资源投入到许多最终没有成功的事情上。
当我对技术感到沮丧时,这实际上是我感到安慰的事情之一:即使世界上有那么多钱,X 公司仍然无法做出客户喜爱的 Y。你可以用你自己的 X/Y 代替你感觉不好的任何大型公司。有趣的是,当我第一次起草这一段时,Google 放弃了 Facebook 克隆的消息传出,似乎完美地证明了这一点。或者想想微软和亚马逊在手机领域的尝试。
尽可能客观地看待这件事,我想我可以说我们推出的原始产品是真正好的软件。我们所做的一些事情,比如页面之间的操作系统级沙箱隔离,对于任何其他浏览器来说都需要数年时间才能实现。
其中很大一部分是因为我们有一些意想不到的伟大工程师出现了。思考一下,无论你从互联网上认识多少人,都有一种你从未听说过的其他超级聪明人的“暗物质”,这很有趣。举个例子,我想到了非常有才华的 Antoine,他是这些粗俗评论的作者,也是 ChromeOS 上的最高级别的人,他在互联网上似乎几乎是隐形的。
有时我怀疑我自己对整个项目的最大贡献只是邀请agl参与其中。 (回想起来,我是不是?也许都是他自己的计划中的计划……)
但我也见过很多优秀的工程师开发出不成功的软件。如果我试图指出我们拥有而我合作过的其他项目所缺乏的一件事,我想我会称之为一致性:该产品有一个明确的目的,每个人都知道并且都朝着那个方向前进。我记得事后猜测一些随机的设计细节,我们的设计师Glen描述了他为做出特定设计决策而权衡的所有因素。从那时起,我对他非常清楚自己在做什么充满信心。
也许这只是说我们有很好的领导。很抱歉没有更具体的成功秘诀。当然总是有很大的运气成分。
格伦海德。 Chrome 最初仅适用于 Windows,并且在其自定义标题栏中有非常 Windows 外观的按钮。我一直在唠叨 Glen 给我们一些 Linuxy 按钮,作为恶作剧,我用他的脸代替了关闭按钮。
回想起来……我还是觉得这很有趣。虽然我也了解到他没有给我我想要的按钮的原因是因为他当时有其他事情的压力,所以我有点不体贴。但我认为他今天也认为这很有趣,所以一切都很好。
抛光。当我们即将发布第一个 Chrome 版本时,我们选择了一个发布日期,并在日期临近时按照标准“尽可能地消除最后的错误,并将其他一切都扔掉”。例如,我曾致力于一项与 RSS 相关的功能,但我们在发布时就放弃了,而且再也没有恢复。然后发生了一些不相关的危机——我不记得是哪一次了,这有多难过?无论如何,一些新闻报道会让我们的报道黯然失色——这导致我们将发布推迟了一个月。
这给了我们额外一个月的时间,我们无法真正添加功能,而是有余地来完善这个东西,修复所有那些你通常没有时间处理的最后一刻的细节错误。回想起来,这对产品来说是一种难得的解脱,我认为它使最初的发布比其他情况下更令人印象深刻。奇怪的是,润色对于某些产品来说有多重要,同时很难激励人们将润色工作置于一般功能工作之上。
漫画。我在第 22/23 页的Chrome 漫画中有短暂的停留。很高兴见到 Scott McCloud。他的书 Understanding Comics 真的很棒,值得你花时间阅读。我在照片中举了一个关于惊喜礼物的隐身模式的例子,但我很确定我给出的例子是色情片,不会让任何人感到惊讶。
目的是在我们发布浏览器的同时发布漫画,作为发布的一种支持文件。由于(运输?)错误,有人在我们发布实际产品之前拿到了漫画,因此漫画内容与浏览器评论分开出现了一些新闻。现在回想起来,这有点棒,因为这意味着兴奋的评论者首先会参与到产品的创意中,而不会被产品的视觉细节分散注意力。
版本控制。我们最初使用 Google 用于代码的 Perforce 版本控制系统开发 Chrome,然后在某个时候切换到内部托管的 SVN,以期在发布时将其作为开源发布在 Google 的公共 SVN 托管服务上。当真正启动时,我们发现该服务并不是为扩展到像 Chrome 这样大的项目而设计的,这导致了围绕如何实际发布代码的演习。
我们最终租用了 Google 网络之外的服务器,并自行对它们进行系统管理。我记得我个人的任务是弄清楚如何阻止来自伊朗的 IP——关于加密出口的一些愚蠢的法律要求——并破解一个 xinetd 脚本。这个故事可能是任何在初创公司工作的人都熟悉的事情,但在谷歌的环境中它是非常不正常的,那里的服务器管理是非常定制的、很好理解的和集中管理的。我认为我们甚至不能使用谷歌硬件,因为在我们自己的数据中心或类似的地方运行非谷歌软件是一个很陌生的想法!这绝对是我记忆中最靠谱的事情之一。
与此同时,我是一个版本控制的书呆子(我用所有奇怪的东西编写了软件——monotone、darcs、tla!)并且非常肯定 Git 会成为一件大事。因此,我编写了用于在 Chrome 上工作的 Git 相关工具,以将其与我们基于 SVN 的代码审查流程等集成。回想起来,我认为这是我领导方面的失败。许多年后,当 Chrome 最终不可避免地转向仅使用 Git 时,我认为从 SVN 中挖掘出来是一个多年的项目。如果我花一点时间来倡导对我来说很明显的事情,我会为那些人节省很多时间。
由于我是一个版本控制的书呆子,这里有一个额外的有趣的深奥的 Git 功能:在谷歌,我使用git grafts将 P4 和多个 SVN 历史拼接在一起成为一个大的连续历史,这有时最终是有用的通过git blame
进行代码考古。我想今天加起来的历史可能有 16 年之久!
与苹果公司合作。大约一半的 Chrome 代码是我们对 WebKit 的分支,在 Chrome 发布后我们将其重新整合到 Apple 的上游(只是在多年后,在我的时间之后最终再次永久分支)。这意味着,在我们发布后不久,我们所做的更改需要得到 Apple 工程师的批准。
回想起来,出于两个原因,我非常喜欢这个。一是从经验丰富的工程师那里获得代码审查是作为程序员成长的最佳方式之一,而 Apple 工程师来自完全外国的工程文化——没有单元测试!暂无评论! – 这显然也在生产高质量的产品。第二个是 Apple 的批准程序是我们将随机的 Chrome 特有的东西塞进网络平台的一道门;你必须证明它对 Apple 也有意义。
然而,我在这方面没有做太多工作,我知道这对其他人来说是很多压力的来源,部分原因是我们的基本目标如此不同。虽然个别工程师可能不同意这种描述,但我认为可以毫不夸张地说,从结构上讲,Apple 关心的是制作一款能够充分呈现网页的浏览器,而真正的应用程序不属于浏览器。也有很多技术分歧。也许我只是很幸运或者我忘记了,但我对我得到的代码审查大多有温暖的回忆。
我提到所有这些也是为了反思所有这一切中一个特别奇怪的部分。在某个时候,我被告知不要向 Apple 的任何人提供工作。有传言说我们已经成功地从 WebKit 团队招募了一位重要人物,而史蒂夫·乔布斯 (Steve Jobs) 亲自揭开了这件事的面纱。多年后我才知道这是一项行业范围内的非法协议的一部分。我最终得到了一张 12,000 美元的集体诉讼和解支票,我猜这是为了弥补我损失的工资。
缺少楼梯。多年后在一次聚会上,我遇到了 Apple 的一位开发 WebKit 的人,我说,“哦,太棒了!我在 Chrome 上工作,所以我也接触了那个代码。”他们问:“你们团队中的 [X 人] 是怎么回事,为什么他们这么混蛋?” (遗憾的是,如果你在 Chrome 上工作,你可能确切地知道我在说谁。)这段经历让我意识到一个群体,尤其是一个不露面的互联网群体,是如何被其最糟糕的行为所感知的。
我的“采访”。有一次我度假回来发现一封电子邮件,上面写着:“一家 Linux 杂志想采访你,但你不在,所以我们为你写了回复,你可以根据需要进行编辑。”回想起来这真的不太好,我不确定为什么我没有大惊小怪。您仍然可以在文章中阅读“我的”回复,其中包括诸如“我们构建 Google Chrome 浏览器是因为我们相信我们可以为用户增加真正价值”之类的令人眼花缭乱的回复。
报酬。谷歌有一个项目,他们偶尔会在正常补偿之外给予大笔股票赠款,作为对在某些方面非常出色的项目的奖励。我们有一个——也许是最后一个? — 适用于 Chrome。 (我写了“最后”,但对我来说,他们一直在不宣布就一直颁发此类奖项。)
我提到这一点是因为当我们得知我们获得了奖项,并且每个人都被告知他们将获得多少奖金时,团队中最资深的人之一不久后宣布他将离开公司。我记得对此感到惊讶并问他这件事。他的回答让我印象深刻,大概是这样的:“一旦我知道留下来能给我带来的最大好处,我就能更好地评估它与我的其他选择的对比。”
我认为那里有一个关于奖励如何产生你想要的相反效果的教训。类似地,虽然我能理解为什么一家公司可能想为他们想要奖励的行为提供额外的奖金,但最终让一家公司为了留住人才而悬而未决的未来奖励的潜力而感到恶心。
Web 应用程序与本机应用程序。我们今天认为您可以在 Web 上构建真正的软件是理所当然的。但这里有一个故事或许可以说明那个时代:在我们推出 Chrome 时,我们有一个搜索功能,浏览器会显示一个显示链接和文本片段的选项卡,就像网络搜索结果页面一样。 (有关此功能的更多信息,现在已不存在。)
我记得编写本机 UI 代码来执行我们自己的自定义文本布局和可点击链接,尽管页面的预期外观和行为看起来就像基于 Web 的搜索结果页面。这就是说,在当时使用 HTML 来实现任何你关心的东西似乎都很可怕,即使对于我们浏览器开发人员来说,即使对于应该表现得像网页的 UI 也是如此!
根据我在那个项目上的经验,我后来在 Chrome 中做了一些工作来公开基于 HTML 的浏览器 UI,我记得我在团队中提倡它。从那时起,很多浏览器的 UI 都是用 HTML 实现的。 (你还记得 Chrome 的设置 UI 曾经是全原生的吗?)当然,现在在今天的 Electron 世界中,桌面应用程序不使用 HTML 实现的情况越来越少……
Chrome 与网络。当我们还小的时候,网站不会解决我们的错误。我们不得不为他们工作。这是一个专门解决 MediaWiki(又名维基百科)中的错误的 WebKit hack 。它于 2009 年添加 (!) 并存在了十年。
有一次问题出现了:浏览器应该遵循多少次重定向?假设您尝试加载 A,但它会将您重定向到 B,B 再重定向到 C,依此类推;在某些时候你应该放弃并说有些东西坏了。有人选择了一些看似合理的阈值,比如 10 左右,超过 Chrome 就会放弃。然后,以前在 Firefox 上工作过的达林说:“不,它必须是 30,否则它会打破纽约时报——我从经验中知道这一点”。 (今天 Darin 正在开发另一个浏览器,希望能从这个来之不易的课程中获得第三次使用。)
然后 Chrome 变大了,网站开始测试以确保它们能够解决 Chrome 的错误。然后 Chrome 变得庞大并开始规定允许网站做什么。我认为这可能来自一个好的地方(例如,为什么即使是静态网站实际上也需要 https )但它让我感到焦虑,因为没有结构性的原因这些决定应该是好的。
我读到过,美国政府效率低下的一个原因是创始人故意将其设计为难以做出改变,理由是抵御暴君突然改变比轻易改变法律更重要。网络移动得更快,但我们主要依赖少数独裁者的仁慈(或者说,我们是恶意的受害者)。导致 HTML5 分裂的标准过程的失败说明了为什么让一个任意的机构定义标准也行不通——这是一个类似的协调激励问题。我认为没有简单的答案。
铬操作系统。我记得有人问我是否想研究这个“Chrome 操作系统”的想法——我的宝贝 Linux Chrome 是其中的一个重要部分——我对此非常怀疑。
但 ChromeOS 的结果让我感到惊讶,尤其是在安全和更新方面。他们以某种方式设法再次让合适的人在合适的地方做出真正令人印象深刻的事情。
今天的铬。一旦我们让 Linux Chrome 基本正常工作,我想我没有意识到我的工作已经完成。当时我开玩笑说“Chrome 12 [一个旧版本] 是最好的 Chrome”,但自从我开始看到它的底层对我来说我想要的是一个快速紧凑的浏览器,一旦我有了它,漂亮根据定义,大多数后续工作只会让情况变得更糟。当然,有修复渲染崩溃或提高滚动性能等工作,但大多数工作涉及添加使其更大或更慢的功能。
从长远来看,我对此表示赞赏的是,我将自己的很多精力投入到产品中,我为当时所做的事情感到自豪,但该产品是一种我无法控制的生物,它已经消失了在我不会接受的方向上。我对谷歌与隐私的关系越来越随意感到特别失望(或者“心烦意乱”是一个更好的词)。旧谷歌比你今天看到的要恭敬得多。
反思我们花了多少时间来制作最简单的东西也很有趣——Chrome 最初没有“主页”按钮,我记得有很长一段时间争论是否将它作为一个选项添加是否违背了这个东西的目标— 与今天的浏览器相比,它覆盖着按钮和设置,就像它打算反抗的浏览器一样。
网络的命运。我对网络有点悲观。在 Chrome 之后,我在一个产品上工作了三年,其创始目标是试图找出某种“拯救报纸”的方法。
每个人都讨厌广告,但没有人对新闻业如何获得资金有一个合理的计划;那个项目尝试了一件我认为也没有成功的事情。在像这样的讨论中,不可避免地会有人说一些无益的话,比如“如果报纸有合理的支付系统,我会为他们付钱”或者其他什么,但挥手和实际计算数字之间的鸿沟是巨大的。
今天的网络感觉就像围绕着广告处于一个类似于底部的螺旋中。可以使用网络技术制作一些非常漂亮的东西——例如 Figma——但是制作用户敌对的垃圾更容易,所以这就是我们通常得到的。
人们似乎认为屏蔽广告是浏览器的工作,但我的观点是,如果企业主想让他们的业务令人厌恶,唯一明智的反应就是停止使用该业务。不知何故,一旦涉及到技术来抽象正在发生的事情,人们就会开始谈论单方面重新谈判交易是他们的权利。或者另一个可能会让你不高兴的类比:“我讨厌这家商店对一根香蕉要 10 美元,所以我还是要付 2 美元买香蕉”。
与此同时,唯一真正的非网络平台是由公司(苹果/谷歌/微软)运营的,这些公司不怕踩踏竞争对手,通常是以非法或本应如此的方式。就在这篇文章中,我有所有这些公司行为不端的例子。所以也许我只是对技术的总体发展方向感到悲观!