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

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

来源:大数据DT(ID:hzdashuju)

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的建议》,经出版方授权发布。

延伸阅读《编程原则》

点击上图了解及购买

转载请联系微信:DoctorData

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

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

点击上图了解及购买

转载请联系微信:DoctorData

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

划重点????

干货直达????

  • 吐血整理:人工智能、机器学习领域13个常见概念

  • 多图详解边缘计算系统的组成及概念

  • 中国提出碳中和,到底能得到什么好处?(真想不到!)

  • 什么是数据产品经理?需要什么能力?有哪些相关书籍可以读?

更多精彩????

在公众号对话框输入以下关键词

查看更多优质内容!

读书 | 书单 | 干货 讲明白 | 神操作 | 手把手

大数据 | 云计算 | 数据库 | Python | 爬虫 | 可视化

AI | 人工智能 | 机器学习 | 深度学习 | NLP

5G | 中台 | 用户画像 数学 | 算法 数字孪生

据统计,99%的大咖都关注了这个公众号

????

为什么你一直在写bug?原因找到了相关推荐

  1. 编程真可怕,我们日常都在写 Bug

    作为开发者,我们一直走在写 Bug 的路上,而什么样的代码才是最好的?又该如何掌握调试的正确姿势呢? 编写易于删除且易于调试的代码 可以调试的代码那必然是不如你大脑聪明的代码.现实生活中,我们总会遇到 ...

  2. tomcat 404错误 原因_软件测试人员定位bug原因的10大妙招分享

    作为一名软件测试人员,日常工作与bug是息息相关的.在发现bug之后,首先要做的就是定位bug,确定bug的存在,然后才是分析bug产生的原因并解决bug. 无论是自己找到的bug,还是开发修复后告诉 ...

  3. 测试人员怎样定位bug原因

    作为测试人员,和我们最常打交道的,莫属bug.当你发现bug后,会采取什么样的行动?是直接报出来,亦或找找问题原因? 不管是我们自己找到的,亦或是开发修复后告诉我们的,知道问题之所在总是好的.在本篇文 ...

  4. 酒店管理系统软件测试找bug,软件测试查找bug原因

    想要修复bug,首先面临找到bug原因的难题,好比一根针掉到地上,怎么找到这根针?这个问题就交给各国大妈去解决了 中国大妈会根据针掉落的方向,落地点等,去确定查找范围,然后目测去寻找到针 德国大妈会把 ...

  5. 每天写bug是一种怎样的体验?

    点击上方"程序员小灰",选择"置顶公众号" 有趣有内涵的文章第一时间送达! 本文转载自公众号  小象 源 | 小象     文 | 小象君 "哥们,又 ...

  6. 泡着枸杞写bug的三流程序员凭什么逆袭到一线大厂?

    大多数互联网的从业者都有一个梦想:进大厂. 因为不仅可以享受较好的福利待遇,也能与更优秀的人一起共事,获得更专业.更快速的成长. 最近经常有朋友提及想要入门编程学习,该如何学习? 关于编程学习,各种语 ...

  7. 为什么我总写 Bug ?

    总结常见的 Bug,帮大家避坑 写代码的过程中,难免会出现各种各样的 Bug.但实际上,很多 Bug 产生的原因是类似的.于是我总结了一些自己学编程时写 Bug 的诱因,希望大家引以为戒,在以后写代码 ...

  8. 楚留香获取服务器信息卡主,楚留香手游沧海主线任务bug原因及解决方法一览

    楚留香手游的沧海门派还是存在一些bug的,那么楚留香手游沧海主线任务bug怎么解决?很多玩家可能还不太清楚,下面小编为大家带来了楚留香手游沧海主线任务bug原因及解决方法一览,感兴趣的玩家一起来看看吧 ...

  9. 【饭谈】:开发说他要是不写bug,测试就会失业了。

    今天要说的是一个在it职场中非常非常常见的现象: **开发提测了一个版本,你发现里面bug太多了,这样会导致测试排期不够甚至项目延期.所以你去找开发理论,开发却傲慢的对你说 他们要是不写bug,测试不 ...

  10. 英特尔GPU大牛投身AI创业/ ChatGPT公布Bug原因/ SpaceX最新估值1400亿美元…今日更多新鲜事在此...

    日报君 发自 凹非寺 量子位 | 公众号 QbitAI 大家好,今天是3月23日星期四,但是想吃麦当劳(Doge). 科技圈发生了哪些大事,一起来看看吧. 英特尔GPU大牛离职搞AI 又有大牛离职投身 ...

最新文章

  1. Java天使之恋攻略,跑跑卡丁车手游天使之恋怎么得 天使之恋获取攻略[多图]
  2. FTP匿名用户的配置
  3. 解决GitHub报错:schannel:failed to receive handshake, SSL/TLS connection failed
  4. Qt文档阅读笔记-Broadcast Receiver Example解析
  5. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期上涨0.41%
  6. Java基础---Java---IO流-----对象的序列化、管道流、RandomAccessFile、数据类型的流对象DataStream、ByteArrayStream
  7. xtile 下载_Stata: gen 命令中的 group() 函数的潜在风险
  8. SAP那些事-理论篇-5-SAP玩你还是你玩SAP
  9. 负数的二进制转换方法
  10. 离散信号(八)| 离散傅里叶变换DFT性质(圆周移位、圆周卷积)
  11. android开发便签实验报告,什么是艾宾浩斯遗忘曲线?利用这一记忆规律可以提升孩子记忆力...
  12. [转]页面回传与js调用服务器端事件
  13. window批处理文件编写指南
  14. slot具名卡槽和props
  15. java毕业设计——基于java+Spring+JSP的宠物网站设计与实现(毕业论文+程序源码)——宠物网站
  16. virtual Box与Vagrant的安装与踩坑
  17. 文献阅读---玉米干旱响应和耐受性基因表达的调控变异定位
  18. HTML中table表格的常用标签及属性
  19. 解决在ros catkin_make编译时出现“make[2]:*** 没有规则可制作目标“的问题
  20. 关于计算机设计的英语作文,关于电脑的英语作文

热门文章

  1. linux工作笔记-linux之间文件传输图形界面工具gftp
  2. Java基础入门笔记-对象与引用
  3. 使用docker搭建FastDFS文件系统
  4. java反应器构型,反应器结构及工作原理现用图解.doc
  5. java 程序迁移后oracle 数字溢出_Spring Boot 应用迁移到 Java 11
  6. 开发文档怎么编写_PoC 编写指南
  7. 兆观毫米波监护仪亮相CMEF 开创养老监护新时代
  8. python怎么读取石墨表格_python – 使用AMQP和石墨9.9
  9. Tomcat非正常退出导致无法再次启动
  10. 计组之指令系统:1、指令系统概述(定义、分类、格式、扩展操作码指令格式)