随想005:调试的思考

Posted 研究是为了理解

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了随想005:调试的思考相关的知识,希望对你有一定的参考价值。

任何的 BUG,都可以用以下步骤来解决:

  1. 重现 BUG
  2. 观察现象
  3. 提出假设
  4. 验证假设

重现 BUG


很多 BUG 很难解决,在第一步 重现 BUG 时就撞了个头破血流。
总有人试图走些捷径,选择跳过这一步。
无源之水、无本之木、万丈高楼浮空起
结果自然是反反复复、来来回回,“攻关”之后接着“攻关”,然后公关。

重现 BUG ,才可以 观察现象
重现 BUG ,才能判断 BUG 是否已经修复好
当你发现一个 BUG 时应该怎么办?
让它再次发生!

你站着说话不腰疼、你不知人间疾苦、你何不食肉糜
你有没有见过复杂系统、恶劣现场、间歇性 BUG ?
我知道,我见过
你说这个 BUG 有个性,在家一切好好的,一到现场才出现
那就收拾好仪器,搭车、坐船、乘飞机,去现场
你说这个 BUG 很调皮,你想见它它不见,刚刚离去它出现
那就做好监控、日志,打持久战
你说这个 BUG 是库函数/客户电脑/编译器/之前就有…
你总是有那么多理由,就是对解决 BUG 没有丝毫帮助
我见过很多个在家想破头,现场仪器/调试器一架,秒解 BUG 的例子
我见过有人死磕半个月,解决一个复杂 BUG 的例子
我还见过有人用 1 年多的时间跟踪,解决一个偶发 BUG 的例子
所以现在,让我们正视问题 ,拿出专业的态度,跟着念:
BUG 一定有原因,也一定能够找到它。


观察现象


观察现象 是为了获得足够的细节,为 提出假设 提供依据。
你又说轻飘飘的废话了!
什么样的现象算是细节?多少细节才算足够多?
第一个问题我真回答不了,就我不严谨的观察结果而言,有的人明摆着的错误就是视而不见。
而有的人在茫茫多的数据中一眼就能看出问题所在。
不信?
有人调试硬件挠断头,说电源都正常,程序烧不进,有人看了一眼,说你的单片机焊错了,整体偏了180°。
有人调试程序挠断头,说程序能烧写进去,就是好像不运行,有人看了一眼,说你的主晶振和时钟晶振位置调换了。
有人破解通讯挠断头,说都测试了一千多条数据了也看不出规律,有人多看了几眼,给出了一个256个字符组成的密码表外加一个加密计算公式。
判断出哪些是细节,哪些需要关注,我很不情愿的认为这需要经验和天赋。
但另一个问题有着确定的答案,多少细节才算足够多?多到把 BUG 的原因锁定在几种可能范围内
为了实现这个目标,得有观察手段。
他说我家那个占地一百亩的超级密室,进了个贼,你给我抓来
你过去一看,图纸工具都没有,密室里面还漆黑一片,抓你x的贼啊
首先里面得有光,也就是可见性
可见性,就是可以监控和显示内部状态。
他说现场有个问题,重启了你的设备就消失了。
你连到设备后台,敲个命令返回了设备的历史启动信息,信息清楚的表明设备已经一年没有重启过了,显然问题消失跟你的设备毫无关系。
他说把接在你设备上的 1# 传感器拔掉了,你的设备还是显示这个传感器在线。
你连接到设备后台,敲个命令返回了这个传感器的实时信息,信息清楚的表明,当前 1# 地址上一定有个传感器存在。你说 1# 地址上有传感器存在,他说我已经拔掉了;你说除了你拔掉的那个,还有一个 1# 传感器。他不说话了,去顺着线排查了。
其次得有工具,好歹给个手电筒
你说我的设备通讯老是短时故障
去搬台示波器查查波形。
你说我的 I2C 设备读回来的都是 FF
去找个逻辑分析仪看看时序。
凭空猜想,可能原因千万条,实际一看,猜了千万条都没中个奖。


提出假设


这是个技术活。
不能凭喜好提,不能盲目自信的提,不能漫天撒网的提
你所提出的每一个假设,都得有所依据,这要求你肚子里得有点知识
问题常常出现在你不曾触碰的地方。
棘手的 BUG,通常是因为 BUG 涉及的知识超出了你能理解的范围。
所以,提出假设,还不能局限于自己已知的领域
有人提出的假设接近事实或者就是事实,有人提出的假设让你误入歧途。
关键在于你有多理解系统
理解系统的工作原理,理解为什么这样设计。
我有个四岁多的儿子
半年前我们在床上睡觉的时候,我俩第一次遇到了地震,
他被地震晃醒了,坐起来四下看了一眼,又继续睡
第二天我问他经过,他说:
“我睡觉,(发现)床在动,我坐起来看,没有人摇晃床,我就又睡了。”
这就是为什么理解系统很重要的原因。不理解系统,就没有做出正确假设的认知。
为了能提出合理的假设,你需要读一读文献、做一些计算、问一问该领域的好手,期间可能还要做些测试。
提出假设的过程,其实是对该领域加深理解的过程,一个主动学习的过程。


验证假设


如果只允许说一条经验法则,我毫不犹豫选择:
不要相信自己的假设!
无论是谆谆教导、耳提面命,还是吃过亏上过当、或者常常自省
我们还是一次又一次的做出毫无根据的假设看似合理的假设或者局限于自己现有知识和经验的假设
然后不负责任的给出结论,最后被狠狠打脸
对于提出的每一个假设,用实验去证实或者证伪,然后记录下来
在寻找线索的过程中,把纸笔放在旁边会很有帮助。

我带着3岁半的儿子去户外活动。
那是公园旁边一块很大的草地,草地的另外一端,离我们大约两三百米处是一座工地,工地上几辆工程车正在作业。
我指着工地的方向对儿子说:“看,前面有两辆挖掘机!”
儿子好像看不清,一边茫然的四下巡视,一边问:
“爸爸,挖掘机在哪里?”
“顺着我手指的方向,你看不到挖掘机吗?”
儿子摇头,表示没有看到。
“估计是太远了,或许走近些就能看到了”,我心里想着。
然后我们边玩边向工地的方向靠近。
离工地还有一百多米的地方,工程车清晰可见。
我再次指给儿子看挖掘机,儿子仍表示看不到。
“完蛋了,眼睛有问题啊”
我看到他鼻尖渗出汗来,知道他跑热了,于是蹲下来把他衣服的拉链拉开一些。
随后我扭头朝工地的方向看了一眼
这次,我也没能看到工程车
映入眼前的,是一个小土坡。
一个很缓很矮的小土坡,在我蹲下时,挡住了工地。
我站了起来,再次看到了工地,也首次注意到了那个小土坡
我把儿子抱起来,把工地指给他看,他立刻雀跃起来:
“有两辆工程车,一辆绿色一辆蓝色,还有翻斗车和混凝土车。。。”
看不到工程车,原来不是眼睛的问题,而是身高的问题。
有时候觉得离奇,只是因为眼界不够。






读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)

以上是关于随想005:调试的思考的主要内容,如果未能解决你的问题,请参考以下文章

随想005:调试的思考

005 selenium xpath/调试/table

“程序的迭代”——复杂性度量随想

阅老师之阅读与思考之后随想

第五章随想

005_针对于go语言中速率限制的思考