为什么我没有拔出钥匙 ——开锁引发的程序bug解决方案的思考
今天中午回宿舍的时候,舍友S开完锁以后,钥匙在锁槽里拔不出来了。以前只是锁不怎么好用,左旋右旋活几下1分钟之内就能打开了。这次,的确可能卡的比较紧吧,室友S旋转了好久没有打开。然后,我接过来弄了好久(几乎同样的方法)也没有打开。此时室友S告诉我,他上午给老师屋开门,没有打开,钥匙断在里面了,刚报修了。此时,我的第一反应就是:别再尝试了,钥匙很脆,万一断在里面岂不是更麻烦,下午导师去实验室我还想着正点上班。
这时候,我们隔壁宿舍J同学也过来了,多一个同学多一种思路吧,他也过来尝试拔出钥匙,也是试探了好久,未果。
在他们试探的过程中,我想着:为了不耽误下午的进度,我去楼管阿姨那报修吧。阿姨说,修锁师傅可能去吃饭,你自己去看吧。去了两次,可能真去吃饭了,未果,然后跑回宿舍。
舍友S还在尝试拔钥匙,因为有上次断钥匙的经历,只是反复小心翼翼试探着……
这时,另一同学H看到我们在弄钥匙,也凑了过来。然后接过来,试图拔出钥匙。起初也是和我们一样,没有成效。但是反复抽插,加上顶着门插拔,钥匙被顺利拿了出来。
我和舍友S感激之情溢于言表。而后,我们削了铅笔芯放在锁芯里,整个锁有了焕然一新的感觉,开锁、拔钥匙都很流畅了。
中午的时候,我对这件事反复思考……为什么我没有拔出钥匙呢?
这让我联系到了程序设计的过程,并一一作了对应。
1、正常开锁——程序正常运行,没有bug;
2、钥匙拔不出来——程序运行有bug;
3、反复试探拔出钥匙——普通方法试图修正bug;
4、别的同学帮忙拔钥匙——同学帮忙解决bug;
5、 找楼管阿姨保修——找特定技术人员(网络找技术博客、牛人)解决bug;
6、舍友H顶着门插拔——另辟蹊径解决了bug;
7、削铅笔芯放入锁芯——完善修正bug,消灭bug,避免程序再次出错。
8、上次帮老师开门钥匙断了——以往程序经验会对bug产生积极或消极的影响,此次为消极影响,也是由于我的胆怯,听说钥匙断了,不敢大胆尝试。
9、中午想不影响正常休息、下午正常上班——程序设计过程是有进度要求的,此时要考虑项目组负责人(如项目经理)的时间进度安排,还有自己的作息习惯。
10、我和室友没有拔出钥匙——我们没有找到bug的所在。
这样,整个开锁的过程就是程序的bug查找、修改、完善修正bug的过程。
在拔出钥匙,即查找bug的过程中,我们用了3种方法。
方法1:普通方法(反复试探拔出钥匙),即逐个排除bug;
方法2:求助同学帮忙,即同学帮忙调试查找bug;
方法3:求助楼管阿姨找技术人员保修,即等同于找IT专业大牛解决bug。
当然,在方法1我和室友的试探过程中,我明显犯了经验主义的错误,即室友提到他上午帮老师开锁,结果钥匙都弄断了。此时,我一方面考虑自己的中午午休、下午上班的正常进度;另一方面也考虑万一钥匙断了有责任问题,也浪费了大把时间。我当时甚至想到:中午正常休息,下午继续保修。很显然,是我想的太多,其实完全没有必要。
对比方法1、2、3;其实方法3可能是最快的(天时、地利、人和具备的条件下)。方法1可能最慢,并且可能有风险,在开锁的时候体现在可能钥匙断掉、耽误项目进度、耽误正常作息等,程序设计中则体现在bug没有找到、花费了很长时间、死机等情况。但回头想想,方法1自己动手、去尝试、去体验各种旋转(即对应解决bug的各种思路),如果万一bug找到,这时候自己回头去想整个找寻bug的过程,会很快乐,印象会很深,并且如果下次还有类似的bug出现,肯定能迎刃而解的。
同学H过来后二话没说,接过来就是拔钥匙,各种传统方法并结合尝试新的方法,最终结果是,2分钟内钥匙拔出来了。让我想到的是,程序设计中当传统的方法无法解决问题时,可以考虑另辟蹊径,往往新思路会突破旧思维取得好的效果。但也可能会带来钥匙断掉的风险,即bug也未解决甚至死机的风险。但权衡下,这毕竟增加了胜算的可能。即前两天师弟所讲的“越努力、越幸运!”,从概率论的角度来讲,是成立的。
这也让我想到之前和师弟们探讨过的问题:遇到bug后如何解决bug?这样经过开锁的经历后,我越发坚定了我的思路:
第1:尽最大可能的自己通过手头已有的知识解决(已有的程序思维逻辑、手头有的笔记、书籍),如果一条路行不通,可以考虑回溯另辟新路去探索解决问题的方法。若该条方法在自己试探了N条路走都行不通的话,可以考虑第2条。
第2:求助项目组的同学/同事,因为你们的项目接近,一起开发时可能会遇到类似的难题,这样,一起讨论可能很快就产生了解决问题的火花。如果第1、2条都行不通的话,可以考虑第3条。
第3:查询互联网(Google搜索、CSDN搜索等),或者借助互联网论坛,如CSDN论坛、cnblog等里有不同的板块,可以考虑发帖求助。我试验过,第3条基本能解决1、2解决不了的难题。
解决bug有时候是个痛苦的过程,甚至1天、2天都没有结果,但越是濒临绝望的边缘的时候,越不放弃对解决bug方法的希望。问题会得到解决的,届时,你会感觉:恍然大悟、醍醐灌顶。其不幸哉!
2013-4-25 pm 3:00于实验室
为什么我没有拔出钥匙 ——开锁引发的程序bug解决方案的思考的更多相关文章
- 【Foreign】开锁 [概率DP]
开锁 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output Sample Input 4 5 1 2 5 4 3 1 5 ...
- hihoCode 1075 : 开锁魔法III
时间限制:6000ms 单点时限:1000ms 内存限制:256MB 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅 ...
- 4位开锁<dfs>
题意: 有一个四位密码的锁,每一位是1~9的密码,1跟9相连.并且相邻的连个密码位可以交换.每改变一位耗时1s,给出锁的当前状态和密码,求最少解锁时间. 思路: 用bfs枚举出所有相邻交换的情况,并记 ...
- hihocoder 1075 : 开锁魔法III
描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...
- #1075 : 开锁魔法III
描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...
- Hiho #1075: 开锁魔法III
Problem Statement 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜 ...
- HihoCoder 1075 开锁魔法III(概率DP+组合)
描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它 ...
- 20140322 卡迪夫城VS利物浦,拔出重剑,有惊无险
一.菱形442 起初在客战南安普顿的时候,罗杰斯启用了菱形442阵式,阵容和今天客战卡迪夫城几乎一样,只是格伦·约翰逊打左后卫,弗拉纳甘任职右后卫,目的是为了在客场抵御卢克·肖+拉拉纳.当时库蒂尼奥的 ...
- hrb——开锁魔法I——————【规律】
解题思路:从1到n的倒数之和. #include<stdio.h> #include<string.h> #include<algorithm> using nam ...
随机推荐
- Shell基础学习(五) test命令
1.数值测试 参数 说明 -eq 等于则为真 -gt 大于则为真 -lt 小于则为真 -nq 不等于则为真 -ge 大于等于为真 -le 小于等于为真 示例: num1= num2= if test ...
- 为什么要使用netty
选择Netty的理由在开始本节之前,我先讲一个亲身经历的故事:曾经有两个项目组同时用到了NIO编程技术,一个项目组选择自己开发NIO服务端,直接使用JDK原生的API,结果2个多月过去了,他们的NIO ...
- Retrieving ST-Link/V2 Firmware from Update Utility
http://www.taylorkillian.com/2013/01/retrieving-st-linkv2-firmware-from.html http://forum.easyelectr ...
- STN1170 Multiprotocol OBD to UART Interpreter
http://www.obdsol.com/stn1170/ STN1170 supports the following protocols: all legislated OBD II proto ...
- 学习mfc书籍
Visual C++ and MFC Programming http://www.math.hcmuns.edu.vn/~tatuana/C%20For%20Win/MFC/Tai%20Lieu%2 ...
- android DrawerLayout 侧边栏实现
现在实现侧边栏比较简单了,官方提供的DrawerLayout可以很方便实现. 主要实现方法是:用DrawerLayout 作为界面根控件.在DrawerLayout里面第一个View为当前界面主内容: ...
- 【spring boot】启动类启动 错误: 找不到或无法加载主类 com.codingapi.tm.TxManagerApplication 的解决方案
导入的一个外部的spring boot项目,运行启动类,出现错误:找不到或无法加载主类 com.codingapi.tm.TxManagerApplication 解决方案: 将所有错误处理完成后,再 ...
- combogrid翻页后保持显示内容为配置的textField解决办法
easyui的combogrid当配置pagination为true进行分页时,当datagrid加载其他数据页,和上一次选中的valueField不匹配时,会导致combogrid直接显示value ...
- matlab在图像中画长方形(框)
function [state,result]=draw_rect(data,pointAll,windSize,showOrNot) % 函数调用:[state,result]=draw_rect( ...
- POJ 1740:A New Stone Game
A New Stone Game Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5113 Accepted: 2806 Desc ...