我有一个用户问我这个问题。我们知道汽车发生故障,但这是由于物理原因(除非涉及软件!)。
我试图回答说,软件是一个年轻的行业,但用户反驳说:“汽车行业难道不是比更少的人变得更加稳定和可靠吗?”。
我还试图回答说软件更复杂,但是用户反驳说,构成汽车的零件有成千上万。通常,设计和制造汽车的人都非常了解其组件,但最终他们仍然会共同努力。
那么,为什么软件没有汽车那么可靠?
我有一个用户问我这个问题。我们知道汽车发生故障,但这是由于物理原因(除非涉及软件!)。
我试图回答说,软件是一个年轻的行业,但用户反驳说:“汽车行业难道不是比更少的人变得更加稳定和可靠吗?”。
我还试图回答说软件更复杂,但是用户反驳说,构成汽车的零件有成千上万。通常,设计和制造汽车的人都非常了解其组件,但最终他们仍然会共同努力。
那么,为什么软件没有汽车那么可靠?
Answers:
您提出这个问题的前提是完全不正确的:软件并非没有汽车那么“可靠”。还有数十亿数十亿后设备的外面,运行嵌入式软件全天候,好几年,没有问题。哎呀,其中一些在汽车里,控制/监视引擎。那么,如果汽车本身依靠软件,那么软件又怎么会比汽车不那么可靠呢?
我设计软件和机械零件。
这是复杂性。
因为现代软件中有数百万个“零件”。
软件部分非常复杂,并且有很多状态。机械的非运动部件没有状态。
机械运动部件具有其位置(一个变量)。
正在运行并使用1Mb RAM的程序具有一百万字节的状态。这远比任何普通机械系统都要多。
将会有永远不会被测试的状态组合,因为它们很少发生。在机械系统(例如汽车)中,很容易检查操作过程中机械零件是否相互碰撞。我在工作中使用的机械CAD软件会自动执行。
如果您是用看不见的,不可触摸的零件制造机器的,并且有数百万个相互丢失的活动零件,那就像是一个简单的程序。
甚至“ hello world”也可以在操作系统上运行。旧的8位系统和小型计算机操作系统非常简单,因此非常可靠。
诸如DLL和共享库之类的内容在病毒更新或软件安装过程中被替换,因此感兴趣的程序无法正常工作。有点像将汽车轮胎换成自行车轮胎。库函数的某些边缘状态会干扰(不要按程序预期的方式运行)。
用Java之类的语言编写的程序,一旦对象完全无法工作,它们就不允许对象之间进行许多未经设计的交互(指针重用,数组边界溢出),它们通常是相当可靠的。
当您将操作系统与静态库一起使用时,程序一旦运行就可以继续工作(但根据其状态大小,仍然会有很多边缘条件)。
Dave Parnas撰写了有关通过减小程序的状态来提高软件的可靠性的文章。严格的函数式编程人员通过强制执行单个静态分配来完成相同的工作。
这是消费者选择的问题。
如果消费者要求软件像我的本田思域(与我的老福特小牛)一样可靠,那就可以了。一些组织要求可靠且可靠的软件,通常是嵌入式软件,有时是对安全至关重要的事情,例如太空飞行和空中交通管制。该软件仍然不是完美的,但汽车也不是完美的。
但是,客户要求他们的软件具有其他质量,并且大多数人不愿意为功能可能更少,当然更昂贵的软件付费,而仅仅因为它更可靠而以后才发货。
组成汽车的零件有成千上万。
如果只有一台计算机(和相关软件)就这么简单。
电脑有多少GB的内存?数十亿个触发器?一个TB的磁盘?几百万个“运动中”的零件?
该软件可能正在运行成千上万的代码行或成千上万的代码行。加上许多(或更多)单元测试和工具。
不。“汽车也很复杂”的论点是铺张的。软件比汽车复杂得多。
在过去的一个世纪中,使内燃机运转的原理以及构成汽车的所有组件都没有太大变化。当然,已经有了进化上的改进和混合动力汽车,但是基本组成部分是相同的。您拥有发动机,传动系统等。甚至概念车和超级昂贵的布加迪威龙都采用相同的基本结构制造。简而言之,设计汽车是一个众所周知的问题。
与开发软件进行对比。
简而言之,有许多原因使汽车比软件更可靠。我刚想到了一对。
汽车是可靠的。大多数软件也是如此。
但是...定制汽车和定制软件都存在问题。
任何真正的汽车发烧友,只要拥有经过改装的1970年肌肉车,修修补补和微调,并且会出现故障,而且如果他保留原始设置,也不会遇到各种愚蠢的问题。但是...那他就没有增压器了...
由于您驾驶的汽车已经制造了许多次,因此构造过程非常精细,因此可以在生产线上反复制造同一辆汽车。
如果这是一种从头开始建造的同类复杂尖端汽车,那么它的可靠性将远不及它,例如,看看一级方程式赛车的故障率要高多少。每场比赛一到两次崩溃很常见。
新软件永远是一次性的。程序员以前从未编写过什么代码。在这种情况下,要获得真正的高质量,将涉及大多数产品无法承受的成本。每个非平凡的新软件实际上都是原型。
顺便说一句,这是将传统工程技术应用于软件工程的灾难的主要原因之一。
我可以继续,但是我的浏览器好像要崩溃了...
实际上有一个非常简单的原因。
赚钱的软件就是赢得市场份额的软件。通常,即使他们的软件不是特定市场上的最佳产品,最先将某个软件推向市场的公司也将获得最大的市场份额。
因此,重点在于尽快和不完美的软件发布,而不是后来的完美软件。
到目前为止,我都喜欢大多数答案。这是我的想法。
汽车的故障成本比软件更严重
汽车故障可能会导致生命损失。即使是不危及生命的车辆故障,也给用户带来极大的不便。软件故障只是意味着生产支持中的一些不良问题必须加班。如果那个人是一名全职免税员工,那么天哪,这根本就不那么昂贵。实际上,质量差和管理不善会得到奖励,因为免费加班实际上减少了每小时的人工成本!
当然,这取决于所用软件的类型(为武器系统,航空电子设备或医疗系统供电的软件也可能对生命产生影响),但是汽车要花很多钱,并且要经常使用,以至于可靠性下降。相当明显和痛苦。软件故障通常具有解决方法。
另一个想法:汽车看起来很可靠,但是即使汽车运行良好,它们也有一定的维护成本,而且从文化上讲,这是人们所关心的,甚至是关心汽车的人的骄傲支出。另一方面,软件在安装时通常已经损坏,并且经常需要随时间进行更改,但是从文化上讲,没有人愿意为维护付费。
我喜欢将Car视为应用程序。操作系统是运行应用程序的道路。
道路和汽车之间的接口定义明确。经过良好的测试,并经过广泛的向后兼容性检查(这很容易,因为界面简单)。但是即使如此,您仍存在一些向后兼容性问题。“ Farrie”类型的汽车很难在“泥泞道路”类型的道路上行驶。
即使这样,您的OS就像道路需要不断维护。架起桥梁。汽车挂在雪地上,像修坏应用程序一样破坏道路,损坏操作系统使用的磁盘和文件。
应用程序将在一个OS上编写。但是通常,它们必须运行不同版本的OS(不同类型的道路)。因此,只要在正确的OS(高速公路)上运行,您经过超级优化的应用程序就可以顺利运行且没有问题,而其他通用(简单)代码则可以在所有类型的道路上正常运行。
定义了应用程序和操作系统之间的接口,但该接口非常复杂,并且始终会略有波动。特别是因为我们允许用户使用扩展名修改自己的操作系统。如果政府允许用户修改道路,将会发生更多的交通事故。
当您开始限制用户修改OS的能力时,应用程序的可靠性几乎可以变成坚不可摧。查看所有这些嵌入式设备。我们不允许用户靠近他们的操作系统,否则您不能连续不断地以24/7全天候正常运行。
因此,我要说的不是软件不可靠。更像是说用户正在高速公路上为应用程序挖洞。嘿,您的应用程序刚好撞上我去年挖的洞,忘了。
首先,您的用户需要知道在这个世界上有如此可靠的软件,以至于他甚至都不知道它的存在。您是否看过电视崩溃?我也不。
我认为主要原因是软件无关紧要。非物质化意味着非开发人员看不到进展。例如,如果我在制造汽车,您会看到我组装了不同的零件,并且看起来越来越像汽车了。但是,如果您看着我编程,也许我会花数小时在黑色屏幕上咒骂绿色文字的图形,然后再进行奇怪的模式变化,当我对模式进行少许更改时,我会非常兴奋。
因此,普通人不会意识到软件的复杂性。当他们看到一个窗口时,就认为他们看到了该程序的整体,这太糟糕了。
而且,与汽车相比,软件的定制化程度要高得多。当您定制汽车时,您不会违背其设计,因为这显然是愚蠢的。如果我的引擎在汽车的前部,那么将其向后移动很可能是一场巨大的灾难。但是,由于软件无关紧要,如果客户要求您完全按照设计进行某些操作,他们将不会得到任何指示(除了您,但他们不会听)他们所做的事情是愚蠢的,然后他们我会惊讶地发现它没有按预期运行。
机械设备可以简单地简化为输入/输出;增加实现此I / O操作的部件数不会更改I / O操作。因此,系统可以被完全理解。
另一方面,软件具有Input-> Process-> Output。由于这种性质,无法完全预测或理解系统。
唐纳德·拉姆斯菲尔德说得最好:
“已知的东西;有些事情我们知道我们知道。我们也知道有未知的事物。就是说我们知道有些事情我们不知道。但是,还有未知的未知数-我们不知道的我们不知道的。” — 美国国防部长唐纳德·拉姆斯菲尔德
综上所述:
这是一个愚蠢的问题(不是您提出的,而是原始人提出的)。
这听起来像我父亲(技工)讨厌计算机,却整天都在eBay上度过。
这就像在问“为什么树比飞蛾更可靠?”。
首先,我拥有30台(是的,超过30台)计算机,而商店中没有一个是。我刚花了1400美元在修车上。去算一下汽车维修店和计算机维修店的数量。再次,愚蠢的比喻。
汽车由钢制成,计算机由塑料制成。汽车在任何天气条件下均可工作,计算机专为室内使用而设计。
我的Commodore 64(26岁)可以正常工作,并且没有维修。我的两辆车(不到10年)都进行了广泛的维修。给我看一辆拥有数千年使用小时的汽车,它已经使用了26年,仍能像出厂时一样100%运行。
软件基于位:0和1。(大多数情况下)汽车基于机械零件。
机械零件可能会磨损或发生故障,仍会继续工作。您的制动器磨损了,或者阀门泄漏了,但是汽车仍然可以正常工作,直到您可以修理它。
在大多数情况下,软件没有渐进式故障之类的东西。它要么起作用,要么破裂。除以零并非“几乎正确”;这只是一个错误。当您尝试将驱动器保存到没有足够空间的驱动器上时,就很难挤入所有数据。它只是不会走。
我认为软件的可靠性不一定要比汽车低,但是当软件出现故障时,它会立即而不是逐渐失效。
我想我有一个更好的类比。以一家根据客户要求制造救护车的公司为例。基本平台(例如,一个完全可操作且符合街道法律的RV剖析底盘)需要在几个方面进行修改:车架,充电系统,加注口,悬挂装置等。这些修改不仅必须符合街道法律,还必须满足管辖要求同时满足客户的需求。
然后,您必须自己建造救护车机构,同时还要满足政府和其他机构的多层监管要求。在仍然满足客户对某些时髦的座椅布置或存储系统的需求的同时。而且不要忘了您有来自世界各地的一百个不同的客户,他们在不同的购买和部署时间表上,没有一个人会说“我将像上一个一样,再拿一打”,而不必提交例外情况页面,通常需要对整个事物进行全面的重新设计。
汽车?没什么。您将购买建造的产品,并且对设计的任何方面都没有直接影响。甚至您对颜色的选择都是人为的,因为您实际上无法指定尚未经过工程设计和测试的颜色。从某种意义上说,只有“市场”而不是“客户”。我认为,为某些市场生产的现成软件通常与您在当地经销商处购买的汽车一样可靠。
汽车实际上并不像您想象的那样可靠。只是故障可以长时间隐藏(或忽略)而不会导致整个故障。您的汽车漏油和/或冷却液?没有?你确定吗?您可能错了...它可能只是在您尚未注意到的某处泄漏了很少量的水...现在将其扩展到悬架,车身面板,内饰等。我想我从来没有但遇到一辆我找不到问题的汽车。但是,绝大部分零件对于运输任务都是多余的。电脑不是这样。几乎计算机中的每个部分都是至关重要的。
这是旧的模拟与数字辩论,只是重新包装了。只要一切都完美,数字电视就很棒。一旦出现问题,音频就会断断续续,视频会阻塞,从而使它变得无用。与模拟电视相比,在模拟电视中您会有点嘶嘶声或静电,而这些声音很容易被忽略。
首先,当然有些软件是完全可靠的,而汽车,尤其是英国和意大利的汽车,不一定那么可靠。
也就是说,我在使用汽车软件方面的经验归结为两点:
保修费用。如果您的软件失败,请重新启动它。也许您将提交错误报告。或使用昂贵的支持合同。当您的汽车出现故障时,您将其带入汽车并要求在保修期内对其进行修理。这将使制造商花费100美元以上。如果每个软件故障使制造商损失2美元,我相信软件会更可靠。
JD Powers(和其他质量排名)。JD Powers调查ThingsGoneWrong(可能是任何东西)。如果这个排名真的很糟糕,人们将根本不会购买您的汽车,至少没有足够的钱来获利。如果我们为sw建立了JD Powers,并且人们真的很关心它,那么我相信sw会更可靠。
因此,如果您生产的汽车不可靠,保修成本将很快吞噬掉您的全部利润,并且几年后质量不佳的排名将意味着您根本不会出售任何汽车。如果您制作不可靠的软件,则用户会抱怨,您将出售昂贵的支持合同。
要求机动车辆具有可靠性和安全性。在许多(大多数)国家中,法律要求它们具有最低的可靠性和安全性,并且必须针对最坏情况(无论哪种情况)进行测试。在大多数情况下,商业软件不是。
尽管该软件还有其他法律含义,但需要注意的是,如果每次您按下“保存”按钮时软件都崩溃了,那么这仅仅是补丁/修复问题,然后您就可以继续进行。如果每次打开指示灯都会使汽车撞车,那么情况就更糟了。对于Microsoft Outlook而言,运行不会意外崩溃并不是那么重要,而对于SUV而言,运行不会意外崩溃并不那么重要。
话虽这么说,还有其他一些软件所承担的责任比汽车的技工还要高。飞机和导弹制导系统必须可靠;生命危在旦夕!人们希望它们比普通的汽车受到更严格的测试。
汽车行业不会向公众发布“测试版”汽车进行测试,汽车行业也不必担心他们交付产品的环境,但是我也必须担心很多其他事情。说软件行业首先是根本不同的(众所周知),因此可靠性和复杂性确实具有启发性。在我看来,汽车比软件复杂,但是自从
因此,声明说软件不如汽车可靠,对于许多软件来说都是正确的,而在其他领域(安全,航空...)则完全错误,您可以确定软件至少最可靠而不是最可靠。在那些地区的汽车。仅仅因为这些领域至关重要,而据我所知,只有这些领域的软件才能与汽车行业进行比较。
这就导致了这一点:大多数软件在其领域中并不重要。如此看来,您就拥有了可靠的软件,您将发现的唯一问题就是与环境相关的问题(因此,即使您可以控制它,实际上也没有问题),而不是软件本身。但是,大多数软件编辑器都不能在这些关键领域中工作,当然它们必须提供一定水平的质量,但是(我认为)他们必须尽快交付软件。但是,好的软件要求:好的项目管理,可靠的规格,好的设计和熟练的技术(要恢复它)。那只是为了实现它,我们甚至没有在谈论出售它。
所有这些都需要时间,因此需要金钱。我并不是说您得到的就是我要说的话,而在大多数情况下,您生产的投资却从未减少(除非您被搞砸了,但随后却什么也没产出……),有时甚至更多。 。
我不认为汽车没有那么复杂。但是即使是这种情况,我也不认为软件的可靠性较低。但是,我认为还有一些更重要的因素导致软件可靠性方面的差异:
软件中涉及的抽象。这导致软件创建者误解了事情是如何工作的。随着时间的流逝,越来越多的抽象被添加。例如,汇编语言使您可以直接控制机器。C更加抽象,但仍与机器接近。Java,C#和接下来将要发布的内容极大地抽象了机器中发生的事情。另一个示例是,如果您是一位程序员,想了解软件级别上的网络是如何发生的,那么您应该知道要使用C进行编程,因为基础结构(作为软件)是用C编写的。
不同的经历和制造者的知识导致不同的结果。不同的开发人员创建具有不同可靠性的软件。关于汽车制造商也可以这样说。但是,不同之处在于,任何可以使用编辑器和编译器,甚至只是安装IDE(集成开发环境)的人都可以免费创建软件。要制造汽车,您需要巨额投资,需要一家工厂(有些汽车制造商可以不使用汽车而制造汽车,但是您到处都找不到它)。您将投入大量资金,这意味着您将尝试聘用该领域的佼佼者。但是,汽车仍然存在可靠性问题。如果您意识到这一点,则有数百万辆汽车因严重的[错误]而被从市场撤出。在我的汽车上,制造商将免费更换当年购买的所有汽车的制动钳。
用户通常比汽车更容易出现软件中的错误。这是用户与软件之间交互和响应的结果。在汽车中,我们关注的细节较少,例如“踩油门时汽车正在加速”,折断,转弯,照明,后视镜等。在软件中,每当用户单击/输入时,通常一个答复。因此,在很多地方软件可能会出现故障,用户会立即注意到它。这使用户相信它不如汽车可靠。
黑客和攻击。使用的软件越广泛,遭受黑客攻击的百分比就越高。您可以将此与盗车进行比较。对我来说,如果汽车的所有者或钥匙以外的其他人打开汽车,汽车的可靠性也会受到损害。但是,由于看不见攻击者,因此与汽车相比,尝试攻击软件更容易。因此,当软件被盗用时,人们会联想到它即使可靠,也不可靠。
就像其他所有内容一样……当它起作用时,您不在乎……当它破裂(或不按您想要/期望的方式工作)时,您就在乎。
想想飞机。许多人担心人们试图劫持或炸毁他们。但是与每日航班数量相比,负面事件的数量确实很少。(一天之内有更多的航班遭到劫持或轰炸。甚至还试图劫持或轰炸。)
一切都在您的外观和测量方式中。
实际上很简单。汽车是老技术。这些天肯定会响起(断断续续),但如果您看看早期的汽车,它们会摔坏很多。
汽车机械部件背后的“技术”已经存在了数百年,内燃机也已经存在了很长时间,并且在引入时存在很多问题。
考虑到某些托管平台的内存问题几乎已成为过去。给软件几百年,我们也将其牢牢掌握。实际上,考虑到软件的复杂性,我认为我们处于领先地位。
现代汽车依靠S / W。当现代汽车发生故障时,例如发动机计算机发生故障时,通常(尽管不是总是如此,但是通常)是引起故障的电子设备,而不是软件。
询问装有ECU的现代汽车的任何拥有者,在发生昂贵的故障之前可以运行多长时间。如果你活了十年,我会被惊呆了。充满电子和传感器的现代汽车极度不可靠。
如果您学习可靠性理论,答案将非常明显。所有的机械设备(预期软件)都具有稳态可靠性,这是在婴儿死亡率和磨损区域之外时的故障率。最终项目的失败率是零件失败率的总和。添加更多零件:总体故障率变得更高。接下来的挑战是使所有这些组件的故障率真正降低。
当涉及到同步皮带和气缸磨损以及氧气传感器充满碎屑,连接器变成欧姆以及由于振动而导致电线断裂等问题时,可以使用一些技术来降低故障率。这样做也会增加成本。
另一方面,软件具有恒定的故障率。尽管有时很难发现缺陷,但最终所有软件都是香肠机。输入->处理->输出。有时,输入的ORDER和输入的组合会导致可检测模式的失败。发生这种情况时,您就发现了缺陷,将其修复,然后继续前进。
没有(已知)缺陷的软件的故障率有效为0。它将永久运行而不会出现故障。(两次故障之间的平均时间= 1 /故障率)。硬件平台将首先失败。
带有缺陷的软件可能只能运行,直到随着时间的推移输入条件的正确组合导致缺陷变得明显为止。
所有这一切中的FALLACY是试图将物理事物的故障率(由磨损,IC中的金属迁移,进水,振动等引起)与实质上是有限状态机的故障率进行比较,而该有限状态机仅能准确地完成它的指令序列告诉它做什么。
(即使诸如alpha粒子在RAM中的位翻转之类的现象都是物理现象,而不是软件缺陷。但是,处理此类事件的方式可能是软件缺陷,但请记住,讨厌的alpha粒子只是该软件的另一输入。 )