軟件工程起源於上個世紀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