在空白的文字編輯器裡開啟乙個嶄新的文字,沒有一行**,出現在眼前的是乙個充滿了無限可能和希望的專案。可是,當數千行的**寫完之後,整個專案因為bug的出現而被壓垮了,更別說新增什麼新功能了...這也許是對程式設計師的最大打擊,在飽滿的熱情上澆了一盆冷水。其實,最好的軟體程式設計師當然知道怎樣去發現並修復這些bug,在剛開始程式設計的時候就通過軟體工程的最好方法來降低bug的出現概率。
幾乎沒有哪個程式設計師能夠寫出乙個bug都沒有的**,但是解決方法總是比困難多得多。多實踐和堅毅的決心是成功的關鍵,這樣才能夠寫出清潔**,保證軟體系統的可靠性。
1. 輸出語句
**除錯的首要工具就是插入可靠地、真實的輸出語句。當輸出語句數量龐大且不易於管理的時候,在輸出語句裡恰當使用記錄系統,這可以說是乙個等效的好方案。許多程式語言裡都配備了現成的類庫,例如在python裡構建的記錄庫。
輸出語句是程式設計師檢查資料值和變數型別最快、最簡單和最直接的方式。高效的輸出語句能夠幫助程式設計師通過一段**來跟蹤資料流,並快速識別bug源頭。雖然先進的除錯工具有很多,但是如果你想除錯一段**的話,這個普通的輸出語句的方法應該是程式設計師最先考慮的方法。
2. 偵錯程式
源**偵錯程式採用了輸出語言方法裡的邏輯推理。這樣可以讓程式設計師一行一行的單步執行**,同時監測從變數值到底層虛擬機器整個狀態的一舉一動。另外,大部分的程式語言都具有多個偵錯程式,可以提供不同的功能,包括圖形介面、終止程式的斷點設定、執行環境內部任意**的實施。
在許多情況下,偵錯程式可以說是大材小用了,但如果合理利用的話,偵錯程式絕對是一款高效率的工具。更多偵錯程式的功能請看python偵錯程式:pdb。
3. bug跟蹤系統
在一些比較重大的軟體專案裡,使用bug跟蹤系統是很有必要的。如果沒使用bug***,最典型的狀況就是程式設計師要整理以往的郵件或者是聊天記錄來查詢bug,更糟糕點兒的就是程式設計師根本不記得其它東西,印象裡只有一點bug的文件。一旦這種情況發生,bug將必然充斥著整個**程式設計,更加嚴重的是,想要識別出這些bug並確定它們的位置是很難的。
乙個簡單的文字檔案在專案裡可以作為最初的bug跟蹤系統。隨著**庫的不斷增加,bug衍生出乙個文字檔案並不需要太長的時間。有很多商業和開源的bug跟蹤軟體提供的解決方案都是可以考慮的,選擇哪乙個bug跟蹤軟體首先要明確的部分就是要確保在程式設計專案裡,那些非程式人員能夠快速使用這個bug跟蹤系統。
4. linter
在某些程式語言裡,linter可以執行對**的靜態分析,以便在**編寫和執行之前識別出問題區域;在一些其它程式語言裡,linter工具對於語法檢查和增強風格是很有幫助的。程式設計的時候在編輯器裡開啟乙個linter程式,或者是在**編寫和執行之前通過linter傳遞**,這些都有利於程式設計師在使用軟體之前發現並糾正更多的錯誤。因此,使用linter可以幫你在節省寶貴時間的同時揪出因語法錯誤、打字錯誤或資料型別錯誤而引起的bug源頭。
想要知道什麼樣的linter最適合你使用,看看python的linter工具:pyflakes。
5. 版本控制
任何乙個重大的軟體工程專案裡都不應該忽略使用版本控制系統。舉例而言,像git,mercurial和svn這類的版本控制允許不同的**庫版本在不同的基礎上是可以分開的。
不同的控制版本可以被合併到一起,因此,多個程式設計師可以同一時間執行同乙個**庫。版本控制在**排錯裡同樣有著舉足輕重地位,可以讓程式設計師回滾修改較早版本的**,盡可能在錯誤出現之前,在**庫里對錯誤進行修復。
6. 模組化
缺少架構的**是難以修復bug的主要源頭。只要**易於理解,而且理論上行得通,那麼對於程式設計師來講,找到並快速修復bug並不是什麼棘手的事情。另一方面,越是重要的**出現錯誤的機率就越大,找到這個錯誤相對也就比較困難。
設計軟體的元件經常需要考慮一點就是所謂的**模組化,**模組化可以幫助程式設計師更好的用兩種方法來理解軟體系統。第一,模組化能夠創造出一定層次的抽象感,在沒有完全理解所有細節的情況下也能想象出系統的模型。比如,程式設計師正在構建乙個商業系統,可能會考慮到信用卡處理模組,然後觀察這個模組和其餘**有什麼聯絡,根本不用考慮信用卡處理模組的所有詳細內容。第二,模組的詳細說明,這個詳細說明是不會和別的模組內容混淆的,就像每個卡只有乙個卡號是一樣的。
7. 自動化測試
單元測試和其它型別的自動化測試跟模組化是有很大關聯的,可以說是相輔相承。自動化測試就是一段**用特殊的輸入值來執行軟體,以此來檢測程式執行是否和預期的相符合。
單元測試主要是用來檢測單個功能的功能性,然而功能測試是用來檢查特殊的程式效能,並且結合單元測試來檢查軟體系統的整體部分。有很多測試框架可以用來編寫測試程式,而且大部分受歡迎的測試框架都是由kent bent編寫的junit類庫衍生而來的,kent bent是「測試驅動開發方法」最早的支持者之一。 python標準類庫包括乙個junit的python版本,稱之為pyunit或者unittest的單元測試框架。
8. 泰迪熊方法(橡皮鴨除錯)
在軟體程式設計界,就不得不提到傳奇人物brain kernighan和rob pike,泰迪熊除錯法源於乙個大學計算機中心,在這裡,學生們遇到神秘bug的時候就可以先把問題解釋給這只擺在桌子上的泰迪熊聽,然後才能向老師或助教求助。所以,有的時候只跟熊聊天也能解決問題。這一除錯方法真的很管用,以至於風靡了整個軟體工程行業,就像列印語句這一方,不管那些複雜的工具如何風起雲湧,輸出語句這一方法仍然在今天很受歡迎。
同泰迪熊除錯法相似的一種方法叫做橡皮鴨除錯法,當你在向這只始終保持沉默的橡皮鴨子解釋的過程中,你會發現你的想法、觀點、思路和實際的**相偏離了,於是你也就找到了**中的bug。一旦乙個問題被充分地描述了它的細節,那麼解決方法也是顯而易見的。你覺得這個方法太「愚蠢」,太「弱智」了?是的,看上去,會這樣做的人腦子好像是有點毛病。不過,我要告訴你的是,這個方法的確有效。因為,這就是「code review」的雛形!
9. 編寫**注釋
注釋的功能就是在更易於理解的層次上解釋**的編寫目的,盡可能多寫一些:每行**是幹什麼的,怎麼去完成,這些問題都應該在通讀**之後很容易找到答案才行。另外,給各個功能和變數取合理的名稱也有助於簡化**實施的過程。在**行下面的空白處填寫注釋來回答為什麼要使用特殊的實現功能,或者一段**怎樣和程式的其餘部分互動等等。
編寫詳細的注釋可以說是軟體工程裡一步可靠地檢驗步驟,即使是在沒有bug的**裡也是同樣受用。這樣,就算bug出現了也不用擔心,注釋會幫你節省數小時的排錯時間。
10. 編寫文件
**注釋是程式設計師以簡單的方式和個人的觀點編寫的,而編寫軟體文件是用來描述軟體系統的功能性,同時使用者也可以看到這些軟體文件。根據軟體型別的不同,文件可以用來詳述程式介面、圖形介面或者工作流程。
編寫文件還有乙個好處就是,可以展示你對軟體系統的理解程度,指出軟體系統不夠完善的部分或者有可能是bug源頭的部分。
10個除錯和排錯的小建議
在空白的文字編輯器裡開啟乙個嶄新的文字,沒有一行 出現在眼前的是乙個充滿了無限可能和希望的專案。可是,當數千行的 寫完之後,整個專案因為bug的出現而被壓垮了,更別說新增什麼新功能了.這也許是對程式設計師的最大打擊,在飽滿的熱情上澆了一盆冷水。其實,最好的軟體程式設計師當然知道怎樣去發現並修復這些b...
10個除錯和排錯的小建議
在空白的文字編輯器裡開啟乙個嶄新的文字,沒有一行 出現在眼前的是乙個充滿了無限可能和希望的專案。可是,當數千行的 寫完之後,整個專案因為bug的出現而被壓垮了,更別說新增什麼新功能了.這也許是對程式設計師的最大打擊,在飽滿的熱情上澆了一盆冷水。其實,最好的軟體程式設計師當然知道怎樣去發現並修復這些b...
10個除錯和排錯的小建議
摘要 計算機程式設計可以說是乙個要求較高的手藝,掌握這門手藝就得具備勤奮和不斷學習的條件,因為新的事物和新的方法總是層出不群,所以不斷地學習 提公升技能是必不可少的。希望下面10個排錯bug的工具對你的工作有用。在空白的文字編輯器裡開啟乙個嶄新的文字,沒有一行 出現在眼前的是乙個充滿了無限可能和希望...