对源代码有用的指标是什么?[关闭]


Answers:


30

“通过代码行来衡量软件生产率就像通过衡量飞机的重量来衡量飞机的进度。”-比尔·盖茨


3
请不要更新非答案。
埃里克·威尔逊

3
虽然这是一个有趣的轶事,但对回答这个问题几乎没有帮助。
克里斯·奈特

7
@Chris由于许多开发人员认为软件指标没有用,因此该答案获得了很多好评(或如FarmBoy所称的“更新”)。如果您不同意或觉得自己对问题的回答更好,请发表您自己的答案。像您在此处所做的评论一样没有效果;您自己一无所担。
chrisaycock 2011年

7
我的反对和评论目的是劝阻那些缺乏深度且不能直接解决OP的问题的答案。如果您更详细地说明为什么您认为软件指标在软件开发和质量保证方面没有用,而不仅仅是LOC,那么这可能是一个更好的答案。
克里斯·奈特

如果正确使用软件指标,则实际上非常有用。也就是说,LoC越多->错误越多->质量越差。我从未见过它会失败作为衡量质量的标准。如果飞机以相同的速度进行相同的行程但所需的重量要少得多,那么它肯定会更好。显然,比尔·盖茨(Bill Gates)这么说时并不了解飞机,对软件的了解也不够。
Pablo Ariel


11

使我对代码指标感到困惑的是,它做得还不够。大多数公司都会报告其员工,供应商和系统的效率,但是似乎没有人愿意报告代码。我肯定会同意这样的答案:陈述更多的代码行是一种责任,但是您的代码所做的却更为重要。

代码行: 正如我已经提到的,这是一项至关重要的度量,应该在每个级别上都认真对待。函数,类,文件和接口可以指示长期难以维护且成本高昂的所有代码。比较代码的总行数和系统的工作量是无限困难的。它可能做很多事情,在这种情况下,将有很多行代码!

复杂性: 这项度量很适合在您尚未使用的代码库上进行,并且可以很好地指示问题所在的位置。作为一个有用的轶事,我在自己的一个代码库中测量了复杂度,而最复杂的区域是我在更改时花费最多的时间。降低复杂性的努力大大减少了维护时间。如果管理人员手头有这些度量,他们可以计划系统特定区域的重构迭代或重新设计。

代码重复: 就我而言,这是非常重要的度量。代码重复是一个非常糟糕的信号,它可能会指出系统设计水平低下的严重问题,或者指出复制粘贴的开发人员,从长远来看会导致大量问题,而系统则难以维护。

依赖性图 查找不良的依赖性和循环的依赖性是代码中的一项重要度量。这几乎总是指向需要修改的不正确的高级设计。有时,一个依赖关系会吸收很多不必要的其他依赖关系,因为有人在电子邮件库中使用addNumber进行财务计算。更改电子邮件库和财务中断后,每个人都会感到震惊。如果一切都取决于一件事,那么它也可以指向所有难以维护且设计不当的库。

良好的度量始终可以告诉您系统的每个功能都占用很小的空间。更少的依赖关系,更少的复杂性,更少的重复。这表明耦合松散和内聚性高。


8

这种“源代码指标”废话不会消失吗?

原始代码行(SLOC)是最古老,最简单,最基本的指标。

Halstead最初提出了一整套指标。许多人在编写测量程序之前都玩得很开心,直到一些剧透进行了明显的研究,并证明了每个Halstead指标都与SLOC密切相关。

那时,Halstead的指标被放弃了,因为SLOC总是更容易测量。


1
与研究有任何联系吗?
乔恩·霍普金斯

Google是您的朋友,但是这里可以助您一臂之力。 ecs.csun.edu/~rlingard/comp589/HoffmanArticle.pdf
John R. Strohm

6
有趣的研究,尽管他们的研究通常只研究50到100行代码之间的程序。解决了这么小的定义明确的问题,最终结果似乎并不令人惊讶。
克里斯·奈特

我想说的是,在现实世界中,所有这些研究都变成了泥泞。
沃伦·P

这是真的。代码行越多,质量越好。
Pablo Ariel

8

用于质量保证的源代码指标旨在两个目标:

  • 编写代码,减少内部错误
  • 编写代码以便于维护

两者都导致编写代码尽可能简单。这意味着:

  • 简短的代码单元(函数,方法)
  • 每个单元中的几个元素(参数,局部变量,语句,路径)
  • 和许多其他或多或少复杂的标准(请参阅Wikipedia中的软件指标)。

7

据我所知,发现的错误数量与代码行(可能搅动),模语言,程序员和领域直接相关。

我不知道与错误紧密相关的任何其他简单而实用的指标。

我想做的一件事是开始运行我所从事的不同项目的数字-Test Coverage :: kLOC,然后讨论“感知质量”以查看是否存在相关性。


1
那么,代码越多,其中包含的错误越多?

3
@Thor:是的。令人震惊,是吗?
保罗·内森

据我所记得,典型的行业数字是每个普通项目每1000行代码中有2-3个错误,对于核工厂控制软件或NASA项目,每花费1000行代码中就有0.5个错误,他们付出了巨大的努力,控制,测试,审查等,因为失败可能会带来非常严重的后果。是否有人提到支持此的数字?
hlovdal

2
@hlovdal:每个KSLOC 2-3错误已经是一个非常低的数字。我从航空航天和安全领域了解到的最低数字是每个KSLOC大约0.1个错误。每个KSLOC的典型数字似乎是20到50个错误。作为参考,Google for Andy German的论文名为“软件静态代码分析-经验教训”。
Schedler

1
我对这些数字表示怀疑-它完全取决于语言,编译器和可执行环境。用JavaScript代码编写的错别字可能要花费数才能找到,但是在第一次编译时会发现使用编译语言的错别字。
JBRWilkinson

7

仅当您知道如何处理所获得的答案时,指标才有用。本质上,软件指标就像温度计。直到您知道正常温度是多少,您在98.6°F的温度下测量的事实才有意义。上面的温度对人体温度有好处,但对冰淇淋却很不利。

常见的指标,可以成为有用的是:

  • 每周发现的错误
  • 每周解决的错误
  • #需求定义/发布
  • #实施/发布需求

前两个度量趋势。您发现错误的速度超过了解决它们的速度?有两种可能的结果:也许我们需要更多的资源来修复错误,也许我们需要停止实施新功能,直到我们赶上来。后两者提供了您完成工作有多接近的图片。敏捷团队将其称为“疲倦”图表。

圈复杂度是一个有趣的指标。它的基本概念是函数/方法中唯一执行路径的数量。在繁重的单元测试环境中,这对应于验证每个执行路径所需的测试数量。但是,仅因为您具有Cyclomatic Complexity为96的方法,并不意味着它一定是错误的代码-或您必须编写96个测试以提供合理的置信度。生成的代码(通过WPF或解析器生成器)创建这种复杂的代码并不少见。可以粗略地了解调试方法所需的工作量。

底线

您进行的每次测量都需要定义以下内容,否则将无用:

  • 了解什么是“正常”。这可以在项目的整个生命周期内进行调整。
  • 在“正常”范围之外的阈值,您需要采取某种措施。
  • 超过阈值时处理代码的计划。

您所采用的指标可能因项目而异。您可能在整个项目中使用了一些指标,但是“正常”的定义会有所不同。例如,如果一个项目平均每周发现5个错误,而新项目每周发现10个错误,则不一定表示有问题。这次可能只是测试团队更加细致。同样,“正常”的定义可能会在项目的整个生命周期内发生变化。

该指标只是一个温度计,您该如何处理取决于您自己。


在某些情况下,另一个有用的bug是每行代码的bug。通常,与仍在开发中的应用程序相比,成熟的代码库每行代码应具有相当少的错误。
rjzii 2011年

@Rob Z,无论采用哪种度量标准,人们都会做得足以优化该度量标准。对于每行代码中的错误,您可能会要求开发人员引入一个未使用的变量,它们只会增加无缺陷LOC的数量(因为SLOC计数器可以检测到多个分号)。当然,这也人为地增加了要经过的代码量。
Berin Loritsch 2011年

6

源代码是负债,而不是资产。考虑到这一点,测量代码行类似于跟踪建造房屋时花费的美元。如果您想使预算保持在预算之内,则需要完成此操作,但是您不一定会认为每天花费1000美元比每天花费50美元更好。您想知道有多少钱用来盖房子。软件项目中的代码行也是如此。

简而言之,没有用于源代码的有用指标,因为仅测量源代码本身就没有用。


4

由于源代码只是序列,选择和重复的组合。如果要描述我们可以合理预期生产的最佳软件,则如下所示。具有几乎100%的测试代码覆盖率的软件,使用该工作所需的最少代码行数,但又足够灵活以承受更改。


2
如果100%的覆盖率涵盖所有路径,而不仅仅是所有行,则覆盖率仅为100%。在任何现实的软件中,设置100%的路径覆盖都是一个不好的目标,因为到达它的成本非常高,并且仍然只会告诉您代码的行为与设计一致,而不是设计本身是正确的。您可能会有大量的安全漏洞,并且具有100%的路径覆盖率。
Joeri Sebrechts

+1更多的源代码不一定更好。
拉里·科尔曼

只有非常简单的应用程序才能达到100%的测试覆盖率(使覆盖率变得多余)。对于复杂软件而言,要达到100%的测试覆盖率在计算上是昂贵的(如果不可行的话)。我们已经以大约六十年的坚定理由知道了这一事实。其次,测试仅告诉您尚未发现错误-它不能保证您没有关于结构质量,大小或复杂性的错误(这在很长一段时间内都为人所知。)工作时不知道这些事实实际上,软件中的软件类似于物理学家,不知道热力学定律。
luis.espinal 2011年

@ luis.espinal软件如此之大,以至于在计算上过于昂贵而无法测试,这是编写得非常差的软件。几乎不知道如何制作可运行的软件。
Pablo Ariel

@PabloAriel-“软件太大,以至于在计算上测试起来太昂贵了” <<这不是我所说的。阅读评论(也许两次或三遍),以确保您实际上正在阅读自己认为正在阅读的内容。
luis.espinal

4

揭示为什么KLOC计数对评估性能没有用(甚至有害)的原因。

几年前,我参与了一个大型项目(公司中有70多名员工,客户中有30多名员工),该项目使用KLOC计数作为衡量团队和个人绩效的唯一标准。

为了我们的Y2K工作(告诉您它是多久以前的:)),我们对团队负责的代码部分进行了大幅度的清理。我们最终发布了大约30.000行代码,对于5个人来说,这是一个不错的3个月的工作。我们最终还废弃了另外70.000行代码,这是3个月工作的出色表现,尤其是与新代码结合使用时。

该季度的最终结果:-40.000行代码。在本季度之后的性能评估期间,由于未能满足我们每季度生产20.000行代码的生产力要求(毕竟,这些工具表明我们生产了-40.000行代码),我们受到公司的正式谴责。如果没有项目经理和质量保证团队的干预,得到了谴责的推翻并被表扬,那么我们所有人都将被列为表现不佳并被绕过晋升,培训,加薪等工作。

几个月后(这些事情需要时间),我们被告知该公司正在审查其生产力标准,并雇用了一个专家团队根据功能点分析创建新系统。


你为什么不只显示差异?
reinierpost

我认为就是这样做了。但是,如果系统是如此严格,那么当出现如此明显的错误数据点时,它甚至都不会响起警钟,这将无济于事。
jwenting 2011年

2
您的答案并不表明KLOC是无用的,而是表明如何不使用它们。
尼尔N

2
它表明,依靠它们作为生产力的度量是短视的,依靠它们作为唯一的度量是愚蠢的。在其他使用KLOC来衡量生产率甚至质量的项目中,我们通过创建导致行数众多的编码标准(C ++支撑做法,多余的空行并在每个地方加上简短的注释,在if语句中拆分条件, 3行等)。
jwenting

1
将SLOC用作生产力指标只是愚蠢的,可能永远不会给出好的结果。使用SLOC作为指示可维护性和缺陷数量的质量度量标准更为理智,有关此问题的所有警告已得到讨论。
redcalx13年

2

我很惊讶没有人提到单元测试的声明/决策覆盖率(单元测试所执行代码的百分比)。

代码覆盖率很有用,因为您知道应用程序的百分之几不会灾难性地失败;其余的有用性取决于单元测试的质量。


代码覆盖率也是一个错误的指标(尽管可能有一些用处)。它邀请编写废话测试只是为了获得更高的覆盖率。当然,有些东西是永远都不会涵盖的,人们将开始避免编写这些东西。例如,我见过将JavaDoc标记为代码的代码覆盖工具,当然不会覆盖。另一个工具将所有空行标记为未被测试覆盖。您会同意,消除代码中的注释和空格比错过某些单元设置程序的单元测试要糟糕得多?
jwenting 2011年

毫无疑问,糟糕的单元测试在许多方面对他们的帮助远超过其帮助。例如,对于没有单个断言的一组测试,您可以获得100%的代码覆盖率。
StuperUser 2011年

1

通常,提交越小越好。这是关于SCM工具的,而不是本质上的代码,但这是一个非常可衡量的指标。提交越小,越容易将每个更改视为一个原子单位。还原特定更改并在出现问题时查明位置越容易。

只要没有提交破坏构建...


1

就进度而言,这些不是绝对有用的绝对指标,但可用于给出代码状态的一般概念。

值得注意的是,我发现循环复杂度在可视化给定代码库的模块化方面很有用。通常,您需要低复杂度,因为这意味着每个模块的源数量很少,并且模块很多。



1

在我的工作中,很多情况下我都使用代码指标:

在编写代码时

我日常工作中最大,也许最重要的用途是Checkstyle,这是Java开发人员的工具,它会根据我们定义的一组规则不断检查代码的指标(除其他外),并标记代码未包含的地方遵守这些规则。在我开发代码时,它实时地告诉我我的方法是变长,变复杂还是耦合,使我退后一步,然后考虑将其重构为更好的方法。

开发人员可以完全自由地违反所有规则,因为它们永远不会适用于所有情况。那里的“规则”可以激发思想并说:“嘿,这是最好的方法吗?”

质量检查/代码审核期间

当我执行代码审查时,我通常要做的第一件事是结合使用代码覆盖工具来检查我正在审查的代码的代码覆盖率,该工具会突出显示已覆盖了哪些代码行。这使我对测试代码的完整性有一个大致的了解。我并不在乎覆盖率是20%还是100%,只要对重要代码进行了良好的测试即可。因此,所覆盖的百分比多少没有意义,但0%的确定性就像我要仔细查看的拇指酸痛一样突出。

我还检查团队同意的哪些指标已“破坏”(如果有),以查看我是否同意开发人员的观点,或者是否可以提出改进建议。我们的团队已同意这些开发指标来编写新代码,这为改进我们的代码做出了巨大努力。我们编写的整体方法要少得多,现在在单一责任原则上要好得多。

对遗留代码进行趋势改进的趋势 我们有许多遗留代码需要改进。在任何时间点的指标都没有用,但是对我们来说重要的是随着时间的流逝,代码覆盖率会上升,而复杂性和耦合性等因素则会下降。因此,我们的指标已插入到我们的持续集成服务器中,从而使我们可以花时间查看以确保我们走上正确的轨道。

掌握新的代码库 关于我不熟悉的代码库,是我唯一一次使用源代码度量标准的行。与我合作过的其他项目相比,它使我能够快速评估项目的粗略规模。使用其他指标,我也可以对项目质量有一个更粗略的了解。

关键是要使用指标作为趋势,讨论或前进方向的起点,而不是认真地将其管理成精确的数字。但是我坚信,如果正确使用它们,它们可以帮助您改进正确的代码。


0

问:捕获源代码有哪些有用的指标?

商业用途:

答:工时数

对于编码员的主管:

答:没关系。今天就做吧

对于编码者的自尊心:

答:SLOC的数量(代码源代码行)

对于编码员的母亲:

答:多吃这些柔软的法式面包和喝茶

在下面的评论中继续...


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.