第一章 软件工程概述
第一章 软件工程概述
摘录自学堂在线平台《软件工程(国家精品课)—— 【清华大学】 刘强》,
视频资源出自哔哩哔哩《软件工程(国家精品课)—— 【清华大学】 刘强》
一、软件的本质特征
(Ⅰ)软件的定义
软件 = 程序 + 数据 + 文档。
(1)
程序:计算机可以接受的一系列指令,运行时可以提供所要求的功能和性能。(2)
数据:使得程序能够适当地操作信息的数据结构。(3)
文档:描述程序的研制过程、方法和使用的图文资料。
(Ⅱ)软件开发中的挑战
软件的行为只有通过运行才能呈现出来,即在程序运行的过程中才能观察到软件的功能和性能,而软件提供的信息和服务有融合的相关功能领域的知识,从这个方面来看,软件更像是嵌入式的数字化知识,这种知识载体的特征对软件开发带来一些影响。
软件是人类思维的创造物,具有复杂性、一致性、可变性、和不可见性等
固有的内在特性,这是造成软件开发困难的根本原因。\(^{【1】}\)
(1)复杂性
软件是人类思维和智能的一种延伸,它比任何一种人类的创造物都要复杂得多,是人类创造出的最复杂的物体。如下图所示为云计算的服务器。
![]()
(2)一致性
①、软件不能独立存在,需要依附于一定的环境(如硬件、网络以及其他软件)。
②、软件必须遵从人为的惯例并适应已有的技术和系统。
③、软件需要随接口不同而改变,随时间推移而变化,而这些变化是不同人设计的结果。
比如下图所示的微信中的抢票应用来说
![]()
用户使用不同的服务终端发出请求,微信服务器接收请求并转发至抢票主服务器,主服务器处理响应要求非常高的抢票请求,然后将其他的请求转发给其他的辅助服务器。当然在整个的过程中,系统还可能和一些身份认证等其他系统进行交互。从这个应用来看,它需要与微信系统、身份验证系统等系统打交道,因此就必须遵循这些系统定义的接口,而这些接口都是开发工程师认为设计的,任何接口的变化都会带来微信应用的修改,所以说要保持与其他系统的一致性也会造成软件设计的复杂性。
(3)可变性
①、人们总是认为软件是容易修改的,但忽视了修改所带来的副作用。
②、不断的修改最终导致软件的退化,从而结束其生命周期。
理想的情况下,随着软件的使用其故障率会逐渐降低,逐渐达到一个稳定的质量,但是软件是在不断变化的,每一次的修改都会造成故障率的升高,同时也有可能对软件的结构带来破坏,不断地修改最终可能导致软件的退化,从而结束其生命周期。如下图的《时间-失效率曲线图》所示
![]()
尽管如此,成功的软件都是会发生演化的,没有任何变化的软件一定是没有用的,虽然软件的可变性给开发带来了很多难题,但是也给软件本身带来了生命力,所以我们需要用积极地态度和有效的方法来控制变更,使软件在演化的过程中保证高质量。
(4)不可见性
①、软件是一种“看不见、摸不着”的逻辑实体,不具有空间的形体特征。
②、开发人员可以直接看到程序代码,但是源代码并不是软件本身。
③、软件是以机器代码的形式运行,但是开发人员无法看到源代码是如何执行的。
正如Fred Brooks教授在《The Mythical Man-Month》中提及到如下图所示内容
![]()
【1】出自(Fred Brooks《No Silver Bullet — Essence and Accidents of Software Engineering》)
软件所具有的复杂性、一致性、可变性、不可见性等特性,使得软件开发过程变得难以控制,开发团队如同在焦油坑中挣扎的巨兽。挣扎地越猛烈,焦油纠缠地越紧,最后有可能沉没到坑底,因此我们需要寻找解决问题的有效方法,从而保障软件开发过程的高效、有序和可控。
二、软件工程的产生和发展
(Ⅰ)软件开发面临的挑战
![]()
(Ⅱ)软件工程的产生
1968年,北大西洋公约组织( NATO )在德国的一个小镇召开国际会议,提出“软件工程”概念和术语。在会议中的报告中这样写道:
我们特意选择‘软件工程’这个颇具争议性的词,是为了暗示这样一种意见:“软件的生产有必要建立在某些理论基础和实践指导之上,在工程学的某些成效卓著的分支中,这些理论基础和实践指导早已成为了一种传统。”
(Ⅲ)软件工程的发展
(1)史前阶段
时间为:1956~1967年。
软件开发没有方法可循;软件设计是在开发人员的头脑中完成的隐藏过程;60世纪出现了软件危机。
(2)瀑布模型——经典模型
时间为:1968~1982年。
1968年提出“软件工程”;结构化开发方法;瀑布式软件生命周期称为典型模型,整个软件开发过程分为:需求、设计、编码和测试等不同阶段。
(3)质量标准体系
时间为:1983~1995年。
人们意识到过程质量对产品质量的重大影响,面向对象开发方法和软件过程改进运动盛行,并提出了一系列质量标准体系,比如:CMM、ISO9000、SPICE。
(4)互联网
时间为:20世纪90年代至今。
敏捷的开发方法流行;更紧密的团队协作;有效应对需求变化;快速交付高质量软件;迭代和增量的开发过程,十分敏捷,大大提高了时间效率和软件的质量;
软件工程的发展的时间线如下图所示:
![]()
三、软件工程的基本概念
(Ⅰ)工程的含义
工程是将理论和知识应用于实践的科学,以便经济有效地解决问题。
(Ⅱ)工程的共有特征
①、大规模的设计与建造。
②、复杂问题与目标分解。
③、团队协作与过程控制。
(Ⅲ)软件工程的含义
①、将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护,即工程化应用到软件上。
②、对①中所述方法的研究。
(Ⅳ)软件工程的目标——创造 “足够好”的软件。
足够好,有多好:
①、较低的开发成本。
②、按时完成开发任务并及时交付。
③、实现客户要求的功能。
④、具有良好性能、可靠性、 可扩展性、可移植性等。
⑤、软件维护费用低。
(Ⅴ)软件工程的三个基本要素
(1)过程
(ⅰ)概念:支持软件开发各个环节的控制和管理。
(ⅱ)软件过程是一系列的开发活动,这些活动将用户的需求转换为用户满意的产品,通过对开发过程中各个活动环节质量的有效控制,来保证最终产品的质量。软件工程过程的数据流图如下图所示。
![]()
(ⅲ)软件开发过程一般包括一系列的软件开发活动:
![]()
首先要研究和定义用户的问题,确定和分析用户的实际需求,然后设计整个系统的整体结构,接着编程实现系统的各个部分,最后将各个部分集成起来进行测试,最终交付出用户满意的产品。除此之外还应该包括一些开发过程管理等支持性的活动。
(2)方法
(ⅰ)概念:完成软件开发任务的技术手段。
(ⅱ)软件工程方法的发展是由内向外的,如下图所示
![]()
代码封装的力度从函数到类,再到力度更大的构件,以及在应用层次上的服务。软件的复用程度逐步提升,开发效率也越来越高。
(3)工具
(ⅰ)概念:为软件开发方法提供自动或半自动的软件支撑环境。
(ⅱ)软件建模工具可以支持建立系统的需求和设计模型;软件构造工具包括程序编辑器、编译器、解释器和调试器;软件测试工具可以帮助人们分析代码的质量、执行软件测试和评价产品的质量;在软件维护阶段,一些代码分析工具和重构工具可以帮助人们理解和维护代码;除此之外还有一些软件工程管理工具,帮助人们有效管理开发过程、控制代码的更改、支持团队进行协作开发。如下图所示
![]()
(Ⅵ)软件开发的四大基本策略
在软件工程的发展中已经积累了不少优质的开发方法,但是仅有好的战术是不够的,还需要在实践中运用良好的开发策略,如下图所示即为软件开发中的四大基本策略。
![]()
(1)软件复用
构造一个新的系统不必从零开始,直接复用已有的构件可以提高开发效率和产品质量,降低维护成本。
当然,在之后会详细介绍软件复用,因为软件复用不仅仅是代码的复用,还包括对系统内库函数和类库、模板(文档、网页等)、设计模式、组件、框架等的复用。
(2)分而治之
这是人们处理复杂问题的一个基本策略。通过对问题进行研究分析,将一个复杂问题分解成可以理解并能够处理的若干小问题,然后再逐个解决。
将一个大的系统划分为不同的若干个小的功能模块,然后将其分配给编程人员进行并行开发。
(3)逐步演进
软件更像一个活着的植物,其生长是一个逐步有序的过程。软件开发应该遵循软件的客观规律,不断进行迭代式增量开发,最终交付符合客户价值的产品。如下图所示
![]()
(4)优化折中
软件工程师应当把优化当成一种责任,不断改进和提升软件质量;但是优化是一个多目标的最优决策,在不可能使所有目标都得到优化时,需要进行折中实现整体最优。
比如,在提高文件的访问速度时,可以建立内存缓冲区,如下图所示为不同缓冲区大小系统资源的消耗情况,显然缓冲区越大,设备的硬件成本就越高。
![]()
虽然内存越大,资源消耗就越小,但是不难发现,当缓冲区大小达到2048或者4096时,继续加大缓存对系统性能的提升影响很微小,所以我们可以选择2048或者4096的缓存方案,这样就能达到
成本和性能整体更优的结果。
(Ⅶ)软件工程学科发展
Wasserman规范给出了对软件工程发展有重大影响的若干技术,如下图所示
![]()
(1)
抽象是一种降低复杂性的方法。(2)
软件建模方法可以帮助工程师理解和刻画,分析和设计结果,便于开发人员进行开发和交流。(3)
用户界面原型化可以克服需求难以确定的困难。(4)
软件体系结构是软件质量至关重要的一环。(5)
软件过程、复用和度量都是工程方法的组成部分。(6)
工具与集成环境对于软件提高软件开发效率是必不可少的。
四、软件质量的实现
软件的质量是不可能达到完美的,所以软件工程的目标并不是达到完美,而是达到足够好。
(Ⅰ)什么是好的软件?
软件质量是一个复杂多面的概念,不同的人从各自不同的视角会有不同的理解和要求。如下图所示
![]()
一般情况下,软件质量主要包括三个方面:软件过程、软件产品和产品效用。
软件过程用过程质量衡量,软件产品包括:内部质量和外部质量两个部分,产品的效用用使用质量来衡量。在这些质量中存在着相互影响的关系:软件的过程质量会直接影响软件产品内在的代码质量,显然代码质量的好坏直接决定产品的外在质量,外在质量最终会影响到用户的使用质量。因此我们必须要用有效的方法来检验整个开发过程、程序代码和最终产品,并对用户的使用质量进行检测。如下图所示为软件质量的三个方面以及质量衡量之间的影响。
![]()
“质量就是软件产品对于某个(或某些)人的价值。”—— 杰拉尔德·温伯格
(1)正确的软件:一个软件要能够满足用户的需求,为用户创造价值。这里的价值可以体现在两个方面,即为用户创造利润和减少成本。
(2)软件运行正确:软件没有或者有很少缺陷,具有很强的扩展性、良好的性能以及较高的易用性等。
如下图所示是两个典型的不满足以上方面的案例:
![]()
从以上两个方面来看,我们开发的软件必须是正确的并且运行正确的软件,故而得出,高质量的软件产品主要包括一下四个方面的特点:
①、做了用户想要它做的事情。
②、正确有效地使用计算机资源。
③、易于用户学习和使用。
④、设计良好、代码良好且易于测试和维护。
(Ⅱ)产品质量的维度
(1)David Garvin质量评估模型
David Garvin提出了一种质量评价模型(通用模型,并不针对软件),如下图所示一共包括八个方面。
![]()
①、
性能:首先满足人们的需要即软件的正确性,为最终用户提供价值。②、
特色:必要性能之外的额外的、有作用的性能。③、
可靠性:满足软件的运行正确性,在一个稳定的状态下满足用户的使用。④、
符合性:符合国家或者行业的相关标准。⑤、
耐久性:软件的维护不能损坏或者降低软件的性能。⑥、
可服务性:维护的时间在可接受的范围之内。⑦、
审美:软件的界面需要整洁美观并且有序。⑧、
感知:软件开发团队的品牌效应和有关企业的声誉,会影响人们对软件产品的感知。
(2)ISO9126质量模型
该模型定义了评价软件质量的六个属性:功能性、可靠性、易用性、效率/性能、可维护性、可移植性。
其中每一个属性又细分成一系列的子属性,如下图所示:
![]()
(ⅰ)功能性
①、适合性:当软件在指定条件下使用,其满足明确和隐含要求功能的能力。
②、准确性:软件提供给用户功能的精确度是否符合目标。
③、互操作性:软件与其它系统进行交互的能力。
④、安全性:软件保护信息和数据的安全能力。
(ⅱ)可靠性
①、成熟性:软件产品避免因
软件中错误发生而导致失效的能力。②、容错性:软件防止
外部接口错误扩散而导致系统失效的能力。③、可恢复性:系统失效后,重新恢复原有的功能和性能的能力。
(ⅲ)易用性
①、易理解性:软件显示的信息要清晰、准确且易懂,使用户能够快速理解软件。
②、易学习性:软件使用户能学习其应用的能力。
③、易操作性:软件产品使用户能易于操作和控制它的能力。
④、吸引性:软件具有的某些独特的、能让用户眼前一亮的属性。
(ⅳ)效率/性能
①、时间特性:在规定的条件下,软件产品执行其功能时能够提供适当的响应时间处和理时间以及吞吐率的能力。
②、资源利用:软件系统在完成用户指定的业务请求所消耗的系统资源,诸如CPU占有率、内存占有率、网络带宽占有率等。
(ⅴ)可维护性:衡量当产品被修改的时候需要花费多大的努力
①、易分析性:软件提供辅助手段帮助开发人员定位缺陷原因并判断出修改之处。
②、易改变性:软件产品使得指定的修改容易实现的能力。
③、稳定性:软件产品避免由于软件修改而造成意外结果的能力。
④、易测试性:软件提供辅助性手段帮助测试人员实现其测试意图。
(ⅵ)可移植性:衡量软件从一种环境迁移到另一种环境的难易程度
①、适应性:软件产品无需做任何相应变动就能适应不同运行环境的能力。
②、易安装性:在平台变化后,成功安装软件的难易程度。
③、共存性:软件产品在公共环境与其共享资源的其他系统共存的能力。
④、替换性:软件系统的升级能力,包括在线升级、打补丁升级等。
(Ⅲ)如何实现软件质量
测试是检验软件产品的一个重要的手段,但是质量并不是由测试测出来的,因为如果软件质量的问题在测试的阶段发生,是很难进行纠正的。
![]()
所以说,实现软件产品的高质量必须包括以下三个方面:
①、高质量的设计。
②、规范的编码。
③、有效的测试。
(Ⅳ)商业环境下的软件质量
软件质量的重要性是无容置疑的,但是并不是质量越高就越好,而且有时没有必要追求“零缺陷”。
如下图所示为在不同情况下,产品质量的追求程度:
![]()
所以说我们不能抛开商业目标来谈论产品质量,
商业目标决定质量目标,企业必须权衡“成本”、“质量”、“效率”这三方面的因素
①、商业目标决定质量目标,不应该把质量目标凌驾于商业目标之上。
②、质量是有成本的,不可能为了追求完美的质量而不惜一切代价。
③、理想的质量目标不是“零缺陷”, 而是恰好让广大用户满意。

浙公网安备 33010602011771号