此文章摘自:#5天修炼笔记#
三、软件工程
1.软件需求
软件需求包括三个层次∶业务需求、用户需求和功能需求、非功能需求。
业务需求反映了组织机构或客户对系统、产品高层次的目标要求,在项目视图与范
围文档中予以说明。
用户需求描述了用户使用产品必须要完成的任务。
功能需求定义了开发人员必须实现的软件功能,使得用户能完成他们的任务,从而满足业
务需求。
非功能需求包括产品必须遵从的标准、规范和合约,外部界面的具体细节,性能要求,
设计或实现的约束条件及质量属性。
2.软件设计
软件设计是把许多事物和问题抽象起来,并且抽象其不同的层次和角度。
软件设计的基本原则是信息隐蔽与模块独立性。
内聚是模块功能强度(一个模块内部各个元素彼此结合的紧密程度)的度量。
一个模块内部各个元素之间的联系越紧密,则它的内聚性就越高,相对地,它与
其他模块之间的耦合性就会越低,而模块独立性就越强。由此可见,模块独立性
比较强的模块应是高内聚低耦合的模块。
※内聚按强度从低到高有以下几种类型∶
●偶然内聚,即巧合内聚∶如果一个模块的各成分之间毫无关系,则称为偶然内聚。
●逻辑内聚∶几个逻辑上相关的功能被放在同一模块中,则称为逻辑内聚。
如一个模块读取各种不同类型外设的输入。尽管逻辑内聚比偶然内聚合理一些,但逻辑内聚的
模块各成分在功能上并无关系,即使局部功能的修改有时也会影响全局,因此这
类模块的修改也比较困难。
●时间内聚;如果一个模块完成的功能必须在同一时间内执行(如系统初始化)
但这些功能只是因为时间因素关联在一起,则称为时间内聚。
● 过程内聚∶如果一个模块内部的处理成分是相关的,而且这些处理必须
以特定的次序执行,则称为过程内聚。
● 通信内聚;如果一个模块的所有成分都操作同一数据集或生成同一数据集,则称为通信内聚。
● 顺序内聚∶如果一个模块的各个成分和同一个功能密切相关,而且一个成分的输出作为另
一个成分的输入,则称为顺序内聚。
● 功能内聚∶模块的所有成分对于完成单一的功能都是必需的,则称为功能内聚。
【辅导专家提示】内聚性参考记忆口诀∶"偶逻时过通顺功"。
※耦合性由低到高有以下几种类型∶
● 非直接耦合∶两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。
● 数据耦合∶一个模块访问另一个模块时,彼此之间是通过简单数据参数
(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的。
● 标记耦合;一组模块通过参数表传递记录信息,就是标记耦合。这个记录
是某一数据结构的子结构,而不是简单变量。其实传递的是这个数据结构的地址。
● 控制耦合∶如果一个模块通过传送开关、标识、名字等控制信息,明显
地控制选择另一模块的功能,就是控制耦合。
● 外部耦合∶一组模块都访问同一全局简单变量,而不是同一全局数据结构,而且不是通过
参数表传递该全局变量的信息,则称为外部耦合。
● 公共耦合∶若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。
公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。
● 内容耦合∶如果发生下列情形,两个模块之间就发生了内容耦合。
【辅导专家提示】耦合性参考记忆口诀∶"非数标控外公内"。
(1)一个模块直接访问另一个模块的内部数据。
(2)一个模块不通过正常入口转到另一模块内部。
(3)两个模块有一部分程序代码重叠(只可能出现在汇编语言中)。
(4)一个模块有多个入口。
3.软件测试
软件测试是指使用人工或者自动手段来运行或测试某个系统的过程,其目的
在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。
软件测试从是否关心软件内部结构和具体实现的角度划分为白盒测试、黑盒
测试、灰盒测试;从是否执行程序的角度划分为静态测试、动态测试;从软件开发
的过程按阶段的角度划分为单元测试、集成测试、确认测试、系统测试、验收测
试。
动态测试指通过运行程序发现错误∶静态测试指被测试程序不在机器上运
行,而是采用人工检测和计算机辅助静态分析的手段对程序进行检测。
黑盒测试把被测试对象看成一个黑盒子,测试人员完全不考虑程序的内部结
构和处理过程,只在软件的接口处进行测试,依据需求规格说明书,检查程序是
否满足功能要求。白盒测试把测试对象看作一个打开的盒子,测试人员须了解程
序的内部结构和处理过程,以检查处理过程的细节为基础,对程序中尽可能多的
逻辑路径进行测试,检验内部控制结构和数据结构是否有错,实际的运行状态与
预期的状态是否一致。由于白盒测试是结构测试,所以被测对象基本上是源程序,
以程序的内部逻辑为基础设计测试用例。灰盒测试是一种介干白盒测试与黑众测试之
间的测试,它关注输出 对于输入的正确性,同时也关注内部表现。但这种关注不像
白盒测试那样详细且完整,而只是通过报一些表征性的现象、事件及标志来判断
程序内部的运行状态。
桌前检查由程序员自己检查自己编写的程序。
代码审查是由若干程序员和测试员组成一个会审小组,通过阅读、讨论和争
议,对程序进行静态分析的过程。
代码走查与代码审查的过程大致相同,但开会的程序与代码审查不同,代码
走查不是简单地读程序和对照错误检查表进行检查,而是让与会者"充当"计算
机,集体粉演计算机角色,让测试用例沿程序的逻辑运行一遍,随时记录程序的
踪迹,供分析和讨论用。
面向对象测试是与采用而向对象开发相对应的测试技术,它通常包括 4 个测
试层次,从低到高排列分别是算法层、类层、模板层和系统层。
性能测试是通过自动化的测试工具模拟多种正常峰值以及异常负载条件来
对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可
以结合进行,统称为负载压力测试。通过负载测试,确定在各种工作负载下系统
的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。
压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能
提供的最大服务级别的测试。
第三方测试指独立于软件开发方和用户方的测试,组织的测试也称为"独立
测试"。软件质量工程强调开展独立验证和确认(IV&V)活动,是由在技术、管
理和财务上与开发组织具有规定程序独立的组织执行验证和确认过程。软件第三
方测试是由相对独立的组织进行的软件测试,一般情况下是在模拟用户真实应用
环境下,进行软件确认测试。
4. 软件维护
所谓软件维护就是在软件已经交付使用之后,为了改正错误或满足新的需要
而修改软件的过程。依据软件本身的特点,软件的可维护性主要由可理解性、可
测试性、可修改性三个因素决定。
软件的维护从性质上分为纠错性维护、适应性维护、预防性维护和完善性维
护。
纠错性维护是指改正在系统开发阶段已发生而系统测试阶段尚未发现的错
误。
适应性维护是指使用软件适应信息技术变化和管理需求变化而进行的修改。
完善性维护是为扩充功能和改善性能而进行的修改,主要是指对已有的软件系统
增加一些在系统分析和设计阶段中没有规定的功能与性能特征,这方面的维护占
整个维护工作的 50%~60%。
预防性维护是为了改进应用软件的可靠性和可维护性,为了适应未来的软硬件环境的变化,主动增加预防性的新功能,以使应用系统适应各类变化而不被淘汰。
四、软件过程改进
软件过程改进(Software Process Improvement,SPI)帮助软件企业对其
软件过程的改进进行计划、制定以及实施,它的实施对象就是软件企业的软件过
程,也就是软件产品的生产过程,当然也包括软件维护之类的维护过程。
CMM(Capability Maturity Model for Software,全称为 SW-CMM,软件能
力成熟度模型)就是结合了质量管理和软件工程的双重经验而制定的一套针对软件生产过程
的规范。CMM 是对于软件组织在定义、实施、度量、控制和改善其软件过程的实践中各个发
展阶段的描述。CMM 的核心是把软件开发视为一个过程,并根据这一原则对软件
开发和维护进行过程监控和研究,以使其更加科学化、标准化,使企业能够更好
地实现商业目标。CMM 将成熟度划分为 5 个等级
(1)初始级∶软件过程的特点是无秩序的,有时甚至是混乱的。软件过程定义几乎处
于无章法和无步骤可循的状态,软件产品所取得的成功往往依赖极个别人的努力和机遇。
初始级的软件过程是未加定义的随意过程,项目的执行是随意甚至是混乱的。也许有些企业
制定了一些软件工程规范,但若这些规范未能覆盖基本的关键过程要求,且执行没有政策、
资源等方面的保证时,那么它仍然被视为初始级。
(2)可重复级∶已经建立了基本的项目管理过程,可用于对成本、进度和功能特性进行跟踪。
对类似的应用项目有章可循并能重复以往所取得的成功。焦点集中在软件管理过程上。
一个可管理的过程则是一个可重复的过程,一个可重复的过程则能逐渐演化和成熟。
从管理角度可以看到一个按计划执行的且阶段可控的软件开发过程。
(3)已定义级∶用于管理和工程的软件过程均已文档化、标准化,并形成整个软件组
织的标准软件过程。全部项目均采用与实际情况相吻合的、适当修改后的标准软件过程来进行操作。
要求制定企业范围的工程化标准,而且无论是管理还是工程开发都需要一套文档化
的标准,并将这些标准集成到企业软件开发标准过程中。所有开发的项目需根据这个标准过
程,剪裁出项目适宜的过程并执行。过程的剪裁不是随意的,在使用前需经过企业有关人员
的批准。
(4)已管理级;软件过程和产品质量有详细的度量标准。软件过程和产品质量得到了
定量的认识和控制。已管理级的管理是量化的管理。所有过程需建立相应的度量方式,所有
产品的质量(包括工作产品和提交给用户的产品)需有明确的度量指标。这些度量应是详尽
的,且可用于理解和控制软件过程和产品,量化控制将使软件开发真正变为一个工业生产活
动。
(5)优化级∶通过对来自过程、新概念和新技术等方面的各种有用信息的定量分析,
能够不断地、持续地进行过程改进。如果一个企业达到了这一级,表明该企业能够根据实际
的项目性质、技术等因素,不断调整软件生产过程以求达到最佳。从
CMMI(Capability Maturity Model Integration,能力成熟度模型集成)是 CMM 模型
的最新一一编版本
CMMI 也划分为 5 个成熟度级别∶
(1)完成级。在完成级水平上,企业对项目的目标与要做的努力很清楚,项目的目标
得以实现。但是由于任务的完成带有很大的偶然性,企业无法保证在实施同类项目的时候仍
然能够完成任务。企业在完成级上的项目实施对实施人员有很大的依赖性。
(2)管理级。在管理级水平上,企业在项目实施上能够遵守既定的计划与流程,有资
源准备,权责到人,对相关的项目实施人员有相应的培训,对整个流程有监测与控制,并与
上级单位对项目和流程进行审查。企业在二级水平上体现了对项目的一系列的管理程序。这
一系列的管理手段排除了企业在一级时完成任务的随机性,保证了企业的所有项目实施都会
得到成功。
(3)定义级。在定义级水平上,企业不仅能够对项目的实施有一整套的管理措施,并
保障项目的完成;而且,企业能够根据自身的特殊情况以及自己的标准流程,将这套管理体
系与流程予以制度化,这样,企业不仅能够在同类的项目上得到成功的实施,在不同类的项
目上一样能够得到成功的实施。科学的管理已经成为企业的一种文化、组织财富。
(4)量化管理级。在量化管理级水平上,企业的项目管理不仅形成了一种制度,而且
要实现数字化的管理。对管理流程要做到量化与数字化。通过量化技术来实现流程的稳定性,
实现管理的精度,降低项目实施在质量上的波动。
(5)优化级。在优化级水平上,企业的项目管理达到了最高的境界。企业不仅能够通
过信息手段与数字化手段来实现对项目的管理,而且能够充分利用信息资料,对企业在项目
实施的过程中可能出现的次品予以预防。能够主动改善流程,运用新技术,实现流程的优化。
五、软件复用
软件复用,又称软件重用,是指在两次或多次不同的软件开发过程中重复使用相同或相
近软件元素的过程。软件元素包括程序代码、测试用例、设计文档、设计过程、需求分析
文档甚至领域知识。通常,把这种可重用的元素称作软件构件,简称为构件。可重用的软件
元素越大,就说重用的粒度越大。
六、面向对象基础
首先要掌握一些基本的术语。对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。面向对象的软件系统是由对象组成的,复杂的对象由比较简单的对象组合而成∶
类是对象的抽象定义,是一组具有相同数据结构和相同操作的对象的集合,类的定
义包括一组数据属性和在数据上的一组合法操作。也就是说,类是对象的抽象,对象是类的
具体实例。
封装是对象的一个重要原则。它有两层含义;第一,对象是其全部属性和全部服务紧密
结合而成的一个不可分割的整体;第二,对象是一个不透明的黑盒子,表示对象状态的数据
和实现操作的代码都被封装在愿盒子里面。使用一个对象的时候,只需知道它向外界提供的
接口形式,无须知道它的数据结构细节和实现操作的算法。
继承是使用已存在的定义作为基础建立新的定义。
多态中最常用的一种情况就是,类中具有相似功能的不同函数是用同一个名称来实现
的,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数。
接口∶操作的规范说明,说明操作应该做什么。