一次艱難debug的反思

已經(jīng)很久沒有遇到如此頑固的bug了,總共耗費了我近1個禮拜的時間。期間的種種沖突,個人崩潰,最終解決方案的形成,到回過頭來的反思,實在有太多值得梳理的東西。
從結(jié)果上來講,這是個人js基礎(chǔ)極端薄弱的集中體現(xiàn),是對js閉包、基本流程和運轉(zhuǎn)方式掌握不到位的綜合反應(yīng)。正因為基礎(chǔ)薄弱,所以debug到某個階段,竟然不知道該如何制定探索方案。
從調(diào)式的方式來講,面對這樣頑固的bug,我并沒有做到冷靜分析、科學(xué)梳理。在跨過某一個節(jié)點后,我可恥地又成為了newbie時期的模樣:對一切都持神秘的態(tài)度。不過是因為別人提了一句,這個系統(tǒng)有點混亂。自己似乎一下子就找到了什么光明正大的理由,就可以把所有的責(zé)任推卸出去,可以不用、不必去把問題找出來。
這種黑盒態(tài)度,等同于封建迷信,似乎要憑借什么不可告人的運勢、辛苦和神秘,才能夠?qū)⒁粋€問題解決。這是我所厭惡的,但卻依舊不斷再犯的東西。從信念上講,我再一次將問題劃歸為了“不可知”,于是,整個形勢就陡然發(fā)生了巨變。因為你將一個問題判定為了“不可知”,你允許了僥幸心理的存在。因為你的僥幸心理,你對一切就不再保持一顆空靈之心,不再相信邏輯、相信理智。
所謂的將理智拋諸腦后,就是開始顛倒黑白、指鹿為馬。
-
你在過往經(jīng)歷中能找到某個類似bug的解決方案,不是因為你做了很多的無用功,而是因為你在這種低效的搜索中,恰好碰到了解決方案。所以這里的秘訣不是做無用功,而是枚舉法、網(wǎng)格搜索法,不斷地低效窮舉。而如果你能夠以更優(yōu)的策略做搜尋,一定是可以更快地解決bug。
-
總是用苦力和莫名其妙的怪異方法做比對,只會讓自己徒勞耗費精力。但內(nèi)心卻總是有一種情感上的寄托,似乎歷盡艱難,就能有回報。所以這是非理性的第二點:不是精準(zhǔn)地找到是什么東西、核心策略導(dǎo)致你有回報、有成功,而是訴諸于“苦難情節(jié)”。
-
越是找不到方法,就越是陷進去,開始不思考、不用謀略去制定測試和探索方案。像一只蒼蠅一樣亂撞。更可怕的是,自己越是這樣,就越是深深不可自拔,不知道如何停下來,徒勞地耗費時間。
-
再往后更可怕的是什么呢,開始像學(xué)生時代做不出數(shù)學(xué)競賽題目時,思緒胡亂遨游,開始訴諸于命運、劫難、劫數(shù)等玄幻的封建迷信。似乎終有此劫無法逃避。可實際呢?一個技術(shù)問題解決不了和劫數(shù)有什么關(guān)系?無非是技術(shù)基本功不扎實,學(xué)的東西不到位,掌握的東西不細致。可自己早已脫離了理性,開始在“不可知”的世界里越走越起勁兒。
伴隨著非理性的,是自己抗壓力的嚴重失衡。在高壓之下,自己無法理性思考問題,無法合理地、系統(tǒng)性、有條理地制定自己的探索方案。面對一個bug,特別是一個神奇現(xiàn)象的bug,你能做的應(yīng)該是不斷地通過“不同種類”的測試,來將可能出現(xiàn)問題的范圍縮小。這個時候,最重要的就是精心制定合理的測試方案。
沒有條理、沒有理性的探索方式,就會導(dǎo)致制定出N個只會得出相同結(jié)論的test case。那么請問,這樣的方案有何意義?如果你已經(jīng)在某個方向上做了測試,那么你至少應(yīng)該讓問題的范圍縮小一半,即是二分。而如果你的測試用例連這么基本的標(biāo)準(zhǔn)都無法達到,請問,你制定出來的探索方案還合理嗎?
再來,當(dāng)你感覺到“應(yīng)該”要用測試用例縮小問題的定位范圍,而“實際”感覺困難或者不能時,你就應(yīng)該果斷地停下來細細思考,而不是悶頭繼續(xù)寫一堆、執(zhí)行一堆毫無用處的測試方案。你該從頭到尾去梳理一遍,自己做過哪些測試,它們意味著什么,但同時又不意味著什么。關(guān)鍵就是要想清楚它們“不意味”著什么,才能發(fā)現(xiàn)還有哪些地方和模糊點尚待測試。這是關(guān)節(jié)處。
所謂工程師,最重要的就是要能夠把問題、把過程梳理得透徹,能夠明察秋毫。什么叫明察秋毫?就是連羽毛、頭發(fā)絲那樣的細節(jié)、差別都可以發(fā)現(xiàn)。工程師的部署,應(yīng)該讓每一粒塵埃都有的放矢。那么,一個大前提便是,你至少要能夠把每一粒塵埃都裝進自己的腦海里做到心中有數(shù)。如果你只能夠覺察到某一部分的塵埃,那有怎么去談?wù)撟屆恳涣m該都有的放矢呢?
科學(xué)、工程的世界里,不允許有模糊不清的地方。你可以不知道,但你不能夠把“不知道”當(dāng)作知道,更不可以把“不知道”歸因于各種莫名其妙的“不可知”黑盒。工程師的任務(wù),首先要能夠明確地察覺出、理清楚哪些是清楚的、哪些是不清楚的。基于這個認識,再理性地制定攻克方案,而不是蠻干、更不是寄托于“神諭”或者“祈禱”,期望通過僥幸使自己的方案發(fā)揮效果。
這次經(jīng)歷,唯一值得稱道、也是我解決這個bug的重要因素,便是我沒有閉門造車,而是以開放的心態(tài)誠懇地向周圍的朋友求助。在與他們的談話中、建議下,自己不斷獲得啟發(fā),從而能夠?qū)⑦@個bug解決。終于,在只求“解決問題”這個方面,自己更為激進一些了。
感謝向我提供幫助的這些朋友們,有你們真好。
近期回顧
《J2EE導(dǎo)論 | 疑惑篇》
《前端技術(shù)的碎碎念》
《放眼望去都是痛》
如果你喜歡我的文章或分享,請長按下面的二維碼關(guān)注我的微信公眾號,謝謝!

更多信息交流和觀點分享,可加入知識星球:

VIP贊賞專區(qū):

浙公網(wǎng)安備 33010602011771號