如何除臭蟲 (Introduction to Computer Science and Programming Using Python - How to debug)


盡量不要寫出有蟲的程式碼,逆向思考,用現有條件做實驗,用留下的蹤跡追蹤到哪行出錯。




特別不喜歡這不知為何被否定的感覺,(含淚咬手帕)今天早上一直到下午兩點左右,我埋首在Problem set 3的第四題 hangman game。我電腦上Run的完美的python script,一送出給課程評分系統之後,滿滿的紅字(Error***)。因為覺得這是個很特別的經驗,所以寫一下記錄,這是我上edX上的Introduction to Computer Science and Programming Using Python遇到的一些問題。

一開始我覺得是平台上驗證機制(grader)的問題,人總是這樣,當看到支持自己沒有犯錯的證據時,是無論如何都不會想到,自己也有犯錯的可能,沒道理在我這裡跑得好好的,到你那裡就不行了。然而正是因為這個絕對不可能想法,讓我浪費許多時間。

因為正是基於這個自己沒犯錯的假設,所以不會往自己的身上尋找問題,而是往別人(grader)身上尋找問題,當方向錯誤時,怎麼可能找到解答。

哇靠,短短的時間內,一些灰心失志的喪氣話,不停的在腦袋裡重播。

『我的working memory好弱,剛是看到哪了?』

『我一定是老了』

『這好無聊,或許我不應該浪費這麼多時間在這裡』

『課堂上的頁面有問題吧!』

『不可能,已經送出11次了,11次都錯!問題到底在哪,我要發瘋啦~~~』

七七四十九天過去,老狗玩不出新把戲,我決定Move on,老娘不做這個作業,先繼續往下上課再說。

就跟出門要付帳時發現沒帶錢包,掏口袋卻發現有張千元鈔票一樣剛好,下一堂課就是講如何除臭蟲(Debug),從歷史開始講起,原來人類編程歷史上的第一個bug,真的是一隻Bug。

也算看得津津有味,還笑出來XD,接著介紹Test case,包括test case的種類,與如何發想Test case,有黑箱的,有玻璃的,還有大師講的幾個除臭蟲的原則,現在想來真是受用。 當然蟲有分很多種,最難解的就是那種在背後重複執行,但是你無跡可尋的蟲,對付不同的蟲解法也不同。最難解的還是Covert。

Categories of bugs (MITx: 6.00.1x Introduction to Computer Science and Programming Using Python)

如何除蟲(How to debug)以下節錄幾點課堂上提的重要對策

  • 盡量不要寫出有蟲的程式 (這不是廢話嗎?掌嘴先~~) 寫之前先想,把想法畫出來,或短暫休息。解釋代碼給別人/自己/空氣聽都可以。就算是一隻黃色小鴨,也有它的價值。
  • 逆向思考(Study program code),不要想什麼出錯了,想How did i get the unexpected results,是一部分錯,還是整個都錯了。要怎樣改寫目前的程式,才會產出Bug。 
  • 做實驗,利用現有的資料來產生一個假設,實驗驗證假設是否成真。 
  • 縮小範圍,記Log或分區搜尋(Print statement and bisection search),確認程式運作到哪裡時,都還是正確的。比方說現在會依序執行6個function,那可以在第三個fucntion時,去實驗到目前為止的結果是不是預期中的,依此類推,逐一縮小問題範圍。 
  • 修改前先備份,不要徒手去改,而是改之前,先備份再修改,之後可以互相參考。


Categories of bugs (MITx: 6.00.1x Introduction to Computer Science and Programming Using Python)

就在上完這個Lecture後,再回去看之前Grader評論我錯誤的地方,我終於發現問題了!問題果然在我自己身上XDDD。只能說,題目很重要!題目很重要!題目很重要!題目上的說明要看清楚,因為他都有寫上去。要解決一個困難的問題,先把問題拆小,拆細,然後逐一完成。這問題就是這樣,到最後的問題之前,已經先寫了幾個function了,但這些function是雷區,因為我寫的與最後這個問題所使用的function雖然回傳同樣的值,但寫法不同,所以導致問題的發生,(這問題要我們只上傳某一function的內容)。


結論

不要太早下結論,即使證據如此明確,還是要多想無窮無盡的假設與嘗試多做推論。如果你執著的那個方向,經過很久的時間都還找不到原因,那就表示應該要換方向啦~









沒有留言:

張貼留言