高考考试网
当前位置: 首页 高考资讯

程序员不是在写bug就是在改bug(为什么你一直在写bug)

时间:2023-07-23 作者: 小编 阅读量: 6 栏目名: 高考资讯

程序员的预期没有满足绝大部分理性用户的期望。但有时候程序员期望程序执行的行为会出乎普通用户的意料,甚至给他们带来麻烦,所以这也算是一类bug。bug通常来自开发者尝试降低代码复杂性未果而产生的副作用。复杂的事物容易引起用户的误操作。这也是需要额外小心的另一件事。这两个方面是紧密关联的。本文摘编自《编程原则:来自代码大师MaxKanat-Alexander的建议》,经出版方授权发布。

导读:当谈论bug时我们究竟谈论的是什么?

作者:马克斯·卡纳特-亚历山大(Max Kanat-Alexander)

来源:华章科技

01 什么是bug

相信绝大部分程序员都听说过这个故事:曾经真的有人在计算机里找到了一只昆虫,正是这只昆虫导致了计算机程序运行出现了错误。(但真实情况是,人们在那之前就已经把程序的异常行为称为bug了,但因为这则故事富有趣味,所以一直被人们津津乐道。)

但说真的,当谈论bug时我们究竟谈论的是什么?

这里是关于bug的精确定义:

  1. 程序的行为并没有符合程序员的预期。
  2. 程序员的预期没有满足绝大部分理性用户的期望。

通常来说只要程序能够严格执行程序员给出的指令,它就可以算是处于正常工作的状态。但有时候程序员期望程序执行的行为会出乎普通用户的意料,甚至给他们带来麻烦,所以这也算是一类bug。

其他软件功能上的不足都可以归纳到新功能需求中。如果说程序的工作状态的确与我们期望的一致,但离用户期望还有差距,则意味着它需要新“功能”。“功能”和“bug”定义之间的区别也就在这。

请注意硬件也可能产生bug。程序员不太可能发出“让计算机爆炸”这类的指令。如果程序员编写了一段程序导致了计算机真的爆炸了,这很有可能是硬件bug引起的。硬件中当然可能存在某些bug,但应该不会是如此夸张的这种。

本质上说,任何导致程序员指令没有被正确执行的故障,都可以被认为是bug,除非程序员打算让计算机做一些它本不应该去做的事情。

举个例子,如果程序员告诉计算机去“统治整个世界”,但是它本身就不是被设计用来统治世界的,那就意味着计算机需要一个新的“统治整个世界”的功能。这也就算不上是一个bug。

  • 硬件

至于硬件,你应该同时考虑到硬件设计者的预期,以及大部分程序员的对于它们的期望。从这个层面上说,程序员其实是主要的“用户”,硬件设计者则是需要考虑程序员预期的人。

当然,我们也应该关心普通用户的期望,特别是针对那些普通用户会与之打交道的硬件设备,比如打印机、显示器和键盘等。

02 bug的源头

bug来自哪里?我们能把所有bug的成因范围缩小至一个或者几个之内吗?答案是肯定的。

bug通常来自开发者尝试降低代码复杂性未果而产生的副作用。也有部分来自对其实简单的代码产生的误解。

除了一些拼写错误以外,我能十分肯定以上两点基本就是所有bug产生的根本原因,尽管我还没有进行深入的研究来证明这件事。

复杂的事物容易引起用户的误操作。想象一下一个黑色盒子,上面有上百万个没有任何标识的按钮,而其中的16个按钮按下之后会毁灭整个世界,那么使用这个盒子的人中注定有人会一不小心让毁灭降临。在编程中也存在类似的情况,如果你无法轻易理解编程语言的文档,或者是这门语言本身,你就或多或少存在错误使用它的可能。

说真的,就那个长满上百万个没有标识按钮的盒子而言,正确的使用方式不可能存在。你永远也不可能弄清正确的方式是什么,即使你计划阅读完1000页的说明书,也不一定能记住能够帮助你正确使用盒子的整套流程。

同样的道理,只要你让事物变得足够复杂,人们就会倾向于用错误的而不是正确的方式使用它。如果你把50、100或者1000个这类的复杂组件拼装在一起,无论由多聪明的工程师来进行拼装,它们也永远无法正常工作。

所以你开始明白bug来自哪里了吧?你每引入一丝复杂性,开发者(这里的“开发者”甚至包括你自己)误用你的代码的概率就高一分。

一旦代码的意图和使用方法变得极不明确,就会让使用这份代码的人犯错。又因为你的代码和其他的代码混合在了一起,导致了开发者误用和犯错的可能性大大增加。而后这些代码又会继续和其他的代码混合,形成恶性循环。

  • 复杂性的构成

硬件设计者将硬件制造得极为复杂的情况时常发生。所以它必须与复杂的汇编编程语言集成。而这又使得汇编语言和编译器同样复杂起来。当你遇到这种情况时,如果你不提前对程序进行精妙的设计或者全方位的测试的话,基本上无法避免bug的发生。只要你的设计不够完美,那么在运行的一瞬间,大量的bug就会涌现出来。

站在其他程序员的视角看这件事也很重要。毕竟有些事对你来说很简单,但是对其他人来说或许很复杂。

如果你想要感同身受地体验一下其他人看不懂你的代码的感受,你可以找一份你从没有使用过的类库的文档来阅读看看。

也可以找一些你从没有阅读过的代码来阅读。尝试理解整段程序而不是单行代码的含义,并且想象当你需要对它进行修改时应该从哪里入手。这些都是其他人阅读你代码时的体验。你大概注意到在阅读他人代码时,即使并不复杂的代码也足以让人产生挫败感。

现在我们考虑另一种程序员误解简单代码的情况。这也是需要额外小心的另一件事。如果你察觉到某位程序员在向你解释一段代码时叙述得牛头不对马嘴,那便意味着他应该是误解了代码中的某些内容。当然如果他正在研究的领域极其复杂,也情有可原,可能需要他读到博士学位才能完全掌握它。

这两个方面是紧密关联的。当你编写代码时,需要承担的部分职责是让将来阅读你代码的程序员理解它,并且是很轻松地就能理解。如果你确实是这么做的,但是他在阅读过程中仍然产生了严重误解——或许他根本就不明白“if”语句是什么含义。那应该就与你无关了。

假设将来那些阅读你代码的程序员,对编程的基本原理和正在使用的编程语言语法都略知一二,在这个前提下你的职责是写出整洁的代码。

所以最后可以总结出几条有趣的原则:

  1. 你写的代码越简单,bug就越少。
  2. 你应该始终想方设法去简化程序中的代码。

关于作者:马克斯·卡纳特-亚历山大(Max Kanat-Alexander)是谷歌的代码健康技术主管,主要帮助其他软件工程师提高生产力,包括编写开发工具、创建教育程序、指导重构工作等。他还曾在谷歌担任YouTubeXbox的技术主管,从事Java JDK、JVM和Java其他方面的工作,以及担任YouTube的工程实践技术主管,他在YouTube上为所有开发人员提供最佳实践和工程开发效率方面的支持。

本文摘编自《编程原则:来自代码大师Max Kanat-Alexander的建议》,经出版方授权发布。

延伸阅读《编程原则》

推荐语:Google代码健康技术主管、编程大师Max Kanat-Alexander又一力作,聚焦于适用于所有程序开发人员的原则,从新的角度来看待软件开发过程,帮助你在工作中避免复杂,拥抱简约。

延伸阅读《深入理解计算机系统》

推荐语:卡内基梅隆大学计算机学院院长兼美国4大机构院士撰写,畅销全球40余国,中文版售逾30万册。

    推荐阅读
  • ip67级防水怎么测试(IP65防水检测方法)

    IP65中的“6”表示完全防止外物侵入,且可完全防止灰尘进入;“5”表示防止来自各方向由喷嘴喷射出的水进入产品内部。IP65防护等级的应用,一般有户外的灯具,灯具正常情况下只需要防止雨天的时候,雨水进去,空气中的尘埃,进去就可以了.摄像头也是如此,也就是IP65防护等级。可以采用深圳市海瑞思自动化科技的气密性检测装置,海瑞思的气密性检测装置采用的是压缩空气,由于压缩空气不具有粘性,易于使用,收集方便,不会造成污染。

  • 幼小衔接必做的12件事(你家孩子的幼小衔接做对了吗)

    在这一点上,几乎也成为了所有父母和教育者的一个共识。于是,付老师也给各位家长列举了几个“坑”,家长们完全可以避免。付老师就指出,幼小衔接并不是所谓的提前学习,而是培养孩子的阅读习惯、语言表达能力等等。对此,付老师就表示,幼小衔接的准备工作实际应该是贯穿于整个幼儿阶段,其中包括了习惯、性格、能力各个方面。

  • dnf粉卡怎么升级(dnf粉卡升级胚子2022)

    一般来说,打造装备提升最大的是附魔、其次是徽章、最后才是增幅。流传属性最逆天的卡片就目前来说,流传中最逆天的卡片莫过于卡洛夫的武器附魔了,这张卡片则是在暗精灵遗迹随机出现的卡洛夫BOSS掉落,老玩家对这个副本相信都不会陌生。升级最离谱的BOSS粉卡如果说卡洛夫是属性最离谱的BOSS卡片,那么混沌之奥兹玛就是升级最离谱的BOSS粉卡了。虽然说奥兹玛团本还没有上线,但是在之前的异界中却出现了这位使徒!

  • 重阳节的来历简短(重阳节的由来和传说介绍)

    今年10月25日就是重阳节了,如今的重阳节已经是一个敬老节。东南网记者叶伏国摄重阳节的起源九九重阳,早在春秋战国时的《楚词》中已提到了。到了唐代重阳被正式定为民间的节日。重阳节的传说和大多数传统节日一样,重阳节也有古老的传说。一场瘟疫夺走了青年恒景的父母,他自己也因病差点儿丧了命。后来人们就把重阳节登高的风俗看作是免灾避祸的活动。

  • word技巧知识进阶(Word技巧实用就好)

    Word技巧实用就好不知道大家有没有这种感觉,在使用Word的过程中,总能遇到很多看似简单做起来却一点也不容易的难题,但如果不知道必要的方法,就会消耗我们大量的时间,很是让人头疼今天我们就来分享几个Word输入与编辑文档。

  • 翡翠矿点算杂质吗(翡翠矿点是否算杂质吗)

    翡翠矿点算杂质吗一般来说,翡翠行业内基本黑点,只有程度较深足以影响原件的美观才算瑕疵,如果程度较浅对原件的美观没有明显的影响,那么就不算杂质。另外,并不是说有矿点的翡翠就一定就不值钱了,因为有矿点的翡翠,一般其原材料种份老,质地致密细腻,绿色浓艳。但是,如果在无色或白色为主体的翡翠制品中含有矿点,对翡翠的外观不产生负面的影响,反而会提高翡翠制品的价值,这时这些矿点就不算杂质。

  • 身体累心更累得啥病(身心健全离不开)

    而无论家庭条件如何,无论男孩女孩,“精神富养”才是父母需要给予孩子的最佳营养。所谓“精神富养”就是要让孩子感到被父母珍视,从而自信、自强;要不断开阔孩子的眼界,丰富孩子的知识内涵;要帮助孩子培养理性思考、判断的能力,让孩子眼光更高远。然而我们看到很多贫穷的家庭依然可以做到“精神富养”。这事实上也体现了我国传统的“精神富养”的智慧。

  • 亲爱的小孩方一诺是不是太敏感了(母爱也包裹不住的自私)

    双方各执一词,至今依然在网上争论不休。得知禾禾配型成功后,方一诺终于可以睡上一次久违的安稳觉。再加上主治医生无法提供捐赠者的有用信息,方一诺把心一横,决定到骨髓库大闹一场。文主任无可奈何,只能向方一诺透露,捐赠者是因为怀孕无法捐赠,他实在是无能为力。首先,四人在做出这些极端行为前,禾禾并没有任何病重的迹象,在得知捐赠者有难言之隐后,他们没有任何理由继续骚扰文主任一家人。

  • 世界最大的植物是什么(地球上最大的植物)

    科学家们从鲨鱼湾的十片海草草甸中采集了芽样,那里的海水盐度从正常的海洋盐度到几乎两倍的盐度。大多数情况下,海草幼苗将继承其双亲的一半基因组,然而,多倍体携带着其双亲的所有基因组。大约8500年前,当海平面在最后一次冰期后上升时,鲨鱼湾的沙丘被淹没。鲨鱼湾的水域也有很多光线,营养水平低,温度波动大。鲨鱼湾的海草草甸在热浪中遭受了广泛的破坏。保护和恢复海草草甸在减缓和适应气候变化方面具有至关重要的作用。

  • 福禄寿喜四色翡翠价格(福禄寿喜四色翡翠价格怎么样)

    福禄寿喜四色翡翠价格福禄寿喜四色翡翠品质好的价格是要上亿的,在市场上非常少见。四色翡翠最常听的就是福禄寿喜,就是四种颜色的结合,指的是红色、绿色、紫色和白色的结合,又或者是红色、黄色、紫色和绿色的结合。“福禄寿喜”代表了人们对日常生活中,幸福、升官、长寿、喜庆这四个方面的美好祈愿,在我国的传统文化中,“福禄寿喜”所对应的元素分别是福星、禄星、寿星和喜神。