软件测试方法是否依赖有缺陷的数据?


45

在软件工程中众所周知的一个事实是,修复漏洞的成本在发现漏洞的开发后期呈指数增长。这由Code Complete中发布的数据支持,并已在许多其他出版物中进行了修改。

但是,事实证明该数据从未存在过Code Complete引用的数据显然没有显示出这样的成本/开发时间相关性,而相似的已发布表格仅在某些特殊情况下显示了相关性,而在其他特殊情况下则显示了平坦的曲线(即成本没有增加)。

是否有任何独立数据可以证实或反驳?

并且如果为真(即,如果根本没有数据可以为后来发现的错误提供成倍的成倍的成本支持),那么这对软件开发方法有何影响?


这听起来合乎逻辑,因为在大多数情况下稍后发现错误还涉及数据损坏。而且,如果在修复错误的过程中后来发现数据损坏,那么数据损坏将使企业付出巨大的代价。
EL Yusubov

8
@ElYusubov确实如此。但是常识可能具有很大的欺骗性。相反,我们的思想很容易被明显的逻辑所欺骗。这就是基于证据的软件工程如此重要的原因。
康拉德·鲁道夫


2
为了记录(并在我的回答中提到),我能够找到的最早的提及早于Code Complete。我可以找到1976年Fagan和Stephenson(独立)的工作。直到20年后的1993年,Code Complete的第一版才发布。我希望巴里·勃姆(Barry Boehm)在1980年代的工作导致这种想法的流行-勃姆的工作对1980年代甚至2000年代后期的软件工程过程具有很大的影响力。
Thomas Owens

1
毫无疑问,任何有关软件工程统计的陈述都是错误的,包括这一陈述。(您以后发现的错误通常是更复杂的错误。而通过后期修复所采用的“控制”来修复这些错误则更加复杂。)
Daniel R Hicks 2012年

Answers:


25

软件测试方法是否依赖有缺陷的数据?

是的,可以证明。检查敏捷变更成本曲线表明,肯特·贝克(Kent Beck)在XP上所做的工作(我不确定这是否是他的动机或他的辩解的一部分)是根据对“ “代码完成”表后面的“指数”曲线。因此,是的,至少在某种程度上基于有缺陷的数据,对一种方法进行的工作-在普及测试优先开发方面做得最多的方法。

是否有任何独立数据可以证实或反驳?

是的,当然还有其他数据可供您参考-我知道的最大的研究是对作为其CMM评估计划一部分的休斯飞机公司进行的缺陷分析。那里的报告显示了缺陷成本是如何与它们的阶段相关:尽管该报告中的数据不包含差异,所以您需要警惕得出太多的“该事物要比该事物花费更多”的结论。您还应该注意,与方法无关,在1980年代到今天之间工具和技术发生了变化,这使这些数据的相关性受到质疑。

因此,假设我们仍然无法证明这些数字的合理性:

这如何影响软件开发方法?

我们一直依赖无法核实的数字这一事实并不能阻止人们根据轶事和经验取得进步:就像学习许多学徒交易一样。我不认为中世纪时期有《基于证据的砌体杂志》,但仍然建造了许多大型,令人印象深刻且持久的建筑,并取得了可观的成功。这意味着我们的实践主要基于“对我或我遇到的人有用的东西”;这不是什么坏事,但也许不是改善提供当今技术时代基石的数百万人的最有效方法。

我感到失望的是,在所谓的工程学科中,经验主义没有更好的基础,而且我怀疑(尽管显然无法证明)我们能够在改善技术和方法论方面取得更好,更清晰的进步。已有的基础-正如临床医学似乎已被循证医学实践所改变。不过,这是基于一些大的假设:

  • 大多数软件工程实践的专有性不会阻止收集足够的有用和相关数据;
  • 从这些数据得出的结论是普遍适用的(因为软件工程是一个熟练的职业,经验,能力和品位的个人差异可能会影响这种适用性);
  • “现场”的软件工程师有能力并有动机利用由此获得的结果;和
  • 我们实际上知道首先应该问什么问题。这显然是最重要的一点:当我们谈论改进软件工程时,我们要改进什么?测量什么?改善测量结果实际上会改善结果,还是会影响系统?例如,假设我公司的管理层决定我们要降低实际项目成本与预测项目成本之间的比率。我可以开始将我所有的成本估算值乘以一个软糖,就可以实现这一目标。那么是否应该成为标准的行业惯例来捏造所有估计?

关于基于证据的工程的真棒元答案。谢谢。
Konrad Rudolph 2012年

4
该死,我只是意识到这是直接从马口中传来的。呵呵。太棒了
康拉德·鲁道夫

1
我感觉到每个人都将“错误数据”的使用解释为“完全不真实,相反是正确的”,但是我感觉到您的立场只是指出它可能是不真实的。这个对吗?
Daniel

3
@DanielB是的。给我看证据,证明这实际上是错误的,我可能会改变主意。直到后来我才知道,这是不是demonstrably权。

1
@GrahamLee我明白您的意思(只是认为措辞可能有点不必要地激进)。出于好奇,我在这里找到了Fagan纸,上面写着:“ ...允许返工...在原产地附近...比在过程的后半部分完成的价格便宜10至100倍”。我在此文字附近看不到任何引文。
Daniel

8

就我而言,“这将如何影响软件开发方法”的答案是“不多”。

无论是被开发人员还是最终用户捕获,是否在被用户捕获后进行修复都需要花费更多的钱,事实仍然是在系统中发现了错误。如果由开发商抓住了,希望这是一个快速解决方案。对用户捕获的错误也抱有同样的希望。

修复最终用户发现的bug所需的实际开发时间不计成本,但维护编码人员从事工作的刻板印象却要付出无形的代价。当用户发现错误时,这是​​开发人员的错。因此,最终用户发现的每个错误都会降低用户对系统的信心。这就像您要购买的房屋,并从房屋的一个角落的天花板上看到水渍一样。从本质上讲,这很容易解决,但您想知道是什么原因引起的,以及根本原因可能还影响了什么。您的内心安宁值得什么?您可能需要将墙壁拆下回到螺柱,并目视检查所有内容,以确保污点来自固定的孤立事件。知道这是可能的并不能使您对家庭充满信心。同样,

尽早发现错误,可以避免这些无形的成本,这是TDD式方法论的既定目的。开发人员或合作伙伴在打字过程中发现的一个错误,一个在编译时发现的错误或一个在单元/集成测试(TDD添加的层)中发现的错误是用户永远不必知道的错误,即您的项目经理永远不必为此道歉,也不必在第二秒就退出工作,而将齿轮切换到您认为已经落后了几周的系统中的缺陷修复模式前。


3
有趣的答案。我试图让我的用户理解开发是一个反复的过程,或者是完善和改进。我可以很快地给他们一些东西,如果他们发现问题或需要改进,我也可以很快地改变那些变化(几分钟或几小时,而不是几天或几周)。随着时间的流逝,系统变得更加稳定,但是他们对开发过程和最终结果而不是对规范过程和首次构建的信任就消失了。(当然,这取决于您的工作环境-我正在编写一系列业务应用程序,因此,如果它们破裂,它们将得到修复)。
Kirk Broadhurst,2012年

不幸的是,原始证据(即产品交付时发现的需求错误比产品交付时发现的实施错误的代价更大)意味着需要更好的验证而不是更好的验证。TDD-使用测试来验证产品是否符合要求-与发现这些错误根本无关。
Pete Kirkham

6

我将以我发现的大部分内容都来自1970年代和1980年代初期为事实作为开头。在这段时间里,顺序过程模型比迭代和/或增量方法(螺旋模型或敏捷方法)普遍得多。这些工作大部分建立在这些顺序模型上。但是,我认为这不会破坏关系,但是迭代/增量方法的好处之一是在注入依赖项和每个阶段的复杂性之前,快速发布功能(应用程序的整个垂直片段)并纠正其中的问题。高。


我刚拿出软件工程经济学的副本,并在第4章中找到了该图表背后的数据。他引用了ME Fagan(IEEEUMD的PDF),EB的“减少程序开发中的错误的设计和代码检查”。Daly的“软件工程管理”,WE Stephenson的“对保障系统软件开发中使用的资源的分析”(ACM)和“几个TRW项目”。

...根据进行校正或更改的阶段来校正软件错误(或进行其他软件更改)的相对成本。如果在计划和需求阶段检测到并纠正了软件需求错误,则其修正是更新需求规范的相对简单的事情。如果在维护阶段之前未纠正相同的错误,则纠正工作涉及大量的规格,代码,用户和维护手册以及培训材料。

此外,后期更正涉及更正式的变更批准和控制流程,以及更广泛的重新验证更正的活动。这些因素相结合,使得在大型项目的维护阶段纠正错误的成本通常比要求阶段高100倍。

Bohem还研究了两个较小的,非正式的项目,发现成本增加了,但远没有大型项目中确定的100倍重要。根据图表,在系统运行后,修复需求缺陷的差异似乎比需求阶段大4倍。他将其归因于组成该项目的项目的较小库存和减少的形式,从而导致能够更快地实施更简单的解决方案。

基于《软件工程经济学》中的Boehm,“代码完成”中的表相当肿(范围的下限通常太高)。在阶段内进行任何更改的成本确实为1。从软件工程经济学的图4-2推断,需求更改应为体系结构的1.5-2.5倍,编码2.5-10,测试4-20和4- 100维护中。金额取决于项目的规模和复杂程度以及所使用流程的形式。


在巴里·勃姆(Barry Boehm)和理查德·特纳(Richard Turner)的平衡敏捷与纪律的附录E中,有一小节是关于变更成本的经验发现。

开头几段引用了Kent Beck的《 Extreme Programming Explained》,引用了Beck。它说,如果变更的成本随着时间的推移缓慢上升,则决策将尽可能晚地做出,而仅执行需要的事情。这就是所谓的“平坦曲线”,它是极限编程的驱动力。但是,先前的文献发现是“陡曲线”,小型系统(<5 KSLOC)的变化为5:1,大型系统的变化为100:1。

本节引用了马里兰大学基于经验的软件工程中心(由美国国家科学基金会资助)。他们搜索了可用的文献,发现结果倾向于确定100:1的比例,其中一些结果表明范围为70:1至125:1。不幸的是,这些通常是“前期大型设计”项目,并且按顺序进行管理。

有一些使用Extreme Programming运行的“小型商业Java项目”的示例。对于每个故事,都跟踪了在错误修复,新设计和重构方面的工作量。数据表明,随着系统的开发(实施了更多的用户案例),平均工作量倾向于以不平凡的速度增加。重构的工作量增加了大约5%,固定工作的努力增加了大约4%。

我正在了解的是,系统复杂性在所需的工作量中起着很大的作用。通过在系统中构建垂直切片,可以通过逐渐增加复杂度而不是将其成堆增加速度来降低曲线的速率。与其处理大量的需求复杂性,然后处理极其复杂的体系结构,然后处理极其复杂的实现,等等,不如说是非常简单地开始并添加。

这对修复成本有什么影响?最后,也许不多。但是,它确实具有允许对复杂性进行更多控制(通过管理技术债务)的优势。此外,经常与敏捷相关联的频繁交付物意味着项目可能会更快结束-而不是交付“系统”,而是交付件直到业务需求得到满足或对新系统(以及新项目)进行了彻底改变为止是必需的。


Stephen Kan的“ 软件质量工程中度量标准和模型”在第6章中有一节介绍了相位缺陷消除的成本效益。

他首先引用了Fagan 1976年的论文(在软件工程经济学中也曾引用),指出在高级设计(系统架构),低级设计(详细设计)中进行的返工和实现的成本可以降低10至100倍。比在组件和系统级测试期间完成的工作要多。

他还引用了Freedman和Weinberg分别于1982年和1984年发表的两篇有关大型系统的出版物。第一个是“演练,检查和技术审查手册”,第二个是“演练,检查和检查手册”。在开发周期的早期应用评审可以将到达测试阶段的错误数量减少10倍。缺陷数量的减少导致测试成本降低了50%至80%。我将不得不更详细地阅读研究报告,但似乎花费还包括发现并修复缺陷。

Remus于1983年所做的一项研究“检查/审查中的集成软件验证”,研究了使用IBM加利福尼亚州圣塔特雷莎实验室的数据来消除不同阶段的缺陷的成本,特别是设计/代码检查,测试和维护。引用的结果表明成本比为1:20:82。也就是说,在设计或代码检查中发现的缺陷的变更成本为1。如果相同的缺陷无法通过测试,则成本将增加20倍。如果它一路逃脱给用户,它将使纠正成本增加多达82倍。Kan使用IBM位于明尼苏达州Rochester的设施的样本数据,发现AS / 400项目的缺陷清除成本是相似的在1:13:92。但是,他指出,成本增加可能是由于发现缺陷的难度增加。

提到了Gilb在1993年(“软件检查”)和1999年(“优化软件工程规范和质量控制过程”)有关软件检查的出版物,以佐证其他研究。


其他信息可以在Construx的“ 缺陷成本增加”页面上找到,该页面提供了许多有关缺陷修复成本增加的参考。应当指出,Code Complete的作者Steve McConnell创建并为Construx工作。


我最近听了讲座,真正的软件工程,由下式给出格伦Vanderburg在2010年他给在同一谈话在龙星红宝石会议苏格兰红宝石会议Erubycon在2011年的QCon旧金山在2012年,和O'Reilly的软件架构会议在2015年。我只听过Lone Star Ruby会议,但是随着他的思想的提炼,话题随着时间的推移而发展。

范德堡(Venderburg)建议,所有这些历史数据实际上都在显示随着时间的推移而修复缺陷的成本,而不一定是随着项目的逐步进行而修复的。前面提到的论文和书籍中检查的许多项目都是顺序的“瀑布”项目,其中阶段和时间一起移动。但是,在迭代项目和增量项目中也会出现类似的模式-如果在一次迭代中注入缺陷,则在该迭代中进行修复将相对便宜。但是,随着迭代的进行,发生了很多事情-软件变得更加复杂,人们忘记了有关在特定模块或代码部分中工作的一些次要细节,需求也随之变化。所有这些都会增加修复缺陷的成本。

我认为这可能更接近现实。在瀑布式项目中,由于上游问题需要校正的伪像数量,导致成本增加。在迭代和增量项目中,由于软件复杂性的增加,成本增加。


@AndresF。我在跟踪这些引用时发现的问题之一是Bossavit在您链接的书中将其描述为“大海捞针”问题。引用书是一种很大的混淆-即使您在阅读引用时仍在印刷中,您也需要阅读数百页才能找到支持引用作者主张的小块。

3

它只是简单的逻辑。

在规格中检测到错误。

Case : Error found while reviewing UseCase/Function spec.
Actions:
        Rewrite paragraph in error.

Case : Error found during unit test.
Actions:
        Fix code.
        (Possibly) rewrite paragraph in spec.
        rerun unit test.

Case : Error found in integration test.
        Fix code.
        (possibly) rewrite paragraph in spec.
        rerun unit test.
        build new release.
        rerun integration test for whole system.

Case : Error found in UAT
        Fix code.
        (possibly) rewrite paragraph in spec.
        rerun unit test.
        build new release.
        rerun integration test for whole system.
        deploy release to UAT.
        rerun UAT tests.


Case : Error found in production
        Fix code.
        (possibly) rewrite paragraph in spec.
        rerun unit test.
        Build release.
        rerun integration test for whole system.
        deploy release to UAT.
        rerun UAT tests.
        deploy release to production.

如您所见,发现错误的时间越晚,涉及的人员越多,则需要重新完成的工作就越多,并且在任何“正常”环境中,一旦您遇到UAT,文书工作和官僚主义都会成倍增加。

这一切都不包括由于生产软件错误(销售损失,订单过多,客户被黑等)而导致的业务成本。

我认为没有人能编写出一个在生产中从未出现过错误的非平凡系统,但是,从长远来看,您可以尽早发现错误的任何措施都可以节省您的时间和精力。规范审查,代码审查,广泛的单元测试,使用不同的编码器编写测试等等等,这些都是提早发现bug的行之有效的方法。


2
这仅涉及一种情况:规范中检测到错误,即一开始就引入了错误。但是错误可以引入开发的所有阶段(包括部署后的错误修复),并且更容易修复这些错误,因为它们可能会影响系统的一小部分。
康拉德·鲁道夫

2
但是问题是,错误修复可能会带来意想不到的副作用,因此,除非您完全可以保证修复只会影响重做SIT UAT等问题的特定子集,而且无论文档的大小如何,纸张跟踪记录仍然同样繁重更改。
詹姆斯·安德森

2
我仍然不相信这表明错误发现总是较晚才修复的。我认为,自引入错误以来,修复错误的代价更高。也就是说,较晚引入,不久发现并修复的错误要比早期引入和早期发现的错误要便宜(但比第一种情况延迟的时间更长)。至少我可以想象这是这样的。
康拉德·鲁道夫2012年

@KonradRudolph您能详细说明吗?这篇文章也是我的理解,我不明白为什么时间很重要,但阶段无关紧要。对我来说,项目中的时间量度是您当前的阶段(有时是经过时间限制的迭代要遍历所有阶段)。我看不到详细设计的第3天和第300天完成的工作之间的区别-详细设计工作产品尚未用于制造任何其他工作产品,因此,在详细设计中注入的缺陷仅存在于一个地方,并且仅存在于一个地方。需要在那里进行更改。我看不到日子的流逝如何重要。
Thomas Owens

3
@Thomas我只是假设。但是时间很重要,因为引入的大多数代码或规范功能都会随着时间的流逝而影响更多的组件,除非它们具有高度专业性,并且没有其他任何直接或间接依赖于它们的组件。因此,一个长期存在的错误,无论它引入哪个阶段,都可能会影响系统的许多部分,要想将其删除,必须确保该过程不会破坏其他组件。
康拉德·鲁道夫2012年

2

我相信这一直是而且一直是关于风险管理和经济学的。减少缺陷数量相对于未来缺陷影响的现值的成本是多少?在《愤怒的小鸟》中,黄鸟的飞行轨迹略微偏离,这并不等同于“战斧”巡航导弹的飞行轨迹。这两个项目中的软件开发人员都无法根据该表做出决定。在这方面,什么都没有改变。

我认为这很可能是通过反馈来实现的,该领域中昂贵的错误会导致公司加强其质量流程,而没有来自该领域的投诉会导致公司放松它。因此,随着时间的流逝,软件开发公司将趋向于收敛或在适用于它们的事物周围波动(+/-)。代码完成可能会影响某些初始值,或者可能会以一种或另一种方式稍微拉动公司。一家公司花费过多的精力去消除没人注意到的缺陷,这很可能会使公司失去业务,而竞争者的方法更优化。另一方面,发布故障产品的公司也将倒闭。

快速搜索一些相关的论文(阅读完整的论文,进行更多的研究,并形成您自己的见解):

软件质量成本研究的系​​统文献综述(2011年)

“尽管社区已经对研究领域的结构有了很好的了解,但通常缺乏经验验证。只有大约三分之一的分析文章提供了案例研究或更广泛的经验结果。这似乎不足以进行软件质量成本研究,它强烈依赖于定量数据来产生新的发现。因此,需要一种新颖的方法来收集质量成本数据,并且需要行业和研究机构之间更紧密的合作以使这些数据可用。”

评估软件质量成本(1998)

“最后,我们已经看到监视软件符合性和不符合性成本很重要,以便可以调整符合性策略以降低软件质量的总成本。”

软件缺陷的成本行为(2004年)

摘要:“当前的研究试图更新我们的知识,其中缺陷以及纠正缺陷(或使它们未经校正)对软件最终成本产生影响的方式”……“未经校正的缺陷成倍地增加了成本尚未解决的每个阶段”

测试覆盖率和验证后缺陷:多案例研究(2009)

“我们还发现,测试工作量随测试覆盖率呈指数增长,但现场问题的减少却随测试覆盖率呈线性增长。这表明,对于大多数项目而言,覆盖率的最佳水平可能远远低于100%。”

弥合软件测试过程与业务价值之间的鸿沟:一个案例研究(2009年)


0

我无法回答您的第一部分问题,因为我只是没有检查过。但是我可以为您的第二个问题制定答案,也许暗示对第一个问题的可能答案。

毋庸置疑,在修复错误,排除本质上难以使用的开发工具的成本方面,一些最重要的因素是产品的固有复杂性以及用户对产品的理解程度。

假设代码通常是由能够处理其代码内在复杂性的开发人员编写和维护的(这可能不是完全正确的,可能值得自己辩论),然后再专心讨论代码,我敢建议在维护中以及因此在修复错误中,至关重要的是维护人员理解上述代码的能力。

通过使用久经考验的软件工程工具,可以大大提高理解代码的能力,但这些工具大多使用不当或使用不当。使用正确的抽象级别,模块化,增强模块凝聚力和减少模块耦合是应对需要正确使用的复杂性的关键工具。对接口进行编码,或者在OOP中,为了避免过度使用对结构的继承(按功能打包),是在编码中经常没有给予足够重视的一些技术。

我认为,行业竞争的现实对采用质量增强方法来开发软件产生了负面影响,使软件的内在质量保持较低水平,以此来衡量持续取得的成功。

因此,我相信,在软件行业中,软件增长的越大,其受错误修复成本的影响越大。在此类产品中,随着时间的流逝,错误变得越来越难以修复,因为随着系统的发展,它变得越来越难以理解。每个功能引入的关注点与其他关注点过多地结合在一起,使得难以理解。或者,没有采用正确的抽象级别,这使维护人员很难制定适当的系统模型并对其进行推理。缺少文档当然无济于事。

也有例外。我敢肯定,如果没有杰出的开发者坚持采取一些扎实的做法,Google的步伐将不会实现。和其他人可能处于相同的情况。但是对于大多数软件,如果数据确实确认了Code Complete中的要求,我不会感到惊讶。


即使是负面评分,我也坚持我的回答。我最近采访了一位候选人,该候选人维护着顶级银行之一的在线银行工具。在随意聊天时,他建议不要使用它,因为它会大量重复使用粘贴粘贴,并且结构不佳。在上一份工作中,我是一家公司的开发人员,为雷曼,MS,UBS等银行编写分析工具,我们必须充当领域专家,从最多的稀疏文档中找出下一步要放在else分支上的方法。即使不同意具体做法,总体信息还是:行业是真实的。
Mihai Danila 2012年

-1

另一个答案!这次是解决标题问题“软件Morhtodoligy是否依赖有缺陷的数据”。

真正的答案是“没有数据”。由于在软件项目中没有大量可靠的数据,因此存在缺陷,成功上市的时间等。

收集此类数据的所有尝试都资金不足,存在统计缺陷,或者是特定于特定项目的,因此无法从中得出一般性结论。

此外,我认为永远不会存在,软件开发过程过于主观且难以进行严格的度量。最适合收集此类数据的组织(大型软件公司和系统集成商)内心深知,从他们的绩效中收集的任何数据都将非常令人尴尬。

唯一发布有关软件项目的成本和成功程度的数字的组织
是政府部门。

因此,总而言之,所有软件研究都必须纯粹是主观的,因为没有可作为客观结论基础的真实数据。


1
不,我不买这个。首先,有数据,虽然你可能是正确的,它是有缺陷的。但是,这需要对每个数据集进行单独的批判,而不是一般的解雇。我对永远不会有数据的争论以及“它太主观”这样的理由深表怀疑。本质上讲,这是缺乏想象力论点。我不认为在这里收集可靠的统计数据很容易,但是我认为这完全可行。在其他领域,成功地分析了更复杂的系统。
Konrad Rudolph

@Konrad-采取一些基本而简单的方法,例如“缺陷计数”,一些工厂对单元测试失败进行计数,一些工厂直到UAT才开始跟踪缺陷,一些工厂仅跟踪代码中的缺陷,一些工厂包括文档,配置和缺陷跟踪过程中的部署脚本。背景色错误是否算作缺陷?一些项目会将其跟踪为缺陷,而另一些则将其忽略。
詹姆斯·安德森

这些都是狭och的,即可以解决的问题。他们没有对可能的事物施加根本的约束,只是增加了需要解决的困难。
Konrad Rudolph 2012年
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.