购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.2 软件工程的基本概念

软件工程是一门研究用工程化方法构建和维护有效、实用和高质量软件的学科,涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面的内容。作为计算机科学与技术专业的核心课程,其研究和实践涉及人力、技术、资金、进度的综合管理,是开展最优化生产活动的过程。

软件工程学科的理论基础是数学和计算机科学,其相关学科有计算机科学与技术、数学、计算机工程、管理学、系统工程和人类工程学等。软件工程必须划分系统的边界,给出系统的解决方案。

1.2.1 工程

在近代技术发展历史上,工程学科的进步一直是产业发展的巨大动力。传统工程所走过的道路已为人们所熟知,如水利工程、建筑工程、机械工程、电力工程等对工农业、商业的影响是极为明显的。随着工程学科的发展,近年来人们开始对气象工程、生物工程、计算机工程等产生新的认识。作为工程学科家族的新成员,人们对软件工程的认知正在不断提升。

工程建设项目具有唯一性、一次性、产品固定性、要素流动性、系统性、风险性等特征,其中的唯一性、产品固定性和要素流动性是工程建设项目中三个最基本的特征。工程建设项目的特点有:

●投资额巨大,建设周期长。由于建设项目规模大、技术复杂、涉及的专业面宽,因此,从项目设想到施工投入使用,少则需要几年,多则需要十几年。同时,由于投资额巨大,要求项目建设只能成功、不能失败,否则将造成严重后果,甚至影响国民经济发展。

●整体性强。建设项目是按照一个总体设计建设的,是可以形成生产能力或使用价值的若干单位工程的总体。

●具有固定性。建设产品的固定性,使其设计单一,不能成批生产(建设),也给实施带来难度,且受环境影响大、管理复杂。

与一般工程类似,软件工程的本质特性有:软件工程关注大型程序的构造;软件工程的中心课题是控制复杂性,许多软件的复杂性不是由问题的内在复杂性造成的,而是由必须处理的大量细节造成的;软件经常变化;开发软件的效率非常重要;和谐合作是开发软件的关键;软件必须有效支持它的用户;由一种文化背景的人替具有另一种文化背景的人创造产品。

但现实世界中经常出现软件推迟交付、超出预算、带有错误、不满足用户要求等问题,失败案例比比皆是,应当使用已建立的工程学科的基本原理和范型来解决软件危机。需要特别关注软件的地位和作用、软件的特点、软件的发展、软件的危机以及软件工程学科的形成、软件生命周期等方面的问题和基本概念。

软件工程专业以计算机科学与技术学科为基础,强调软件开发的工程性。其培养目标是:使学生在掌握计算机科学与技术知识和技能的基础上,熟练掌握从事软件需求分析、软件设计、软件测试、软件维护和软件项目管理等工作所必需的基础知识、基本方法和基本技能。整个过程突出对学生专业知识和专业技能的培养,造就能从事软件开发、测试、维护以及软件项目管理的高级专门人才。

1.2.2 软件

“软件”这一名词是在20世纪60年代初从国外传来的,当时许多人都不清楚它确切的含义。从字面上看,Software一词由soft和ware两个单词组合而成。有人翻译为“软制品”,也有人翻译为“软体”,现在统一翻译为“软件”。目前公认的解释是:软件是计算机系统中与硬件相互依存的另一部分,它是包括程序(按事先设计的功能和性能要求执行的指令序列)、数据(使程序能正常操纵信息的数据结构)及相关文档(与程序开发、维护和使用有关的图文材料)的完整集合。

Program(程序)=Data Structure(数据结构)+Algorithm(算法)

Software(软件)=Program(程序)+Software Engineering(软件工程)

Software Company(软件公司)=Software(软件)+Business Model(商业模型)

以上3个公式可以表明程序、软件、软件公司的构成和关系。程序(源程序)是一行一行的代码,是建立在数据结构上的一些算法。但光有代码是不行的,代码不会自己运行,要将其编译成机器能识别的目标代码,而编译不仅仅是cc和link命令。一个复杂的软件不但要有合理的软件架构(Software Architecture)、软件设计和实现(Software Design & Implementation),还要用各种文件来描述各个程序文件之间的依赖关系、编译参数、链接参数等。这些都是软件的构建,是工程性的事务。另外,软件加上商务模型就构成了一个软件公司。

软件早期作为计算机硬件的零件来开发。到20世纪50年代中后期和60年代早中期,软件开始被独立地开发、销售和使用。大家通常认为软件是一种工具:从20世纪50年代起,软件主要作为计算工具;从20世纪60年代起,软件主要作为商业计算和数据处理工具;从20世纪70年代起,软件主要作为计算和信息处理工具。要对软件有清楚的认识,我们首先必须知道软件的发展,软件大体上经历了程序—软件—软件产品这3个发展阶段。

●第一阶段(程序):在世界上出现了第一台电子计算机以后,就有了程序的概念。从20世纪50年代到60年代,人们曾经把程序设计看成一种任人发挥才能的技术领域。当时人们一般认为写出的程序要能在计算机上得出正确的结果。

●第二阶段(软件):传统软件开发(作坊式的软件生产),其开发工作主要依赖于开发人员的个人素质和程序设计技巧。其特点是缺少与程序有关的文档,由于程序量和规模都不大,通常由个人编写,不需要考虑团队合作,因此项目管理松散,程序可重用的程度差。

●第三阶段(软件产品):现代软件开发适应社会化大生产的要求,强调分工和协作,重视对项目的管理和软件质量的把握,采用工程化的方法进行文档的控制和代码的管理。

现代软件开发模式经历了巨大的转型,如单枪匹马写出WPS的求伯君、单独完成BASIC开发的比尔·盖茨等创业英雄在现代软件开发中越来越少见,而越来越多的项目经理都具有丰富的管理经验。项目的划分也越来越细,项目不再依赖于单个程序员的发挥和技巧,而依靠团队(Teamwork)的力量。实行现代软件开发的软件生产企业——微软公司,1975年时只有3名员工,营业额仅有16000美元;1989年时已经有8000名员工,营业额达80亿美元;而发展至2000年时,员工已多达35000名,营业额达240亿美元,利润更高达150亿美元,成为世界上最大的软件公司。

还有一些与软件密切相关的工作,比如源代码管理(Source Code Control),也叫软件配置管理(Software Configuration Management)。软件团队成员每天都在不断地修改各种源代码,因此要保证软件在不断的修改中能稳定质量,不至于崩溃。另外还可能需要为某个需求写一些特殊功能,并把这些功能合并到主要版本中。这些程序还有32位版本、64位版本等。又如质量保证(Quality Assurance),也叫软件测试(Test),需要有一系列的工具和程序来保证程序的正确性。当然,这些工具和程序本身应该是正确的,这样才能保证其他软件的质量。

在软件的生命周期(Software Life Cycle,SLC)中,还要有人负责软件项目管理(Software Project Management)。一个软件得先找到顾客,顾客有各种需求,要把应实现的需求都实现。从需求分析(Requirement Analysis)开始,软件开发者需要做各种事情,比如设计(软件架构)、实现(写数据结构和算法)、测试,到最后的发布软件。软件在运行过程中还会出现这样或那样的问题,也许要时不时地给软件打个补丁,即软件的维护(Software Maintenance)。

1.2.3 软件的特点

为了能全面、正确地理解计算机软件,需要了解软件的特点。总体来说,软件具有复杂性(是人类创造的最复杂的系统类型)、不可见性(看不到源代码具体是如何被执行的)、易变性(看上去很容易修改)、服从性(需要协调系统中其他组成、用户和行业系统)和非连续性(输入很小的变化引起输出极大的变化)。

随着技术的不断发展,软件开发会越来越容易吗?答案是“No Silver Bullet”(没有银弹),即没有一种大规模提高软件开发效率的快速办法,将来也没有。这也充分说明了软件工程的必要性,需要坚持不懈的努力。

具体来看,区别于硬件,软件有以下4大特点。

●软件是一种逻辑实体,而不是具体的物理实体。这个特点使软件和计算机硬件有着明显的差别。人们可以把软件记录在纸上、保存在计算机的存储器中,也可以将其保留在磁盘、磁带等介质上,但却无法看到软件的形态,必须通过观察、分析、思考、判断去了解它的功能、性能及其他特性。

●软件的生产与硬件不同。在软件开发过程中,没有明显的制造过程;不同于硬件,软件一旦研制成功,可以重复制造,并可以在制造过程中进行质量控制,能保障产品的质量。软件是通过人们的智力活动,把知识与技术转化成信息的一种产品。对软件质量的控制,必须着重在软件开发方面下功夫,由于软件的复制非常容易,也出现了软件产品的知识产权保护问题。

●在软件的运行和使用期间,没有硬件那样的机械磨损、老化问题。任何机械、电子设备在运行和使用期间的失效率都遵循U型曲线。因为在刚刚投入使用时,各个部位尚未做到配合良好、运转灵活,很容易出现问题。经过一段时间的磨合、运行就可以稳定下来。当设备经历了相当长时间的运转后,会出现磨损、老化等问题,使失效率越来越大。当失效率达到一定程度时,就达到寿命的终点。而软件的情况与此不同,它没有U型曲线的右半部分,因为不存在磨损和老化的问题。但在软件的生命周期中,为了克服以前没有发现的故障以及适应硬件/软件环境的变化、用户新的要求,必须多次修改、维护软件,而每次修改不可避免地会引入新的错误。一次次的修改可能导致软件的失效率升高,进而导致软件退化。因此,软件维护要比硬件维护复杂得多,也与硬件维修有本质上的差别。

●软件成本相当高。软件的研制工作需要投入大量的、复杂的、高强度的脑力劳动,成本比较高。值得注意的是,硬件、软件的成本发生了戏剧性的变化。无论自己研制还是向厂家购买,在20世纪50年代末,软件的开销大约占总开销的百分之十几,大部分成本要花在硬件上;但到了20世纪80年代,这个比例完全颠倒过来,软件的开销大大超过了硬件的开销;到了20世纪90年代,情况更是这样,如美国每年投入的软件开发经费有几百亿美元。

1.2.4 软件的类型

要给计算机软件做出科学的分类是很难的事情。对于不同类型的工程对象,对其进行开发和维护有着不同的要求和处理方法,需对软件类型进行必要的划分。

1.按功能划分

按功能划分,软件可分为系统软件、应用软件和支撑软件三大类。

系统软件能与计算机硬件紧密配合在一起,使计算机系统各个部件、相关的软件和数据协调、高效地工作,比如操作系统、数据库管理系统、设备驱动程序以及通信处理程序等。系统软件是计算机系统中必不可少的组成部分。

应用软件是在特定的领域内开发、为特定目的服务的一类软件,如CAD(计算机辅助设计)、CAM(计算机辅助制造)、CAI(计算机辅助教学)等软件以及专家系统、模式识别系统、刹车系统等。

支撑软件是协助用户开发软件的工具性软件,其中包括帮助程序人员开发软件产品的工具(如集成开发环境IDE),也包括帮助管理人员控制开发进程的工具(如版本控制软件SVN或Git等)。

2.按规模划分

按规模划分,软件可分为微型软件、小型软件、中型软件、大型软件、甚大型软件、极大型软件等。

微型软件通常是只有一个人在几天之内完成的软件,通常不到500行代码。

小型软件通常是一个人半年之内完成的、2000行语句以内的软件。例如,数值计算问题或数据处理问题就是这种规模的软件。这种程序通常没有与其他程序的接口。

中型软件通常是5人以内在一年多时间里完成的5000到50000行语句的软件。这种软件需要关注软件人员之间以及软件人员与用户之间的联系、协调和配合关系等问题。

大型软件通常是5~10人在两年多的时间里完成的5万行到10万行语句的软件。如编译程序、小型分时系统、应用软件包、实时控制系统等。

甚大型软件通常是100~1000人参与完成的软件。

极大型软件通常是2000~5000人参与完成的软件,如微软的Windows 2000项目包含近3000名工程师,被分成几百个小的团队。

3.按软件开发划分

按软件开发划分,软件可分为软件产品和软件项目两类。

软件产品指不局限于特定领域的可以被广大用户直接使用的软件系统,如微软的Windows、Office等。这类系统的特点是技术含量高,开发时要考虑各种不同的用户需求。

软件项目也称定制软件,是受某个特定客户或少数客户的委托,由一个或多个软件开发机构完成,有具体合同的约定,如我们常说的管理信息系统(MIS)和电子商务系统。这类软件的特点是领域知识所占的比重较大,相对技术而言,工程性更强。例如,军用防空指挥系统、卫星控制系统等均为这类软件。

针对上述两种不同类型的软件,有不同的软件开发方法去指导项目开发过程。例如,针对软件产品的开发,微软公司积累了许多成功的经验;针对软件项目的开发,目前比较成熟的软件开发方法有软件成熟度模型(CMM)。这种软件开发模型试图将整个软件开发过程规范化和量化,直到可以对软件开发过程进行定量的控制和优化。

1.2.5 软件危机

在计算机刚刚投入实际使用时,往往只是为了一个特定的应用而在指定的计算机上设计和编制软件,一般采用密切依赖于计算机的机器代码或汇编语言,软件的规模较小,文档资料通常也不存在,很少使用系统化的开发方法,设计软件往往等同于编制程序,基本上是个人设计、个人使用、个人操作、自给自足的私人化的软件生产方式。

20世纪60年代中期,大容量、高速度计算机的出现使计算机的应用范围迅速扩大,软件开发的规模急剧增长,同时高级语言开始出现,操作系统的发展引起了计算机应用方式的变化,大量的数据处理促进了第一代数据库管理系统的诞生。因而软件系统的规模越来越大,复杂程度越来越高,软件可靠性问题也越来越突出。原来的个人设计、个人使用的方式不再满足实际要求,因而迫切需要改变软件生产方式,提高软件生产率,软件危机由此开始爆发。

软件危机是指在软件开发和维护过程中遇到的一系列严重问题,表现为:

●软件开发进度难以预测,拖延工期几个月甚至几年的现象并不罕见,这种现象降低了软件开发组织的信誉;

●软件开发成本难以控制,投资一再追加,实际成本往往比预算成本高出一个数量级,而为了赶进度和节约成本所采取的一些权宜之计又往往降低了软件产品的质量,不可避免地会引起用户的不满;

●用户对产品功能难以满意,开发人员和用户之间很难沟通、矛盾很难统一,原因往往是软件开发人员不能真正了解用户的需求,而用户又不了解计算机求解问题的模式和能力,双方无法用共同熟悉的语言进行交流和沟通,在双方互不充分了解的情况下就仓促设计系统、匆忙着手编写程序,必然导致最终产品不符合用户的实际需求;

●软件产品质量无法保证,系统中的错误难以消除,原因在于软件是逻辑产品,质量问题很难使用统一的标准进行度量,从而造成质量控制的困难,另外盲目的检测很难发现软件产品中的所有错误,隐藏下来的错误往往是造成重大事故的隐患;

●软件产品难以维护,表现在软件本质上是开发人员代码化的逻辑思维活动,他人难以替代,除非是开发者本人,否则维护人员很难及时检测、排除系统故障,另外,为使系统适应新的硬件环境或根据用户的需要在原系统中增加的一些新功能,又有可能造成系统中的新错误;

●软件缺少适当的文档资料,文档资料是软件中必不可少的重要组成部分,是开发组织和用户之间的权利和义务的合同书,是系统管理者、总体设计者向开发人员下达的任务书,是系统维护人员的技术指导手册,是用户的操作说明书。缺乏必要的文档资料或文档资料不合格,将给软件开发和维护带来许多严重的问题。

因此,软件危机客观上是由于软件本身的特点造成的——软件由复杂的逻辑部件构成,同时规模又十分庞大;主观上是由不正确的开发方法造成的——开发者通常会忽视需求分析,并错误认为“软件开发=程序编写”,同时轻视软件的测试和维护。

在软件开发项目中常以人月来衡量工作量。这种度量暗示着人手和时间是可以互换的,但这种“人多力量大”的想法是一种一厢情愿的虚妄神话(见《人月神话》)。布鲁克斯法则表明:向滞后的软件项目追加人手,会使进度更加迟缓。为此提倡外科手术式的团队组织,即软件项目的核心概念要由很少的人来完成,以保证概念的完整性。另外,软件开发过程中的沟通手段非常必要,并需要保持适度的文档。需要牢记的是:在软件开发过程中,只有适度改进,没有包治百病的银弹。

目前在软件开发过程中,人们开始研制和使用软件工具,用以辅助进行软件项目管理与技术生产,人们还将软件生命周期各阶段使用的软件工具有机地结合成为一个整体,形成能够连续支持软件开发与维护全过程的集成化软件支撑环境,以期从管理和技术两个方面来解决软件危机问题。

此外,人工智能与软件工程的结合成为20世纪80年代末期开始活跃的研究领域。程序变换、自动生成和可重用软件等软件新技术研究也已取得了一定的进展,把程序设计自动化的进程向前推进了一步。在软件工程理论的指导下,发达国家已经建立起较为完备的软件工业化生产体系,形成了强大的软件生产能力。软件标准化与可重用性也得到了工业界的高度重视,在避免重复劳动、缓解软件危机方面起到了重要作用。 gD0nA7pZfGtZZE2WHfIxJqFXYySjBjtCkIbw/6cwqGr4B+h0h3G3yXt2f1YFmpjS

点击中间区域
呼出菜单
上一章
目录
下一章
×