尽管采用了严格的质量措施,导致缺陷泄漏到软件中的主要原因是什么?
为什么仍然会发生bug,如何减轻它们呢?
我知道,有了良好的编码实践和仔细的质量措施,许多bug是可以预防的,但我不明白为什么它们都不能被预防。不可能是程序员不够优秀,因为即使是非常优秀的程序员也会编写有缺陷的代码。不可能是测试人员没有正确地完成他们的工作,因为他们发现了许多错误,即使程序员正在使用最好的工具和技术组合来编写代码。
发布于 2018-10-30 13:18:49
有几个因素涉及到不可能创建非平凡的无bug软件的原因。
即使是最简单的软件也有效地有无限的途径通过它。考虑一个非常基本的计算器应用程序,它允许加法、减法、乘法和除法。它不仅需要检测键盘输入并知道要执行哪些计算,还需要能够遵循操作规则的顺序,处理嵌套括号,并生成正确的答案。
然后,在用户界面方面,它还需要能够在任何时候处理撤消或取消操作。它必须维护用户输入的完整列表,在用户触发计算(通常为=)之前不计算任何内容,因为否则输入(如1 + 2 * 3 )将返回9而不是7。
如果这还不够的话,该应用程序将使用底层架构来执行其操作。在计算器示例中,它可能使用编程语言中的库,但这些库正在调用计算机GPU来实际执行计算。这里浮现出臭名昭著的奔腾虫。
开发人员或测试人员所认为的bug并不一定是用户所认为的bug。如果您正在编写销售点软件,用户将希望销售和收取付款的过程是快速和容易的。他们将接受一个笨拙的产品设置过程,因为他们将花费大部分时间使用软件进行销售事务。
想象一下一个文字处理程序,其中编写或编辑文档的过程是使用它最复杂的部分--用户会认为这是一个缺陷,尽管从技术上讲,该软件正在完成它设计的任务。类似地,今天的用户可能会考虑使用x图标以外的任何东西来表示关闭按钮是错误的,因为二十多年的个人计算机已经教会了他们x的意思是close。
现代软件并不是孤立运行的。即使是嵌入式设备软件也通常与某些东西进行通信。这意味着软件必须能够管理其通信,优雅地处理其内存需求,而不是在其退出后留下锁定的资源。
通常,任何软件都试图为至少一个人解决至少一个问题。通常,软件试图为具有类似问题的多个人解决多个相关问题。
模块之间的每一个交互,每个潜在的配置设置,每个问题,每个潜在的用户都形成了一个“边缘”,一个软件的某些部分与其他东西交互的地方。每一种新的边缘都会使软件的复杂性成倍增加,因为它必须以某种方式与(通常)其他边缘进行交互。
这种程度的互动很快就变得不可能为人类的头脑所控制。我们可以编写有数百万个交互点的软件,但我们不能真正理解它。我们所能做的最好就是在给定的时间将一小部分保留在我们的脑海中。
这意味着,即使所有与技术、用户相关和交互相关的潜在问题都能得到预防(这通常是不可能的),我们仍然会错过一些东西,因为任何重要的应用程序中都有太多的东西需要任何人去处理。
从本质上讲,软件工作在二进制逻辑中。有些东西是或不是的。甚至对人工智能的工作最终也会以某种形式分解成二进制,它是否高于概率阈值。
现实是复杂的,通常是模糊的/模拟的,在那里,某些东西可以是其他事物的一部分,或者是过程的一半,或者两者兼而有之。
虽然这仍然是真的,但仍然会有错误,因为软件不可能完全处理人们一直本能地做的事情,而且人们总是把漏洞看作是bug。
发布于 2018-10-31 10:53:01
发布于 2018-10-31 14:11:24
凯特的回答不多,但这是我的尝试。
有可能吗?-可能,但不可行。
查看所有的数据排列、配置、交互、边缘案例、阴性案例、失败案例、未知案例(这个可能是棘手的)将需要大量的时间和精力。我怀疑任何组织是否准备为这个级别的测试分配预算和时间。
所以,我们必须做出权衡。我们必须确保在给定的时间框架和预算范围内尽可能多地进行测试。这就是为什么在一些组织中,对需求进行风险评估的原因。这次失败的可能性有多大?有多复杂?这个功能用了多少钱?如果此功能失败,对应用程序其余部分的影响有多大?对客户的影响有多大?
所有这些权衡意味着我们知道我们并没有经历每一种可能的情况。我们的希望是,我们能够做出明智的决定,以减少错误通过最终用户的可能性,而不是灾难性的。
https://sqa.stackexchange.com/questions/36228
复制相似问题