用于衡量代码稳定性的源代码指标?


17

考虑到在发行周期(实现,测试,错误修复,发行)中软件的开发方式,我认为人们应该能够看到在代码库中更改过的代码行中的某种模式。例如,在项目结束时,如果代码变得更稳定,则应该看到每单位时间修改的代码行更少。

例如,可以看到在项目的前六个月中,平均每天200行代码,而在上个月中,每天平均50行代码,而在最后一周(就在产品DVD发行之前)已发货),根本没有更改任何代码行(代码冻结)。这只是一个例子,根据特定团队采用的开发过程,可能会出现不同的模式。

无论如何,是否有任何代码度量标准(有关其文献资料?)使用每单位时间的代码修改行数来衡量代码库的稳定性?如果项目到达某个地方或者距离发布尚很遥远,它们是否对感觉有用?是否有任何工具可以从版本控制系统中提取此信息并生成统计信息?



4
“其次,机制是抽象的,其生产被包含在其设计中。在这方面,程序就像一首诗:您不能不写就写一首诗。但是人们却像在谈论编程一样,将其视为生产过程和度量。”程序员的生产率”用“产生的代码行数”来表示。这样做的话,他们在总账的错误一侧记录了该数字:我们应该始终引用“花费的代码行数”。- 误会的结果,埃德斯·迪克斯特拉(Essger W. Dijkstra)。
yannis

3
@Yannis Rizos:我绝不建议用LOC来衡量生产力或代码复杂性,因为我知道这不是一个好方法。另一方面,如果在发货前两天更改了300行代码,我作为经理会想到一个大的“ RED ALERT”灯(除非有计划,并且是对风险进行非常仔细评估的结果) )。通常,我认为已经使用(和测试)了很长时间的代码比每天更改100行的代码“更稳定”。
乔治,

2
@Giorgio Argh,我在发布另一条评论(在第一个字符中达到了字符数限制)时被打扰(这里是工作日的中间)。并不是说您在谈论生产力,Dijkstra的名言刚刚浮现在脑海,我认为这很有趣。无论如何,代码流失指标非常接近您要寻找的指标,并且有大量的文献资料。至于工具,Atlassian的FishEye非常出色。
yannis 2013年

@Yannis Rizos:确实是一个非常有趣的阅读。至于FishEye,我们在工作场所使用它(以供审核),因此我将立即研究该手册,并查看可以产生什么样的统计数据。
乔治,

Answers:


17

迈克尔·费瑟(Michael Feather)所描述的一种度量是“ 活动集 ”。

他测量了相对于“封闭”类别增加的类别数量。将类关闭描述为:

从该日期到现在为止,该类的关闭日期尚未发生任何进一步的更改。

他使用这些度量来创建如下图表: 活动课表

两条线之间的距离越小越好。

您可能可以对您的代码库采取类似的措施。类的数量可能与代码行的数量相关。甚至有可能将其扩展为合并每个类度量的代码行,如果您有一些大型整体类,则可能会改变图形的形状。


4

只要功能到类的映射相对一致,或者就此而言,文件系统,您就可以将gource之类的东西挂接到版本控制系统中,并很快了解大多数开发的重点(因此代码的哪一部分最不稳定)。

假设您的代码库相对整洁。如果代码库是一团糟,那么由于相互依存关系,您基本上会看到每个小部分都在进行。就是说,也许它本身(使用功能时的聚类)很好地表明了代码库的质量。

它还假定您的业务团队和开发团队总体上具有某种将开发中的功能分开的方法(无论是版本控制中的分支,一次是一个功能,无论如何)。例如,如果您正在同一分支上使用3个主要功能,则此方法将产生无意义的结果,因为与手头的代码稳定性相比,您面临的问题更大。

不幸的是,我没有文献来证明我的观点。它完全基于我在良好(但不是很好)的代码库上使用gource的经验。

如果您使用的是git或svn,而您的gource版本是> = 0.39,则与在项目文件夹中运行gource一样简单。


gource似乎也是一个很棒的工具!(+1)
乔治

1
我偶然发现了这个答案,然后在接下来的六个小时里与古斯一起玩。我不确定这是+1还是-1,但是该死,这是一个很酷的工具。
RonU

@RonU:您可以使用gource在自定义时间范围内可视化存储库的状态。关键是它可以使您的代码库随时间变化的活动可视化。信息的解释难度取决于许多因素,就像我在上面的回答中所解释的那样。是的,如果您想要“全景图”,它是一个了不起的工具,所以我认为值得+1;)
卡尔

是的,当我说“六个小时”时,我并不是说那段时间我运行了一个Gource sim卡……只是我玩了很多选择,将其传送到ffmpeg,可能还添加了史诗般的配乐,等等。真是兔子洞。:)
RonU

我猜。配乐是循环的哈林随机播放(Harlem Shuffle);)
卡尔,

0

使用修改的行的频率作为代码稳定性的指标至少是有问题的。

首先,修改后的生产线随时间的分布在很大程度上取决于项目的软件管理模型。不同的管理模式存在很大差异。

第二,这个假设中的人员伤亡还不清楚-是由于软件的稳定性导致的修改行数减少,还是仅仅是由于截止日期到期而开发人员决定不立即进行某些更改,而是在更改之后进行更改。发布?

第三,引入新功能后,大多数行都会被修改。但是新功能不会使代码不稳定。这取决于开发人员的技能和设计质量。另一方面,即使更改了很少的行,也可能修复了严重的错误-在这种情况下,软件的稳定性显着提高,但是更改的行数不会太大。


“这取决于开发人员的技能和设计质量。”:但是您至少需要一些时间来测试更改,以便您有足够的信心确保您不会引入任何错误。即使是最熟练的开发人员也可能会犯打字错误,例如,如果他们承受压力,加班时间过多或睡眠不足。另外,如果您采用开放式/封闭式原理,则更改(错误修复)的次数应会减少。无论如何,我已经在我的问题中明确指出,这种衡量的结果可能会根据开发过程而变化。
乔治

顺便说一句,代码不稳定可能不是因为开发人员很糟糕,而是因为要求不明确并且项目仍处于原型开发阶段。
乔治

@乔治:你当然是对的。但这正是我写的:修改行的数量很大程度上取决于太多因素。其中一些与代码稳定性有关,而有些则与代码稳定性无关。这就像尝试通过假设-更少的电量-更少的灯光-更多的性爱来计算有多少人发生性行为,并测量电能。尽管事实证明,大停电后出生率正在提高。;)
johnfound

-1

健壮性是与指令集的正确功能有关的术语,而不是与用于表达这些指令的文本的数量,详细程度,简洁性,语法正确性有关。

确实语法很重要并且必须正确,但是除此以外的任何其他内容,因为它与指令的期望功能有关,通过查看指令的“指标”类似于通过阅读茶叶底部的图案来绘制您的未来。你喝杯茶。

坚固性通过测试来衡量。单元测试,冒烟测试,自动回归测试;测试,测试,测试!

我对您的问题的回答是,您正在使用错误的方法来寻求稳健性之一的答案。这是一条红色的鲱鱼,代码行比代码占用行更有意义。您只有在测试代码是否正在执行您要求的代码时,才能知道代码是否按照您的要求执行。

请重新使用适当的测试工具,并避免代码度量的神秘性。

最好的祝愿。


3
我已经明确指出,我不建议使用LoC来衡量代码复杂性。我建议通过更改代码来衡量代码的稳定性:一段代码是否具有稳定的功能要求以及经过测试的稳定实现可以满足这些要求?
乔治

我不想与您争论,而是恭敬地引导您远离代码度量毫无意义的愚蠢行为。我重读了您的问题,您的示例都表明了一种推断出要更改的代码行与其结果健壮性之间的关系的愿望。我认为您输入的字词越多,您输入错字的可能性就越大。但是我反对他的原则,即您要求我必须坚决支持您以这种方式放弃您的要求。良好的测试实践=强大的可能性。
Sassafras_wot

“良好的测试实践=强大的可能性。”:我完全同意。这就是为什么我建议您必须再次测试最近更改的一段代码,然后我们才能确信它是正确的。
乔治

稳定性有几种定义,其中之一就是您所追求的。与我所做的语义解释不同。我的意思是说,它“不受极端改变”而不是“抗拒改变”
Dave Hillier 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.