Categories
程式開發

年終展望:最愛折騰的前端 在雲時代如何備考?


本文是 InfoQ“解讀 2019”年終技術盤點系列文章之一。

雲時代為前端技術⼈員織就了⼀張全新的互聯⽹,以往在UI交互技術孤島上的前端技術⼈員被聯上了⽹,終於可以站在C/C++、Java、Python……等程序員⾯前⾃豪的說:你們能⼲的我們也能⼲,⽽且,⼲得更好!

概要

這⼏年很少寫⽂章,⼀⽅⾯確實很忙,另⼀⽅⾯怕誤⼈⼦弟,⼀家之⾔望指正。

在這篇文章中我想分享⼀下云時代的前端技術展望。在開始之前,先聊聊雲時代的背景。

任何⼤規模技術變⾰都逃不開⼀個驅動⼒:商業價值。今天世界經濟不確定性陡增、⼈⼝紅利消失、流量被市場寡頭控制……整個互聯⽹⾏業從沒像今天這般短兵相接、劍拔弩張,這就要求互聯⽹從業者更加註重商業價值。

雲時代帶來了:通過極致效率、⾼可⽤、精細化成本控制,來滿⾜商業價值的要求。極致效率讓招聘成本和研發成本⼤幅度降低,資本對互聯⽹從業者提供的加速性能爆棚;⾼可⽤讓運維成本⼤幅度降低,現在的互聯⽹基礎設施在雲端為商業保駕護航,絲滑的阿⾥雙⼗⼀驗證了這⼀點;精細化成本控制讓基礎設施如:服務器、帶寬、存儲空間……可以隨著業務發展按需投⼊,業務初期節約的資本可以投⼊到獲取⽤戶等更加迫切的事情中去。因此,雲計算為互聯⽹商業帶來了前所未有的優質環境。

作為所有技術棧⾥最愛折騰的前端,拿著亞⻢遜雲Lambda超過60%的JavaScript市佔率,⾯對雲計算和雲時代的⼤考,究竟應該怎樣備考呢?本⽂將按照從環境到應⽤的順序,逐步揭開雲計算時代的⾯紗。

雲遊

偽屏蔽:Serverless下的Node

容器技術起源於虛擬化,從Parallels Desktop、Vmware、VirtualBox、Virtual PC 到Xen、KVM、Hyper-V。雲計算起源於容器技術,從cgrpups、Docker的基礎容器到FaaS函數容器;從最早的虛擬技術,到後來的容器化技術。在前端技術領域⾥使⽤容器技術實現Serverless的開發⽅式,把Node從⼀個包管理技術和開發調試⼯具,變成真正意義上的⽣產⼒技術,這個過程還是跨越了許多坎坷的。

⾸先,需要真正意義上實現IaaS。對於應⽤來說,底層的基礎設施服務化從Devops到Nops,最⼤的轉變在於Devops不是誰都能⽤好,所以並不具備普世價值。 Devops提供了通過編程來控制基礎設施的能⼒,但是,如果不深⼊理解分佈式系統架構、不了解容錯容災和⼀致性問題……並不能使⽤好Devops。因為它不僅僅是啟動服務器、掛載硬盤、安裝運⾏環境、設置環境變量、啟動服務、InitD啟動腳本、啟動守護進程這麼簡單。

其次,從架構設計⻆度上看,⼀個分佈式系統和⼀個⾮分佈式系統有著本質的區別,並⾮把服務⽤Node開發、借助容器技術部署到雲端這麼簡單。無論是接⼊層的流量負載均衡、流量分發、安全,還是服務層的服務註冊發現機制、任務分發、任務結果的Reduce、事務性⽀持、⼀致性⽀持、調度、消息通信機制、服務監控,分佈式系統最核⼼問題就是引⼊⽹絡通信帶來的不確定性,這也是為什麼編程問題⾥最複雜的是⽹絡編程。

最後,從研發體系上看,⽆論C/C++還是Python、Java,都針對服務開發沉澱、積累了⼤量技術⽣態,尤其是針對分佈式系統、⼤規模部署的複雜系統、⼤數據量和⾼並發系統、⾼實時性系統……都有成熟的技術⽅案和研發體系⽀撐。 Serverless的出現可以作為傳統服務開發的⼀個加速器和技術補充,Node服務端開發遠不如傳統服務開發技術體系成熟,要想從技術⽣態上完善這個體系,還有很⻓的路要⾛。

綜上所述,Node進⼊到Serverless技術體係並涉⾜傳統服務開發領域,看似表⾯光鮮的虛擬化技術、容器技術、容器編排技術、服務註冊發現技術、服務編排技術,實則對技術細節做了偽屏蔽。技術上看,雖然帶來了充分的技術保障和實施可能性,但完善Node服務端開發技術體系,還需要Node FaaS和Node Serverless⽣態在未來很⻓⼀段時間深耕技術細節,完善配套設施做到真屏蔽。

從思想上看,⽆論這個技術體系多厲害,從⽤戶側發起請求到服務側響應,在雲技術和Serverless體系下依舊⾮常複雜,需要有體系化的技術思想和架構思想去理解,這也要求Node開發⼈員更多去了解學習:MDA分析法、五視圖分析法、領域模型……等設計思想和設計範式。

超級膠⽔:Fission看FAAS

Javascript誕⽣之初,作為⼀⻔解釋執⾏的語⾔,天⽣的動態性就決定了其“膠⽔”的特性。起初,Javascript把DOM和BOM粘在⼀起實現了DHTML;後來,Javascript把DHTML和HttpWebRequest粘在⼀起實現了動態⻚⾯。 ⼗餘年發展下來,Javascript從加⼊ECMA語⾔層⾯增加了⼗來個特性,W3C標準卻帶來了成百上千的瀏覽器特性,這意味著膠⽔⾃身的特性是夠⽤的。這讓我想起“502膠水”,不管是啥,擦⼲淨抹上”502″⼀按就粘住了。

Node.js的出現讓Javascript成為了真正的”502″,不僅在瀏覽器上可以粘這兒粘那兒,在服務器上也同樣可以。 ⽐如你可以把⼀個HTTP Request Accept下來,把Token粘到鑑權Service判斷⽤戶是否合法,然後⽤AWK粘上Post內容來個⽂本分析,再粘個雲端存儲服務的REST API把某個Key的Value更新⼀下,然後掛著200的狀態返回個Response。

在Serverless下的Node技術體系更進⼀步,聰明的程序員發明了FaaS(Function as a Service)函數即服務。經歷了基礎設施即服務、平台即服務、軟件即服務的收斂過程,個性化訴求因為市場激烈競爭給業務帶來巨大壓力,市場迫切需要在集中式的以服務為基礎的雲上,快速構建個性化服務。雲服務商的一個方案——把不同的業務邏輯包裝在函數⾥直接在雲端函數容器執⾏,從眾多解決⽅案中迅速脫穎⽽出。究其原因就是因為極致效率、⾼可⽤、精細化成本控制。當業務有需求的時候寫個函數來⽴刻構建、測試、發布上線,函數容器背後的雲技術乃⾄雲原⽣可以保證⾼可⽤,彈性縮擴容可以保證成本精細化控制,完美!

這⾥⽤Fission來演示⼀下FaaS的魅⼒:可以看到,只要⼀個CLI即可解決所有問題,本地裝個Docker和K8s⽴即就能跑起來。推薦這個的原因是⽅便在本地搭建實驗環境,真正動⼿學習K8s的容器編排、了解Docker容器技術之強⼤,不⽤去Amazon 花錢開Lambda服務就能體驗FaaS的魅⼒。通過Fission實踐可以掌握:

  • K8S加持的雲原⽣開發⽅式
  • 了解容器池化如何應對冷啟動和瞬間⾼並發問題
  • 如何進⾏服務編排
  • 什麼是LSTIO服務⽹格
  • 如何借助Prometheus這種雲⼯具來攫取指標觀察數據
  • 測試Javascript和其他語⾔在函數容器中的性能表現
  • ……其他花式玩法等你探索

由此,即可順利跨上雲計算這匹寶⻢良駒,馳騁疆場應對⻜速變化的市場環境和新技術,精確⽆誤的把各種雲能⼒⽤Node FaaS這管強⼒膠黏合在⼀起。

雲上開瓶器:Web IDE

作為⼀個1990年擁有電腦的編程⽼⻦,Delphi是我⻅過的第⼀個集成開發環境(IDE)。在Pascal的改進版語⾔Object Pascal加持下,各種UI控件和⾃定義控件可以實現⼏乎所有的GUI,相較之下,SourceInsight只能算代碼編輯器。這也是很多⼈不理解微軟把VS Code叫做代碼編輯器,把Visual Studio稱為IDE的根本原因。

因為VS Code的開放,在各種插件加持下,VS Code的IDE能⼒⼀點⼉不⽐Visual Studio弱,是不是很神奇?所以,數千⼈組成的研發團隊,依舊趕不上開源社區的強⼤,這是阿⾥巴巴、Apple等⼤公司擁抱開源⽣態的本質原因。所以,今天的開源VS Code成為地表最強IDE已極少有⼈質疑。

VSC Team 由著名⼯程師 Erich Gamma 領導,Erich 是《設計模式》作者之⼀,Eclipse 之⽗,擁有多年的 IDE 開發經驗。 Erich舉重若輕的利⽤Node把Extensibility管理得井井有條,為開放的插件⽣態創造了⽆限可能。

年終展望:最愛折騰的前端 在雲時代如何備考? 1

多進程的架構不僅帶來了優秀的性能,也能讓後台進程、UI和編輯器、I/O、插件、Debug、Search各司其職。因此,只要⽹絡帶寬允許,理論上可以把任何⼀部分服務化。舉個例⼦,只要你願意,可以下載VS Code的源碼,把I/O部分服務化,利⽤雲存儲服務來替換本地I/O,輕鬆保證源代碼、資源⽂件等在雲端的環境⾥安全可控。 ⼜或者,你可以把插件部分服務化,不論你在家⾥還是在公司啟動VS Code,雲端存儲⼀致的插件⽴即帶給你⼀致的IDE和⼀致的開發體驗。最後,⼲脆把後台進程和Renderer process也放在雲端,⻬活,⼀個雲上的IDE就此誕⽣。當然,如果你不願意⾃⼰折騰,也可以試試微軟的VS Code Online,或者Github上的Gitpod,或者在本地跑⼀下:https://github.com/cdr/code-server

如果把本⽂前半部分所講的雲端技術⽐作⼀瓶82年的拉菲,那雲上的IDE⽆疑就是⼀把開瓶器,用來拔開阻擋品嚐雲技術美酒的瓶塞。擋住美酒的瓶塞主要是:能⼒發現、調試、部署。

能⼒發現有兩個層⾯,⼀個是表⾯上的⽂檔上雲服務能⼒是什麼? ⼀個是本質上的代碼上雲服務能⼒是什麼?對於⼀個程序員來說,⽂檔寫得再詳細,不親⾃進去敲個Hello World、Echo Server,⼤抵也是不放⼼的。有了雲上的IDE,你即刻就可以“打開”雲服務的能⼒,⽤代碼去⼀探究竟。

年終展望:最愛折騰的前端 在雲時代如何備考? 2

調試是應⽤任何新技術、新研發模式的基礎,因為你⽆法預測⾃⼰的想法是否能被那些⾃以為是的代碼,在陌⽣的運⾏環境⾥被正確執⾏。要駕馭分佈式系統和現代云技術體系,尤其當⾯對混合雲的時候,要完整搭建整個調試環境是⼀件很痛苦的事情。雲上的IDE因為其云原⽣的先天優勢,可以⽅便地在雲端利⽤雲技術、容器技術、容器編排技術快速創建應⽤調試環境,甚⾄可以藉助雲測試和真機模擬環境來進⾏調測、撥測。

部署在雲服務和雲設施之上,不同的雲技術對應不同的持續交付和持續集成,構建過程、構建環境、構建對象和容器技術的依賴都讓部署過程變得複雜。部署過程中流量分桶、熱更新、服務⼀致性保障等問題也⾯臨複雜的環境。尤其在多⼈協作的場景中,如何良好進⾏發布的管控,成為亟待解決的軟件⼯程問題。雲上的IDE可以⼏乎⽆痛的解決上述問題,通過在雲上維護統⼀的持續交付和持續集成環境、⾃動化管控部署過程、借助源碼和編譯構建卡⼝代碼發布,所有部署過程都在⼀個受控和受保護的雲環境中進⾏,開發⼈員可以放⼼⼤膽的⽤代碼構建整個世界。

展望

未來最讓我期待的前端技術趨勢就是雲技術和機器學習技術,機器學習有imgcook.com這個作品在前端研發提效這個⽅向持續探索,為前端智能化充當排頭兵。雲技術在前端和Node FaaS技術體系下,需要怎樣的突破創新?

⾸先,如何吸收借鑒傳統服務開發的經驗、分佈式系統設計實踐經驗,將是⾸要問題。初⽣⽜犢不怕⻁也意味著⽆知者⽆畏,即便有云技術良好的基礎設施和基礎能⼒,如何訓練⾃⼰擁有良好的架構思想、⾯向失敗的設計習慣?只有不斷學習吸收傳統服務開發的經典架構思想和經典設計範式,並充分進⾏實踐和反思,才能將其融⼊到Node FaaS技術體系。

其次,學習速度和學習深度都是因⼈⽽異的,每個⼈都有不同的理解⼒、不同的技術背景,⼜分處在不同的業務場景中,因此對Node FaaS技術體系的理解必定各有差異。如何在⾃⼰擅⻓的⽅向上、⾃⼰熟悉的領域中持續積累,沉澱出Node FaaS的最佳實踐,並使⽤VS Code插件或開源項⽬的⽅式將其分享出來,共同借助社區的⼒量豐富和完善Node FaaS技術⽣態?這也是一大挑戰。

最後,雲時代為前端技術⼈員織就了⼀張全新的互聯⽹,以往在UI交互技術孤島上的前端技術⼈員被聯上了⽹,終於可以站在C/C++、Java、Python……等程序員⾯前⾃豪的說:你們能⼲的我們也能⼲,⽽且,⼲得更好!

作者介紹:

甄焱鯤(甄子),阿里巴巴淘寶技術部高級前端專家。騰訊 3 年半 T1.1~T3.3 前端開發通道最高職級達成後,2011 年 4 月離職創業,先後創辦兩家中等規模電商公司,同時自研智能家居相關軟硬件。 2014 年 8 月加入阿里移動事業群,先後負責國內發行、國際信息流運營研發、廣告平台、國際瀏覽器。現在淘寶技術部,負責前端技術委員會智能化方向。在編程領域服務端、客戶端和前端、機器學習等領域都積累了豐富的項目經驗,尤以前端技術見長。在硬件領域從基礎電路設計、部分高速電路設計、無線傳輸、FPGA 和 CPLD 芯片原型設計、部分簡單工業設計有項目經驗和一些專利。求職篤行,是一個熱愛技術、願意花時間思考的人。