2016年5月14日 星期六

如何找出那隻臭蟲 ─ 談軟體除錯

http://4rdp.blogspot.com/2016/05/blog-post.html?m=0

寫程式或多或少都會有 bug,以個人寫程式三十多年經歷,設計複雜軟體還是有 bug,我與其它一般工程師不同的是,可以快速進入狀況查出問題所在,並提出方法解決。

以下經驗給年輕的程式設計師參考,
拼字錯誤 ─ 初級程式設計師最常犯錯,多是程式語言或是指令語法不熟,還好編譯器可以把這個層面的錯誤找出來,只要逐項修正可以很快清空這些錯誤及警告,還有為了日後的安寧,編譯器的警告不要留

方法錯誤 ─ 用錯誤的方法解決問題事倍功半,這通常中級的程式設計師卡關在這,程式寫法百百種,跟寫作文相像,高手的程式如行雲流水毫無滯礙,而低手設計,程式是可以達成功能,但是結構複雜不簡潔,日後維護困難,或是效能不彰,因為系統結構選用不良,一秒鐘只能處理十筆資料,跟別人的比較一秒鐘可以成千上萬筆資料量處理,馬上相形見拙,通常在通訊與資料庫處理方面最為常見,這要靠多思考高效的方法,廣泛閱讀、多練習各類程式設計,補充資料結構演算法等知識,才能進階到高級工程師。

邏輯錯誤 ─ 判斷式不夠嚴謹,個人覺得程式最麻煩的地方在此,要把所有狀況全部考量,才有辦法寫出無懈可擊的程式,通常開發日程常虛耗在這裡很多,參考百萬程式碼一文。解決這部分問題,目前靠整理文件資料自覺發現,或是寫一些自動測試程式,攻擊測試有沒有遺漏的條件,真希望未來人工智慧發展能幫忙解決。

如何除錯

讓問題再現 ─ 簡化步驟以呈現問題,這是測試工程師可以幫忙的地方,厲害的測試工程師真的可以讓程式設計的品質再上一層樓,我曾遇過一位馬來西亞的工程師,雖然剛畢業,但是她細心以及鍥而不捨的精神,幫產品挑出上百個問題點,很多很多是在特殊的場合才會出現的問題,一個沒甚麼經驗的小女生可以找到,那為什麼我們做不到?

善用軟體工具 ─ 如果軟體工具可以設定中斷點,那除錯就比較簡單,只要一步一步看變數變化或是條件判斷,就容易找到錯誤點。如果像是 Arduino 之類程式,程式無法暫停或中斷情形時,就利用顯示或列印來顯示狀態,反正想盡辦法找出問題癥結。

比對差異 ─ 比較需要 apple to apple,不能是 apple to orange,其實這在電路除錯也是一樣,例如某產品是 A+B 的組合,當發現功能不正常時,把認為可疑的部分換掉,例如換成 A+C,結果是正常,那再換回 A+B 問題可以重現,這時可以確認 B 物是有問題的,不能拿 D+C 跟 A+B 直接比較,這是找不到問題點的。

每日備份程式 ─ 由於現在寫程式都是專業商品等級,不是一兩小時就可以寫一寫交差,至少要開發半年以上時間,這麼久的開發時間,人難免遺漏某些東西,或是新功能上線整合有問題,就需要退回之前 OK 的版本比對除錯。

多年的程式除錯經驗,感覺程式設計像是一場可以回子重下的圍棋,一直再尋找優化的棋步 (程式)。最近工作忙碌,ROSA 開發需要點時間,因此這段時間會先發表其它類型文章,待有新功能完備再繼續逐項發表。

15 則留言:

  1. 以前學寫HTML,標籤常常丟三落四,做出來的網頁簡直讓人啼笑皆非。

    回覆刪除
  2. 程式初學者這種歷程很正常,為什麼 HTML 引起你的興趣?誰教你?以及用甚麼工具編輯?

    回覆刪除
  3. https://www.codecademy.com/
    最初是來這個網站學,HTML是第一基礎順位,所以我就學了。
    有其他程式語言可以當出發點的嗎?

    回覆刪除
    回覆
    1. 這網站我知道,是學程式語言的好地方,這網站你是從何得知?搜尋還是有人推薦?
      個人通常推薦初學者學 Python,參考舊文 http://4rdp.blogspot.tw/2014/02/blog-post_15.html,如果未來專攻資訊工程系之類,C/C++ 及 Java 應學。

      刪除
    2. 當初是搜尋到的,不過是全英語,對當時小學的我來說讀起來有點吃力。
      Python的話,我一定會找時間學學。

      刪除
    3. 我的英語和日語一開始都是玩遊戲學來的……
      畢竟當年中文遊戲大作還太少了。

      刪除
    4. 西瓜真是有好學精神,讚!

      從遊戲中學習,可以獲得良多知識與技能,這篇舊文跟老師分享多次了,再回味 http://4rdp.blogspot.tw/2008/03/blog-post_18.html

      刪除
    5. 對了,老師最喜歡那一款遊戲?

      刪除
    6. 我喜歡有合作有對抗的遊戲。
      以前玩了很多桌遊,雙人對抗的卡卡城我打到了香港亞軍。
      最近迷上了電腦遊戲英雄聯盟,聽説有些學生也在玩,感覺確實有它的過人之處。

      刪除
    7. 卡卡城(Carcassonne) https://zh.wikipedia.org/wiki/%E5%8D%A1%E5%8D%A1%E9%A0%8C_(%E9%81%8A%E6%88%B2),這款遊戲曾聽薛尤榮老師推薦,沒想到老師是這方面高手,看來應該找時間玩玩體會一下。
      LOL 這在台灣已經流行多年,小朋友一年前還很瘋這款遊戲,不過現在改玩有野豬騎士的部落衝突,不過電玩遊戲不要過度沉迷才好,分享一則網路文章 https://www.facebook.com/bridan.wang/posts/1137887026231915?pnref=story
      (哈)

      刪除
    8. 我玩的是2v2的合作對抗式的卡卡城,規則與1v1的有些出入。

      刪除
    9. 除了考驗對抗之外,與隊友合作是否默契也是很重要的一方面。
      畢竟與橋牌有些類似,對弈過程中是不允許説話的。

      刪除
    10. http://www.kingstone.com.tw/toy/book_page.asp?kmcode=3060000004980&actid=index.asp 查到台灣金石堂有賣,我想一些桌遊店應該也有租借,關於卡卡頌的致勝策略,要等實際玩過後,才能領悟成形。

      刪除
  4. Scott,你的留言遺失了,在此補上

    讓問題再現,我覺得這很重要。經驗上有些問題都是從現場回報回來的
    等工程師趕到時,問題先生就會害羞不出現
    這時後只能對著機台喊話,出來單挑啊
    怎樣讓發生錯誤的情形再次發生,這也考驗著工程師的功力

    回覆刪除
    回覆
    1. 非常認同 Scott 的觀點,問題再現是解決問題必須的第一步驟,如果無法再現,而僅只臆測原因,那通常是無法對症下藥,而是亂槍打鳥,甚至會傷及無辜。

      刪除