版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 下載APP 37 | 云編程:云計算會如何改變編程模式?2019-11-18 宮文學編譯原理之美進入課程 講述:宮文學時長 18:02 大小 16.53M上一講中,我分享了當前 3 個技術(shù)發(fā)展趨勢,以及其對編譯技術(shù)的影響。今天我們把其中的云計算和編程模式、編譯技術(shù)的之間的關(guān)系、前景再展開探討一下??偟膩碚f,現(xiàn)在 編寫程序是越來越云化了,所以,我們簡單地稱作云編程就好了。關(guān)于云編程,有很多有趣的問題:1. 編程本身是否也能上云?在云上編程會跟本地開發(fā)有什么不同?2. 如何編寫云應用,來充分發(fā)揮云平臺的能力?分為哪些不同的模式?3. 為什么編寫云應用那么復雜?如何降低這些復雜度?云原生應用的開發(fā)
2、平臺,能否解決 這些問題?本節(jié)課,我就帶你深入討論這些問題,希望借此幫助你對編程和云計算技術(shù)的關(guān)系做一個梳理,促使你更好地利用云計算技術(shù)。首先,來看看如何實現(xiàn)云上編程。實現(xiàn)云上編程90 年代初,我在大學學習編程,宿舍幾個人合買了一臺 386 電腦。那個時候,我記得自己不太喜歡微軟提供的 MFC 編程框架,這和 386 電腦沒有浮點運算器,編譯起來比較慢有關(guān), 編譯一次使用 MFC 框架的,C+ 程序的時間,足夠我看一頁報紙的了。喜歡編程的人,為了獲得流暢的性能,電腦配置總是很高,雖然這足以滿足 C/C+ 時代的編程需要,但進入 Java 時代后,因為應用結(jié)構(gòu)越來越復雜,工程師們有時需要在筆記本
3、或桌 面電腦上,安裝各種復雜的中間件,甚至還要安裝數(shù)據(jù)庫軟件,這時,電腦的配置即便再高, 也很難安裝和配置好這么復雜的環(huán)境。那么到了云計算時代,挑戰(zhàn)就更大了,比如,你能想 象在電腦上安裝 Hadoop 等軟件,來做大數(shù)據(jù)功能的開發(fā)嗎?其實,編寫一個小的應用還好,但現(xiàn)在的應用越來越復雜,所需的服務端資源越來越多。以我最近參與的一個項目為例,這個項目是采用微服務架構(gòu)的一個企業(yè)應用,要想實現(xiàn)可擴展的性能、更好的功能復用,就要用到數(shù)據(jù)庫、消息隊列、容器服務、RPC服務、分布式事務服務、API 服務等等很多基礎設施,在自己的電腦上配置所有這些環(huán)境,是不大可能的。因此,工程師們已經(jīng)習慣于,在云上搭建開發(fā)和
4、測試環(huán)境,這樣,可以隨需獲取各種云端資源。因為編程跟云的關(guān)系越發(fā)緊密,有些開發(fā)工具已經(jīng)跟云平臺有了一定的整合,方便開發(fā)者按需獲取云端資源。比如,微軟的 Visual Studio 支持直接使用 Azure 云上的資源。再進一步,IDE 本身也可以云化,我們可以把它叫做“云 IDE”。你的電腦只負責代碼編輯的工作,代碼本身放在云上,編譯過程以及所需的類庫也放在云上。Visual Studio Code 就具備 UI 和服務端分離的能力。還有一些服務商提供基于瀏覽器的 IDE,也是實現(xiàn)了前后端的分離。我認為,未來的 IDE 可能會越來越云化,因為云 IDE 有很多優(yōu)勢,能給你帶來很多好處。1. 易
5、于管理的編程環(huán)境編程環(huán)境完全配置在云上,不用在本地配置各種依賴項。這一點,會給編程教育這個領(lǐng)域,提供很大的幫助。因為,學習編程的人能夠根據(jù)需要,打開不同的編程環(huán)境,立即投入學習。反之,如果要先做很多復雜的配置才能開始學習,學習熱情就會減退,一些人也就因此止步了。其實,在軟件開發(fā)團隊中,你經(jīng)常會看到這樣一個現(xiàn)象:新加入項目組的成員,要花很長的時間,才能把開發(fā)環(huán)境搭建起來。因為他們需要安裝各種軟件,開通各種賬號等等。那么, 如果是基于云 IDE 開發(fā)的,這些麻煩都可以省掉。2. 支持跨平臺編程有些編程所需要的環(huán)境,在本地很難配置,在云中開發(fā)就很簡單。比如,可以用 Windows 電腦為 Linux
6、 平臺開發(fā)程序,甚至你可以在云上,為你的無人機開發(fā)程序,并下載到無人機上。在為手機編程時,比較復雜的一項工作是,適配各種不同型號的手機。這時,你只需要通過云 IDE,整合同樣基于云的移動應用測試環(huán)境,就可以在成百上千種型號的手機上測試你的應用了。3. 更強的計算能力有些軟件的編譯非常消耗 CPU,比如,完整編譯 LLVM 可能需要一兩個小時,而充分利用服務器的資源可以讓編譯速度更快。如果你從事 AI 方面的開發(fā),體會會更深,AI 需要大量的算力,并且 GPU 和 TPU 都很昂貴,我們很難自己去搭建這樣的開發(fā)環(huán)境。而基于云開發(fā), 你可以按需使用云上的 GPU、TPU 和 CPU 的計算能力。4
7、. 有利于開發(fā)過程的管理開發(fā)活動集中到云上以后,會有利于各種管理工作。比如,很多軟件項目是外包開發(fā)的,那么你可以想象,基于云編程的平臺,甲乙雙方的項目管理者,都可以獲得更多關(guān)于開發(fā)過程的大數(shù)據(jù),也更容易做好源代碼的保護。5. 更好的團隊協(xié)作越來越多的人已經(jīng)習慣在網(wǎng)上編寫文檔,平心而論,線上文檔工具并沒有本地的 Office 軟件功能強大,是什么因素讓我們更加偏愛線上文檔工具呢?就是它的協(xié)作功能。團隊中的成員可以同時編輯一個文檔,還可以方便地將這個文檔在團隊中分享。而我比較希望見到這樣的場景,那就是,程序員們可以基于同一個代碼文件,進行點評和交互式的修改,這相當于基于云的結(jié)對編程,對于加強團隊的
8、知識分享、提升軟件質(zhì)量都會有好處?;谏鲜鰩c,我個人猜測:編程這項工作,會越來越與云緊密結(jié)合。這樣一來,不僅僅能方便地調(diào)取云端的資源,越來越多的編程環(huán)境也會遷移到云上。既然提到了在云上編程的方式,那么接下來,我們從編譯技術(shù)的視角,來探討一下,如何編寫能充分運用云計算強大威力的應用,這樣,你會對云計算有一個更加全面的認知。如何編寫云應用?學習編譯原理,你可能會有一個感受,那就是編程可以在不同的抽象層次上進行。也就是說,你可以通過抽象,把底層復雜的技術(shù)細節(jié)轉(zhuǎn)換成上層簡單的語義。程序員最早是直接編寫機器碼,指令和寄存器都要直接用 0101 來表示。后來,馮諾依曼的一個學生,發(fā)明了用助記符的方法(也
9、就是匯編語言)簡化機器碼的編寫。用匯編語言編程的時候,你仍然要使用指令和寄存器,但可以通過名稱來引用,比如 34 講中,用pushq %rbp 這樣的匯編指令來表示機器碼 0x55。這就增加了一個抽象層次,用名稱代替了指令和寄存器的編碼。而高級語言出現(xiàn)后,我們不再直接訪問寄存器,而是使用變量、過程和作用域,抽象程度進一步增加??偨Y(jié)起來,就是我們使用的語言抽象程度越來越高,每一次抽象對下一層的復雜性做了屏 蔽,因此使用起來越來越友好。而編譯技術(shù),則幫你一層層地還原這個抽象過程,重新轉(zhuǎn)換 成復雜的底層實現(xiàn)。云計算的發(fā)展過程跟編譯技術(shù)也很類似。云計算服務商們希望通過層層的抽象,來屏蔽底層的復雜性,讓
10、云計算變得更易用。而且,通常來說,在較低的抽象層次上,你可以有更大的掌控力,而在更高的抽象層次上, 則會獲得更好的方便性。虛擬機是人們最早使用云資源的方式,一臺物理服務器可以分割成多個虛擬機。在需要的時候,可以創(chuàng)建同一個虛擬機鏡像的多個實例,形成集群。因為虛擬機包含了一套完整的操作系統(tǒng),所以占據(jù)空間比較大,啟動一個實例的速度比較慢。我們一般是通過編寫腳本來管理軟件的部署,每種軟件的安裝部署方式都不相同,系統(tǒng)管理的負擔比較重。最近幾年,容器技術(shù)變得流行起來。容器技術(shù)可以用更輕量級的方式,分配和管理計算資源。一臺物理服務器可以運行幾十、上百個容器,啟動新容器的速度也比虛擬機快了很多。跟虛擬機模式相
11、比,容器部署和管理軟件模塊的方式標準化了,我們通過 Kubernetes 這樣的軟件,編寫配置文件來管理容器。從編譯原理的角度出發(fā),這些配置文件就是容器管理的DSL,它用標準化的方式,取代了原來對軟件配置進行管理的各種腳本。無服務器(Serverless)架構(gòu),或者叫做 FaaS(Function as a Service),做了進一步的抽象。你只要把一個個功能寫成函數(shù),就能被平臺調(diào)用,來完成 Web 服務、消息隊列處理等工作。這些函數(shù)可能是運行在容器中的,通過 Kubernetes 管理的,并且按照一定的架構(gòu)來協(xié)調(diào)各種服務功能。但這些技術(shù)細節(jié)都不需要你關(guān)心,你會因此喪失一些掌控力,比如,你不
12、能自己去生成很多個線程做并行計算。不過,也因為需要你關(guān)心的技術(shù)細節(jié)變少了,編程效率會提高很多。上面三個層次,每一級都比上一級的抽象層次更高。就像編譯技術(shù)中,高級語言比匯編語言簡單一樣,使用無服務架構(gòu)要比直接使用虛擬機和容器更簡單、更方便。但即使到了 FaaS 這個層次,編寫一個云應用仍然不是一件簡單的事情,你還是要面臨很多復雜性,比如,處理應用程序與大容量數(shù)據(jù)庫的關(guān)系,實現(xiàn)跨公有云和私有云的應用等等。那么能否再進一步抽象并簡化云應用的開發(fā)?是否能通過針對云原生應用的編程平臺,來實現(xiàn)這個目標呢?為了探究這個問題,我們需要進一步審視一下,現(xiàn)在云編程仍然有哪些,需要被新的抽象層次消除掉的復雜性。對云
13、原生編程平臺的需求:能否解決云應用的復雜性?在人月神話里,作者把復雜性分為兩種:一種叫做本質(zhì)復雜性(Essential Complexity),指的是你要解決的問題本身的復雜性, 是無法避免的。一種叫做附屬復雜性(Accidental Complexity),是指我們在解決本質(zhì)問題時,所采用的解決方案而引入的復雜性。在我們現(xiàn)在的系統(tǒng)中,90% 的工作量都是用來解決附屬復雜性的。我經(jīng)常會被問到這樣的問題:做一個電商系統(tǒng),成本是多少?而我給出的回答是:可能幾千塊,也可能很多億。如果你理解我的答案,那意味著比較理解當前軟件編程的復雜性問題。因為軟件系統(tǒng)的復雜性會隨著規(guī)模急劇上升。像阿里那樣的電商系統(tǒng)
14、,需要成千上萬位工程師來維護。它在雙 11 的時候,一天的成交量要達到幾千億,接受幾億用戶的訪問,在性能、可靠性、安全性、數(shù)據(jù)一致性等維度,都面臨巨大的挑戰(zhàn)。最重要的是,復雜性不是線性疊加的,可能是相乘的。比如,當一個軟件服務 1 萬個用戶的時候,增加一個功能可能需要 100 人天的話;針對服務于 1 百萬用戶的系統(tǒng),增加同樣的功能,可能需要幾千到上萬人天。同樣的,如果功能不變,只是用戶規(guī)模增加,你同樣要花費很多人天來修改系統(tǒng)。那么你可以看出,整體的復雜性是多個因素相乘的結(jié)果,而不是簡單相加。這跟云計算的初衷是相悖的。云計算 最早承諾,當我們需要更多計算資源的時候,簡單增加一下就行了。然而,現(xiàn)
15、有軟件的架構(gòu),其實離這個目標還很遠。那有沒有可能把這些復雜性解耦,使得復雜性的增長變成線性或多項式級別(這里是借助算法復雜性的理論)的呢?我再帶你細化地看一下附屬復雜性的一些構(gòu)成,以便加深你對造成復雜性的根源的理解。1. 基礎設施的復雜性編寫一個簡單的程序,你只需要寫寫業(yè)務邏輯、處理少量數(shù)據(jù),采用很簡單的架構(gòu)就行了。但是編寫大型應用,你必須關(guān)心軟件運行的基礎設施,比如,你是用虛擬機還是容器?你還要關(guān)心很多技術(shù)構(gòu)成部分,比如 Kubernetes、隊列、負載均衡器、網(wǎng)絡、服務發(fā)現(xiàn)、系統(tǒng)監(jiān)控、安全、數(shù)據(jù)庫、分片、各種優(yōu)化,等等。這些基礎設施產(chǎn)生的復雜性,要花費你很多時間。像無服務器架構(gòu)這樣的技術(shù),
16、已經(jīng)能夠幫你屏蔽部分的復雜性,但還不夠,仍然有很多復雜性因素需要找到解決方案。舉個例子。大多數(shù)商業(yè)應用都要很小心地處理跟數(shù)據(jù)庫的關(guān)系,因為一旦數(shù)據(jù)出錯(比如電商平臺上的商品價格出錯),就意味著重大的商業(yè)損失。你要根據(jù)應用需求設計數(shù)據(jù)庫結(jié)構(gòu);要根據(jù)容量設計數(shù)據(jù)庫分片的方案;要根據(jù)數(shù)據(jù)分析的需求設計數(shù)據(jù)倉庫方案,以及對應的 ETL 程序。一個經(jīng)常出現(xiàn)的情況是,數(shù)據(jù)處理的邏輯分布在幾個微服務中,要讓它們對數(shù)據(jù)的修改滿足事務特征,所以你要在代碼里添加與分布式事務有關(guān)的邏輯。那么,能否由云原生的開發(fā)平臺來自動處理所有這些事情?我們只需要做業(yè)務對象(比如訂單)的邏輯設計,把上述所有技術(shù)細節(jié)都隱藏起來呢?2
17、. 部署復雜性大型軟件從編寫代碼,到部署,再到生產(chǎn)環(huán)境運行,是一個復雜的過程。源代碼可能有多個分支,需要進行合并;需要能夠正確地編譯;編譯后的成果,要打包成可部署的對象,比如容器鏡像;要對需要發(fā)布的模塊進行測試,確保不會因為這次發(fā)布而造成很多 bug; 要對數(shù)據(jù)庫的結(jié)構(gòu)、基礎數(shù)據(jù)等做必要的修改;新版本的軟件上線,有時候不是全部上線,而是先讓一部分用戶使用,然后再針對所有用戶;如果上線的特性出現(xiàn)問題,需要能夠回滾到原來的版本。是不是很復雜?那么,這樣的復雜性,是否也可以由云原生的開發(fā)平臺隱藏起來呢?3. API 的復雜性我們在寫云應用的時候,需要通過 API 來調(diào)用別的服務。你需要處理與之相關(guān)的
18、各種問題,包括 API 訪問的權(quán)限、訪問次數(shù)的限制、錯誤處理、不同的 RPC 協(xié)議和調(diào)用約定,以及相同的功能在不同的云平臺上使用不同的 API。那么我的問題是:能否讓 API 調(diào)用跟普通語言的函數(shù)調(diào)用一樣簡單,讓開發(fā)平臺來處理上述復雜性呢?回答上面 3 個問題,并不簡單。但是,根據(jù)計算機語言的發(fā)展規(guī)律,我們總是會想辦法建立更高的抽象層次,把復雜性隱藏在下層。就像高級語言隱藏了寄存器和內(nèi)存管理的復雜性一樣。這樣看來,解決云計算的復雜性,要求新的編程語言從更高的一個抽象層次上,做編譯、轉(zhuǎn)換和優(yōu)化。我們只需要編寫業(yè)務邏輯就可以了,當應用規(guī)模擴大時,真的只需要增加計算資源就行了;當應用需求變化時,也只
19、需要修改業(yè)務邏輯,而不會引起技術(shù)細節(jié)上的很多工作量。能解決這些問題的軟件,就是云原生的編程語言及其基礎設施。而現(xiàn)在的技術(shù)進步已經(jīng)提供了很好的基礎,容器技術(shù)、無服務器架構(gòu)、處理大數(shù)據(jù)的Map/Reduce 架構(gòu)等,為云原生的編程語言準備好了素材。我相信,在很多應用領(lǐng)域,我們其實可以降低對掌控力的要求,從而獲取更大的方便性的。比如,對于大多數(shù)企業(yè)應用來說(比如 ERP、CRM 等),進行的都是以業(yè)務數(shù)據(jù)為核心的處理,也就是以數(shù)據(jù)庫為核心的處理。這些應用都具備相對一致的模式,通過更高的抽象層次,去除各種附屬復雜性是有可能的。像這樣的針對數(shù)據(jù)庫編程的特定領(lǐng)域的云原生編程平臺,會比較容易成功。課程小結(jié)本節(jié)課,我?guī)銍@“云
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 如何制定生產(chǎn)日報表制度
- 修理廠安全生產(chǎn)工作制度
- 農(nóng)業(yè)標準化生產(chǎn)建設制度
- 生產(chǎn)廠長安全生產(chǎn)制度
- 生產(chǎn)技術(shù)負責人崗位制度
- 生產(chǎn)車間夜班值班制度
- 生產(chǎn)車現(xiàn)場人員管理制度
- 生產(chǎn)企業(yè)制定領(lǐng)料制度
- 企業(yè)安全生產(chǎn)費使用制度
- 司機班安全生產(chǎn)管理制度
- 西藏轉(zhuǎn)移就業(yè)課件
- 2026-2031中國房地產(chǎn)估價市場分析預測研究報告
- 2025年繩索技術(shù)理論題庫及答案
- 天津市和平區(qū)2025年高二化學第一學期期末監(jiān)測試題含解析
- 供熱企業(yè)環(huán)保知識培訓課件
- 工業(yè)園招商課件
- 護理帶教老師小講課
- 氟硅烷改性自清潔涂層的制備及性能表征
- 特警小組戰(zhàn)術(shù)課件大綱
- 電氣設備維護保養(yǎng)手冊模板
- 3.1城市的輻射功能課件-高中地理人教版選擇性必修2
評論
0/150
提交評論