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