APP下载

罗盘研发效能评估系统设计与实现

2021-03-11郑喆颖王欢唐飞程必伟申力

电子技术与软件工程 2021年21期
关键词:复杂度代码效能

郑喆颖 王欢 唐飞 程必伟 申力

(1.东方证券股份有限公司 上海市 200010 2.南京航天数智科技有限公司 江苏省南京市 210012)

科学技术的不断进步和经济的不断发展促使全球化市场竞争日趋激烈,组织敏捷化成为企业最新发展方向。

软件维护的不透明,我们软件代码当中存在很多质量问题;项目完成质量参差不齐;开发过程不透明,一个团队和开发人员实际开发的效能,程序员的工作难以评价;软件资产没有得到有效的记录,很多代码难以理解,无法准确把握代码意图。如何度量一个研发组织的产品质量,一个项目的研发效能,如何客观评价研发人员的工作完成质量,如何运用考核指标促成员工成长,达到考核的管理目标。

真正实现数据驱动的研发效能提升,不是对效能指标进行简单的统计,更需要对研发活动建模,进而改进研发活动过程。

如上分析,以某公司信息技术研发部门为例,组织敏捷化进程可能使用的场景有:

(1)数字化实施:如何衡量各个二级部门、项目在研发数建设以及主航道工具的使用情况?

(2)横向效能比较:如何跨二级部门、跨项目进行横比较?衡量研发效能产出、资源投入?

(3)人员效能评估:如何跨项目、跨角色、跨编程语言,衡量研发人员效能?以及对优质供应商的评估?

(4)研发效能看板:如何实时度量当前研发现状,包括人力、需求、缺陷、代码、用例数据,通过数据指导改进?

1 效能评估模型设计

1.1 效能评估的意义

互联网时代,软件行业爆发式发展,用户需求频繁变更,企业组织成员协同更复杂,敏捷项目管理也越来越盛行,快速反应,鼓励试错和不停迭代,适应变化的轻量级敏捷开发管理日益被接受。敏捷组织中,知识工作的不确定性更高、组织成员相互协同更复杂。组织的效能评估和度量也更有挑战和难度。这是一项有意义的工作:首先,让目标更明确,对目标有共同的认识。其次,让现状更清晰,度量可以告诉我们现状如何、效率如何、质量如何、流程如何以及问题所在。第三,让改进更精准。

1.2 评估指标设计原则

评估度量系统中,指标是主观事件客观呈现的效果。数据指标是评估系统最直接的支撑,也是数字化的底层结构。总计业界经验,我们认为进行指标设计时应遵从以下几个原则:

(1)全局性。在敏捷交付过程中,包含很多关键路径,项目管理、资源管理、研发管理、测试管理,交付管理、项目后评价,全局指标可以进行过程管理也可以进行结果回溯。

(2)细分性。以交付为例,项目经理负责管控整个交付流程,开发经理关注代码提交质量,而部门负责人关注人力投入效率。整个交付阶段的全局性指标应该分解到需求、开发、测试、发布、运维各个关键节点中。将主指标切成若干块,这样可以避免平均数陷阱和团队的虚荣指标。如空间维度,区分部门、项目和个人不同考察指标,再如,通过年,季度和月长期时间维度度量组织的健康度。

(3)制衡性。需要用多个指标来互相制约以求得平衡。

(4)演进性。绩效指标应该随着组织的发展不断调整。

1.3 康威定理

效能评估模型的设计,依据康威定律而来。

马尔文·康威在1967年的论文中阐述了系统设计与组织架构的内在联系,“设计系统的架构受制于产生这些设计的组织的沟通结构”。通俗的来讲,产品必然是其(人员)组织沟通结构的缩影。沟通问题会带来系统设计问题,进而影响整个研发组织的开发效率及最终产品结果。基于康威定理,设计组织的效能评估基准以推动组织的改进。

2 罗盘效能评估系统设计

2.1 评估模型设计

研发效能的模型设计,基于输入、输出、质量进行抽取,选择最最关键指标:产出及质量作为核心指标,计算效能公式,如图1所示。

图1:研发效能模型设计

接着,模型设计从两个维度出发,空间维度和时间维度。空间包括完成部门、项目、个人,三个层级颗粒度的效能评估模型,以支撑系统研发总部的管理颗粒度;时间维度包括年、季度、月的维度,查看各个空间维度的数据,较长时间段进行跟踪。

第三步,进行模型设计。以项目评估为例,效能E=产出*产出权重R1+质量*质量权重R2。最终,针对项目维度细化后,其评估模型为,E =(I1*R1/B1+I2*R2/B2+I3*R3/B3+I4*R4/B4+I5*R5/B5 +(I6_MA3-I6)*R6/B6)/项目研发人力

同样,按照角色,设计本系统的开发人员,测试人员及UED等人员的绩效模型。

2.2 系统模块设计

罗盘系研发效能评估系统按照DaaS 结构设计,平滑支持演进。其架构设计如图2所示。

图2:罗盘系统架构

2.2.1 配置管理模块

建立部门、项目、人员的归属关系,建立项目与需求、代码(分支)、用例、缺陷的对应关系,完成整个关系的建模及填报系统;

2.2.2 数据采集模块

此模块主要功能,建立JIRA、Git、ALM、人力投入等系统,完成量化数据的采集。

2.2.3 数据关联及计算模块

此模块根据对应关系数据、工作产出数据,根据模型进行计算;

采集和计算模块每天定时对组织代码进行扫描,并采集前一天最新提交代码,进行计算分析,绘制上升和下降趋势图形,对组织中某时间段内代码质量进行统计,对开发人员每月增量代码质量进行标准量化考核。支持C/C++ (works with C++14),Java,C# (C Sharp),JavaScript (With ES6 and JSX)等多种语言。

2.2.4 效能服务及展示模块

此模块根据业务场景及研发管理诉求,建立研发系统总部量化指标,从时间维度支持不同月份、多个月份的数据展示,从空间维度支持部门、项目层层下钻展示;

(1)可以通过本模块,由至上而下视角,分析哪个部门效能数据做得好还是待改进,然后下钻到部门下面所有项目进行进一步分析,最终再到项目下各个研发人员效能进一步确认原因;

(2)按照研发人员角色建模,根据各个阶段的产出及质量反馈综合评分,给出排名;各角色按月度打分,客观数据和主观数据相结合,根据长期得分情况综合确定该人员绩效是否合格,可用于供应商人员考核、签约、加薪等场景;

(3)根据人员角色定义职能;通过最新人力填报查询,人员与业务线关联关系,分析统计部门人员编程语言使用分布及提交情况,形象展示部门的人力报表,学历、岁数分段、职能、代码,服务的业务线等数据。

3 关键技术

3.1 代码行计算

代码行数需要比较两次提交的增量代码,变动场景判定:增加行,删除行,修改行,新增文件,删除文件,修改文件名,移动文件目录,代码中包含空行,注释等非有效代码,计算时会根据不同代码语言进行过滤统计,考虑每种语言的特性,进行代码行计算后,会通过语言比例因子换算,计算出标准代码行。

执行过程

cloc gcc-5.2.0/gcc/c

3.2 圈复杂度计算

圈复杂度可以用来判断软件的复杂度,它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的可能错误和高的圈复杂度有着很大关系。

3.2.1 评估项目圈复杂度

对于整个项目的代码圈复杂度,我们建议使用函数平均圈复杂度,用于确定项目的整体复杂度。

示例:项目A 和项目B 均是Java 开发业务系统,项目A 的平均圈复杂度为2.3,项目B 的平均圈复杂度为6.1,则从数值上我们认为项目A 的代码状况相对较好一些。

3.2.2 评估个人圈复杂度

对于项目中的成员,我们就不能再将他的代码质量用函数圈复杂度来衡量了,因为其可以增加一个函数、修改一个函数、删除一个函数,因此我们更喜欢用每次提交的变动代码的圈复杂度来衡量其代码质量。

示例:某项目成员A,通过重构,将某文件的累计圈复杂度从100 降低为80,变动代码为500 行,则本次代码提交圈复杂度为-20,我们认为表现优良。

3.2.3 评估方法

工具lizard。

命令执行示例:

$ lizard -C 10000 -L 10000 -X /path/source

3.2.4 执行过程

执行圈复杂度扫描工具,结果保存为文件,文件名为“gerrit提交标识.ccn.xml”;

扫描xml 文件,将信息写入数据库。

3.3 重复度计算

重复度是一种代码复杂度的衡量标准,用来表示程序的复杂度,它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。重复度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的可能错误和高的重复度有着很大关系。

3.3.1 评估项目重复度

对于整个项目的代码重复度,我们建议使用函数平均重复度,用于确定项目的整体复杂度。

示例:项目A 和项目B 均是Java 开发业务系统,项目A 的平均重复度为2.3,项目B 的平均重复度为6.1,则从数值上我们认为项目A 的代码状况相对较好一些。

3.3.2 评估个人重复度

对于项目中的成员,我们就不能再将他的代码质量用函数重复度来衡量了,因为其可以增加一个函数、修改一个函数、删除一个函数,因此我们更喜欢用每次提交的变动代码的重复度来衡量其代码质量。

示例:某项目成员A,通过重构,将某文件的累计重复度从100 降低为80,变动代码为500 行,则本次代码提交重复度为-20,我们认为表现优良。

3.3.3 评估方法

目前业界普遍使用的重复度评估工具是CPD。

命令执行示例:

$ ./run.sh cpd --minimum-tokens 100 --files /path/to/c/source

--language cpp --skip-duplicate-files --skip-lexical-errors --format xml

3.3.4 执行过程

针对每次提交,根据代码扫描结果,确定新增代码类型;

根据新增代码类型,分别执行重复度扫描工具,结果保存为文件,文件名为“gerrit 提交标识.language.xml”;

扫描xml 文件,根据以下公式,将信息写入数据库;

重复代码次数 = (duplication.lines>=10) && (COUNT(duplication/file) - 1)

4 结语

研发效能作为数字化企业的核心竞争力日益凸显,真正实现数据驱动的研发效能提升,具有理论和实践的双重意义。发展和完善软件系统评价技术具有广阔前景。

本文所设计的罗盘效能评估系统在某公司研发部门上线后,运行良好。开发一部在用例、代码、需求、缺陷等维度都表现优秀且均衡;开发五部目前用例数据没有体现,其余部分都表现良好;开发六部和开发七部各项指标很均衡,长期视角看,其余部门数据应向六部和七部靠拢。

本文所设计的罗盘效能评估系统,以科学的度量模型,再运用高效率的呈现手段,从时间维度支持不同月份、多个月份的数据展示,从空间维度支持部门、项目展示。数据充实,跨项目、跨角色、跨编程语言,实现衡量不同角色的效能。以研发数据为基准,分析各研发部门的目标差距,以准确的研发度量数据,促进开发过程改进,优化产品质量管理。实施以来,罗盘系统为软件组织提供持续改进方案方面取得了亮眼的成绩。

猜你喜欢

复杂度代码效能
同时多层扩散成像对胰腺病变的诊断效能
充分激发“以工代赈”的最大效能
一种低复杂度的惯性/GNSS矢量深组合方法
创世代码
创世代码
创世代码
创世代码
求图上广探树的时间复杂度
某雷达导51 头中心控制软件圈复杂度分析与改进
唐代前后期交通运输效能对比分析