天天看點

一次艱難debug的反思

一次艱難debug的反思

已經很久沒有遇到如此頑固的bug了,總共耗費了我近1個禮拜的時間。期間的種種沖突,個人崩潰,最終解決方案的形成,到回過頭來的反思,實在有太多值得梳理的東西。

從結果上來講,這是個人

js

基礎極端薄弱的集中展現,是對

js

閉包、基本流程和運轉方式掌握不到位的綜合反應。正因為基礎薄弱,是以debug到某個階段,竟然不知道該如何制定探索方案。

從調式的方式來講,面對這樣頑固的bug,我并沒有做到冷靜分析、科學梳理。在跨過某一個節點後,我可恥地又成為了newbie時期的模樣:對一切都持神秘的态度。不過是因為别人提了一句,這個系統有點混亂。自己似乎一下子就找到了什麼光明正大的理由,就可以把所有的責任推卸出去,可以不用、不必去把問題找出來。

這種黑盒态度,等同于封建迷信,似乎要憑借什麼不可告人的運勢、辛苦和神秘,才能夠将一個問題解決。這是我所厭惡的,但卻依舊不斷再犯的東西。從信念上講,我再一次将問題劃歸為了“不可知”,于是,整個形勢就陡然發生了巨變。因為你将一個問題判定為了“不可知”,你允許了僥幸心理的存在。因為你的僥幸心理,你對一切就不再保持一顆空靈之心,不再相信邏輯、相信理智。

所謂的将理智抛諸腦後,就是開始颠倒黑白、指鹿為馬。

  • 你在過往經曆中能找到某個類似bug的解決方案,不是因為你做了很多的無用功,而是因為你在這種低效的搜尋中,恰好碰到了解決方案。是以這裡的秘訣不是做無用功,而是枚舉法、網格搜尋法,不斷地低效窮舉。而如果你能夠以更優的政策做搜尋,一定是可以更快地解決bug。
  • 總是用苦力和莫名其妙的怪異方法做比對,隻會讓自己徒勞耗費精力。但内心卻總是有一種情感上的寄托,似乎曆盡艱難,就能有回報。是以這是非理性的第二點:不是精準地找到是什麼東西、核心政策導緻你有回報、有成功,而是訴諸于“苦難情節”。
  • 越是找不到方法,就越是陷進去,開始不思考、不用謀略去制定測試和探索方案。像一隻蒼蠅一樣亂撞。更可怕的是,自己越是這樣,就越是深深不可自拔,不知道如何停下來,徒勞地耗費時間。
  • 再往後更可怕的是什麼呢,開始像學生時代做不出數學競賽題目時,思緒胡亂遨遊,開始訴諸于命運、劫難、劫數等玄幻的封建迷信。似乎終有此劫無法逃避。可實際呢?一個技術問題解決不了和劫數有什麼關系?無非是技術基本功不紮實,學的東西不到位,掌握的東西不細緻。可自己早已脫離了理性,開始在“不可知”的世界裡越走越起勁兒。

伴随着非理性的,是自己抗壓力的嚴重失衡。在高壓之下,自己無法理性思考問題,無法合理地、系統性、有條理地制定自己的探索方案。面對一個bug,特别是一個神奇現象的bug,你能做的應該是不斷地通過“不同種類”的測試,來将可能出現問題的範圍縮小。這個時候,最重要的就是精心制定合理的測試方案。

沒有條理、沒有理性的探索方式,就會導緻制定出N個隻會得出相同結論的test case。那麼請問,這樣的方案有何意義?如果你已經在某個方向上做了測試,那麼你至少應該讓問題的範圍縮小一半,即是二分。而如果你的測試用例連這麼基本的标準都無法達到,請問,你制定出來的探索方案還合理嗎?

再來,當你感覺到“應該”要用測試用例縮小問題的定位範圍,而“實際”感覺困難或者不能時,你就應該果斷地停下來細細思考,而不是悶頭繼續寫一堆、執行一堆毫無用處的測試方案。你該從頭到尾去梳理一遍,自己做過哪些測試,它們意味着什麼,但同時又不意味着什麼。關鍵就是要想清楚它們“不意味”着什麼,才能發現還有哪些地方和模糊點尚待測試。這是關節處。

所謂工程師,最重要的就是要能夠把問題、把過程梳理得透徹,能夠明察秋毫。什麼叫明察秋毫?就是連羽毛、頭發絲那樣的細節、差别都可以發現。工程師的部署,應該讓每一粒塵埃都有的放矢。那麼,一個大前提便是,你至少要能夠把每一粒塵埃都裝進自己的腦海裡做到心中有數。如果你隻能夠覺察到某一部分的塵埃,那有怎麼去談論讓每一粒塵該都有的放矢呢?

科學、工程的世界裡,不允許有模糊不清的地方。你可以不知道,但你不能夠把“不知道”當作知道,更不可以把“不知道”歸因于各種莫名其妙的“不可知”黑盒。工程師的任務,首先要能夠明确地察覺出、理清楚哪些是清楚的、哪些是不清楚的。基于這個認識,再理性地制定攻克方案,而不是蠻幹、更不是寄托于“神谕”或者“祈禱”,期望通過僥幸使自己的方案發揮效果。

這次經曆,唯一值得稱道、也是我解決這個bug的重要因素,便是我沒有閉門造車,而是以開放的心态誠懇地向周圍的朋友求助。在與他們的談話中、建議下,自己不斷獲得啟發,進而能夠将這個bug解決。終于,在隻求“解決問題”這個方面,自己更為激進一些了。

感謝向我提供幫助的這些朋友們,有你們真好。

近期回顧

《J2EE導論 | 疑惑篇》

《前端技術的碎碎念》

《放眼望去都是痛》

如果你喜歡我的文章或分享,請長按下面的二維碼關注我的微信公衆号,謝謝!

一次艱難debug的反思

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

一次艱難debug的反思

VIP贊賞專區:

一次艱難debug的反思