作者 | Andreas Kling
策划 | 徐杰承
审校 | 云昭
51CTO读者成长计划社群招募,咨询小助手(微信号:TTalkxiaozhuli)
从头构建一个新浏览器?这如果是不是个天大的“伪需求”,便是一场开发者的噩梦!
要知道,如果没有上百亿的资金和数百名研发工程师的投入,从头开始构建一个新的浏览器引擎,几乎是不可能的。
然而SerenityOS系统的作者Andreas Kling却带领着一支仅有数十人且几乎没有资金支持的开源项目小队仅花两个月便完成了这项任务——从0到1构建了一款跨平台Web浏览器Ladybird(瓢虫)。截至目前,瓢虫已实现了在Linux、macOS、Windows(WSL)和Android等系统上运行。
本文就带领大家一探此事的究竟。
一、“轮子之王”两个月实现小目标
起初,Andreas希望将瓢虫作为 SerenityOS 系统的“LibWeb”浏览器引擎,随后Andreas Kling为其构建了一个简单的GUI。随着瓢虫项目的不断完善,在启动仅两个月后,它已经成为一个跨平台的Web浏览器。
在此之前,Andreas Kling曾有过Qt和WebKit项目的开发经验,而除了Qt,整个Ladybird浏览器的组件(包括LibWeb和LibJS等渲染组件)几乎全是Andreas Kling一手打造的,这也使其在圈内拥有了“轮子之王”的绰号。
在完成这项难以置信的壮举后,Andreas Kling收到了不少来自圈内朋友的赞誉和提问,而其中重复度最高的一个问题便是:“你的团队为何能在构建瓢虫浏览器方面取得如此快速的进展,这从表明看起来是完全不可能的。”
二、也许不能复制的五个秘诀
近期,Andreas Kling也正式通过一篇博客回应了这个问题,并将这次成功归结为了五个方面。
1.更强的网页规范
在启动Ladybird项目前,我们已经在HTML4和CSS2.1的模糊时代走了很长一段路。今天的ECMAScript、HTML和CSS规范(在大多数情况下)都拥有一流的技术文档,与过去相比,它们的算法可以用更少的工作和测试来实现。
瓢虫在体系结构层面会尽可能地匹配在各种网络规范中所描述的体系结构。这使得新加入项目的开发人员更容易适应,因为他们在参与开发前只需要学习一种架构而不是几种。
然而尽管如此,这与理想情况仍然存在差距,一些较为独特且不常见的特性给研发工作带来了一定困难。但值得庆幸的是,W3C有一个活跃的编辑社区致力于改善这些问题。我们在Ladybird上所做的大量工作包括使我们的代码库都能够适应这些规范编辑器所进行的更新。
我们也在努力改进规范:瓢虫的开发人员经常会报告规范错误,有时甚至还会提交pr来直接改进规范。但归根结底,在一个全新的浏览器引擎中实现一个规范,可以很好地验证该规范的完整性及可靠性。
2.专注于垂直领域
虽然今天的网页规范确实比以往任何时候都好,但许多特性仍然跨越多个规范,通常在子系统之间有细微的交互,实现者必须理解这些交互。如果开发人员试图一次只构建一个规范的浏览器,甚至一次只构建一个特性,那么其很可能会失去动力并因繁杂的工作而失去兴趣。
因此,我们倾向于专注于构建功能的“垂直切片”。这意味着需要设定实际的、交叉的目标,比如“让我们加载twitter.com/awesomekling”,“让我们登录discord.com”,以及其他类似的目标。在垂直切片上工作有助于保持开发者的动力,随着网站的进步,每一位参与者都能看到实际的变化,这会给大家带来极大的动力。
这种方法在一定程度上是可行的,因为web本身是围绕优雅降级设计的,这意味着浏览器可以呈现web内容,同时只支持站点使用的一些功能。你可能认为这种方法会产生一个“兼容网站”的小集合和一大堆无法运作的代码,但实际情况是水涨船高的,当我们专注于改进一个网站时,成千上万的其他网站也会得到改进。
3.后置性能优化
我们目前并没有花太多精力优化瓢虫的性能。相反,我们的主要关注点是解决与正确性和兼容性相关的问题。这种方法能帮助我们在深入优化之前专注于确保浏览器按预期工作。当然这并不是说我们不关心浏览器性能。我们希望瓢虫浏览器最终能够实现快速响应。
这是一个遵循一定规律的选择,不要花太多时间优化一个还不能正常工作的产品。例如,虽然我们几乎可以确定将会优化JavaScript执行或渲染速度的区域,但我们会有意识地选择优先修复渲染错误或与流行网站的兼容性问题。
但有时我们也确实会为慢得难以忍受的事情破例。毕竟对于一个开源项目而言,我们不想让开发者的贡献过程变得不愉快。在遇到这种情况时,我们会花一定时间解决最重要的性能瓶颈,以保持相对良好的开发体验。但在这个阶段,我们并没有跟踪基准分数之类的东西。不过,一旦我们在正确性和兼容性方面取得了坚实的基础,那么下一步要做的便是优化性能。
4.强大的团队文化
在Ladybird开发团队一起工作的时间里,我们形成了强大的团队文化。这里的文化是高度乐观的,每个人都抱有“我能行”的态度。虽然由于采取开源协作的工作模式,Ladybird团队分布在世界各地,但我们都会在Discord上见面聊天,互相激励。团队中的开发人员也经常合作,参与彼此的项目。
每个在Ladybird团队中工作的人都被鼓励在项目中探索自己的个人兴趣而不是被指定任务。团队中的大多数人在加入我们之前都从未接触过浏览器代码,但在加入项目后,他们会迅速成为世界级的浏览器开发人员,这也使得每一个项目的参与者能够收获足够的获得感。
此外,由于瓢虫是SerenityOS项目的一个分支,它具有与SerenityOS同样的责任感和自力更生的文化。我们在开发瓢虫浏览器时几乎避免了所有的第三方依赖,由开发人员自己构建一切。这样做的一部分原因是由于从0开始是一件很有趣的事情,此外也正因如此,这种开发模式为我们的软件创建了全面的责任制,每个人都会尽力对自己所写的代码负责,在出现问题时也能更快的进行响应,而无需等待第三方的反馈。
5.拥有一位经验丰富的领导
在比较复杂的项目中,一位经验丰富的领导可以发挥重要作用。我曾有机会在产品浏览器领域工作多年(在苹果和诺基亚),这让我对浏览器的构建以及各组件的组成方面有着比较深刻的理解。
当没有这方面经验的开发者看到需要组合一个浏览器的大量技术和规范时,可能会感到不知所措,但我能够清楚地知道如何将它们合理的组合在一起并使其工作。
在瓢虫浏览器的开发过程中,参与其中的开发者不需要过多考虑自己的想法或所写的代码是否可行,而是可以直接在与团队进行简单沟通后便开始工作,这会为整个项目省了大量时间,参与者也不会因为过多的意见分歧而产生不良情绪。
在更实际的情况下,我真正负责的工作通常是在各组件的链接与交互之间-浏览器的部分没有严格指定(例如布局和渲染)。对于缺乏经验的浏览器开发人员来说,他们可以更专注自己所擅长的领域而不必过多担心其他问题。
三、关于再造浏览器:杠精之间的讨论
既然有了Chrome、Firefox浏览器,为什么还要再造一个呢?这当然不是个好主意。
一位Reddit用户对于之所以会出现“再造浏览器”的情况,是因为历史上所有的浏览器都构建了自己的“怪癖”库,或者超出了标准范围的功能,或者干脆不符合标准。他还举例说:IE、Chromium、Safari一直都是“越界”来满足用户的需求,并期待自己的实现版本能成为标准。这位用户还吐槽:Safari是唯一一个给我带来真正麻烦的浏览器。
简言之,用户所期望的域浏览器的标准本身就存在差距。
即便再造一个,也可能只会是制造适用于某些站点的浏览器。因为有的网站只支持Chrome。很多用户在遇到类似的情况下只能选择它,而放弃Firefox。
其实不管重写一个浏览器是不是个伪需求,但一位Reddit用户仍然对此表示了赞许:“Kling的努力远超过了它的体量。”同时对于该浏览器的向后兼容性以跟上网络标准并提供可行的替代平台表示担忧。
有网友进一步分析,这个浏览器跟Chrome相比,是不需要完美的像素渲染的。并指出“如果排名前100的网站能在其上正常运行,那这个项目才是成功的”。
有网友反驳道:这个浏览器是为开发人员自己准备的,不应吹毛求疵。
四、写在最后
虽然时至今日,Ladybird浏览器中的部分功能依然存在一些错误,甚至一些功能还需要很长时间才能真正投入日常使用。但目前这只小瓢虫已经震动双翅飞向了天空。Ladybird 的出现,增加了浏览器和浏览器引擎的多样性,不少开发者也表示了对项目的赞许:“这是一项令人难以置信的艰巨任务,虽然一个小型的非商业项目不太可提供一个可行的替代浏览器平台。但这只小瓢虫成功击碎了‘不可能’的标签。”
对此,Andreas Kling也表示:我们依然在努力让Ladybird变得更好、更快,我们会持续关注关注Ladybird各类功能的正确性和功能支持,并对整体新能进行优化。
在博客末尾,Andreas Kling提到:尽管我不确定我们的工作方式可以直接转移到其他软件项目上(除非它们也是浏览器)并给其他团队带来帮助,但是通过一个由聪明、专注的个人组成的小团队和一个知识渊博的领导者来指导他们,你可以尝试构建任何你想要的软件。你当然可以做到,即使没有数十亿美元和数百名员工,没必要听取那些从未开发过浏览器的失败主义者的纸上谈兵。