1.1 计算机系统与软件

硬件工程和软件工程都可以看成是一门更广义的学科——计算机系统工程的一部分。

用于计算机硬件的工程技术是由电子设计技术发展起来的。今天,硬件设计技术已经达到比较成熟的水平,制造方法仍在不断地改进,可靠性已是一种可以期待的现实。

但是,计算机软件工程却还处于某种困境之中。在以计算机为基础的系统中,软件已经取代硬件成为系统中设计起来最困难、最不容易成功(按时完成和不超过预计的成本),而且是最不容易管理的部分。另一方面,随着以计算机为基础的系统在数量、复杂程度和应用范围上的不断增长,对软件的需求却仍然有增无减。

计算机系统工程的主要内容是对系统所要求的功能加以揭示、分析,并把它们分配给系统的各个部分,如图1-2所示。

978-7-111-52634-6-Chapter01-2.jpg

图1-2 计算机系统工程

在大多数新系统创建时,对系统所要求的功能往往只有模糊的概念。系统分析和定义的目的在于项目的范围,这就要对需要进行处理的信息、所要求的功能、所期望的性能,以及设计的约束和检验的标准等进行系统、详细的分析。

在范围确定之后,计算机系统工程师必须考虑多种能潜在满足项目范围的、可供选择的配置,在综合考虑各项因素之后,选择其中的一种配置,并将系统的功能分配给系统的各个部分(例如硬件和软件)。本书主要讨论其中的软件工程部分。

1.1.1 软件的本质

现在的软件具有产品和产品交付载体的双重作用。作为一个产品,它显示了由计算机硬件体现的计算能力,更广泛地说,显示的是由一个可被本地硬件设备访问的计算机网络体现的计算潜力。无论是驻留在移动电话还是大型计算机中,软件都扮演着信息转换的角色:产生、管理、获取、修改、显示或者传输各种信息,简单如几个比特的传递或复杂如从多个独立的数据源获取的多媒体演示。而作为产品生产的载体,软件提供了计算机控制(操作系统)、信息通信(网络)以及应用程序开发和控制(软件工具和环境)的基础平台。

软件提供了当今这个时代最重要的产品——信息。它会转换个人数据(例如个人财务交易),使信息在一定范围内发挥更大的作用;它通过管理商业信息提升竞争力,为世界范围的信息网络提供通路(比如因特网),并对各类格式的信息提供不同的查询方式。

在最近半个世纪里,计算机软件的作用发生了很大的变化。硬件性能的极大提高、计算机结构的巨大变化、内存和存储容量的大幅度增加,以及种类繁多的输入和输出方法都促使计算机系统的结构变得更加复杂,功能更加强大。如果系统开发成功,复杂的结构和功能可以产生惊人的效果,但是同时复杂性也给系统开发人员带来巨大的挑战。

现在,庞大的软件产业已经成为了工业经济中的主导因素。早期的独立程序员也已经被专业的软件开发团队所代替,团队中的不同专业技术人员可分别关注复杂的应用系统中某一个技术部分。然而,同过去独立程序员一样,开发现代计算机系统时,软件行业依然面临同样的问题,现列举如下。

1)软件生产不能满足日益增长的需要。

2)软件开发成本和开发进度的估计往往不准确。实际成本有时高出预计成本好几倍,预计完工的时间往往推迟几个月,甚至更长时间。

3)软件开发人员和用户之间的信息交流不充分,导致用户对完成的软件满意度很低。

4)软件价格昂贵,软件成本在整个计算机系统中所占的比例急剧上升,软件已成为许多计算机系统中花钱最多的项目。

5)软件质量难以保证,软件质量保证技术还没有真正应用到软件开发的全过程。

6)软件可维护性差,程序中的错误很难改正,或者当硬件环境发生变化时,想要进行的适应性或完善性维护都是极其困难的。

为了克服软件危机,人们开始考虑采用工程化方法和工程途径来研制和维护软件。20世纪60年代末至70年代初,逐渐发展起一组总称为“软件工程”的技术。这些技术把软件作为一个工程产品来处理:它需要计划、分析、设计、实现、测试及维护。

1.1.2 定义软件

2006年出版的《中国大百科全书》给软件下的定义是:“计算机系统中的程序和有关的文件。程序是计算任务的处理对象和处理规则的描述,文件是为了便于了解程序所需的资料说明。程序必须装入机器内部才能工作,文件一般是给人看的,不一定装入机器。程序作为一种具有逻辑结构的信息,精确而完整地描述计算任务中的处理对象和处理规则。这一描述还必须通过相应的实体才能体现。”

也就是说,“软件”不仅仅是指程序,在软件研制过程中按一定规格产生的各种文件也是软件不可缺少的组成部分。

软件是逻辑的而非物理的系统元素。因此,软件和硬件具有完全不同的特性。

1)软件是设计开发的,而不是传统意义上生产制造的。

虽然软件开发和硬件制造存在某些相似点,但两者有根本不同:两者均可通过优秀的设计获得高品质产品,但硬件在制造阶段可能会引入质量问题,这在软件中并不存在(或者易于纠正);两者都依赖人,但是人员和工作成果之间的对应关系完全不同;它们都需要构建产品,但是构建方法不同。软件产品成本主要在开发设计,不能像管理制造项目那样管理软件开发项目。

2)软件不会“磨损”。

图1-3描述了硬件的失效率,它是时间的函数。这个被称为“浴缸曲线”的关系图显示:硬件在早期具有相对较高的失效率(这种失效通常来自设计或生产缺陷);缺陷被逐个纠正之后,失效率随之降低并在一段时间内保持平稳(理想情况下很低)。然而,随着时间推移,因为灰尘、震动、不当使用、温度超限及其他环境问题所造成的硬件组件损耗累积的效果,使得失效率再次提高。简而言之,硬件开始“磨损”了。

而软件不会受引起硬件磨损的环境问题的影响。因此,从理论上来说,软件的失效率曲线应该呈现为如图1-4所示的“理想曲线”。未知的缺陷将在程序的生命周期的前期造成高失效率。然而随着错误被纠正,曲线将趋于平缓。“理想曲线”只是软件实际失效模型的粗略简化,曲线的含义很明显——软件不会磨损,但是软件退化的确存在。

978-7-111-52634-6-Chapter01-3.jpg

图1-3 硬件失效曲线图

978-7-111-52634-6-Chapter01-4.jpg

图1-4 软件失效曲线图

这个似乎矛盾的现象用如图1-4所示的“实际曲线”可以很好地解释。在完整的生存周期里,软件将会面临变更,每次变更都可能引入新的错误,使得失效率像“实际曲线”那样陡然上升。在曲线回到最初的稳定失效率状态前,新的变更会引起曲线又一次上升。就这样,最小的失效率点沿类似于斜线逐渐上升,可以说,不断地变更是软件退化的根本原因。

磨损的硬件部件可以用备用部件替换,而软件却不存在备用部件。每个软件的缺陷都暗示了设计的缺陷或者在从设计转化到计算机可执行代码的过程中产生的错误。因此,软件维护要应对变更请求,比硬件维护更为复杂。

3)虽然整个工业向着基于构件的构造模式发展,然而大多数软件仍是根据实际的顾客需求定制的。

工程学科的发展将产生一系列标准的设计器件。可复用构件的使用使得工程师可以专心于设计中真正创新的部分。在硬件设计中,构件复用是工程进程中通用的方法。而在软件设计中,大规模的复用刚刚开始尝试。

软件构件应该设计并实现成可在不同程序中复用的组件。现代的可复用构件封装了数据和对数据的处理,使得软件工程师能够利用可复用的构件构造新的应用程序。例如,现在的交互式用户界面使用可复用构件构造图形窗口、下拉菜单和各种交互机制,构造用户界面所需要的数据结构和处理细节被封装在用于用户界面设计的可重用构件库中。

1.1.3 软件应用领域

计算机软件可以被分为以下7个大类。

1)系统软件:这是一整套服务于其他程序的程序。某些系统软件(如编译器、编辑器和文件管理软件)处理复杂但确定的信息结构,另一些系统程序(如操作系统构件、驱动程序、网络软件和远程通信处理器)主要处理的是不确定的数据。无论何种情况,系统软件通常都具有以下特点:和计算机硬件大量交互,多用户大量使用,需要调度、资源共享和复杂进程管理的同步操作,复杂的数据结构以及多种外部接口。

2)应用软件:是指解决特定业务需要的独立程序。这类应用软件处理商务或技术数据,以协助业务操作和管理或技术决策。除了传统的数据处理(见图1-5),应用软件也被用于业务功能的实时控制,例如销售点的交易处理、实时制造过程控制等。

3)工程/科学软件:这类软件通常带有“数值计算”算法的特征,涵盖了广泛的应用领域,从天文学到轨道动力学,从分子生物学到自动制造业。科学工程领域的应用软件已经不再局限于传统的数值算法,计算机辅助设计、系统仿真和其他的交互性应用程序已经呈现出实时性甚至具有系统软件的特性。

978-7-111-52634-6-Chapter01-5.jpg

图1-5 应用软件——飞行数据集成系统

4)嵌入式软件:存在于某个产品或者系统中,可实现和控制面向最终使用者和系统本身的特性和功能。嵌入式软件可以执行有限但难以实现的功能(如微波炉的按键控制)或者提供重要的功能和控制能力(如汽车中的燃油控制、仪表板显示和制动系统等汽车电子功能)。

5)产品线软件:产品为不同用户的使用提供特定功能。产品线软件关注有限的特定的专业市场(如库存控制产品)或者大众消费品市场(如文字处理、电子制表、计算机绘图、多媒体、娱乐、数据库管理、个人及公司财务应用软件)。

6)Web应用软件:也称“Web应用”(WebApp),是一类以网络为中心的软件,其概念涵盖了宽泛的应用程序产品。最简单的可以是一组超文本链接文件,仅仅用文本和有限的图形表达信息。随着Web2.0的出现,网络应用正在发展为复杂的计算环境,不仅为最终用户提供独立的特性、计算功能和内容信息,还与企业数据库和商务应用程序相结合。

7)人工智能软件:这种软件利用非数值算法解决计算和直接分析无法解决的复杂问题。这个领域包括机器人、专家系统、模式识别(图像和语音)、人工神经网络、定理证明和博弈等的应用程序。

全世界有许多的软件工程师在为以上各类软件项目努力地工作着。有时是建立一个新的系统,有时只是对现有应用程序的纠错、适应性调整和升级。

软件的确定性是指系统的输入、处理和输出的顺序及时间是可以预测的;反之亦然。

1)开放计算:无线网络的快速发展也许将很快促成真正的普适计算和分布式计算的实现。软件工程师所面临的挑战将是开发系统和应用软件,使移动设备、个人计算机和企业可以通过大量的网络设施进行通信。

2)网络资源:因特网已经快速发展为一个计算引擎和内容提供平台。软件工程师新的任务是构建一个简单而智能的应用程序,为全世界的最终用户市场提供服务。

3)开源软件:就是将系统应用程序(如操作系统、数据库和开发环境)代码开放,使更多人能够为软件开发做贡献,这种方式正在逐步成为一种趋势。软件工程师面对的挑战是开发可以自我描述的代码,而更重要的是,开发某种技术,以便用户和开发人员都能够了解已经发生的改动,并且知道这些改动如何在软件中体现出来。

1.1.4 WebApp的特性

早期(大约从1990年到1995年)WWW的Web站点仅包含链接在一起的一些超文本文件,这些文件使用文本和有限的图形来表示信息。随着时间的推移,一些开发工具(如XML、Java等)扩展了HTML的能力,使得Web工程师在向客户提供信息的同时也能提供计算能力—基于Web的系统和应用(WebApp)诞生了。今天,WebApp已经发展成为成熟的计算工具(见图1-6),这些工具不仅可以为最终用户提供独立的功能,而且已经同公司数据库和业务应用集成在一起了。

978-7-111-52634-6-Chapter01-6.jpg

图1-6 丰富的WebApp软件

绝大多数WebApp具备下列属性。

1)网络密集性:WebApp驻留在网络上,服务于不同客户群体的需求。网络提供开放的访问和通信(如因特网)或者受限的访问和通信(如企业内联网)。

2)并发性:大量用户可能同时访问WebApp。很多情况下最终用户的使用模式存在很大差异。

3)无法预知的负载量:WebApp的用户数量每天都可能有数量级的变化。

4)性能:如果一位WebApp用户必须等待很长时间(访问、服务器端处理和客户端格式化显示),该用户就可能转向其他地方。

5)可用性:尽管期望百分之百的可用性是不切实际的,但是对于热门的WebApp,用户通常要求能够全天候访问。

6)数据驱动:许多WebApp的主要功能是使用超媒体向最终用户提供文本、图片、音频及视频内容。此外,WebApp还常被用做访问那些存储在Web应用环境之外的数据库中的信息(如电子商务或金融应用)。

7)内容敏感性:内容的质量和艺术性在很大程度上决定着WebApp的质量。

8)持续演化:传统的应用软件是随一系列规划好的时间间隔发布而演化的,而Web应用则持续地演化。

9)即时性:将软件尽快推向市场的迫切需要是很多应用领域的特点,然而将WebApp投入市场可能是几天或几周的事。

10)安全性:由于WebApp是通过网络访问来使用的,因此要限制访问的最终用户数量即使可能也非常困难。为了保护敏感的内容,并提供保密的数据传输模式,在支持WebApp的整个基础设施上和应用本身内部都必须实施较强的安全措施。

11)美观性:不可否认,WebApp的用户界面外观很有吸引力。是否能将产品或是思想成功地推向市场,界面设计的美观和技术设计同样重要。

尽管其他应用类型可能具备上述的某些特性,但WebApp几乎具备了所有这些属性。