简介:这是中南大学软件学院《软件度量》课程的复习重点整理,面向软件工程专业学生及需要系统掌握软件度量基础的开发者,用于考前冲刺、知识梳理与概念辨析。资源将课程核心章节浓缩为一份可读性较高的笔记,覆盖测量的基本概念、用头脑/单词/数字度量的三个阶段、六大测量尺度(标定、类型、序列、间隔、比例、绝对),并梳理直接测量与间接测量的区别;同时深入第二章软件度量概念、过程/产品/资源三类实体度量、内部与外部属性,以及有效软件度量的实施步骤,第三章则归纳软件规模度量方法与Halstead长度度量等内容。包体为1个docx文档(1.66MB),排版适合打印或电子阅读,便于对照教材逐条复习。目前已有467人学习下载,适合考前快速回顾或作为课程笔记补充。 每年期末,软件度量这门课都会刷掉一批人。我在中南大学软件学院读研时做过这门课的助教,见过太多代码写得不错、一到度量计算就懵的同学。其实软件度量没想象的那么玄,核心就三件事:先搞清要度量什么,再按规则算出来,最后用数据解释质量或者过程。今天这篇就把复习重点一次性整理清楚,包括常考概念、高频公式、典型例题和我自己踩过的坑,希望能帮你少走弯路。
软件度量这门课最大的特点就是“看起来简单,做起来容易混”。因为度量指标实在太多,而且很多概念边界模糊,比如规模、工作量、成本、质量这些词,平时说说都能理解,一到计算题就开始乱套。所以复习的核心思路只有一个:先建好分类框架,再往框架里填公式和场景。框架稳了,题目怎么变都不怕。
1. 先搞懂课程主线:软件度量不是“算算数”
1.1 从“可度量目标”出发:GQM模型是万金油
GQM(Goal-Question-Metric)模型是这门课的骨架,也是考试最喜欢让人画图或者举例的考点。它的思路很简单:从业务目标出发,拆解成可以回答的问题,再为每个问题找到可以量化的指标。
举个例子,如果你的目标是“提高软件交付质量”,那问题可以是“交付后的缺陷率有没有下降”,对应的度量指标就是“缺陷密度”和“缺陷去除率”。考试时如果让你设计度量方案,不要一上来就写指标,先写目标,再写问题,再写指标,这个顺序本身就值分。
GQM模型为什么反复考?因为它体现了软件度量的一个根本原则:度量不是自娱自乐,而是为目标服务。没有目标就选指标,最后出来的数据既没人看,也没法指导改进。复习时可以把GQM当作主线索,把后面所有指标都挂靠到“目标→问题→指标”这条链上,记忆效率会高很多。
另一个容易考的点是“基线(Baseline)”和“目标(Target)”的区别。基线是当前状态,目标是想达到的状态。比如缺陷密度当前是5个/KLOC,目标是降到2个/KLOC,这中间才引出改进动作。很多同学只记公式,忘了这种概念题,其实这类送分题更需要拿稳。
1.2 过程度量、产品度量、项目度量怎么分
软件度量通常分成三类:产品度量、过程度量和项目(资源)度量。考试时经常给一个具体指标,让你判断它属于哪一类,或者反过来让你举例。这个分类很像给水果分类,看似简单,但总有人把项目进度当产品度量。
产品度量针对的是“软件产物”,包括规模、复杂度、质量、可维护性等;过程度量针对的是“开发活动的能力”,比如生产率、缺陷去除率、过程时间;项目度量则关心“项目情况和资源”,比如成本、进度偏差、人员配置。
这里有个经典的记忆方法:产品是对“代码和文档”说话,过程是对“做事效率”说话,项目是对“资源和时间”说话。缺陷密度属于产品度量,因为它衡量的是交付物里的缺陷;缺陷去除率属于过程度量,因为它衡量的是测试过程发现缺陷的能力;成本偏差属于项目度量,因为它描述的是项目预算的执行情况。
考试中还有一种陷阱题:同一个指标可以出现在多个类别里。比如生产率,既可以用“代码行/人月”来反映开发过程效率,也会被当作项目资源使用率来衡量。遇到这种情况,先看题目给的上下文,再判断最合适的分类,不要一看到“生产率”就直接写过程度量,要看看它到底在问哪个层面。
2. 高频考点:规模度量与复杂度度量,公式必须闭眼能写
2.1 代码行、功能点、用例点:三种规模度量的选择题与计算题
规模度量是后续所有度量的基础,没有规模,缺陷密度、生产率都是空中楼阁。考试中最常出现的是代码行(LOC)和功能点(FP)。
代码行最直接,但坑也最多。它的争议在于“什么叫一行代码”,注释算不算、空行算不算、一个语句跨多行怎么算,这些问题在现实中吵不完,考试里却经常给明确规则,比如“只计算非空非注释的可执行代码行”。遇到LOC题目,先看清楚单位,是LOC还是KLOC,计算缺陷密度时尤其容易在乘算时搞混。
功能点分析是更“科学”的规模度量,因为它不依赖具体语言,从用户视角出发。功能点的核心公式是:
FP = 未调整功能点数 × (0.65 + 0.01 × ΣD_i)其中未调整功能点数由五类基本组件加权求和得到:外部输入、外部输出、外部查询、内部逻辑文件、外部接口文件。每种组件还要根据复杂度选择低、中、高三种权重,考试中如果没给权重表,通常会用简化权重:外部输入4,外部输出5,外部查询4,内部逻辑文件10,外部接口文件7。
很多人忘记最后一步“调整因子”,这是最容易丢分的地方。调整因子中的ΣD_i是14个通用系统特性的影响程度总和,取值范围0到70。整个公式本质上是把非功能需求也纳入考虑。复习时可以把这14个特性粗略记成“通信、分布式、性能、负载、数据量、交互、联机更新、效率、复杂性、复用、易安装、易操作、多站点、易变更”,能记住核心几个就不容易被题干绕晕。
用例点(Use Case Points)在研究生阶段可能涉及,本科考试相对少。它和功能点思路类似,先计算未调整用例点和未调整技术因子,再乘环境因子。如果时间紧张,优先级排在功能点之后。
2.2 McCabe环路复杂度和Halstead指标:复杂度考点的两座大山
复杂度度量是软件度量里计算性最强的部分,其中McCabe环路复杂度几乎每年都考。环路复杂度的物理意义是“独立路径的最小数量”,也可以理解为“做测试时要准备多少条路径才能全覆盖”。
最常用公式是:
V(G) = E - N + 2其中E是控制流图中的边数,N是节点数。还有一种更快的方式:
V(G) = P + 1其中P是二值判定节点(if、while、for等)的数量。考试时如果给代码,先数if、while、for的个数,再加1,速度很快;如果给控制流图,就用E-N+2。务必注意for循环也算一个判定,switch-case的计算要看题目规则,有些教材把switch的每个case都算判定,有些只算整个switch为一个判定,不看清题目规则容易做错。
Halstead指标相比McCabe更像“软件物理学”,它从操作符和操作数出发。这里的关键是分清“种类”和“出现次数”:n1表示不同操作符的种类数,n2表示不同操作数的种类数,N1表示操作符总出现次数,N2表示操作数总出现次数。程序长度N = N1 + N2,词汇表n = n1 + n2,程序容量V = N × log₂(n)。
考试中Halstead通常会给你一小段伪代码,让你统计n1、n2、N1、N2。这种题没有技术难度,但特别考细心。操作符包括算术运算符、赋值号、括号、分号、关键字(if、while、return)等;操作数包括变量名、常量等。最容易漏的是括号和赋值号,建议按行逐字统计,用四列表格记录,不要跳着数。
3. 质量与过程度量:考试里的“应用题”都在这块
3.1 可靠性指标体系:MTTF、MTBF、MTTR和缺陷密度
可靠性度量看起来像概率题,其实是公式题。考试中常见的几个概念经常放在一起考:MTTF(平均无故障时间)、MTTR(平均修复时间)、MTBF(平均故障间隔时间)。三者的关系是:
MTBF = MTTF + MTTR很多同学背了这个公式但不会用。题目如果告诉你系统正常运行了90小时,发生故障后修理了10小时,那么MTTF是90小时,MTTR是10小时,MTBF是100小时。这里的陷阱在于,题目有时候会直接说“平均故障间隔时间为100小时”,然后再问修复时间,其实就是反过来算。
另一个高频考点是缺陷密度:
缺陷密度 = 缺陷总数 / 软件规模(通常以KLOC为单位)题目可能给出测试阶段发现的缺陷和发布后用户发现的缺陷,让你计算整体缺陷密度。注意单位,如果规模给的是LOC,最终回答时记得换算。
还有一个容易混淆的概念:Fault、Error、Failure。Error是人的错误,Fault是错误引起的代码缺陷(故障),Failure是缺陷被触发后的失效。考试可能给一个场景:“程序员把逻辑符号写错,导致程序在特定数据下崩溃”,问你哪部分是Fault、哪部分是Failure。这种题就考察概念边界,背清楚三者链条即可。
3.2 缺陷去除率与生产率:过程度量的两个典型计算
缺陷去除率(DRE)是衡量测试过程有效性的重要指标,公式是:
DRE = 开发阶段发现的缺陷数 / (开发阶段发现的缺陷数 + 交付后用户发现的缺陷数)这个公式之所以常考,是因为很多同学会漏掉分子分母里同一个缺陷数。举个实际例子:内测发现80个缺陷,发布后6个月内用户反馈20个缺陷,则DRE = 80 / (80 + 20) = 80%。DRE越高,说明缺陷越早被发现,测试效果越好。
生产率计算相对简单,通常是“规模除以工作量”。常见表达是KLOC/人月或FP/人月。考试时要注意工作量的单位,题目如果给“12人天”,要换算成人月,简单除以22个工作日(或按题目标注的换算规则)。这里没有统一标准,但有经验值:大多数教材和题目把人月记为22个工作日或160个小时,看到具体题目先看有没有给出换算依据。
还有一种“复杂度调整因子”在质量度量里也会出现:可维护性指数(Maintainability Index)。这个指标算法比较复杂,考试一般只考概念,很少考计算,理解成“结合复杂度、代码行、注释数量等综合反映代码可维护性的一个分数”就够了。如果有时间,记住公式大致形态,但优先级放在McCabe和Halstead之后。
4. 复习时的常见误区与避坑清单:这些都是丢分重灾区
4.1 概念混淆清单:考前必须分清的五组概念
软件度量考试有很多“看起来差不多”的术语,这里把最容易混的整理成一张速查表:
| 易混淆组 | 区别要点 |
|---|---|
| 测量(Measurement)与度量(Metrics) | 测量是获得数据的过程,度量是用于量化属性的一组规则 |
| 验证(Verification)与确认(Validation) | 验证是“把东西做对”,确认是“做对的东西”,考试会考中英文定义 |
| 有效性与可靠性 | 有效性是“测到了想测的东西”,可靠性是“多次测量的结果一致” |
| 规模(Size)与工作量(Effort) | 规模是产品大小,工作量是人月,两者有相关性但不等价 |
| 复杂度(Complexity)与难度(Difficulty) | 复杂度是代码本身的结构特征,难度更偏向主观理解成本 |
这些混淆点不会单独考,但会藏在判断题和选择题里。比如题目说“代码行数是项目工作量的直接等同指标”,这句话错得很厉害,因为规模只影响工作量,还受人员能力、开发方法、技术栈等因素影响。理解了这一点,就能避免看到LOC就开始换算人月的错误。
4.2 计算题丢分点:单位、公式边界和过程细节
结合我改卷的经验,计算题最常见的失分原因不是不会算,而是细节处理不到位,这里列几个最典型的坑:
第一,单位丢失。题目给KLOC,计算出来的缺陷密度是X个/KLOC,但有人最后顺手写成X个/LOC,导致结果放大1000倍。建议做题时分两步:先把规模统一成KLOC,再代入公式。
第二,McCabe控制流图画错。很多人用代码画图时漏掉了出口节点。不管代码怎么复杂,控制流图一定有一个入口和一个出口。如果按P+1算,就不会画图问题,但题目如果明确要求先画控制流图再算,那你最好练几道图例题,避免平时只记公式。
第三,Halstead统计漏项。赋值符号、比较符号、函数调用括号都要算操作符。很多人在统计时只关注算术运算符,忘记了赋值号“=”和逻辑判断符号。我在助教时看到最夸张的情况,一个简单程序能差出5个操作符,后面的程序容量自然全错。
第四,功能点调整因子忘记扣基础值。FP公式是“未调整FP × (0.65 + 0.01ΣD_i)”,不是“未调整FP × (1 + 0.01ΣD_i)”。0.65这个偏移量经常被记错,建议把公式拆成“加入非功能需求后综合影响为0.65到1.35之间”,这样就不容易记混淆。
5. 根据中南软院的考法,安排复习节奏更高效
5.1 三轮复习法:过书上重点、刷计算题、再做一套自测题
我辅导过的学生里,复习效果最好的普遍不是考前通宵那种,而是有明确轮次的。第一轮建议用两到三天把课件和教材过一遍,重点看GQM、分类框架、各度量的定义和公式,这个阶段不要纠结细节,只要能在纸上默写出每个部分的核心关键词就行。
第二轮专门刷计算题。软件度量的计算题类型其实很固定:功能点、McCabe、Halstead、缺陷密度、DRE、生产率。你把每种类型练两到三道,基本就能覆盖考试中90%的计算题目。我建议准备一个“公式本”,把每个公式适用条件写清楚,尤其是McCabe什么时候用P+1,什么时候用E-N+2,用错场景比公式背不出来更可惜。
第三轮找一套往年题或者老师PPT里的例题做自测,限定时间完成。这一轮主要练手感和查漏补缺。做题时特别关注题干里那些“额外说明”,比如“不计算注释行”“每个case都算一个判定”“人月按22天计”,这类条件往往就是老师设计的区分点,也是送分点。
5.2 考前一晚还能捞分的优先级排序
如果你现在才刚开始复习,不要试图把每个细节都背下来,时间不够。我的建议是把冲刺精力放在三个高频且必拿分的模块:第一,GQM模型的画图和解释;第二,功能点和McCabe环路复杂度的计算;第三,缺陷密度和DRE的计算。这三块内容稳定、题型固定、得分率高,性价比最高。
相比之下,Halstead虽然也会考,但统计麻烦,容易出错,如果你的基础稍微薄弱,可以放到第三优先级。可靠性指标的MTTF、MTBF、MTTR属于公式简单但概念容易绕的点,花一个小时理解清楚即可。
还有一个容易被忽略的捞分点:简答题里的“为什么”。比如“为什么要做软件度量”“为什么不能用代码行直接衡量开发效率”,这种题没有标准公式,但可以从“目标驱动、支持决策、避免拍脑袋”这个角度展开,再结合一两个实际场景说明。平时复习时,可以用自己的话复述每个概念的意义,而不是死记定义,这样到了考场反而更容易写出有逻辑的答案。
如果你现在还在焦虑知识点太多,先不用慌张。把GQM的骨架搭起来,再往里填规模、复杂度、质量、过程四类指标,最后用往年题自测一遍,相信我,这门课拿到一个理想成绩并不难。
本文还有配套的精品资源,点击获取