【任务描述】
软件工程的思想和方法是为应对“软件危机”而提出的,那么如何用软件工程的思想消除“软件危机”呢?本任务的目标是,让大家了解软件工程的思想及做法,为以后开发高质量的软件打好基础。
【知识储备】
一、软件概述
1.软件的定义
软件是计算机系统中与硬件相互依存的重要组成部分。软件是一个宏观的概念,它包括程序、数据及相关文档。其中,程序指的是能够实现某种功能的指令集合;数据是使程序能正常工作的信息和程序执行的数字化成果;文档指的是软件在开发、使用和维护过程中产生的说明、解释、要求或标准等的文件集合。
2.软件发展阶段
(1)程序设计阶段
程序设计阶段出现于1946年—1955年时期。在此之前,尚无程序设计或软件的概念。随着计算机的问世,程序设计随之出现,它最初主要是围绕硬件的控制而开发的。这个阶段的程序规模很小、思路直白、工具简单,这个时期尚无明确的程序开发者与程序用户的分工。因为硬件功能及其存储容量非常有限,所以程序设计者千方百计地追求节省空间和编程技巧,在程序设计和应用过程中,也不会生成完整的文档资料。这时的计算机及其程序主要用于科学计算。
(2)软件设计阶段
软件设计阶段是指1956年—1970年的时期。这个时期,随着计算机应用规模的逐渐扩展,出现了“软件作坊”式的开发组织,许多重要的软件由这样的组织负责设计和开发。这个时期,软件系统的规模越来越庞大,出现了多种高级编程语言,计算机的应用领域逐渐拓展,开发者和用户开始有了明确的分工,应用领域对软件的性能要求逐渐提高,对软件的通用性、易用性、可扩展性、可维护性等均提出了较高的要求。但此时的软件开发技术本身并没有产生重大突破,软件产品开发时间长、功能或性能难以满足全部需求,软件可靠性和可维护性等与开发者个人的能力及责任心密切相关,即软件生产与市场需求产生了极大的不平衡,软件成了妨碍计算机发展的重要“瓶颈”,这便是人们所说的“软件危机”。
(3)软件工程阶段
软件工程阶段是指1970年—1990年时期。这个时期,计算机系统的硬件和软件均得到了飞速的发展,计算机已在全球普及。在一些发达国家,计算机产业成为最重要的和发展最快的产业之一。这个时期,软件开发进入系统、科学、有序和受控的“软件工程”阶段。为应对“软件危机”而做出的各种努力已经产生出许多重要成果,对软件开发技术的研究、变革逐渐深入并开始成熟,产生了许多行之有效的软件工程的理论、技术手段和管理方法。
(4)现代软件工程阶段
现代软件工程阶段是指从1990年到现在的时期。这个时期,以计算机技术、网络技术和通信技术为代表的信息技术得到了飞速发展。这个时期,软件开发出现了系统化、规模化、抽象化、自动化和智能化等多样化特征,软件开发的方法和理论也不断创新。这个时期,出现了众多的软件开发新技术,例如,面向对象开发技术、平台无关式开发技术、模块化可伸缩式开发技术,等等。这个时期,软件工程方法的领域分布更加精细化,软件工程管理体系更加成熟,软件工程对当代信息技术的发展起到了至关重要的作用。可以说,现代软件工程阶段是软件工程的成熟与飞跃的时期。
二、软件危机
“软件危机”是指,在计算机软件发展的早期,开发和维护过程中所遇到的一系列严重问题。这些问题不仅涉及了当时已经在正常运行的软件,还不同程度地影响到当时开发过程中或将要开发的软件。
概括地说,软件危机问题主要涉及下述两方面的问题:其一,面对众多的开发软件需求,软件开发难以满足;其二,已开发和运行的软件如何进行及时和有效的维护,同时控制软件规模的不断膨胀。
1.软件危机的典型表现
(1)软件开发费用难以估算和控制。在早期的软件开发活动中,软件的实际开发成本常常比估算成本高出许多,甚至高出一个数量级。
(2)软件开发进度难以估计,软件工程难以控制地“被拖期”,即实际软件开发进度比预期进度要慢几个月,甚至更长。这种现象既降低了软件开发组织的信誉,也影响了用户的实际应用。而为了满足工期要求或赶进度所采取的措施,常常带来某种意义上的“牺牲”,例如,软件完整性或严谨性降低,缩减部分功能,或采用一些权宜之计……其结果又往往损害了软件的质量,也不可避免地引起用户的不满。
(3)软件需求分析不够充分,“已经完成”的软件功能无法得到用户的认可。软件开发人员常常在对用户需求只有模糊的了解,甚至对所要解决的问题在缺乏确切的理解的情况下,就匆忙着手编写程序。软件需求的调研及开发人员与用户的沟通流程等缺乏科学和系统的方案,造成软件开发人员和用户之间的信息交流不充分,双方对软件的功能和目标理解不一致,从而导致最终的软件产品不符合用户的实际需要。
(4)软件产品质量难于保证。软件产品中的错误难以提前消除,软件产品的逻辑性要求非常严格,软件产品的功能性要求弹性很大,加之软件质量标准难以量化或标准化,因而造成质量的检测方法、质量的标准和质量的控制方式带有较强的盲目性。当时,软件测试方法基本处于“空白”状态,软件产品有错误时难以发现,而隐藏的或未发现的错误往往是造成软件故障、系统崩溃或重大事故的隐患。
(5)软件产品难以维护,修改或纠正软件中的错误较为困难。很多软件中的错误是非常难以发现和改正的,当遇到开发环境与实际应用环境不同时,软件难以适应用户的硬件环境,出现问题时的修改也常常要花费很长的时间。还有,许多用户对计算机及其软件开发不熟悉,造成用户需求会经常发生变化,这也给软件开发、维护和更新带来极大的困扰。
(6)软件缺少必要的文档资料。计算机软件除了要具备完整的程序代码,还应该有一套完整的文档资料。这些文档资料应该是在软件开发过程中产生出来的,而且应该是“最新版本的”(即是与最新程序代码保持一致的)。软件开发组织的管理人员可以将这些文档资料作为控制和评价依据,来管理和评价软件开发的质量及进度;软件开发人员可以利用文档作为交流工具,在软件开发过程中准确地交流信息;对于软件维护人员而言,这些文档资料更是必不可少的。缺乏必要的文档资料或者文档资料不合规,必然给软件开发和后期维护带来许多严重的困难和问题。
(7)开发成本逐年上升,软件开发生产率的提升速度远远跟不上计算机应用普及与需求升级的速度。软件产品“供不应求”的现象造成了巨大的反差。
以上列举的仅仅是软件危机造成的现象与影响,在软件开发和维护等方面出现的问题远远不止于此。
2.软件危机产生的原因
(1)用户需求不明确
在软件开发过程中,用户需求不明确是从有软件开发工作之始便已存在的“著名问题”,它主要体现在四个方面:在软件开发出来之前,用户自己也不清楚软件开发的具体需求;用户对软件开发需求的描述不精确,例如有遗漏、有二义性、甚至有错误;在软件开发过程中,用户又有“新发现”,因而提出修改、扩充或变更软件的功能、界面或环境等方面的要求;软件开发人员对用户需求的理解与用户的本质需求有差异。
(2)缺乏正确的理论指导
缺乏科学的方法论指导和可用工具的支持。由于软件开发不同于工业产品生产,其开发过程是复杂的逻辑思维到程序代码的“转换”过程,这个过程严重依赖于开发人员的智力思维、编程能力和个人创造性。正是由于这些依赖性因素的存在,加剧了软件开发产品的个性化或独特性的特点,这也是软件危机产生的一个重要原因。
(3)软件开发规模越来越大
随着软件开发应用范围的不断扩展,软件开发规模越来越大。大型软件开发项目需要软件团队共同完成,而多数管理人员缺乏开发大型软件或系统的开发经验,而软件开发人员又缺乏管理方面的经验。管理人员与软件开发人员及其用户之间的信息交流不及时、不准确、不充分,有时还会产生误解。软件开发人员不能有效地处理大型软件开发中的技术与管理问题,因此容易产生系统性的漏洞、错误或问题。
(4)软件产品的复杂度也越来越高
软件开发不仅仅在规模上和速度上的要求越来越高,而且其复杂性也在急剧攀升,但开发人员的综合能力无法同步快速提升,至少处理复杂的软件开发问题需要一定的准备、学习和提升时间。所谓“复杂问题”也是相对的,如果采用先进的组织形式、开发能力的教练体系、先进的开发理念和开发工具,开发团队完全有可能依靠团队合作来提升应对复杂软件或系统的综合能力,这不但需整体技术实力的提升,还需要管理能力的强力支撑。
三、软件工程
1.软件工程简介
为了解决软件危机,既要有技术方案,又要有必要的组织管理措施,需要从管理和技术两个方面着手。软件工程正是从管理和技术两个方面研究如何更好地开发和维护计算机软件的一门学科。
许多专家曾经给软件工程下过许多定义,下面给出具有代表性的三个定义。
1968年,在第一届NATO(北大西洋公约组织)会议上曾经给出了软件工程的一个早期定义:“软件工程就是为了高效获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工程原理。”这个定义不仅指出了软件工程的目标是,以经济的方式开发出高质量的软件,而且强调了软件工程是一门工程学科,它应该建立并使用完善的工程原理。
1993年,IEEE(电气与电子工程师协会)进一步给出了一个更全面更具体的定义:“软件工程是:①把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件;②研究①中提到的途径。”
《计算机科学技术百科全书》给出的定义:软件工程是应用计算机科学、数学、工程科学及管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则、方法,以提高质量、降低成本和改进算法。其中,计算机科学、数学用于构建模型与算法,工程科学用于制定规范、设计范型、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。
虽然软件工程的不同定义使用了不同词句,强调的重点也有差异,但人们普遍认为,软件工程是指导计算机软件开发和维护的一门工程学科。采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够使用的最好的技术与方法结合起来,以开发出高质量的软件并有效地维护它。
2.软件工程所涉及的领域
软件工程是一门研究用工程化方法构建和维护有效、实用和高质量软件的学科,它涉及计算机科学、数学、工程科学和管理科学等多个领域。
具体来讲,软件工程涉及程序设计语言、数据库、软件开发工具、系统平台、行业标准、嵌入式系统、人机界面、办公套件、操作系统、编译器、数据库、网络系统、网络应用、网络游戏等。同时,各个行业几乎都是软件工程涉及的领域,如工业、农业、银行、航空、政府部门等。这些应用促进了经济和社会的发展,也提高了工作效率和生活效率。
3.软件工程的基本原则
自从1968年在的软件专业国际会议上正式提出并使用了“软件工程”这个术语以来,研究软件工程的专家学者们陆续提出了100多条关于软件工程的准则。著名的软件工程专家巴利·玻姆(Barry W.Boehm)综合专家们的意见并总结了TRW(美国天合公司)多年的开发软件的经验,提出了软件工程的7条基本原则,见下面的简介。
(1)用分阶段的生命周期计划严格管理
统计表明,在不成功的软件项目中,有50%左右是由于软件计划不合理造成的。在软件开发与维护的生命周期中,需要完成许多性质各异的工作。这条基本原理意味着,可以把软件生命周期划分成若干个阶段,并相应地制订出切实可行的计划,然后严格按照计划对软件的开发与维护工作进行管理。
(2)坚持进行阶段评审
软件工程概念提出之时,人们便已经认识到,软件的质量保证工作不能等到编码阶段结束之后再开始。这样说至少有两个理由:第一,大部分错误是在编码之前造成的,例如,根据巴利·玻姆等人的统计,设计错误占软件错误的63%,编码错误仅占37%;第二,错误发现与改正得越晚,所付出的代价便会越高。因此,在软件工程的每个阶段都应进行严格的评审,以便尽早发现在软件开发过程中所犯的错误,这是一条必须遵循的重要原则。
(3)实行严格的产品控制
在软件开发过程中不应随意改变需求,因为改变一项需求往往需要付出较高的代价。但是,在软件开发过程中改变需求又是难免的,只能依靠科学的产品控制技术来顺应这种要求。也就是说,当改变需求时,为了保持软件各个配置成分的一致性,必须实行严格的产品控制,其中主要是实行基准配置(又称为基线配置)管理。所谓基准配置是经过阶段评审后的软件配置成分(各个阶段产生的文档或程序代码)。基准配置管理也称为变动控制:一切有关修改软件的建议,特别是涉及对基准配置的修改建议,都必须按照严格的程序进行评审,获得批准以后才能实施修改。绝对不能谁想修改软件(包括尚在开发过程中的软件),谁就随意地修改。
(4)采用现代程序设计技术
从提出软件工程的概念开始,人们一直把主要精力用于研究各种新型程序设计技术,并进一步研究各种先进的软件开发与维护技术。实践证明,采用先进的技术不仅可以提高软件开发和维护效率,而且可以提高软件产品的质量。
(5)结果应能清楚地审查
软件产品不同于一般的生活用品,它是看不见摸不着的智力型产品。软件开发人员(或开发团队)的工作进展情况可见性差,难以准确度量,从而使得软件产品的开发过程比普通产品的开发过程更难于评价和管理。为了提高软件开发过程的可见性,实现高效管理,应该根据软件开发项目的总目标及完成期限,规定开发组织的责任和产品标准,从而使得所得到的结果能够清楚地审查。
(6)开发团队的人员应该少而精
开发团队人员的能力和数量是影响软件产品质量和开发效率的重要因素。能力强的人员的开发效率比能力平常的人员的开发效率可能高几倍至几十倍,而且素质高的人员所开发的软件中的错误明显少于素质低的人员所开发的软件中的错误。此外,随着开发团队人员数目的增加,因为交流情况讨论问题而造成的沟通成本也急剧增加。因此,开发团队成员少而精的是软件工程成功的一条基本原则。
(7)承认不断改进软件工程实践的必要性
遵循上述6条基本原理,就能够按照当代软件工程基本原理实现软件的工程化生产,但是,仅有上述6条原理并不能保证软件开发与维护的过程能赶上时代前进的步伐,能跟上技术的不断进步。因此,巴利·玻姆提出,应把承认不断改进软件工程实践的必要性作为软件工程的第7条基本原理。按照这条原理,不仅要积极主动地采用新的软件技术,而且要注意不断总结经验,例如,收集进度和资源耗费数据,收集出错类型和问题报告数据等。这些数据不仅可以用来评价新的软件技术的效果,而且可以用来指明必须着重开发的软件工具或应该优先研究的技术。
【案例1】
千年危机
计算机“2000年问题”又称“千年虫”问题或“千年危机”,它是指,在较早时期的某些计算机智能系统中(包括计算机系统、自动控制系统等),由于其年份只使用两位十进制数来表示,因此当系统进行(或涉及)跨世纪的日期处理运算时(如多个日期之间的计算或比较等),就会出现错误的结果,进而引发各种各样的系统功能紊乱甚至崩溃。因此从根本上说“千年虫”是一种程序在处理日期时遗留的Bug(程序缺陷),而非病毒。
【案例2】
毫秒误差
在1991年的“海湾战争”中,一枚伊拉克发射的飞毛腿导弹准确击中美国在沙特阿拉伯的宰赫兰基地,当场炸死28个美国士兵,炸伤100多人,造成美军在海湾战争中一次伤亡超过百人的案例。
在后来的调查中发现,由于一个简单的计算机Bug,使该基地的美国“爱国者”反导弹系统失效,未能准确拦截飞毛腿导弹。当时,负责防卫该基地的爱国者反导弹系统已经连续工作了100个小时。该系统每工作一个小时,系统内的时钟会有一个微小的毫秒级延迟,这就是造成上述功能“失效”的根源。爱国者反导弹系统的时钟寄存器设计为24位,因而时间的精度也只限于24位的精度。在经过长时间的工作后,这个微小的精度误差被渐渐积累放大。在工作了100小时后,系统时间的延迟约为0.33秒。
对一般人人来说,0.33秒是微不足道的。但是对一个需要跟踪并摧毁一枚空中飞弹的雷达系统来说,便是致命性的了,这个“微不足道的”0.33秒造成的拦截导弹飞行距离误差约为600米。
【任务实施】
消除软件危机的途径
(1)在进行项目开发的时候,要彻底消除“软件就是程序”的错误观念。明确软件是程序、文档、数据的完整集合。程序是能够完成预定功能和性能的可执行的指令序列,文档是开发、使用和维护程序所需要的资料;数据是指使程序能够适当地处理信息的数据结构及其数值,是完成实际功能的基础。
(2)以软件工程的观点、方法和技术来进行软件开发。充分认识到软件开发是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目,不是个人独立的劳动。必须充分吸取和借鉴人类长期以来从事各种工程项目所积累的行之有效的原理、概念、技术、方法和经验,特别要吸取几十年来人类从事计算机软件与硬件研究和开发的经验教训。
(3)推广和使用在实践中总结出来的软件开发的成功技术和方法,尽快消除一些错误概念和做法。
(4)开发和使用更好的软件工具。在软件开发过程中,人们研制和开发了各种各样的软件工具。这些工具能极大地方便开发工作,提高开发效率,提高软件开发的管理水平,从而显著提升软件开发的整体效率和效果。此外,还可以把多种软件开发工具有机地集合成为一个整体,形成能够连续支持软件开发与维护全过程的集成化软件开发环境。在软件开发的每个阶段都有许多复杂、重复的工作要做,在适当的软件工具辅助下,开发人员可以明显提升软件的生产效率。
(5)当前,人工智能与软件工程的结合已成为一个热门话题。基于程序变换、自动生成和可重用软件等软件新技术研究与应用已有许多成功的案例,把程序设计自动化的进程向前推进了一步。软件标准化与可重用性也得到了工业界的高度重视,它们在避免重复劳动,缓解软件危机方面起到了重要的作用。
【任务拓展】
软件开发项目的具体实施
在具体实施软件开发项目时,首先,我们要选择好软件开发的环境,包括操作系统、开发平台及开发语言、开发工具和数据库等。操作系统常见的有Windows、Linux、Mac OS等;开发平台使用的比较多的有.net、Java平台等;开发语言常用的有C/C++、C#、Java、Python、PHP等;开发工具有Visual Studio、Eclipse等;数据库通常使用关系型数据库,例如MySQL、Oracle、SQL Server等。在具体实施时,应根据项目各方面的综合要求,科学合理地选择开发环境。
其次,还要确定开发模型、开发模式及软件文档的书写工具。软件开发模型是跨越整个生存周期的系统开发、运作和维护所实施的过程、活动和任务的开发流程框架。常见的有瀑布模型、V模型、原型模型、螺旋模型、增量模型、敏捷模型等。
当前软件开发的模式有C/S与B/S模式,C/S即Client/Server(客户端/服务器)模式。B/S即Browser/Server(浏览器/服务器)模式。B/S模式是Web兴起后的一种网络结构模式,Web浏览器是客户端最主要的应用软件。
软件文档是软件项目开发过程中不可缺少的一部分,软件文档在软件开发人员、软件管理人员、软件测试人员、软件维护人员、用户以及计算机之间起着重要的桥梁作用,不仅是软件开发的各阶段的重要依据,而且也影响软件的可维护性。
【知识链接】
中国软件行业市场现状与发展趋势
从改革开放到现在,中国的软件产业从无到有,从弱到强,产生了众多成功的软件企业,开发了许多高水平的软件产品,得到了世界的认可。工业和信息化部发布数据显示,2019年,我国软件行业实现收入约7万亿元,2021年,我国软件和信息技术服务业运行态势良好,累计完成软件业务收入约9万亿元,软件业利润总额超过1万亿元,均呈现良好的快速增长态势。
1.软件行业在国民经济中的地位逐步上升
随着近年来科技的发展,软件行业在国民经济中所占比重逐年上升,工信部公布的数据显示:2013年至2019年,软件行业收入占我国GDP的比重从5.14%上升至7.24%,2020前三季度软件行业收入占我国GDP的比重为8.08%,分领域看,2021年,软件产品收入同比增长12.3%,占全行业收入比重为25.7%。其中,工业软件产品实现收入同比增长24.8%。工业软件应用的快速普及,与制造业数字化转型需求不断释放紧密相关。值得一提的是,信息技术服务收入增速领先。2021年,信息技术服务收入同比增长20.0%,其中,云服务、大数据服务共实现收入同比增长21.2%,软件行业在国民经济中的地位日益重要。
2.软件行业规模逐年扩大
近几年来,我国软件和信息技术服务业运行态势良好,收入和效益保持较快增长,吸纳就业人数稳步增加;产业向高质量方向发展步伐加快,结构持续调整优化,新的增长点不断涌现,服务和支撑两个强国建设能力显著增强,正在成为数字经济发展、智慧社会演进的重要驱动力量。“天眼查”App提供的数据显示,我国工业软件相关企业数量持续增长,2017年至2021年,新增注册企业数量平均增速达27.3%。
3.软件行业技术发展趋势
在软件产业发展模式上,和美国等世界发达国家相比,我国的软件设计能力尚显薄弱,可以和国外优秀软件公司匹敌的软件产品尚不丰富,我国的软件产品在国际市场上的竞争力还不够强。与印度、爱尔兰、以色列等国家相比,我国软件迈向国际市场的政策和策略还不够清晰明了,相关的支持措施、激励方案和重点项目依然不足,软件产品出口比重较小,这些需要国家主管部门、软件行业企业及其行业的从业人员共同努力,使我国成为名副其实的软件强国。进入21世纪,我国政府对软件行业的扶持力度不断加大,随着技术的不断进步与创新,未来软件行业技术将呈现网络化、服务化、智能化、平台化以及融合化的发展趋势。
【课后阅读】
计算机相关证书
计算机专业的大学生毕业后,应聘时如果持有一些专业的技术证书,很容易从众多的应聘者中脱颖而出。目前,各种计算机职业相关的证书种类较多,现介绍和软件工程相关的两项考试。
一、全国计算机等级考试
全国计算机等级考试(National Computer Rank Examination,简称NCRE),是国家教育主管部门批准,由教育部考试中心主办,面向社会,用于考查应试人员计算机应用知识与能力的全国性计算机水平考试。
全国计算机等级考试共分为四个等级。
一级:操作技能级。考核计算机基础知识及计算机基本操作能力,以及Office办公软件、图形图像软件、网络安全等软件和工具的综合应用能力。
二级:程序设计、办公软件高级应用级。考核内容包括计算机语言与基础程序设计能力,要求参试者至少掌握一门计算机语言,可选类别有高级语言程序设计类、数据库程序设计类、Web程序设计类等;二级考试还包括办公软件高级应用能力,要求参试者具有计算机应用知识及办公软件的高级应用能力,能够在实际办公环境中开展具体应用。
三级:工程师预备级。考核面向应用、面向职业的岗位专业技能。分为网络技术、数据库技术、信息安全技术、嵌入式系统开发技术四个类别。
四级:工程师级。四级证书面向已持有三级相关证书的考生,考核计算机专业课程,是面向应用、面向职业的工程师岗位证书。分为网络工程师、数据库工程师、软件测试工程师、信息安全工程师。
二、计算机技术与软件专业技术资格(水平)考试
计算机技术与软件专业技术资格(水平)考试(简称计算机软件考试)是原中国计算机软件专业技术资格和水平考试的完善与发展。计算机软件考试是由国家人力资源和社会保障部、工业和信息化部批准的国家级考试。其目的是,科学、公正地对全国计算机技术与软件专业技术人员进行职业资格、专业技术资格认定和专业技术水平测试。
通过考试获得证书的人员,表明其已具备从事相应专业岗位工作的水平和能力,用人单位可根据工作需要从获得证书的人员中择优聘任相应专业技术职务。计算机技术与软件专业实施全国统一考试后,不再进行相应专业技术职务任职资格的评审工作。因此,这种考试既是职业资格考试,又是专业技术资格考试。同时,这种考试还具有水平考试性质,报考任何级别不需要学历、资历条件,考生可根据自己熟悉的专业情况和水平选择适当的级别报考。
计算机软件考试分5个专业类别:计算机软件、计算机网络、计算机应用技术、信息系统、信息服务。每个专业类别又分三个层次:高级资格(高级工程师)、中级资格(工程师)、初级资格(助理工程师、技术员)。对每个专业、每个层次,设置了若干个资格(或级别)。
考试合格者将颁发由中华人民共和国人力资源和社会保障部、工业和信息化部签发的计算机技术与软件专业技术资格(水平)证书。该证书在全国范围内有效。