软件工程起源于上个世纪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