ThinkJS作者李成銀:擇善而從之,篤行致遠(圖靈訪談)

劉敏ituring發表於2016-07-12

李成銀
奇虎360前端技術專家,ThinkJS 框架作者,開發了Chrome擴充套件版的Fiddler,以支援模板語法處理的Fl,等等。目前參與開發的一個專案是燕尾服,藉助多程式和 Ast/Token 大幅提高現在前端工作流的編譯效能,專案地址為:https://github.com/stcjs/stc。

enter image description here

非常有幸邀請到李成銀老師,進行一期圖靈專訪。

關於 ThinkJS

什麼原因促使你開發了 ThinkJS 框架?

提到 ThinkJS,可能有些人會想到,ThinkJS 是不是和國內的 PHP 框架 ThinkPHP 有一些關係呢。沒錯,剛開始 ThinkJS 就是借鑑 ThinkPHP 來開發的。到2013 年下半年的時候,Node.js 框架主要還是 Express,但用 Callback 處理非同步的方式讓人非常頭疼。一種比較好的方案就是用 Promise,所以我慢慢就有了借鑑 ThinkPHP,使用 Promise 機制開發一個 Node.js 框架的想法。

隨著專案複雜度的提升,ThinkJS、Promise 也暴露出一些弊端,例如不能很好的跳過一些中間環節和資料傳遞。我想到藉助 Babel 編譯提前使用 ES2015 規範和 React 的新特性。對於非同步處理方式,我也有了更好的方式——Generator Function 或者 Async Function。

2015年3月,我們完成了 ThinkJS 全新版本的設計,目標定位為能夠在專案裡直接使用 Es2015+ 特性開發,框架自動編譯及更新,大大方便 Node.js 專案的開發;同時優化 1.0 版本當中不合理的架構和設計,脫離對 ThinkPHP 的依賴。2015年10月30日我們終於成功釋出了 2.0 版本,而這天也是 Babel 釋出 6.0 的日子!

據說 ThinkJS 不止侷限於你們開發團隊的內部,外部越來越多的人員也開始使用。當初開發 ThinkJS 框架的時候,有沒有預想到它會如此成功?

ThinkJS 其實還算不上成功,到目前為止 GitHub 上的 star 數也才 1700,社群也不是太活躍。不過,現在確實有越來越多的公司在使用 ThinkJS 開發專案,有 PV 超過千萬的專案,也有一些秒殺的專案。

最近上線的 ThinkJS 2.2 在功能和效能上有哪些改進?

2.2 版本主要支援將錯誤定位到原始檔和支援斷點除錯的功能。因為開發的時候使用了 ES6+ 的語法,然後使用 Babel 編譯,如果程式報錯,輸出的錯誤資訊會是編譯後的程式碼,這給除錯帶來很大的麻煩,同時斷點除錯只能除錯編譯後的程式碼,這對開發又是非常不利的。所以 2.2 版本致力於將報錯定位到原始碼,並且基於原始檔進行斷點除錯。

效能方面的改進是從 2.1 版本就開始的。雖然 ThinkJS 面向企業級應用,封裝了很多基礎的功能,但效能上卻並不亞於 express/koa 這些輕便級的框架。而對於同樣面向企業級的 Sails.js 框架,ThinkJS 的效能是它的 4 倍。所以說 ThinkJS 的效能是非常卓越的。具體的效能測試資料可以見https://thinkjs.org/zh-cn/doc/index.html#toc-9c0

當然在真實的專案中,框架損耗的效能佔比非常小,不用太過關注,只要框架本身沒有記憶體洩露等問題都是可以接受的。

我們知道 ThinkJS 相對於其他的 Node.js 框架來說,更適合企業級的大型專案。目前,360公司的哪些專案正在使用 ThinkJS 框架?

目前,360內部的很多專案都是使用 ThinkJS 開發的,如線上專案“爆米兔” https://www.baomitu.com/ 以及其他一些商業級的專案,如http://shangyi.360.cn/

ThinkJS 的成功帶給你怎樣的體驗?或者說,該框架的成功開發對你的生活帶來哪些變化?

雖然 ThinkJS 現在還不算太成功,未來的路也還很長,不過在開發 ThinkJS 過程中確實有很多的感受。

  1. 作為開源專案,除了開發本身的框架程式碼外,還要寫豐富的測試用例。ThinkJS 現在的測試用例有 1700 多個,單元測試的程式碼比框架本身的程式碼要多得多,每次改動都要確保測試無誤。對於一些介面變動也不能隨意,需要考慮向後相容等各種情況。同時,還要寫各種使用文件,專案示例,等等。

  2. 需要花很多的時間處理 QQ 群/社群裡提的各種問題。經常有人問安裝問題、環境問題、簡單的使用問題,剛開始的時候,我要親自逐一進行回答,不過現在社群慢慢成形了,簡單的問題會有成員幫忙回答,節省了我很多時間。

  3. 相對於國內開發者索取為主,國外開發者更願意積極貢獻。awesome-* 專案發 pr,讓其新增 ThinkJS,也會主動修改文件中的一些拼寫錯誤,然後發 pr。更好玩的是,有個老外 EunseokEom 覺得 ThinkJS 的官網不太好看,就親自設計了一個新的https://github.com/75team/www.thinkjs.org/pull/60。雖然我們最終沒有采納老外設計的這個網站,但他的貢獻精神真的非常贊。這也讓我們有了優化官網的想法。

ThinkJS 未來的規劃是怎麼樣的?

ThinkJS 內建了很多功能,這加大了框架本身的程式碼量,也增加了學習的成本。我們計劃在未來的版本中精簡核心,將一些功能剝離出來,以外掛的方式存在。同時,加強框架周邊的建設,為企業級專案開發更好地保駕護航。

關於團隊

360前端團隊“奇舞團”是怎樣的一個工作團隊?團隊合作帶給你怎樣的生活體驗和專業提升?

“奇舞團”是 360 最大的前端團隊,支援公司的很多業務。開放的團隊鼓勵每個人利用業餘時間開發各種工具、平臺,提高團隊的開發效率。

團隊非常注重技術培養,每週都有技術分享會,覆蓋新技術學習和使用、專案經驗和總結、演算法優化等各個方面。不光奇舞團的同學可以參加,公司其他部門的前端同學也可以參加。我們還會邀請外面的一些團隊來公司交流分享,讓每一位同學都能快速成長。

對外方面,奇舞團每週都會發布《奇舞週刊》,方便團隊以外的同學持續學習前端知識。

“眾成翻譯”是360前端推出的一款線上翻譯平臺。該平臺是否適用於出版行業的引進版圖書翻譯工作?如果適合,這對外版書的翻譯工作會產生哪些積極作用?

“眾成翻譯”1.0 是“奇舞團”在2016年5月10日釋出的,這個專案由李鬆峰老師負責,使用最新的 ThinkJS 2.0 開發。釋出兩個月來,已經翻譯文章200多篇,字數超過了50萬字。“眾成翻譯”當前的主要功能是推薦和翻譯技術文章,核心是為譯者提供便捷的翻譯輔助,提高翻譯效率和質量。目前專案正在圍繞譯者翻譯體驗的提升和優質內容的展示做功能優化。比如正在開發的翻譯問答功能,就是為譯者在翻譯過程中向翻譯高手求助牽線搭橋的。從社群形態來看,這個功能上線後將可能成為國內第一個以技術翻譯為主的問答社群,成為有助於廣大翻譯愛好者快速學習、鍛鍊和成長的一個翻譯知識共享社群。由於“眾成翻譯”目前只支援文章的翻譯,所以在上面翻譯圖書會有些侷限,必須手工把內容拆分然後再合成。“眾成翻譯”未來有可能考慮協作翻譯和引進版圖書翻譯的功能,為專業的翻譯、出版機構和譯者提供一個可選的第三方工作平臺。希望到時候能夠依託已有的譯者隊伍,為更專業的翻譯工作提供有力的支援。

關於前端設計

一個好的前端工作者,應具備哪些特質。

我認為一個好的前端工程師,最基本的就是要做事靠譜。而做事靠譜,不光需要技術能力,還需要溝通能力、責任心和執行力等各個方面的軟素質。具體工作中,技術能力可能只佔了 40%,軟素質方面的能力卻高達 60%。工作中,你很經常看到技術能力一般但能把事情做好的同學,也會見到技術能力很強,但把事情做砸的同學!

你認為,未來新的ES標準將在哪些特徵上做進一步的改進。

JavaScript 這幾年在語法糖和 API 上有了很大的改進,尤其是 ES2015 標準之後,每年都會釋出一個新版本。這得益於前端行業的迅猛發展,前端技術已經不再侷限於瀏覽器端,它發展到了 Web 服務端、手機端,甚至用 JavaScript 做一些硬體介面的開發和遊戲的開發。

至於未來如何改進不太好說,不過我比較看好下面幾點:

  1. 語法改進:借鑑其他語言當中一些比較好的特性,讓開發大型專案更加便利,如class 相關。

  2. 非同步處理:雖然 async/await 還沒正式釋出,不過狀態已經是 stage-3,明年可以如期釋出,這樣 JavaScript 在非同步處理上將有質的改變。另外 Asynchronous Iterators 提案,可以在 iterators 裡直接處理非同步的情況。

  3. 大資料處理:隨著大資料處理越來越熱門,很多專案都要在前端進行大資料處理和展現。SIMD.JS 提案可以大大提升 JavaScript 在大資料處理方面的效能。

再次感謝您參與本次的訪談!

相關文章