已经很久没有遇到如此顽固的bug了,总共耗费了我近1个礼拜的时间。期间的种种冲突,个人崩溃,最终解决方案的形成,到回过头来的反思,实在有太多值得梳理的东西。

从结果上来讲,这是个人js基础极端薄弱的集中体现,是对js闭包、基本流程和运转方式掌握不到位的综合反应。正因为基础薄弱,所以debug到某个阶段,竟然不知道该如何制定探索方案。

从调式的方式来讲,面对这样顽固的bug,我并没有做到冷静分析、科学梳理。在跨过某一个节点后,我可耻地又成为了newbie时期的模样:对一切都持神秘的态度。不过是因为别人提了一句,这个系统有点混乱。自己似乎一下子就找到了什么光明正大的理由,就可以把所有的责任推卸出去,可以不用、不必去把问题找出来。

这种黑盒态度,等同于封建迷信,似乎要凭借什么不可告人的运势、辛苦和神秘,才能够将一个问题解决。这是我所厌恶的,但却依旧不断再犯的东西。从信念上讲,我再一次将问题划归为了“不可知”,于是,整个形势就陡然发生了巨变。因为你将一个问题判定为了“不可知”,你允许了侥幸心理的存在。因为你的侥幸心理,你对一切就不再保持一颗空灵之心,不再相信逻辑、相信理智。

所谓的将理智抛诸脑后,就是开始颠倒黑白、指鹿为马。

  • 你在过往经历中能找到某个类似bug的解决方案,不是因为你做了很多的无用功,而是因为你在这种低效的搜索中,恰好碰到了解决方案。所以这里的秘诀不是做无用功,而是枚举法、网格搜索法,不断地低效穷举。而如果你能够以更优的策略做搜寻,一定是可以更快地解决bug。

  • 总是用苦力和莫名其妙的怪异方法做比对,只会让自己徒劳耗费精力。但内心却总是有一种情感上的寄托,似乎历尽艰难,就能有回报。所以这是非理性的第二点:不是精准地找到是什么东西、核心策略导致你有回报、有成功,而是诉诸于“苦难情节”。

  • 越是找不到方法,就越是陷进去,开始不思考、不用谋略去制定测试和探索方案。像一只苍蝇一样乱撞。更可怕的是,自己越是这样,就越是深深不可自拔,不知道如何停下来,徒劳地耗费时间。

  • 再往后更可怕的是什么呢,开始像学生时代做不出数学竞赛题目时,思绪胡乱遨游,开始诉诸于命运、劫难、劫数等玄幻的封建迷信。似乎终有此劫无法逃避。可实际呢?一个技术问题解决不了和劫数有什么关系?无非是技术基本功不扎实,学的东西不到位,掌握的东西不细致。可自己早已脱离了理性,开始在“不可知”的世界里越走越起劲儿。

伴随着非理性的,是自己抗压力的严重失衡。在高压之下,自己无法理性思考问题,无法合理地、系统性、有条理地制定自己的探索方案。面对一个bug,特别是一个神奇现象的bug,你能做的应该是不断地通过“不同种类”的测试,来将可能出现问题的范围缩小。这个时候,最重要的就是精心制定合理的测试方案。

没有条理、没有理性的探索方式,就会导致制定出N个只会得出相同结论的test case。那么请问,这样的方案有何意义?如果你已经在某个方向上做了测试,那么你至少应该让问题的范围缩小一半,即是二分。而如果你的测试用例连这么基本的标准都无法达到,请问,你制定出来的探索方案还合理吗?

再来,当你感觉到“应该”要用测试用例缩小问题的定位范围,而“实际”感觉困难或者不能时,你就应该果断地停下来细细思考,而不是闷头继续写一堆、执行一堆毫无用处的测试方案。你该从头到尾去梳理一遍,自己做过哪些测试,它们意味着什么,但同时又不意味着什么。关键就是要想清楚它们“不意味”着什么,才能发现还有哪些地方和模糊点尚待测试。这是关节处。

所谓工程师,最重要的就是要能够把问题、把过程梳理得透彻,能够明察秋毫。什么叫明察秋毫?就是连羽毛、头发丝那样的细节、差别都可以发现。工程师的部署,应该让每一粒尘埃都有的放矢。那么,一个大前提便是,你至少要能够把每一粒尘埃都装进自己的脑海里做到心中有数。如果你只能够觉察到某一部分的尘埃,那有怎么去谈论让每一粒尘该都有的放矢呢?

科学、工程的世界里,不允许有模糊不清的地方。你可以不知道,但你不能够把“不知道”当作知道,更不可以把“不知道”归因于各种莫名其妙的“不可知”黑盒。工程师的任务,首先要能够明确地察觉出、理清楚哪些是清楚的、哪些是不清楚的。基于这个认识,再理性地制定攻克方案,而不是蛮干、更不是寄托于“神谕”或者“祈祷”,期望通过侥幸使自己的方案发挥效果。

这次经历,唯一值得称道、也是我解决这个bug的重要因素,便是我没有闭门造车,而是以开放的心态诚恳地向周围的朋友求助。在与他们的谈话中、建议下,自己不断获得启发,从而能够将这个bug解决。终于,在只求“解决问题”这个方面,自己更为激进一些了。

感谢向我提供帮助的这些朋友们,有你们真好。

近期回顾

J2EE导论 | 疑惑篇
前端技术的碎碎念
放眼望去都是痛

如果你喜欢我的文章或分享,请长按下面的二维码关注我的微信公众号,谢谢!

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

VIP赞赏专区:


一次艰难debug的反思的更多相关文章

  1. 编程语言吐槽之Java与C

    包含各种偏见和武断,请谨慎阅读. 为什么在学校学习的C,拿到企业生产中不起作用? 而为什么企业级的程序员,依然对C/C++无法掌控?在算法各方面不够精湛? 根本原因还是应用场景的不同.企业级的开发,主 ...

  2. 2019 IEEEXtreme 13.0 题解记录

    比赛时间 2019.10.19 8:00 - 2019.10.20 8:00 比赛网站 https://csacademy.com/ieeextreme13 // 连续24小时做题真的是极限体验 // ...

  3. jmeter sampler maven项目排错记

    eclipse 创建的maven项目,引入jar包之后出现红色叹号,一直找不到原因,连main方法都无法运行,提示找不到类: 错误: 找不到或无法加载主类 soapsampler.SoapSample ...

  4. 盘点和反思在微信的阴影下艰难求生的移动端IM应用

    本文原作者:李越,由银杏财经原创发布,本次内容改动. 1.前言 上线一周完成1.5亿元融资,上线10天总激活用户数超400万,8月29日单日新增用户超100万,这是子弹短信交出的最新成绩单(详见< ...

  5. django+nginx+xshell简易日志查询,接上<关于《rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>》的反思>

    纠正一下之前在<关于<rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>>的反思>中说到的PHP+MySQL太慢,这里只是说我技术不好,没 ...

  6. 某马-某淘商城的day01--->分析,工程搭建,tomcat插件启动工程,svn,反思

    -1:为什么还要写某马的某淘商城呢? 答:万物更新,季节交替.新人总把旧人换.所以呢,前人写了N多遍的东西,我们依旧在学,所以下决心写某马的某淘商城.(也因为在学校还没找工作,所以找个相对长期的事情做 ...

  7. 宝爷Debug小记——Cocos2d-x(3.13之前的版本)底层BUG导致Spine渲染花屏

    最近在工作中碰到不少棘手的BUG,其中的一个是Spine骨骼的渲染花屏,在战斗中派发出大量士兵之后有概率出现花屏闪烁(如下图所示),这种莫名奇妙且难以重现的BUG最为蛋疼.   前段时间为了提高Spi ...

  8. OO第一次博客作业总结反思

    使用了masteruml插件来生成类图和metrics插件分析代码 第一次作业 1.UML类图 >在第一次作业中,使用了两个类,代码中有没有使用的变量与函数,为平衡两个类的内容,我将输出函数放在 ...

  9. 查bug受气了,反思

    昨天改bug了一天,上午出现bug的原因是Boolean和boolean使用BeanUtils等工具无法自动赋值.我们写的时候注意大小写. 下午查了一个下午没有找到任何原因. 但是我受了气,因为报错点 ...

随机推荐

  1. pycharm工具配置

    灰色主题 菜单栏File --> Settins --> Appearance & Behavior --> Appearance, Theme改成Darcula,然后App ...

  2. Vue源码学习(一)———数据双向绑定 Observer

    从最简单的案例,来学习Vue.js源码. <body> <div id='app'> <input type="text" v-model=" ...

  3. logistics回归理解

    多元回归方程:假设有一个因变量y和一组自变量x1, x2, x3, ... , xn,其中y为连续变量,我们可以拟合一个线性方程: y =β0 +β1*x1 +β2*x2 +β3*x3 +...+βn ...

  4. 用C语言编写一个简单的词法分析程序

    问题描述: 用C或C++语言编写一个简单的词法分析程序,扫描C语言小子集的源程序,根据给定的词法规则,识别单词,填写相应的表.如果产生词法错误,则显示错误信息.位置,并试图从错误中恢复.简单的恢复方法 ...

  5. centos 7 常用工具篇

    1.vmstat监控linux整体性能工具如查看命令:vmstat 1 4 2.用netstat查看网络连接,接口等信息如:netstat -an 3.dig  或者nslookup 跟踪yum解析过 ...

  6. HYSBZ 2743 (树状数组) 采花

    题目:这里 题意: 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记, ...

  7. jquery 上下文菜单实现

    话不多说,直接贴上官方demo演示: https://swisnl.github.io/jQuery-contextMenu//demo

  8. python requests与aiohttp 速度对比

    环境:centos7 python3.6 测试网址:www.bai.com 测试方式:抓取百度100次 结果: aio: 10.702147483825684srequests: 12.4046785 ...

  9. vue history模式 apache配置

    我的服务器apache 版本是2.4.6 看文档上面说加那些代码,但是加上去重启服务器就不能重启,显示代码错误,然后百度查开启mod_rewrite这个重写URL 弄了半天也不会,百度上面的不知道是不 ...

  10. RPA基础

    RPA是什么 软件机器人 RPA是基于计算机操作系统的工作界面,自动识别UI,完成预先设定的工作流程的软件机器人 ​ 全自动 自动的操作整个工作流程,用软件的方式代替人力,完成大量的重复性的手工操作, ...