技術(shù)人怎么少走彎路?看看nw.js作者Roger的經(jīng)歷,希望帶給你啟發(fā)(技術(shù)人的出路)
作者 | 徐川
2009 年,Node.js 橫空出世,JavaScript 終于突破了瀏覽器,可以在不同的平臺上處理各種各樣的任務(wù),但當(dāng)時,人們還只是拿它作為 Web 服務(wù)器或者前端開發(fā)工具來使用。到了 2011 年,有個人突發(fā)奇想,既然 Node 可以運(yùn)行在不同的桌面上,為什么不拿它來開發(fā)桌面應(yīng)用呢?于是,node-webkit(后改為 nw.js)誕生了。到今天,用 JS 開發(fā)桌面應(yīng)用已經(jīng)是從創(chuàng)業(yè)公司到巨頭的共同選擇。
這個人就是 Roger,今天,我想和你聊聊他的故事。
1、從中科大到英特爾
Roger 原名王文睿,老家在遼寧大連,1996 年進(jìn)入中科大后一直讀到博士畢業(yè)。在上課和研究期間,他第一次接觸了 Linux,第一時間就產(chǎn)生了濃厚的興趣。最開始,他只是在學(xué)校 BBS 的 Linux 版面上活躍,在上面交流和回答其他人的問題。和其他熱衷 Linux 的同學(xué)熟悉以后,他開始組織線下的活動,包括一些現(xiàn)場的講座和交流,以及 LUD(Linux User Diner) 聚會。當(dāng)時學(xué)校向他們提供了定期場地,后來,在 2003 年他和其他小伙伴們注冊成為了學(xué)校正式的社團(tuán),這就是中科大 LUG(Linux User Group)的由來。
2005 年,Roger 博士畢業(yè),進(jìn)入了英特爾,并且一待就超過了十年。
很多人可能以為英特爾就是個做芯片的公司,但實(shí)際上,英特爾的軟件和服務(wù)部門有幾千名員工,加上其他部門從事軟件開發(fā)工作的人員,規(guī)模和一個大型的軟件公司相當(dāng)。所以在內(nèi)部可以為工程師提供各種領(lǐng)域的工作機(jī)會。
在英特爾,Roger 待過不少的項(xiàng)目組,從開發(fā)虛擬化和應(yīng)用移植的方案,之后在開發(fā)者工具產(chǎn)品部門和開源技術(shù)中心任職,參與 Java XML 性能庫、MeeGo 和 Tizen 操作系統(tǒng)等多個系統(tǒng)和軟件開發(fā)項(xiàng)目。
Roger 很喜歡英特爾的工程師文化的工作氛圍,英特爾會不斷追求前沿的技術(shù)以保證自己業(yè)界領(lǐng)導(dǎo)者的地位,因此員工都有機(jī)會學(xué)習(xí)和參與到業(yè)界最新技術(shù)當(dāng)中。
(業(yè)余時間里,Roger 除了研究業(yè)界技術(shù)動態(tài)以外,還喜歡美劇、游戲和足球等活動。最近喜歡研究廚藝,他說,做菜和喜歡的編程有很多相似之處。)
現(xiàn)在,Roger 的工作很大一部分與開源相關(guān),他每天仍然會寫代碼,也一直在維護(hù)知名開源項(xiàng)目 nw.js。他認(rèn)為如果樂于不斷學(xué)習(xí)新知識,并且樂于以更聰明的方式工作,編程會是一項(xiàng)非常理想的工作。
2、NW 緣起:MeeGo 和 Tizen 的 Web Runtime
MeeGo 和 Tizen 是基于 Linux 的移動操作系統(tǒng),它們是英特爾、諾基亞和三星帶頭發(fā)起,曾試圖作為 Android 和 iOS 的挑戰(zhàn)者,類似的操作系統(tǒng)還有 Mozilla 發(fā)起的 Firefox OS。它們的特點(diǎn)是基于 html5 等 web 技術(shù)編寫應(yīng)用,鼓勵跨平臺的開發(fā)生態(tài)環(huán)境。
但是,這些嘗試都失敗了,Web 技術(shù)編寫移動應(yīng)用在當(dāng)時還不成熟,功能和性能都有所欠缺,移動設(shè)備和網(wǎng)絡(luò)的性能低下,也無法給 Web 應(yīng)用提供良好的體驗(yàn)。
從 2009 年開始,Roger 所在的團(tuán)隊(duì)當(dāng)時的工作是給這些移動操作系統(tǒng)開發(fā) Web Runtime,即讓這些 Web 應(yīng)用跑起來的核心引擎。其中一項(xiàng)主要的任務(wù)就是拓展它的本地 API,比如操作本地文件、使用 GPS 傳感器等,以實(shí)現(xiàn)和原生應(yīng)用同樣的功能。
對于如何實(shí)現(xiàn)這個功能,項(xiàng)目里的同事有不同的想法。Roger 在會議上和同事討論時,他起初是想利用 Mozilla 的 js-ctypes 這樣的項(xiàng)目,可以讓 JavaScript 方便的調(diào)用任意 C 語言的代碼。不過這個想法并沒有被采納。
后來英特爾開源部門開展了創(chuàng)新計(jì)劃活動,工程師可以花 10% 的時間投入在自己的項(xiàng)目上,Roger 又想起了這個想法。那時候 Roger 正好了解到 node.js 這個項(xiàng)目,感覺用它來擴(kuò)展本地的 API 是最好的選擇——它擁有足夠的能力,而且 JavaScript 開發(fā)者很熟悉 Node.js 的 API,它正好也處于起步階段(當(dāng)時的 Node.js 平臺上有大概 4000 多個軟件包),很受歡迎。Roger 想到了將兩個項(xiàng)目集成在一起,這樣 web 開發(fā)者就可以在 web 頁面中直接調(diào)用 Node.js 平臺的眾多庫。
說干就干,Roger 很快開始了編寫代碼,第一個實(shí)現(xiàn)的版本是基于 webkit 和 Node.js,命名為 node-webkit,經(jīng)過了公司內(nèi)部的開源流程后于 2011 年底在 GitHub 上 發(fā)布,并在 Node.js 社區(qū)的郵件列表里 宣布。由于它實(shí)現(xiàn)了一種新的編程方式,并且開發(fā)者不需要學(xué)習(xí)新知識就可以直接開始使用,在社區(qū)里得到了很好的反響。
公司的其他部門也對這個項(xiàng)目產(chǎn)生了興趣,甚至有些人開始用它開發(fā)產(chǎn)品,后來公司也表示了進(jìn)一步的支持,同意他用 50% 的時間來開發(fā)這個項(xiàng)目,過了一段時間以后又同意他招收一個實(shí)習(xí)生來一起工作,他在項(xiàng)目的郵件列表里發(fā)布了職位,不久后他收到了趙成的簡歷。
趙成以前曾經(jīng)把 gtk 庫的一些功能包裝給 Node.js 使用,毫無疑問這是一個能力很強(qiáng)的小伙子,Roger 很快接納了他,兩人一起對 NW 做了改進(jìn),后來趙成成為當(dāng)年的英特爾最佳年度實(shí)習(xí)生之一。
趙成本有機(jī)會留下來,但他最終還是選擇離開,在 2012 年 12 月,他給 GitHub 做外包開發(fā),嘗試將 Atom 從嵌入式 Chromium 框架和原生 JavaScript 遷移到 NW 上來,由于項(xiàng)目的特殊性,移植困難重重,并導(dǎo)致最終誕生了 Atom Shell 項(xiàng)目(即后來的 Electron),這是和 NW 類似,同樣用 Web 技術(shù)開發(fā)跨平臺桌面應(yīng)用的工具。
隨著 NW 和 Electron 的推動,使用 Web 技術(shù)開發(fā)桌面應(yīng)用的技術(shù)終于徹底流行開來。
3、NW 的現(xiàn)在
NW 上一次最重要的改進(jìn)是在 2016 年發(fā)布的 0.13 版本,它的內(nèi)部進(jìn)行了一次重構(gòu)。經(jīng)過這個版本以后,NW 的軟件質(zhì)量有了不少提高,并且也能按時跟隨 Chromium 發(fā)布新版本。對于這類項(xiàng)目來說,升級 Chromium 代碼非常重要,因?yàn)?NW 發(fā)布的軟件代碼中,99% 都來自 Chromium 項(xiàng)目。每次 Chromium 升級都會修正大量錯誤,包括幾十個安全補(bǔ)丁,同時提供最新的 Web 標(biāo)準(zhǔn)、新功能、新硬件支持和性能改進(jìn)。這次重構(gòu)也是以后很多的工作的基礎(chǔ)。
NW 的大部分代碼來自于 Chromium 和 Node.js 兩個項(xiàng)目,Roger 和其他貢獻(xiàn)者編寫的那部分采用了 MIT 授權(quán),加上 Chromium 和 Node.js 項(xiàng)目的開源授權(quán),所以任何人在這些授權(quán)下都可以將這個項(xiàng)目商業(yè)化。對商業(yè)化的友好,導(dǎo)致后來出現(xiàn)了一些下游的商業(yè)化項(xiàng)目,例如 tint,以及集成和重新發(fā)布了 NW 的其他開發(fā)工具,例如 Construct2。
現(xiàn)在,NW 能夠定期跟隨 Chromium 和 Node.js 發(fā)布最新的版本,軟件質(zhì)量也有了不少提高。使用 NW 開發(fā)的軟件也越來越多,典型的有微信小程序開發(fā)者工具。
NW 創(chuàng)立了使用 Web 技術(shù)開發(fā)本地應(yīng)用的一種新模式,應(yīng)用程序使用 Web 技術(shù)開發(fā),容易開發(fā)出漂亮的用戶界面,并借助 Node.js 平臺的強(qiáng)大功能;同時對想開發(fā)本地應(yīng)用的公司來說也比較容易找到開發(fā)者;已有的網(wǎng)站代碼也易于復(fù)用。未來希望借這個項(xiàng)目推廣這種開發(fā)模式,讓越來越多的應(yīng)用使用這種技術(shù)開發(fā)?;蛟S它會成為 Java runtime 或者 .NET runtime 這樣應(yīng)用廣泛的技術(shù)。
但同時 Roger 也認(rèn)為,NW 這類技術(shù)仍然有很長的路要走:首先是性能需要進(jìn)一步優(yōu)化,如果能占用更少的內(nèi)存、對用戶輸入響應(yīng)更快的話,體驗(yàn)會更接近原生應(yīng)用;另外 Web 平臺的快速演進(jìn)和穩(wěn)定性對應(yīng)用開發(fā)者也是一大挑戰(zhàn):目前,依賴 Web 運(yùn)行時的應(yīng)用需要不斷維護(hù)以應(yīng)對瀏覽器升級,例如 Chrome 66 版本中 autoplay 策略的變更就使很多網(wǎng)站不能正常工作,直到 Chrome 71 中才采納開發(fā)者的意見實(shí)行了一個折衷方案。
Roger 樂于看到 Electron 的發(fā)展,他希望 Electron 能夠和 NW 一起,推動這個領(lǐng)域不斷的擴(kuò)大和發(fā)展。對應(yīng)用開發(fā)者來說,同時有兩個選擇,并且它們之間相互促進(jìn)發(fā)展是比較理想的情況。
經(jīng)歷了 MeeGo 和 Tizen 的失敗,以及 NW 的成功,讓 Roger 認(rèn)識到:知道什么是正確的事,比知道如何高效的做某件事重要的多。它會讓你少走許多彎路,效果遠(yuǎn)高于延長工作時間和提高工作效率。雷軍有句名言也表達(dá)了類似的意思,只要不走到只知道空談的另一個極端,找方向值得你花更多的時間。技術(shù)人在選擇技術(shù)和規(guī)劃職業(yè)道路時也同樣適用,希望 Roger 的經(jīng)歷和他的感悟能給讀者一些參考。