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