修复所有警告和错误。不要容忍您的应用程序日志中的任何错误消息,但要在出现错误消息后立即予以修复。所有有关代码和测试的文献中的“所有警告和错误”。

谁首先这么说?从那以后,谁(如果有的话)提供了轶事或(最好是)经验证据来证明软件应用程序中的“零警告和错误”是有益的?特别是软件测试”。

评论

“软件工程而非测试”的前提是否基于“测试”与“软件工程”是一门独立学科的信念?

@ niels-van-reijmersdal您不正确。阅读日志消息是测试实践的重要组成部分。这是最初的测试方法,因为ENIAC和其他早期大型机除了日志(打入纸带)外没有任何输出。另外,该语句完全是错误的:“修复是关于代码而不是测试”。请在此处提供一些支持您立场的规范资料,否则请问它在哪里以及我强烈认为它应属于的位置。

@NielsvanReijmersdal“通常情况下,您在测试期间不会修复任何东西”,您是否有任何经验证据支持所谓的“正常”(换句话说,是业界普遍认可的默认软件)测试方法?您是否有关于多少人修复“ while”测试代码的数据,您能否定义“ while test”甚至在实际意义上意味着什么(同时编写测试,几天内运行测试?)?编程对吗?)您没有任何数据可以支持这些声明。将问题放在哪里。它属于测试SE。

@NielsvanReijmersdal好的,那么……没有数据支持您的主张吗?我已将您的负面评论标记为无用,因为它们纯粹是您的观点,并非基于任何测试社区标准或先例。

让我们继续聊天中的讨论。

#1 楼

史蒂夫·麦康奈尔(Steve McConnell)在Code Complete(1993)中写道:消除所有编译器错误和警告的原因。请注意编译器告诉您的代码。许多警告通常表示代码质量低下,因此您应该尝试理解收到的每个警告。在实践中,您一次又一次看到的警告具有两种可能的影响之一:您忽略它们,它们伪装了其他更重要的警告,或者变得像中国的酷刑一样令人讨厌。 > p664:


将编译器的警告级别设置为最高,最挑剔的级别,并修复代码,以使其不产生任何警告。忽略编译器错误很草率。关闭警告甚至更草率,以至您甚至都看不到它们。


评论


谢谢!我已将此更改为可接受的答案,因为Matt Heusser的参考文献来自1998年左右,但这早在1993年就建立了惯例。同样,IIRC和Code Complete一定是我最初在1999年阅读此文章的地方。现在重新阅读报价很熟悉。

–诺亚·萨斯曼(Noah Sussman)
17-10-24在17:17



#2 楼

我可能首先在perl社区中遇到此问题,在该社区中使用警告的建议“全部”;并使用严格;很常见。我的猜测是,我首先在Randal Schwartz的“有效的Perl编程”中阅读了该书-看起来像在146页上。那本书出版于1998年。针对尖头程序和小型程序的方法,以及一些大型但批处理模式(“ IT商店处理”)应用程序。我会注意以下几点:

1)这使您非常依赖于代码库。如果您使用引发警告和错误的库,则可能会引起麻烦。 (我可以使用该术语,基本上是我的姓氏。)

2)这也使您非常依赖于基础结构。如果您不想在服务器日志中看到任何警告和错误,则必须在坚如磐石的技术堆栈上构建坚如磐石的应用程序。例如,这在Ruby On Rails的早期版本中是行不通的-基础软件根本不够坚固。

3)结论:在您小的EDI到EDI转换脚本上,这可能会正常工作。但是,传播的范围越广,传播的内容就越稀薄-在财富500强数据中心中尝试任何错误或警告,并观察能带给您的距离有多远。与我合作过的几乎所有客户都可以从朝这个方向发展中受益。实际上,它们中的大多数都有如此多的错误和警告,它们通常会忽略存在用于监视日志的所有软件类别,并告诉您什么时候不应该真正注意的这一点。其中一些使用AI或机器学习。

在大多数情况下,可以将我们可以忽略的虚假和愚蠢的警告数量减少十倍甚至更多。

这对我的朋友们来说是一个值得接受的挑战。

评论


兰德尔·施瓦茨(Randal Schwartz)听起来像是原始来源的一个不错选择。谢谢,我将做一些挖掘以确认。

–诺亚·萨斯曼(Noah Sussman)
17 Mar 17 '17 at 0:41

好了,对过去的研究进行了反思之后,我对Randal Schwartz在“有效的Perl编程”一书中推广“修复所有错误和警告”作为一种测试启发式的说法感到满意。 Perl样式指南书是我记得阅读过的所有最早的例子,这些例子现在被所有现代解释语言称为“良好的代码样式”,这是我们都从Perl窃取的另一件好事。答案被接受。谢谢马特!

–诺亚·萨斯曼(Noah Sussman)
17 Mar 17 '17 at 7:42

Perl的历史非常宽容,导致非常细微的错误。因此,有必要加紧很多。至于ANSI C之前的版本。现在,我在IntelliJ中使用Java代码,并且该编辑器在发现内容方面非常有帮助,以至于仅进行很小的更改就会引入数十种警告,提示需要进行细微调整或有意禁用的事物。因此,这在很大程度上取决于您的工作环境。

–特尔比约恩(ThorbjørnRavn Andersen)
17 Mar 17 '17 at 14:59

Steve McConnell在Code Complete中的建议要提前五年。

–没人
17年3月19日在17:43

#3 楼

我完全同意Neils,并且我想解决这个帖子是否属于此Testing网站的问题。

一些基本的测试原理不依赖所使用的语言或开发的应用程序而适用,这些原理之一是:

复杂性使测试更加困难。

面对错误消息的测试人员正在尝试处理额外的不必要的复杂性-要看的东西与测试工作无关。摆脱它们。

一个潜在的反驳:无法清除错误消息通常表示开发人员匆忙编码。匆忙编码是产生编码错误的良方,因此,许多未清除的警告消息可能是测试人员的线索,暗示了潜在的容易出错的代码。

错误书

#4 楼

生成警告的早期工具是Lint。该警告旨在使程序员像对待错误一样对其进行修复。 Lint,一个C程序检查器。计算机科学技术报告65,贝尔实验室,1977年12月。提到的文章没有明确说“修复所有警告”。但是,它建议通过提供一种消除错误警告(由Lint的错误或缺点引起的警告)的方法来实现干净运行的目标,以达到干净运行的目的。 />但是,我不知道是否有较早的工具具有类似的意图。

评论


感谢您确定Lint可能起源于1977年,这本身就很有趣。

–诺亚·萨斯曼(Noah Sussman)
17 Mar 17 '17 at 10:26

值得注意的是,Lint的构思是因为K&R C及其编译器非常宽松。没有足够的错误,更不用说警告了。诊断是宝贵的资源,应加以充分利用。如果在第一天就可以教给学生使用“ -Wall -Werror”,那么可以避免在SO上发布很多帖子,可以花很多宝贵的时间玩游戏而不是回答多余的问题。

–彼得-恢复莫妮卡
17 Mar 17 '17 14:41



当我在80年代初期通过K&R学习C时,我被告知清洁棉绒是一种好习惯。即使在1985年,典型的C编译器也没有提供很多有用的警告。这是我从中学到的人们的普遍做法,是在Makefile中包含一个皮棉步骤。当我从学术界转到行业时,我的早期导师教我尽早大声地失败,并禁止这样做,以便将设计工作投入日志文件内容和错误消息中。

– RBerteig
17年3月17日在21:57

#5 楼

如果有的话,那就是相反的情况-这种文化开始让错误和警告越来越多地留在其中。卡-程序-很有限,通常很昂贵,而且卡座通常必须经过“验证程序”,检查程序的人会发现错误。即使系统负载很轻,也可能需要一个小时或更长时间才能运行平台,发现错误,修复并重新提交平台。

我从来没有提交过任何会导致错误的内容。

当我在1980年代初学习编程并于1985年开始工作时,打孔卡的日子就快结束了(我打孔并跑了一个牌-

然而,当时的职业中期程序员是从那个背景出发的,每个人都对警告给予了真正的认真对待-您根本就没有把它们留在里面,不用担心错误。遇到必须留下的警告真是令人震惊-而且您该死的人知道该怎么做,为什么不能解决它们以及如何以及为什么它们不会引起问题。 />
,我的意思是,如果警告不是什么意思,为什么还要发出警告?他们经常这样做:警告:进行此无损声明,您将随机覆盖重要的内存位。通过IIRC,Visual C ++在1990年代后期开始出现了许多无用且棘手的警告。我记忆模糊,如果Gnu编译器接受不带警告的警告,则生成Visual C ++警告的构造被认为是可以的。

我仍然对警告有这种感觉。在任何情况下,我都希望通过对代码进行增量测试,方法是将其粘贴到解释器或测试文件中进行编译-因此,如果弹出警告,通常很容易就此消除。 />
我相信亨利·莱德加德(Henry Ledgard)的《编程谚语》或他的后续著作《带样式:编程谚语的Fortran》建议您充分了解您的编程语言,以免产生警告。他曾经是打孔卡程序员。当然,这些天来,挑战在于跟踪您当前正在使用的语言-等待,这是带有“ else:”还是“ else {...}”的语言吗?

#6 楼

我想知道谁先说是否有意义。从历史上看,我希望它能与许多不同的团队在遇到类似问题时出现警告和错误时保持一致,然后再将它们写下来。谁先说的可能是全球不同编程团队中的许多独立人士。我认为这是每个团队最终都会想出的合理规则。

修复所有警告和错误的原因是,如果您不习惯于修复它们,则被他们淹没。可能导致您忽略可能相关的警告和错误。最终,您遇到了生产问题,因为有人长期忽略了它们。最初保留一个或两个警告或错误可能不是问题,但是它可以设置一个不再修复它们的标准。

我发现了一个错误记录系统,有时一个星期记录了20万多个错误。当我们遇到需要调试的问题时,对于开发人员来说,遍历所有这些问题非常令人沮丧。如今,大多数警告都与已弃用的功能有关。如果不尽快删除它们,则无法升级库。可能导致安全问题等。如果您永远无法修复警告(因为警告是可选的),那么您可能会错过重要的警告。这可能永远不会得到优先考虑,因为修复起来既没有乐趣,也没有良好的商业价值。随着时间的推移,可能使混乱变得更大。保持控制似乎是理智的建议:)

清洁代码:

这也可能是倡导干净代码的另一个好时机。干净的代码是人类的代码,而不是计算机的代码。罗伯特·马丁(Robert Martin)建议对代码进行优化以提高可读性,以便其他人可以更轻松地工作。这还有很多其他优点。

警告和错误也是如此。他们不会混淆计算机,它们会很好地处理错误和警告,就像他们会执行混乱的代码一样。问题是警告和错误使人困惑。他们会想知道为什么在这里?我应该用它做什么?谁把它留在这里?是因为原因吗?我也可以忽略它吗?我应该吗?

不要让其他开发人员重复使用。弄清楚意图是什么,并修复警告和错误,以防止造成混淆和不必要的问题。

评论


感谢您的详细答复,但我的问题不是了解谁创建了模因“修复所有警告和错误”是否有用。我是软件特别是软件测试的历史学家。 SQA SE是我用来从互联网挖掘文化和专业情报的工具之一。希望这有助于理解为什么这个问题有用。

–诺亚·萨斯曼(Noah Sussman)
17年3月16日在21:46

它认为这是由软件开发团队的常识造成的。任何团队编写软件都应该得出这个结论,因为它最终会咬人。这并不是一项显而易见的发明。如果您从不打扫房屋,就会遇到麻烦,每个人都知道。这不像有人编造的,现在全世界都对这个想法感激此人。每个人最终都会得出结论,偶尔清洁一下房屋是一种很好的做法。

– Niels van Reijmersdal
17年3月16日在21:51

@NoahSussman也许在您的问题中包含上下文“我是软件的历史学家”是一个好主意。这将使您更清楚为什么会提出要求。

– Niels van Reijmersdal
17 Mar 16 '17 at 21:52

#7 楼

过去十年中Ruby on Rails历史的一部分是,在一个版本中,经常发生的更改会以弃用警告消息标记,然后在下一版本中完全删除向后兼容性。因此,这个社区中经验丰富的人们已经学会了无视这些警告,后果自负。信号太少,您不知道要注意什么警告-特别是对于刚加入团队的新手。

评论


我对Etsy大约在2011年最喜欢的记忆之一是邀请Rasmus查看我们的PHP日志。那个星期,他发行了60张优先级高的Jira门票,那周,我再也没有在计算机上见过他,那时他没有在呼吸中喃喃自语,看上去很生气!不用说Rasmus告诉您修复PHP日志消息时,您删除所有内容并进行修复,这也是我们所做的!在那一周之后,监视和异常调查变得非常容易,并且从那以后开始变得越来越容易。通过消除所有对数噪声,可以实现持续改进!

–诺亚·萨斯曼(Noah Sussman)
17 Mar 17 '17 at 7:38

#8 楼

敏捷开发人员的实践,Subramaniam&Hunt,2006年。第137页有这个...带有警告的代码检入与带有错误的代码或未通过测试的代码检入一样糟糕。检入的代码不应从构建工具中产生任何警告。例; “稍后会有数十亿行代码”

#9 楼

既然您要求传闻,这与传闻差不多。这是一个非常基于意见的问题。

第一:


修复所有警告和错误。不要容忍任何错误消息



可能不切实际,具体取决于应用程序的大小/范围。某些应用程序有很多很多部分,您/您的团队无法控制所有这些部分。他们会抛出错误/警告,您对此无能为力。

但是,您可以控制以下内容:


,但要在它们出现后立即修复。我强调“它们出现后”,因为这是修复它的最佳和最简单的时间。开发人员将使代码焕然一新,并且修复过程将变得简单快捷。

更重要的是,您是否听说过开发人员说过“我以后要修复”?我有。然后出现代码审查,他们要么没有解决,要么放了一个TODO,但它仍然没有修复。当然,这种情况并非每次都发生,但是它很频繁。因此,我的意思是:应该尽快解决所有警告和错误,因为如果现在还不解决的话,那么它们就可以赢得胜利。不固定。即使在今天看来似乎毫无意义,将来也会有影响。

有人会继承该代码。他们不会知道完整的历史记录,可能会认为这是一个合法的问题。所说的人花时间去寻找一个不存在的错误,因为,让我们面对现实,您太懒了,无法解决良性警告/错误。另外,它们不必要地填满服务器日志,使真正的问题更难发现。

评论


尽快解决它的主要好处是,您很快就会养成编写没有警告和/或错误的代码的习惯。然后,您只需要解决以前从未见过的问题-有趣而省力。同样,编写可测试且可维护的代码-这是一种习惯,这很容易,而且生产率更高。

–史蒂夫·巴恩斯(Steve Barnes)
17 Mar 22 '17 at 19:43