?作者 | 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提到:盡管我不確定我們的工作方式可以直接轉移到其他軟件項目上(除非它們也是瀏覽器)并給其他團隊帶來幫助,但是通過一個由聰明、專注的個人組成的小團隊和一個知識淵博的領導者來指導他們,你可以嘗試構建任何你想要的軟件。你當然可以做到,即使沒有數十億美元和數百名員工,沒必要聽取那些從未開發過瀏覽器的失敗主義者的紙上談兵。