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

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

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

程序员的预期没有满足绝大部分理性用户的期望。但有时候程序员期望程序执行的行为会出乎普通用户的意料,甚至给他们带来麻烦,所以这也算是一类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万册。

    推荐阅读
  • 做面条方法(做面条方法与步骤)

    做面条方法首先得有面粉,面粉要高筋面粉,这样做出来的面条好吃,有韧劲,往面粉里加入凉水,边加边搅拌。当加水到面粉成棉絮状的时候就不要加水了,然后把面粉揉成团,封上保鲜膜腥发10分钟。然后把面团给擀成薄点的面饼。再用刀切成条,撒上面粉,这样才不会沾到一起。锅中加入水烧开,水要多一点,然后下入面条煮。煮熟之后把面条、豆芽、青菜给捞出来,然后把面条放到一个碗里。再给搅拌均匀,就可以了。

  • 出去玩的心情说说(分别有哪些)

    人生至少要有两次冲动,一为奋不顾身的爱情,一为说走就走的旅行。说走就走的旅行,要么缘由幸福稳定和宽裕,要么祸起无力无奈和逃避。让所有习惯黑暗的眼睛,都习惯光明。别忘了答应自己要做的事,别忘了答应自己要去的远方,无论有多难,无论有多远。一个人旅行,不理会繁杂的琐事,自由自在地,去体验一个城市,一段故事,留下一片欢笑。一人旅游的确会有些寂寞,但那种寂寞也应当存在于旅途中。

  • 江西豆葱的做法(江西豆葱如何做)

    接下来我们就一起去研究一下吧!江西豆葱的做法食材:黄豆渣200g,面粉200g,牛奶15ml,小葱若干,黄油若干,鸡蛋1个,海盐若干。由于豆渣本身带有水分,一开始可以先不用水。接着加入一只鸡蛋,一把葱花,海盐些许,再倒入些许牛奶,继续搅拌,直到变成稀糊装即可。平底不粘锅,先热锅,然后取黄油下锅,均匀散步在锅底各处。然后取一勺调好的面糊,开始滑动摊饼。

  • 华为mate 30好还是华为p30好(华为Mate30与华为P30谁更值得买)

    而今年呢,华为在发布新旗舰,这一点上做得非常好,节奏很紧凑,新老机型更换速度非常快,那么华为Mate30与华为P30谁更值得买?华为Mate30作为新旗舰的价格相对来说是比较昂贵一点,达到了3999元。华为Mate30采用的是小刘海屏设计,并且机身的尺寸已经是达到了6.62英寸,而华为P30是6.1英寸的水滴屏幕,所以说如果你喜欢小屏幕手机的话,更加修长的华为p30会显得更时尚。同时,机身背部华为Mate30是大圆形摄像头,看起来并不如华为P30的左上角摄像头好看。

  • 大秦赋赵姬可以说话吗(大秦赋赵姬和吕不韦是什么关系)

    非吕不韦一支的吕氏谱牒说吕不韦仅有一女,秦始皇是其子。有人认为吕雉大封其族子弟为王为候时,吕文和并没有封候,吕文和应不是吕雉一族。所以,并不能以此证实吕文和非吕雉一族。吕文和属是第一支吕雉还是第三支吕不韦,目前尚介于两可之间,只能认定吕蜴确实是吕不韦后裔。赵姬的结局是正常去世的,死后被嬴政追尊为“帝太后”。与秦庄襄王合葬茝阳。吕不韦被贬出咸阳后服毒自尽,嫪毐集团被彻底铲除。

  • 咖啡和牛奶可以一起喝吗(牛奶和咖啡可以一起喝吗)

    接下来我们就一起去研究一下吧!牛奶和咖啡的主要成分都是水分,另外牛奶还含有一些蛋白质、脂肪,咖啡还含有一些碳水化合物、粗纤维等成分,都是常规的食品成分,无毒,并且没有刺激性的物质,也没有会相互反应的物质,因此可以一起食用。要把咖啡倒在奶里,而不要把奶倒在咖啡里,且最好用脱脂牛奶,这样就可以防止牛奶在胃里变质。

  • 体型偏胖的人也会营养不良吗(越胖的人可能越营养不良)

    实际上,肥胖也算是一种营养不良肥胖的问题主要是能量过剩,而不是营养过剩,营养不良会导致代谢变慢,身体不能很好的消耗掉脂肪,也不能很好的利用能量,导致脂肪堆积为什么肥胖会导致营养不良呢?

  • 深度解析周星驰所有电影(一九九二香港电影周星驰年)

    片中梅艳芳写给周星驰的文盲情书是最大的笑点,至今让人无法忘怀。也是在1992年,刘德华和张学友、黎明及郭富城正式被封为香港四大天王,香港乐坛正式进入四大天王的时代。黎明和老牌喜剧之王合作的《神算》票房3640万港元排名第7,是四大天王中唯一进入票房前十的。刘德华和黎明在《龙腾四海》中有合作,黎明和张学友在《太子传说2明月照尖东》中有合作。另外还主演了《亚飞与亚基》《踢到宝》《三个夏天》。

  • 香椿用开水烫怎么做(烫多长时间(香椿用开水烫如何做)

    香椿用开水烫怎么做香椿用开水烫怎么做:香椿用开水烫的最主要的目的是去除一些对人体有害的成分,经过开水烫之后,可以使香椿中含有的草酸、鞣酸、硝酸盐、亚硝酸盐等含量大大降低。一般绿叶蔬菜烫15秒就可以了,茎类烫30秒就可以了,而香椿主要是嫩叶和嫩茎,因此一般烫30秒就可以,如果想吃熟一些或者想降低更多的硝酸盐和亚硝酸盐,烫60秒左右也是可以的。

  • 罗马假日剧情介绍(讲述了什么故事)

    罗马假日剧情介绍某国王室的安妮公主到罗马去访问,国务烦身,但她又厌倦繁文缛节。二人把手同游,相当快乐。公主更是到乔的家中作客并在那过夜。然而,在接下来与公主的相处中,乔不知不觉恋上了公主。为了保护公主的形象,乔只能忍痛抛弃功成名就的良机,将照片送予了公主。安妮公主在经历了罗马一日假期后,反而体验了自己对国家的责任,毅然返回了大使馆,为了本身的责任而果断抛弃了爱情,令人有些黯然神伤。