软件工程理论与应用
上QQ阅读APP看书,第一时间看更新

1.1 软件

目前,社会已经进入以计算机为核心的信息社会,信息的获取、处理和人与人之间的交流、决策等都离不开软件,因此,人们对软件提出了更高的要求,为使软件资源能够达到资源共享,以高性价比的方式生产软件对于社会的经济运作是必不可少的。

1.1.1 软件的概念

在第一台计算机问世以后,很多尖端科学计算都采用了计算机,这也是计算机由此得名的理由。由于硬件电路的大规模集成化,计算机由笨重的设备发展成为掌上电脑,并且计算机的应用也由简单的计算到智能化应用。计算机软件的发展经历了4个阶段。

(1)第一个阶段是20世纪50年代到60年代,是计算机系统开发的初期阶段。大多数计算机系统采用的是面向批处理方式,程序的实现也是基于批处理的过程编写的。计算机系统中的多数软件是用户自己设计、自己使用、自己维护。此阶段的特点是软件规模小、文档不完整,开发过程的中间结果一般都不保留,软件开发依赖于程序员的个人技能,软件开发不规范,生产率低,开发过程很难管理,开发计划难以实施,经常性延期,成本不断增加并难以估算和控制,软件质量得不到保证。但在这个阶段仍有很多软件给复杂的工作带来了帮助,例如,军事、国防所采用的应用软件。

(2)第二个阶段是20世纪60年代到70年代,采用了实时多任务方式,引进了多用户、多道程序和人机交互等概念。此阶段的特点是软件规模达到数万行代码,一个软件产品可以为多个用户所使用,改变了软件由自己开发、自己使用的被动局面。同时,数据库语言的出现,程序的实现不单纯是计算机指令集,而是要求编写易于维护的程序,出现了文档的要求。

(3)第三个阶段是20世纪70年代到80年代的分布式阶段。分布式系统是多台计算机同时各自执行某些功能,并与其他计算机通信,极大地增加了计算机系统的复杂性。分布式系统、计算机网络、嵌入式计算机系统有了很大的发展,广泛应用于人们工作、生活的各个领域。基于网络方式的软件应用形成了巨大优势,广域网、局域网、高宽带数字通信以及对“即时”数据访问需求的增加,都对软件开发者提出了更高的要求。

(4)第四个阶段是从20世纪80年代开始的智能化阶段。由复杂的操作系统控制的强大的桌面系统,以及广域网和局域网,配合以先进的软件应用标准,计算机体系结构从集中的主机环境转变为分布的客户机/服务器环境。软件开发采用面向对象的编程思想,结合强大的桌面系统、面向对象技术、专家系统、人工智能等思想,解决了大量的实际问题。多媒体技术将计算机的图形、图像、文字、声音处理集成在一起,提高了计算机的信息处理能力,扩大了计算机的应用领域,Internet环境下的软件开发技术、分布计算环境下的软件互操作技术引起了广泛的研究兴趣。

从软件发展的过程能够看到,作用于计算机上的程序也不再仅仅是公式的计算,更多地含盖了设计思想、设计过程、实现过程等内容。一般来说,计算机软件是与计算机系统操作有关的程序、规程、规则及任何与之有关的文档和数据。因此,软件是由程序、数据、文档组成,通常表示成:软件=程序+数据+文档(Software=Program+Data+Document)。程序(Program)是用程序设计语言描述的、适合于计算机处理的语句序列,它是软件开发人员根据用户需求开发出来的指令的集合。而数据(Data)是软件必不可少的成分,任何软件都要有数据的输入输出、存储以及相应的处理。文档(Document)是一种数据媒体和其上所记录的信息,可用于记录软件开发人员的开发过程的活动,也用于专业人员与用户的交流,利用软件文档,提高了软件开发的效率和软件产品的质量。

综上所述,软件可定义为:计算机语言程序和所有使程序能够运行所需要的数据和文档。也就是说,软件不再是大量的源程序清单,而是作为一种看得见、摸得着的实实在在的产品。

因此,软件包含了以下3个方面的含义。

(1)运行时,能够提供所要求功能和性能的指令或计算机程序集合。

(2)程序能够满意地处理信息的数据结构。

(3)描述程序功能需求以及程序如何操作和使用所要求的文档。

软件产品(Software Product)是指向用户提供的计算机软件、信息系统或设备中嵌入的软件或在提供计算机信息系统集成、应用服务等技术服务时提供的计算机软件。软件产品实行登记和备案制度。

软件产品实例:网络购物系统(如E-Bay)、Microsoft XP操作系统、政府办公网、校园网、高考报名系统、手机操作系统、家庭使用的智能化系统等。

1.1.2 软件的特征

软件作为一种产品,具有产品的特点,同时,由于软件又是开发人员倾注更多的逻辑思维的产物,又为软件蒙上一层神秘的面纱,软件的逻辑性给软件添加了另一方面的特征。下面比较一下硬件与软件作为产品的不同特征。

1.有形性与无形性

硬件产品是看得见、摸得着的实实在在的产物,能够很直观地看到它的形状、结构、连接方式,而软件是无形的(Intangible),对它的形状、外观、操作方式很难直接加以描述。在产品完成过程中,硬件产品能够较为准确地判断某一个阶段完成了多少,完成的结果会是什么效果,并在生产过程中不断加以修正。可是,软件产品很难知道某个阶段进行到什么程度,完成多少,看不到设计过程,看不到阶段性成果,最后的结果到底会达到什么效果,是很难预料的。

2.物理性与逻辑性

硬件产品的每一处连接、每一器件工作状态都能以物理的方式表明产品的存在,并以每一器件的特性构成整体特性;而软件体现在整体性能上的却是各个部分内在的逻辑关系,不能用操作的过程表明其内在的逻辑性。

3.劳动密集型与自动化

目前来说,软件制作过程仍然是劳动密集型,手工作坊的生产方式,重复劳动的过程很多,自动化程度很低,产品制作完成后的大批量生产却是非常简单;而硬件产品的批量生产都是以流水线的自动化生产方式实现的。

4.磨损与老化过程

任何一种硬件产品长时间使用都存在磨损与老化的过程,硬件产品的故障率曲线如图1-1所示。

图1-1 硬件的故障率曲线(浴缸曲线)

在硬件产品制作过程中存在很多故障,经过不断修正,产品性能趋于平稳,达到正常工作状态,但是,随着时间的推移,硬件产品会受到材料本身的老化和不断磨损等因素影响,故障率升高而近于废弃不用的状态。

软件产品不存在这样的过程,它是一种逻辑产品,不会受材料的老化影响,在理想状态下,它的故障率曲线如图1-2所示。

图1-2 软件的故障率曲线(理想情况下)

软件在制作过程中故障率很高,存在很多的缺陷,需要开发人员不断修正,软件系统趋于平稳,但是软件系统不像硬件产品那样,随着时间的推移,软件产品能够一直保持平稳状态运行下去,而没有磨损与老化的过程。

但是,以上只是在理想状态下,实际情况有些不同,软件的修正并不是像人们想象的那样,一定是朝好的方向修正,而是在不断修正的过程中又不断引发新的错误,这样的软件故障率曲线如图1-3所示。

图1-3 软件的故障率曲线(实际情况下)

5.环境的依赖性

硬件产品可以作为一个独立的产品存在于工作和生活中;但是,软件产品更多地依赖于硬件环境,如嵌入式软件依赖硬件的电路,自动控制系统依赖硬件电路和外围设备。因此,软件产品不能独立存在,必须有相应的环境支持才能运行。

通过以上的分析表明,软件产品的特性决定了这个产品不是简单的产品,而是一种独特的产品,在实现的过程中不能仅仅采用工程化的方式,而要更多地融入社会因素。

一般的,软件具有如下的特点:

● 软件是一种逻辑实体,具有抽象性;

● 软件没有明显的制造过程;

● 软件在使用过程中,没有磨损、老化的问题;

● 软件对硬件和环境有着不同程度的依赖性;

● 软件的开发至今尚未完全摆脱手工作坊式的开发方式,生产效率低;

● 软件是复杂的,而且以后会更加复杂;

● 软件的成本相当昂贵。

1.1.3 软件的分类

计算机作为一种工具,应用在各行各业,这就使得各行各业有不同种类的软件。一般情况下,软件的种类可以按不同类型的工程对象特点和软件规模划分。

1.基于不同工程对象划分

(1)通用软件产品(Generic)。由软件开发机构制作,市场上公开销售,可以独立使用,如数据库软件、字处理软件、绘图软件、工程管理工具。

(2)定制软件产品(Bespoke Custom)。受特定客户委托,由软件承包商专门制作。如某一应用领域的自动控制系统、特定业务处理系统、智能化产品等。

这两类软件的不同主要在于:在通用软件中,软件描述由开发者自己完成,而定制软件产品,其软件描述通常是由客户给出,开发者必须按照客户要求进行开发。

2.基于软件规模的划分

一般来说,软件系统按程序规模划分的比较多,也即按程序代码行数的大小划分,分为小型、中型、大型软件系统,如表1-1所示。

表1-1 软件规模分类

根据软件规模大小,软件工程的应用侧重点不同。在小型软件规模的系统开发过程中,虽然也采用软件工程的实现方法,但仅仅侧重在实现部分的实施上;中型软件系统开发应用软件工程思想、方法比较多,会更多侧重在设计与实现部分;大型软件系统必须运用软件工程的思想、方法和工具,对每一阶段的开发步骤都会运用软件工程的分析、设计原则,并伴有相应的文档,实现部分更多的是强调统一的风格。

因此,所有软件系统的开发必须从头至尾坚持软件工程的思想、方法,严格遵循标准文档的格式和正规的复审制度。

(1)微小型软件。通常微小型软件都是由一个人开发,并局限在某个很小的范围内使用,或者是个人使用,如个人为理财、家庭物品等采用计算机管理而编制的软件。一般程序长度都在2000行以内。在开发过程中,不讲究开发方法和开发实施的步骤,没有相应的软件编写文档,日后会根据需要不断修改,或废弃不用。

(2)中型软件。目前来说,软件越来越复杂,应用也越来越广泛,同10年前相比,软件规模远远地增大了,特别是中型软件,在社会发展中占据重要的位置。如企业管理、生产自动化、校园网络建设、政府信息化等这些专门应用软件,小型分时系统、编译系统、实时控制系统等也属于这个范畴。因此,在划分中型软件方面,通常程序长度在5000~10000行之间,一般需要5~10人、持续1~2年时间开发,以团队方式采用统一的标准开发模式,实行严格的审查制度,按照软件工程开发方法进行有效的规划和实施,能够提高工作效率。

(3)大型软件。电信、银行、金融、证券、保险等领域都采用了网络和通信技术,伴随庞大的数据库处理的这类软件,以及大型多任务操作系统、大型数据库管理系统,还有更为庞大的软件,如军事指挥、弹道导弹防御系统等项目的开发,都是大型或超大型软件。这类软件的开发必须采用软件工程指导下的软件开发方法和遵循相应的开发规范,建立软件开发过程的文档,由上百人、甚至上千人参加形成庞大的开发团队,不同领域的人员相互沟通合作。

1.1.4 软件的应用

软件成为我们生活中不可缺少的一个重要部分,可以应用于任何场合。如家用电器、电视、电话、数码相机等都是生活中常用的物品,工作中的普通文件的制作与发送、图像的处理、网上信息发布等是我们工作中经常要做的事情。数字化时代的到来,更使得我们生活、工作和娱乐都离不开计算机,也就势必脱离不了软件。

随着软件复杂程度的增加,软件的应用领域非常广泛,一般按应用分类有:

(1)系统软件。是一组为其他程序服务的程序。如操作系统(Microsoft Windows、Linux)和计算机语言的编译系统等。它具有管理计算机硬件和软件资源、实现多用户交互与调度、资源共享、复杂的数据结构和外部接口等特点。

(2)实时软件。管理、分析、控制现实世界中发生的事件的程序。一个实时系统必须在严格的时间范围内响应。实时软件的组成一般包括:数据采集部件,负责从外部环境中获取信息;分析部件,负责将收集的信息转变成应用所需的形式。如飞机订票系统、航空航天的软件系统。

(3)商业软件。商业信息处理是最大的软件应用领域。如财务软件、ATM及银行软件系统、库存清单等均为管理信息系统(MIS)软件,它可以访问一个或多个包含商业信息的大型数据库。

(4)工程和科学计算软件。这类软件的特点是一般具有数值计算,应用很广泛,如生产过程自动控制系统、工程预算软件系统等。

(5)嵌入式软件。智能产品应用于所有的领域,嵌入式软件作用于这些智能产品,执行有限但专一的功能,如家电智能产品中的洗衣机、微波炉等,以及控制能力强大的汽车中的数字控制,工业应用中的独立控制器等。

(6)个人计算机软件。用于个人的文字、图片、财务、娱乐等方面的软件系统,如个人理财、家庭管理、个人文件管理系统等。

(7)人工智能软件。人工智能(AI)软件利用非数值计算解决复杂问题,如比较典型的专家系统、智能游戏、生物智能分析系统等。

【例1-1】目前,国家环保局正致力于环境保护,对生产企业污水处理、生活小区空气指数、资源的利用等情况进行深入调查并采取相应的措施。在对沿江河等流域的企业进行调查发现,我国很多的石油、制药、化工等企业是沿江河建立的,生产过程中产生的废水给人民的生活带来不便,环境保护成为人们生活中重要的一部分。因此,国家为加强环境保护,将致力于环境监测与管理,为子孙后代造福。国家环保总局希望通过实时的环境监测提高监管的力度,建立一种系统能够直接监测企业排污情况、空气污染指数等实时数据,为国家环保局的管理与决策提供有力的证据。

国家环保局的基本要求是建立网络方式的实时监控与管理信息系统,并建立企业与人民生活环境的监测点,对环境数据实时传送,各级环保部门对实时数据进行分级管理,形成对国家、省地市环保的决策支持。如何利用计算机网络方式实现环保管理与决策的自动化?

可以根据基本要求,采用软件工程的原理、方法对该系统进行分析与设计。在后续的章节中,本书将给出相应的文档以及进一步促进学生依据文档开发项目的案例。

1.1.5 软件的未来与工业化

很多年前人们梦想着可以在家中办公、购物、看病、聊天,现在,这些都已实现,有些已经成为我们生活和工作的一部分。在拥有计算机技术、网络技术、无线技术的现代,不难得出结论,软件是社会生活的巨大驱动力,会提高生活质量、工作效率,使生活简单化、智能化。然而,软件的发展将会更多地面临大型系统的开发、复杂程度的急剧增加、无处不在的应用领域。

软件产业是国民经济和社会发展的基础性、战略性产业,是21世纪国际竞争的焦点。以软件主导硬件已经成为信息产业发展的必然趋势。因此,世界各国都竞相发展软件产业,以期在未来激烈的国际竞争和分工中占据有利地位。小作坊式的生产使我国软件业产生一系列“连锁反应”:大量重复制作一些定制的小软件,严重浪费资源;大量小规模软件公司的存在使软件业处于一个低层次的运作而陷入恶性循环等。目前,国产软件产品主要集中在中文环境支持系统和应用软件领域,而在操作系统、数据库等利润最丰厚、也最需技术实力的软件上却无人问津。因为这些技术复杂度相当高的支撑软件需要大量的人力和资金投入,而国内软件企业大都热衷“二次开发”来获取短期利润。基于上述原因,中国要实现民族软件产业真正的升级,软件产业必须在产品、市场、资本运作尤其是企业管理方面与国际接轨。

首先,在产品方面推行软件工业化生产技术和模式是十分必要的。随着计算机应用领域的不断扩大,信息系统日趋复杂,软件日益显示出群体特性,要高质、高效地开发出大型复杂软件系统已不再是个体或小作坊软件企业所能完成的工作。

其次,改革传统的计算机教育体系,以适应软件开发新形势。早期的计算机专业课程体系中很少有软件管理工程课程,为适应现代软件开发形势的要求,应不断改进计算机教育和课程体系。

最后,引入国际通行的CMM认证,同时对现有国内软件资源进行大规模的整合尤为必要。作为目前国际上最实用的软件生产过程标准和软件企业成熟度等级认证标准,CMM能帮助软件企业改进和优化管理,实现软件生产工程化。

外部环境的改变,并不能完全解决我国软件发展的瓶颈,只有真正按照工业化标准要求软件企业,才能脱离小作坊生产和“个人英雄主义”。仅仅以产值作为衡量软件业是否发展良好是不全面的,软件企业的内功是否过硬、软件品质是否得到保证、软件企业是否确立了工业化意识而具有持续竞争力,更应成为评价我国软件产业发展的标准,也是我国软件业自强的必由之路。

任何一个软件都是代表一个客观世界特性的提炼,那么任何一个软件都有其领域特征。所有领域的特征和系统基本需求决定了软件的结构性。实现软件生产方式变革,即软件必须从手工作坊式转变为工业化的生产方式,要有工业化的开发方法和工业化的生产技术。生产过程中不但要有支撑环境和工具,更要有标准规范和体系。重视软件基础设施建设,也就是要为软件的实施创建优良的产业发展环境,因为软件工程需要有一定的平台。软件不仅是作品,更要成为用户所用的产品,因此,要求有良好的产业组织模式。只有这样,才能够真正地形成软件产业,才能够有产品;只有这样,中国软件产业才能够得到真正的发展,才能够取得巨大成就。