雲計算對傳統軟件工程的影響
軟件工程起源於上個世紀70年代,由於當時的軟件開發沒有一個類似於規范的步驟,致使很多軟件項目的開發時間大大超過了規划的時間。面對軟件功能和需求的日益復雜化以及維護難度的上升,人們開始意識到僅憑個人甚至單個小組來開發一款軟件的難度的巨大的。終於在1968年,北大西洋公約組織舉辦了首次軟件工程學術會議,並在會中提出了要將軟件開發當做工程活動來看待。[1]這可以看做是傳統軟件工程發展的開端。傳統軟件工程的出現很大程度上解決了軟件開發中諸多問題,然而時間邁入21世紀,在雲計算大行其道的今天,傳統的軟件工程又將會面臨機遇與挑戰呢?接下來我將會就雲計算對傳統軟件工程的影響,談談我自己的看法。
什么是雲計算
雲計算(Cloud Computing)是一種基於互聯網的計算方式。這種模式提供可用的、便捷的、按需的網絡訪問,進入可配置的計算資源共享池(資源包括網絡,服務器,存儲,應用軟件,服務),這些資源能夠被快速提供,只需投入很少的管理工作,或與服務供應商進行很少的交互。[2]簡單地說,在互聯網時代,我們所能夠使用的計算資源將不再局限於我們所擁有的。我們可以通過租用雲服務的方式來滿足我們的某些計算需求,從而節省大量的硬件資源開銷。
雲計算的服務模式可分為三種,分別是:IaaS、PaaS和SaaS。
IaaS(基礎設施即服務)指消費者可以總完善的計算機基礎設施獲得服務。有了IaaS,你可以選擇將公司運營所需要的服務器、儲存器和網絡硬件外包給別的公司,以節省日常維護的成本以及辦公場地。一般的IaaS公司會幫你日常維護硬件,並可以滿足一定的彈性需求。比如當公司需要進行業務擴展,需要更多的計算能力的時候,可以輕松地通過IaaS獲取更多的機器,當網站訪問人數較少時,可以減少部署的機器以節約成本。
PaaS(平台即服務)提供了用戶可以訪問的應用程序開發平台。公司中所有的開發環境都可以在這個環境下進行,從而達到節省時間、資源的目的。PaaS的強大之處在於它能夠涵蓋軟件開發的各個階段,提供了從開發工具、中間件到數據庫軟件等開發所需的所有功能,原本分散的工作室之間的合作也變得更加容易。例如微軟的Azure服務平台就包含了Windows Azure;Microsoft SQL數據庫服務、Microsoft .Net服務;用於分享、儲存和同步文件的Live服務;針對商業的Microsoft SharePoint和Microsoft Dynamics CRM服務等,使得開發組之間的合作能夠更加的緊密。
SaaS(軟件及服務)提供了完整的可以直接使用的應用程序。這一層面上的應用大多數通過網頁瀏覽器進行接入,包括了我們日常所使用的電子郵件,網盤等等。用戶一般只需要進行簡單的操作即可完成自己的需求,免去了很多不必要的麻煩。
我嘗試在Amazon注冊了AWS服務,從下面的截圖我們可以看出AWS平台給我們提供的服務也是按照IaaS、PaaS、SaaS來進行划分的。使用現有的服務可以實現程序的快速部署,大大節省我們開發軟件所需要的時間。
單看概念可能還是不太明白,下面我就來借用一個經典的例子(Pizza As A Service)來解釋一下這三者所對應的含義。假如你現在想吃披薩,那么現在有幾種選擇能夠吃到。
- 自己做
這顯然是需要自己動手最多的方式,而且需要准備全部的原料和廚具。想要吃上披薩,需要經歷發面、切菜、調醬、撒料、進烤箱、准備桌子等步驟。於是你開始疑惑,我就想吃個披薩,哪用的了這么麻煩,連原料都要去現賣。於是,就有了下面第二種方法。
2.買半成品披薩回家自己加工
你根本就不會做披薩,但是又不想花精力去解決如何才能做出好吃的披薩的問題。那么你可以去超市買一個半成品,不用再考慮原料的問題,只需要放進烤箱,過一會兒便可以吃上美味的披薩了。但是這次,你需要一個披薩的供應商來為你提供這個披薩。圖中的藍色部分代表需要自己完成的,橙色部分是供應商提供的。
3.叫外賣
你一年也許只吃一兩次披薩,而家又恰巧沒有烤箱做不了半成品,怎么辦?答曰:訂外賣。這次供應商為你省去了所有制作所需的環節更省去了你去購置烤箱的成本,但具體如何享用這份披薩(坐着吃、站着吃、跪着吃_(:з」∠)_)還是需要自己來決定。如下圖:
4.去披薩店吃
最便利的方法,你什么都不需要准備,甚至不需要有餐桌。餐廳會為你奉上一切。
如果我們把披薩替換成軟件,將“吃”替換成“使用”或者“開發”。那么我們就不難理解這三種模式所代表的含義了。雲計算的存在能夠使我們忽略很多底層的細節,以得到一個更加高效的開發環境。
雲計算的優點
介紹完上述的例子,相信你對雲計算已經大體有了一些了解,接下來我就具體總結一下雲計算的優點。
1. 規模大。
從上面我們可以想象,如果一個公司能夠向其他公司提供雲服務,那首先他自身必然擁有強大的計算資源。實際上,雲計算的“雲”一般都具有相當的規模。如IBM,Amazon和微軟的雲服務背后都有着幾十萬台服務器的支持,Google的雲計算更擁有多達百萬級服務器的計算能力。這種規模的計算能力是普通用戶單獨依靠自身所不能得到的。
2. 虛擬化
雲計算的運算可以在雲端完成,因此用戶可以在任意位置使用任一終端來獲取這一服務,這就實現了我們計算資源的虛擬化。用戶無需了解應用運行的具體位置就可以通過網絡獲取強大的計算能力。虛擬化的另一個益處是我可以基於現有的方案隨時更改我遠端的配置,這有利於我們程序的快速部署。
3. 可靠性高
雲端的數據通常采取多副本容錯、計算節點同構可互換等措施來保障服務的高可靠性,相對來說使用雲計算比使用本地計算機更加可靠。例如我們本地采取的最常用的備份方式RAID,除去價格高昂的問題,如果兩個硬盤(存儲數據的和校驗的)同時損壞,數據依然會發生丟失。對比來看,Hadoop一般都將同一份數據部署在三個不同的機群上,並周期性檢測機器的“心跳信號”,如果有機器出現問題則會自動增加一個備份,使得數據丟失的可能性最小。
4. 通用性強
雲計算並不針對特定的應用,即用戶可以使用強大的計算能力構建出千變萬化的應用,並使用同一片雲來支撐不用的應用運行。例如,PaaS只是提供給用戶一個平台,而在這個平台上如何進行開發,怎樣開發則完全取決於用戶自身。
5. 節約成本
上文說過,雲計算的服務是具有彈性的,因此通過雖是調整服務量的多少可以避免不必要的開銷。用戶可以按需購買,而不必為了三兩天的使用高峰去購買額外的服務器。此外,日常維護硬件、采用容錯措施、電力資源成本等等都是公司日常的額外開銷,但是雲服務可以節約這些成本。下圖是AWS的服務方案,針對不同的需求可以為用戶提供不同的資源,用戶可以根據自己世紀的需要購買。企業級的方案看似價格不菲,但是如果考慮到實際服務器部署、日常維護以及人員管理的費用,這個價格其實是可以接受的。
雲計算對傳統軟件工程的影響
雲計算的諸多有點必然會對現有軟件的開發過程帶來影響,下面我將從六個個方面來進行論述。
軟件架構的開放性
軟件架構描述了一個軟件系統從整體到部分的最高層次的划分,架構的優劣不僅影響軟件開發過程的效率,還會影響之后系統的可擴展性。在傳統軟件工程中,系統架構一般由開發經驗最豐富的程序員進行設計,這樣的人一般被稱為“架構師”。那么,當我們沒有豐富的技術水平以及編程經驗的時候,我們該如何設計我們自己的軟件呢?雲計算給了我們答案。在軟件工程里,提升復用率一直是提高軟件開發效率的重要一環。由於雲平台軟件架構的開放性,我們可以選擇現在已經成熟的構建模塊加一復用,這樣一來能夠縮短程序的開發時間,二來還能夠減少軟件開發中的錯誤,提升軟件的可靠性。根據國內著名PaaS提供商800APP 提供的信息,雲計算模式下開發時間可以縮減1/3~1/10。績效與可靠的矛盾關系一直是軟件危機的根源所在,雲計算在這兩方面同時具有的優勢無疑為緩解軟件危機帶來了希望。[5]
軟件對象的多樣性
面向對象已經成為了現在軟件開發的重要方法,我們在設計軟件的時候會首先將大的問題分解為若干個小問題,分析不同軟件對象之間的交互行為,之后再從局部到整體,從抽象到具體一步步完成,逐步求精。雲計算給我們提供了大量的可復用的軟件模塊,這使得我們編寫軟件時可用的對象更加多樣。工欲善其事必先利其器,更多的軟件對象勢必有利於我們施展拳腳,但是跟傳統軟件開發一樣,我們依舊需要先分析清楚軟件之間的交互關系,然后再進行使用。在PaaS 的平台中,開發者有可能寫很少的代碼甚至不需要代碼,而只需按照業務流程對平台中提供的各類資源進行設計和組織即可。這種模式下,需求與開發具有了同等的語境,同時需求在軟件工程中的地位也將更加重要。
軟件過程的動態性
軟件過程是指軟件的整個生命周期,從需求獲取開始,經過需求分析,設計,實現,測試,到發布和維護為一個周期。傳統的軟件開發使用經常迭代的方法來進行開發,開發的軟硬件資源經常是固定的。但是借助於網絡和虛擬化等技術,雲計算實現了對軟硬件資源的集中化、動態化管理,我們可以更加彈性地管理我們所擁有的資源。例如我們開發一個網站,我們設計上的缺陷可能會導致網站在大流量時訪問緩慢。如果沒有雲計算平台,我們只能另外購買其他的服務器,但是雲計算的存在可以使我們隨時擴大我們的計算能力,進而滿足我們的計算需求。這種軟件過程的動態性更加方便了我們進行軟件的開發。
開發組織的社會化
雲計算依賴網絡來獲取強大的計算能力,在網絡環境下,軟件開發從封閉的計算機平台逐漸走向互聯、互通、協作的網絡平台環境。在今年的中國開源年會上,微軟的首席產品經理宋青見先生曾說,傳統的軟件企業正在逐漸走向開源。由於幾年來軟件技術的飛速發展,閉門造車有可能導致技術的落后。通過雲計算,軟件的開發過程可以由多個團隊來協作完成,眾多的開發團隊形成了開發組織的社會化。通過多個團隊之間的技術共享,我們不僅能夠節省“造輪子”的時間,還能夠確保我們的軟件始終能夠接觸到新的技術。更有意義的是,這個社會中還可能包含不同時區的工作人員,這樣一來就可以實現軟件在一天24小時中都有人進行開發/維護,更加有利於軟件開發效率和穩定性。
資源部署的虛擬化
正如上面所說,雲計算將計算能力部署在雲端,並需要網絡來進行訪問。這樣做不僅有利於我們隨時進行資源的擴展,更有利於節省空間以及相關的硬件維護費用。雲端的服務器機群還有利於數據的安全性,更多的備份可以保障數據不會輕易丟失,這點是本地儲存很難避免的。
雲計算面臨的挑戰
軟件開發沒有“銀彈”,雖然雲計算有着諸多的優點,但是它並不是萬能的。在某些場景,傳統的軟件開發仍有着不可替代的地位。
1) 數據傳輸的瓶頸
在傳統的軟件開發中,我們的開發平台一般距離服務器很近,因此數據傳輸的速度也相對較快。但是雲計算因為需要將數據上傳到網絡上進行計算,在面對大量數據傳輸的時候可能會出現數據傳輸瓶頸的問題,尤其是我國的訪問國外的部分網站較為困難,這給我們軟件的開發和運行的影響同樣不能忽視。
2)數據的機密性
雲端數據的安全性僅是保證數據不丟失,但是如果涉及較為私密的數據,還是應當采用傳統的軟件開發方法進行開發,並且將數據在本地進行儲存。
3)大型分布式系統的弊端
大型的分布式系統雖然能夠保證存儲大量的數據,但是很難做到實時響應。因此像通信部門等需要實時響應的軟件不宜部署在雲端。
雲計算的諸多優點已然給傳統軟件工程帶來了諸多轉變,但是正如上面所說,軟件開發沒有“銀彈”。我們在進行軟件開發之前,需要先分析我們的軟件到底適不適合使用雲平台進行開發/運行。在我看來,未來的一段時間之內,傳統的軟件開發和雲計算的軟件開發將會共存。相信經過網絡的不斷發展,雲計算將會給我們帶來更多的價值。
文獻
[1] https://zh.wikipedia.org/wiki/軟件工程,wikipedia
[2] The NIST Definition of Cloud Computing 雲計算的定義
[3] 《Cloud Computing and Software Engineering》Ravindra Dastikop
[4] https://www.zhihu.com/question/21641778/answer/62523535
[5] 史傑,解繼麗,史少華,《論雲計算對軟件工程的影響》,聯創亞信科技有限公司,天津,30020.
[6] 《Challenges for cloud software engineering》Ian Sommerville, StAndrews
University,2012