云计算对传统软件工程的影响
云计算对传统软件工程的影响
软件工程起源于上个世纪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