一次艰难debug的反思

已经很久没有遇到如此顽固的bug了,总共耗费了我近1个礼拜的时间。期间的种种冲突,个人崩溃,最终解决方案的形成,到回过头来的反思,实在有太多值得梳理的东西。
从结果上来讲,这是个人js基础极端薄弱的集中体现,是对js闭包、基本流程和运转方式掌握不到位的综合反应。正因为基础薄弱,所以debug到某个阶段,竟然不知道该如何制定探索方案。
从调式的方式来讲,面对这样顽固的bug,我并没有做到冷静分析、科学梳理。在跨过某一个节点后,我可耻地又成为了newbie时期的模样:对一切都持神秘的态度。不过是因为别人提了一句,这个系统有点混乱。自己似乎一下子就找到了什么光明正大的理由,就可以把所有的责任推卸出去,可以不用、不必去把问题找出来。
这种黑盒态度,等同于封建迷信,似乎要凭借什么不可告人的运势、辛苦和神秘,才能够将一个问题解决。这是我所厌恶的,但却依旧不断再犯的东西。从信念上讲,我再一次将问题划归为了“不可知”,于是,整个形势就陡然发生了巨变。因为你将一个问题判定为了“不可知”,你允许了侥幸心理的存在。因为你的侥幸心理,你对一切就不再保持一颗空灵之心,不再相信逻辑、相信理智。
所谓的将理智抛诸脑后,就是开始颠倒黑白、指鹿为马。
你在过往经历中能找到某个类似bug的解决方案,不是因为你做了很多的无用功,而是因为你在这种低效的搜索中,恰好碰到了解决方案。所以这里的秘诀不是做无用功,而是枚举法、网格搜索法,不断地低效穷举。而如果你能够以更优的策略做搜寻,一定是可以更快地解决bug。
总是用苦力和莫名其妙的怪异方法做比对,只会让自己徒劳耗费精力。但内心却总是有一种情感上的寄托,似乎历尽艰难,就能有回报。所以这是非理性的第二点:不是精准地找到是什么东西、核心策略导致你有回报、有成功,而是诉诸于“苦难情节”。
越是找不到方法,就越是陷进去,开始不思考、不用谋略去制定测试和探索方案。像一只苍蝇一样乱撞。更可怕的是,自己越是这样,就越是深深不可自拔,不知道如何停下来,徒劳地耗费时间。
再往后更可怕的是什么呢,开始像学生时代做不出数学竞赛题目时,思绪胡乱遨游,开始诉诸于命运、劫难、劫数等玄幻的封建迷信。似乎终有此劫无法逃避。可实际呢?一个技术问题解决不了和劫数有什么关系?无非是技术基本功不扎实,学的东西不到位,掌握的东西不细致。可自己早已脱离了理性,开始在“不可知”的世界里越走越起劲儿。
伴随着非理性的,是自己抗压力的严重失衡。在高压之下,自己无法理性思考问题,无法合理地、系统性、有条理地制定自己的探索方案。面对一个bug,特别是一个神奇现象的bug,你能做的应该是不断地通过“不同种类”的测试,来将可能出现问题的范围缩小。这个时候,最重要的就是精心制定合理的测试方案。
没有条理、没有理性的探索方式,就会导致制定出N个只会得出相同结论的test case。那么请问,这样的方案有何意义?如果你已经在某个方向上做了测试,那么你至少应该让问题的范围缩小一半,即是二分。而如果你的测试用例连这么基本的标准都无法达到,请问,你制定出来的探索方案还合理吗?
再来,当你感觉到“应该”要用测试用例缩小问题的定位范围,而“实际”感觉困难或者不能时,你就应该果断地停下来细细思考,而不是闷头继续写一堆、执行一堆毫无用处的测试方案。你该从头到尾去梳理一遍,自己做过哪些测试,它们意味着什么,但同时又不意味着什么。关键就是要想清楚它们“不意味”着什么,才能发现还有哪些地方和模糊点尚待测试。这是关节处。
所谓工程师,最重要的就是要能够把问题、把过程梳理得透彻,能够明察秋毫。什么叫明察秋毫?就是连羽毛、头发丝那样的细节、差别都可以发现。工程师的部署,应该让每一粒尘埃都有的放矢。那么,一个大前提便是,你至少要能够把每一粒尘埃都装进自己的脑海里做到心中有数。如果你只能够觉察到某一部分的尘埃,那有怎么去谈论让每一粒尘该都有的放矢呢?
科学、工程的世界里,不允许有模糊不清的地方。你可以不知道,但你不能够把“不知道”当作知道,更不可以把“不知道”归因于各种莫名其妙的“不可知”黑盒。工程师的任务,首先要能够明确地察觉出、理清楚哪些是清楚的、哪些是不清楚的。基于这个认识,再理性地制定攻克方案,而不是蛮干、更不是寄托于“神谕”或者“祈祷”,期望通过侥幸使自己的方案发挥效果。
这次经历,唯一值得称道、也是我解决这个bug的重要因素,便是我没有闭门造车,而是以开放的心态诚恳地向周围的朋友求助。在与他们的谈话中、建议下,自己不断获得启发,从而能够将这个bug解决。终于,在只求“解决问题”这个方面,自己更为激进一些了。
感谢向我提供帮助的这些朋友们,有你们真好。
近期回顾
《J2EE导论 | 疑惑篇》
《前端技术的碎碎念》
《放眼望去都是痛》
如果你喜欢我的文章或分享,请长按下面的二维码关注我的微信公众号,谢谢!

更多信息交流和观点分享,可加入知识星球:

VIP赞赏专区:

一次艰难debug的反思的更多相关文章
- 编程语言吐槽之Java与C
包含各种偏见和武断,请谨慎阅读. 为什么在学校学习的C,拿到企业生产中不起作用? 而为什么企业级的程序员,依然对C/C++无法掌控?在算法各方面不够精湛? 根本原因还是应用场景的不同.企业级的开发,主 ...
- 2019 IEEEXtreme 13.0 题解记录
比赛时间 2019.10.19 8:00 - 2019.10.20 8:00 比赛网站 https://csacademy.com/ieeextreme13 // 连续24小时做题真的是极限体验 // ...
- jmeter sampler maven项目排错记
eclipse 创建的maven项目,引入jar包之后出现红色叹号,一直找不到原因,连main方法都无法运行,提示找不到类: 错误: 找不到或无法加载主类 soapsampler.SoapSample ...
- 盘点和反思在微信的阴影下艰难求生的移动端IM应用
本文原作者:李越,由银杏财经原创发布,本次内容改动. 1.前言 上线一周完成1.5亿元融资,上线10天总激活用户数超400万,8月29日单日新增用户超100万,这是子弹短信交出的最新成绩单(详见< ...
- django+nginx+xshell简易日志查询,接上<关于《rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>》的反思>
纠正一下之前在<关于<rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>>的反思>中说到的PHP+MySQL太慢,这里只是说我技术不好,没 ...
- 某马-某淘商城的day01--->分析,工程搭建,tomcat插件启动工程,svn,反思
-1:为什么还要写某马的某淘商城呢? 答:万物更新,季节交替.新人总把旧人换.所以呢,前人写了N多遍的东西,我们依旧在学,所以下决心写某马的某淘商城.(也因为在学校还没找工作,所以找个相对长期的事情做 ...
- 宝爷Debug小记——Cocos2d-x(3.13之前的版本)底层BUG导致Spine渲染花屏
最近在工作中碰到不少棘手的BUG,其中的一个是Spine骨骼的渲染花屏,在战斗中派发出大量士兵之后有概率出现花屏闪烁(如下图所示),这种莫名奇妙且难以重现的BUG最为蛋疼. 前段时间为了提高Spi ...
- OO第一次博客作业总结反思
使用了masteruml插件来生成类图和metrics插件分析代码 第一次作业 1.UML类图 >在第一次作业中,使用了两个类,代码中有没有使用的变量与函数,为平衡两个类的内容,我将输出函数放在 ...
- 查bug受气了,反思
昨天改bug了一天,上午出现bug的原因是Boolean和boolean使用BeanUtils等工具无法自动赋值.我们写的时候注意大小写. 下午查了一个下午没有找到任何原因. 但是我受了气,因为报错点 ...
随机推荐
- docker image 详解
docker iamge docker 镜像: [root@localhost ~]# docker image --help Usage: docker image COMMAND 管理镜像 Com ...
- 12条MySQL优化技巧
应用程序慢,原因多多,可能是网络的原因.可能是系统架构的原因,还有可能是数据库的原因. 有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程序员们也有莫大的关系. 程序中嵌入的一行行的SQL ...
- mongodb cxx driver学习
mongodb 增删改查 insert 向集合中增加一个文档 remove 删除文档 update 更新(修改)某些文档 文档替换 文档修改器,只修改文档某个部分 find 返回集合中所有文档 fin ...
- http 6000端口 chrome ERR_UNSAFE_PORT
参考原因 折腾了半天.chrome的提示真不够意思,还是火狐的提示厉害,知道真相的我眼泪流下来.
- centos-1 nginx
常用命令 su #切换用户mkdir flodr #创建目录rm -r flodr #删除文件/目录,有提示rm -rf flodr #删除文件/目录,无提示pwd #查看当前路径 防火墙设置 ht ...
- BZOJ1058或洛谷1110 [ZJOI2007]报表统计
BZOJ原题链接 洛谷原题链接 STL 本题可以直接使用\(\mathtt{STL\ multiset}\)水过去. 因为本题插入数的操作实际上就是将原数列分为\(n\)段,在每一段的末尾插入数,所以 ...
- Scrapy运行ImportError: No module named win32api错误
windows系统上出现这个问题的解决需要安装Py32Win模块,更方便的做法是: pip install pypiwin32
- 线程池ThreadPoolExecutor源码分析
在阿里编程规约中关于线程池强制了两点,如下: [强制]线程资源必须通过线程池提供,不允许在应用中自行显式创建线程.说明:使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源的开销,解决资源 ...
- Gitlab使用时的一些注意事项
1 gitlab-runner 不选中,在commit没有tab的时候,runner不会进行运行 2 在新安装的gitlab的环境上更改@localhost为远程地址 2.1 vim /opt/gi ...
- 异常:No Spring WebApplicationInitializer types detected on classpath
原因: 启动服务提供者/服务消费者-->去注册中心Zookeeper无法注册这个服务 / 在监控中心无法发现服务 异常提示:No Spring WebApplicationInitializer ...