1.4 软件工程的现状与发展趋势
1.4.1 敏捷开发
敏捷软件开发(agile software development),又称敏捷开发,是从20世纪90年代开始逐渐引起广泛关注的一些新型软件开发方法,它是一类轻量级的软件开发方法,提供了一组思想和策略来指导软件系统的快速开发并响应用户需求的变化。
随着软件交付周期的日益加快,迭代式敏捷开发方法渐成标准,已经成为大多数软件开发团队的必选项。迭代对整个团队的需求、架构、协同及测试能力都提出了更高的要求,敏捷可以被看成是迭代式开发的一种导入方式,只不过敏捷的范围其实比迭代化开发更大一些。
简单地说,敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
敏捷方法有很多,包括 Scrum、极限编程、功能驱动开发以及统一过程(RUP)等。这些方法本质上是一样的。敏捷开发小组主要的工作方式可以归纳为以下5种。
1.敏捷小组作为一个整体工作
项目取得成功的关键在于,所有项目参与者都把自己看成朝向一个共同目标前进的团队的一员。一个成功的敏捷开发小组应该具有“我们一起参与其中”的思想,“帮助他人完成目标”这个理念是敏捷开发的根本管理文化。当然,尽管强调一个整体,小组中应该有一定的角色分配,各种敏捷开发方法角色的起名方案可能不同,但原则基本上是一样的。
2.敏捷小组按短迭代周期工作
在敏捷项目中,开发小组根据需要定义开发过程,在初始阶段可以有一个简短的分析、建模、设计。项目真正开始后,每次迭代都会进行同样的工作(分析、设计、编码、测试等)。迭代是受时间框限制的,也就是说即使放弃一些功能也必须结束迭代。迭代的时间长度一般是固定的,时间框设定较短,大概是 2~4周。
3.敏捷小组每次迭代交付一些成果
开发小组在一次迭代中要把一个以上的不太精确的需求声明,经过分析、设计、编码、测试,变成可交付的软件(称为功能增量)。当然并不需要把每次迭代的结果交付给用户,但目标是可以交付,这就意味着每次迭代都会增加一些小功能,但增加的每个功能都要达到发布质量。每次迭代结束的时候让产品达到可交付状态十分重要,但这并不意味着要完成发布的全部工作,因为迭代的结果并不是真正发布产品。
4.敏捷小组关注业务优先级
敏捷开发小组从两个方面显示出它们对业务优先级的关注。首先,它们按照产品所有者制定的顺序交付功能,而产品所有者一般会按照组织在项目上的投资回报最大化的方式来确定优先级,并且把它组织到产品发布中去。要达到这个目的,需要综合考虑开发小组的能力以及所需功能的优先级来建立发布计划。在编写功能的时候,需要使功能的依赖性最小化。功能之间完全没有依赖是不太可能的,但把功能依赖性控制在最低程度还是相当可行的。
5.敏捷小组检查与调整
每次新迭代开始,敏捷小组都会结合上一次迭代中获得的新知识做出相应调整。如果认为一些因素可能会影响计划的准确性,也可能更改计划。迭代开发是在变与不变中寻求平衡,在迭代开始的时候寻求变,而在迭代开发期间不能改变,以期集中精力完成已经确定的工作。由于一次迭代的时间并不长,所以使得稳定性和易变性能够得到很好的平衡。在两次迭代期间改变优先级甚至功能本身,对于项目投资最大化是有益处的。从这个观点来看,迭代周期的长度选择就比较重要了,因为两次迭代之间是提供变更的机会,周期太长,变更机会就可能失去;周期太短,则会发生频繁变更,而且分析、设计、编码、测试这些工作都不容易做到位。综合考虑,对于一个复杂项目,迭代周期选择4周还是有道理的。
1.4.2 开放计算
随着互联网的不断发展和普及,软件工程开放式计算有了技术基础,更多的开放式资源使得软件工程有效地集成,在软件开发标准上形成了互联互通,对于文化、语言来说有所打破,真正地实现了软件开发的协作交流。Linux、Jazz、Android 等软件的开源,对于开放计算来说有了充分的促进,对于软件开发格局有所改变,并且随着互联网的不断普及和发展,对于软件开发计算来说迎来了前所未有的机遇,网络连接了原本分散的开发人员,真正地实现了在基础框架下的集体智慧的升华,能够更高效有序地开发出优秀的产品级软件。
开放计算主要融合了“开放标准”“开放架构”和“开源软件”三个方面。通过坚持“开放标准”,不同企业开发和使用的软件可以互连互通,不同的软件工程工具能够更好地集成,不同国界和不同文化能够更好地协作交流,用户的投资能够得到很好的保证,正是它为全球化趋势奠定了重要基础;“开放架构”通过一组开放的架构标准和技术,有效地解决了商业模式的创新对IT灵活性要求的增加和现有IT环境的复杂度之间的矛盾,第一次使IT和业务走得如此之近,其典型代表包括SOA、REST等;而“开源软件”不但书写了Linux、Eclipse、Jazz等一个又一个的神奇故事,而且有效地促进了开放标准的发展,同时有效利用社区驱动的开发与协作创新,优化软件设计中的网络效应,开源软件越来越被中小企业和个人用户所认可。
开源软件大量出现,软件外包将更加普及,主要特点如下。
(1)计算能力的增强,集成开发环境更加智能,获取现成的类库更加方便,应用软件开发变得更加容易。
(2)加上软件本身一次性投资的特点,很多的场合甚至可以使用软件替代硬件,使得软件开发需求增加。
(3)消费类电子产品与人们的生活更加息息相关,小的免费软件、小型桌面游戏的出现等,使得需要的软件开发人员数量急剧增长(组织形态是大量的小规模开发团队)。在这一因素以及降低成本的压力下,开发外包变得非常普及。
(4)项目构建工具,资源依赖更加自动化,系统开发也不需要从零开始,而是利用业内的免费框架进行二次开发。
1.4.3 云计算
云计算(cloud computing)被称为继个人计算机、互联网之后的第三次信息化革命,它是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法。云计算是一种理念,是旧瓶子装新酒,它实际上是分布式技术、服务化技术、资源隔离和管理技术(虚拟化)的融合。
到底什么是云计算呢?不同的组织从不同的角度给出了不同的定义。例如:
一种计算模式。把IT资源、数据、应用作为服务通过网络提供给用户(如IBM公司)。
一种基础架构管理方法论。把大量的高度虚拟化的资源管理起来,组成一个大的资源池,用来统一提供服务(如IBM公司)。
以公开的标准和服务为基础,以互联网为中心,提供安全、快速、便捷的数据存储和网络计算服务(如Google公司)。
现阶段广为接受的是美国国家标准与技术研究院(NIST)定义,即云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池(资源包括网络、服务器、存储、应用软件、服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。
通俗意义上的云计算往往包含如图1-3所示的内容。开发者利用云API开发应用,然后上传到云上托管,并提供给用户使用,而不关心云背后的运行维护和管理以及机器资源分配等问题。
图1-3 云计算示意图
虚拟化和服务化是云计算的主要表现形式(见图1-4)。
虚拟化技术包括资源虚拟化、统一分配监测资源、向资源池中添加资源。虚拟化的技术非常多,有的是完全模拟硬件的方式去运行整个操作系统,比如我们熟悉的VMWare,可以看作重量级虚拟化产品。也有通过软件实现的共享一个操作系统的轻量级虚拟化,比如Solaris的Container、Linux的lxc。虚拟化的管理、运行维护多数是通过工具完成的,比如Linux的VirtManager、VMWare的vSphere、VMWare的vCloud等。
图1-4 云计算的主要表现形式
服务思想如下所示。
(1)软件即服务(Software-as-a-Service,SAAS)。是目前最为成熟的云计算服务模式。在这种模式下,应用软件安装在厂商或者服务供应商那里,用户可以通过某个网络来使用这些软件。这种模式具有高度的灵活性、可靠性和可扩展性,因此能够降低客户的维护成本和投入,而且运营成本也得以降低。最著名的例子就是Salesforce.com。
(2)平台即服务(Platform-as-a-Service,PAAS)。提供了开发平台和相关组件,软件开发者可以在这个开发平台之上开发新的应用,或者使用已有的各种组件,因此可以不必购买开发、质量控制或生产服务器。Salesforce.com的Force.com、Google公司的App Engine和微软公司的Azure(微软云计算平台)都采用了PAAS的模式。
(3)基础设施作为服务(Infrastructure as a Service,IAAS)。通过互联网提供了数据中心、硬件和软件基础设施资源。IAAS 可以提供服务器、操作系统、磁盘存储、数据库和信息资源。用户可以像购买水电煤气一样购买这些基础设施资源使用。