1.2 软件开发工程化
软件作为人类纯智力的劳动成果,和其他科学、技术、文学、艺术一样是人类共享的社会财富。但与文学艺术这类纯精神产品不同的是,它要面向社会发展的方方面面,它的研制开发工作就必须从用户的要求和市场的需求出发。能否得到用户的欢迎,能否取得一定的市场份额,将取决于软件本身的功能、性能、可靠性、价格以及扩充能力等。软件产品的商品化是实现上述目标的必由之路。传统的“艺术创作”式的方式,极不适应提供低价格高品质软件产品的商品化需求。为此,人们将借鉴其他科技产品商品化的路子,提出软件产品的研制开发与生产必须工程化、标准化。
1.2.1 软件工程的定义
1968年“软件工程”这一名称被首次提出。软件工程的目标简而言之就是要使开发的软件产品具有可靠性、有效性、易维护性和可理解性。实现这一目标的软件工程原理就是:必须采用一种有效的方法和技术来降低开发活动的复杂性。
软件工程一直以来都缺乏一个统一的定义,很多学者、组织机构分别给出了自己认可的定义:
BarryBoehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。
IEEE在软件工程术语汇编中的定义:①将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件;②在①中所述方法的研究。
FritzBauer在NATO会议上给出的定义:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。
此外,《计算机科学技术百科全书》中,软件工程是应用计算机科学、数学、逻辑学及管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则、方法,以提高质量、降低成本和改进算法。其中,计算机科学、数学用于构建模型与算法,工程科学用于制定规范、设计范型、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。
ISO 9000对软件工程过程的定义是:软件工程过程是输入转化为输出的一组彼此相关的资源和活动。
其他定义:①运行时,能够提供所要求功能和性能的指令或计算机程序集合;②程序能够满意地处理信息的数据结构;③描述程序功能需求以及程序如何操作和使用所要求的文档。以开发语言作为描述语言,可认为软件=程序+数据+文档。
综上,软件工程可以概括为:软件工程采用工程学的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,研究和应用如何以系统性的、规范化的、可定量的过程化方法开发和维护软件的学科。
软件工程的目标是:在给定成本、进度的前提下,开发出具有适用性、有效性、可修改性、可靠性、可理解性、可维护性、可重用性、可移植性、可追踪性、可互操作性和满足用户需求的软件产品。追求这些目标有助于提高软件产品的质量和开发效率,减少维护的困难。
1.2.2 软件开发的发展过程
软件是由计算机程序和程序设计的概念发展演化而来的,是在程序和程序设计发展到一定规模并且逐步商品化的过程中形成的。软件开发经历了程序设计阶段、软件设计阶段和软件工程阶段的演变过程。
1.程序设计阶段
程序设计阶段出现在1946年至1955年。此阶段的特点是:尚无软件的概念,程序设计主要围绕硬件进行开发,规模很小,工具简单,无明确分工(开发者和用户),程序设计追求节省空间和编程技巧,无文档资料(除程序清单外),主要用于科学计算。
2.软件设计阶段
软件设计阶段出现在1956年至1970年。此阶段的特点是:硬件环境相对稳定,出现了“软件作坊”的开发组织形式。开始广泛使用产品软件(可购买),从而建立了软件的概念。随着计算机技术的发展和计算机应用的日益普及,软件系统的规模越来越庞大,高级编程语言层出不穷,应用领域不断拓宽,开发者和用户有了明确的分工,社会对软件的需求量剧增。但软件开发技术没有重大突破,软件产品的质量不高,生产效率低下,从而导致了“软件危机”的产生。
3.软件工程阶段
自1970年起,软件开发进入了软件工程阶段。由于“软件危机”的产生,迫使人们不得不研究、改变软件开发的技术手段和管理方法。从此软件开发进入了软件工程时代。此阶段的特点是:硬件已向巨型化、微型化、网络化和智能化四个方向发展,数据库技术已成熟并广泛应用,第三代、第四代语言出现;第一代软件技术——结构化程序设计在数值计算领域取得优异成绩;第二代软件技术——软件测试技术、方法、原理用于软件生产过程;第三代软件技术——处理需求定义技术用于软件需求分析和描述。
4.未来
在Internet平台上进一步整合资源,形成巨型的、高效的、可信的虚拟环境,使所有资源能够高效、可信地为所有用户服务,成为软件技术的研究热点之一。软件工程领域的主要研究热点是软件复用和软件构件技术,它们被视为是解决“软件危机”的一条现实可行的途径,是软件工业化生产的必由之路。而且软件工程会朝着开放性计算的方向发展,朝着可以确定行业基础框架、指导行业发展和技术融合的“开放计算”。
最近几年产生了一种观点——“软件即是一种服务”,软件不再在本地计算机上运行,而是将它放在所谓的“计算云”中。云计算(Cloud Computing)是基于互联网的相关服务的增加、使用和交付模式。云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池(资源包括网络、服务器、存储、应用软件、服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。云计算是继1980年代大型计算机到客户端—服务器的大转变之后的又一种巨变。云计算是分布式计算(Distributed Computing)、并行计算(Parallel Computing)、效用计算(Utility Computing)、网络存储(Network Storage Technologies)、虚拟化(Virtualization)、负载均衡(Load Balance)、热备份冗余(High Available)等传统计算机和网络技术发展融合的产物。云计算是通过使计算分布在大量的分布式计算机上,而非本地计算机或远程服务器中,企业数据中心的运行将与互联网更相似。这使得企业能够将资源切换到需要的应用上,根据需求访问计算机和存储系统。
云计算背景下,传统软件工程也需要不断创新发展。在传统的软件开发过程中,软件使用者对软件的需求确定后则按照传统软件工程开发模型进行软件设计,需求的改变则可能会导致软件架构的改变,这种改变会对软件设计影响巨大。而在云计算背景下,需求可能是在不断地变化,比如刚开始预期的使用人数只有一万人,但是当软件上线之后发现该软件很受欢迎,使用人数达到了百万级,大大超过了之前软件设计容量,于是通过云计算,可以对软件的运行环境进行动态扩充,只要对软件稍作修改便可使软件继续顺利运行。运用云计算的动态性,可以动态改变软件的运行环境,尽量减少整个软件结构所需要的改动。同时对于在开发过程中选择更改架构的程序,也只需要改变本地代码即可,对于云端服务器,只要进行简单的设置就可顺利地让程序运行。此外,传统的软件工程开发更多的是软件工程师采用集中开发方式,以求最大的开发效率,开发组织大部分都局限在某一个具体公司里,组织之外的人想要参与项目是很困难的,而在云计算的时代,由于服务器在云端,只需要通过远程操作云服务器就能完成软件的开发部署工作,所以软件工程师可以身处世界各地而共同完成同一个工程,这使得开发变得更加包容与开放,只要互相之间进行约定,每个人按时完成自己所负责的工作即可,这使得开发组织可以变得更加多元化。
现在,越来越多的人开始意识到云计算的好处,并且已经开始接受并采用云计算,因为它可以改变人们的工作生活方式,对于软件工程行业也是如此。云计算服务器为开发人员提供了更加宽广的开发平台,它使得开发人员可以专注于业务的实现而从复杂的运行环境中抽身出来,使得软件变得更加可靠。
此外,云计算、移动互联网、大数据时代的到来,使传统的软件工程面临新的机遇与挑战。传统软件工程也正处于一个软件工业大变革的过程中,随着软件资源的大量积累与有效利用,软件生产的集约化与自动化程度都将迅速提高,软件生产质量与效率的大幅度改进将成为可能。
1.2.3 软件工程的基本原理
自从1968年提出“软件工程”这一术语以来,研究软件工程的专家学者们陆续提出了100多条关于软件工程的准则或信条。美国著名的软件工程专家巴利·玻姆(Barry Boehm)综合这些专家的意见,并总结了美国天合公司(TRW)多年的开发软件的经验,于1983年提出了软件工程的七条基本原理。
玻姆认为,这七条原理是确保软件产品质量和开发效率的原理的最小集合。它们是相互独立的,是缺一不可的最小集合;同时,它们又是相当完备的。人们当然不能用数学方法严格证明它们是一个完备的集合,但是可以证明,在此之前已经提出的100多条软件工程准则都可以由这七条原理的任意组合蕴含或派生。
下面是软件工程的七条原理:
1.用分阶段的生命周期计划严格管理
这一条是吸取前人的教训而提出来的。统计表明,50%以上的失败项目是由于计划不周而造成的。在软件开发与维护的漫长生命周期中,需要完成许多性质各异的工作。这条原理意味着,应该把软件生命周期分成若干阶段,并相应制定出切实可行的计划,然后严格按照计划对软件的开发和维护进行管理。
玻姆认为,在整个软件生命周期中应指定并严格执行六类计划:项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划、运行维护计划。
2.坚持进行阶段评审
统计结果显示:大部分错误是在编码之前造成的,大约占63%,错误发现得越晚,改正它要付出的代价就越大,要差2到3个数量级。因此,软件的质量保证工作不能等到编码结束之后再进行,应坚持进行严格的阶段评审,以便尽早发现错误。
3.实行严格的产品控制
开发人员最头疼的事情之一是改动需求。但是实践告诉我们,需求的改动往往是不可避免的。这就要求要采用科学的产品控制技术来顺应这种要求。也就是要采用变动控制,又称基准配置管理。当需求变动时,其他各个阶段的文档或代码随之相应变动,以保证软件的一致性。
4.采纳现代程序设计技术
从20世纪六七十年代的结构化软件开发技术,到最近的面向对象技术,从第一、第二代语言,到第四代语言,人们已经充分认识到:方法大于气力。采用先进的技术既可以提高软件开发的效率,又可以减少软件维护的成本。
5.结果应能清楚地审查
软件是一种看不见、摸不着的逻辑产品。软件开发小组的工作进展情况可见性差,难于评价和管理。为更好地进行管理,应根据软件开发的总目标及完成期限,尽量明确地规定开发小组的责任和产品标准,从而使所得到的标准能清楚地审查。
6.开发小组的人员应少而精
开发人员的素质和数量是影响软件质量和开发效率的重要因素,应该少而精。这一条基于两点原因:高素质开发人员的效率比低素质开发人员的效率要高几倍到几十倍,开发工作中犯的错误也要少得多;当开发小组为N人时,可能的通信信道为N(N-1)/2,可见随着人数N的增大,通信开销将急剧增大。
7.承认不断改进软件工程实践的必要性
遵从上述六条基本原理,就能较好地实现软件的工程化生产。但是,它们只是对现有经验的总结和归纳,并不能保证赶上技术不断前进发展的步伐。因此,玻姆提出应把承认不断改进软件工程实践的必要性作为软件工程的第七条原理。根据这条原理,不仅要积极采纳新的软件开发技术,还要注意不断总结经验,收集进度和消耗等数据,进行出错类型和问题报告统计。这些数据既可以用来评估新的软件技术的效果,也可以用来指明必须着重注意的问题和应该优先进行研究的工具和技术。