10個(gè)調(diào)試和排錯(cuò)的小建議
在空白的文本編輯器里打開一個(gè)嶄新的文本,沒有一行代碼,出現(xiàn)在眼前的是一個(gè)充滿了無限可能和希望的項(xiàng)目??墒?,當(dāng)數(shù)千行的代碼寫完之后,整個(gè)項(xiàng)目因?yàn)閎ug的出現(xiàn)而被壓垮了,更別說添加什么新功能了...這也許是對(duì)程序員的最大打擊,在飽滿的熱情上澆了一盆冷水。其實(shí),最好的軟件程序員當(dāng)然知道怎樣去發(fā)現(xiàn)并修復(fù)這些bug,在剛開始編程的時(shí)候就通過軟件工程的最好方法來降低bug的出現(xiàn)概率。
幾乎沒有哪個(gè)程序員能夠?qū)懗鲆粋€(gè)bug都沒有的代碼,但是解決方法總是比困難多得多。多實(shí)踐和堅(jiān)毅的決心是成功的關(guān)鍵,這樣才能夠?qū)懗銮鍧嵈a,保證軟件系統(tǒng)的可靠性。

1. 輸出語句
代碼調(diào)試的首要工具就是可靠地、真實(shí)的輸出語句。當(dāng)輸出語句數(shù)量龐大且不易于管理的時(shí)候,在輸出語句里恰當(dāng)使用記錄系統(tǒng),這可以說是一個(gè)等效的好方案。許多編程語言里都配備了現(xiàn)成的類庫,例如在Python里構(gòu)建的記錄庫。
輸出語句是程序員檢查數(shù)據(jù)值和變量類型最快、最簡(jiǎn)單和最直接的方式。高效的輸出語句能夠幫助程序員通過一段代碼來數(shù)據(jù)流,并快速識(shí)別bug源頭。雖然先進(jìn)的調(diào)試工具有很多,但是如果你想調(diào)試一段代碼的話,這個(gè)普通的輸出語句的方法應(yīng)該是程序員最先考慮的方法。
2. 調(diào)試器
源代碼調(diào)試器采用了輸出語言方法里的邏輯推理。這樣可以讓程序員一行一行的單步執(zhí)行代碼,同時(shí)監(jiān)測(cè)從變量值到底層虛擬機(jī)整個(gè)狀態(tài)的一舉一動(dòng)。另外,大部分的編程語言都具有多個(gè)調(diào)試器,可以提供不同的功能,包括圖形接口、終止程序的斷點(diǎn)設(shè)置、執(zhí)行環(huán)境內(nèi)部任意代碼的實(shí)施。
在許多情況下,調(diào)試器可以說是大材小用了,但如果合理利用的話,調(diào)試器絕對(duì)是一款高效率的工具。更多調(diào)試器的功能請(qǐng)看Python調(diào)試器:pdb。
3. Bug系統(tǒng)

4. Linter
在某些編程語言里,Linter可以執(zhí)行對(duì)代碼的靜態(tài)分析,以便在代碼編寫和運(yùn)行之前識(shí)別出問題區(qū)域;在一些其它編程語言里,Linter工具對(duì)于語法檢查和增強(qiáng)風(fēng)格是很有幫助的。編程的時(shí)候在編輯器里打開一個(gè)Linter程序,或者是在代碼編寫和運(yùn)行之前通過Linter傳遞代碼,這些都有利于程序員在使用軟件之前發(fā)現(xiàn)并糾正更多的錯(cuò)誤。因此,使用Linter可以幫你在節(jié)省寶貴時(shí)間的同時(shí)揪出因語法錯(cuò)誤、打字錯(cuò)誤或數(shù)據(jù)類型錯(cuò)誤而引起的bug源頭。
想要知道什么樣的Linter最適合你使用,看看Python的Linter工具:Pyflakes。
5. 版本控制
任何一個(gè)重大的軟件工程項(xiàng)目里都不應(yīng)該忽略使用版本控制系統(tǒng)。舉例而言,像Git,Mercurial和SVN這類的版本控制允許不同的代碼庫版本在不同的基礎(chǔ)上是可以分開的。
不同的控制版本可以被合并到一起,因此,多個(gè)程序員可以同一時(shí)間運(yùn)行同一個(gè)代碼庫。版本控制在代碼排錯(cuò)里同樣有著舉足輕重地位,可以讓程序員回滾修改較早版本的代碼,盡可能在錯(cuò)誤出現(xiàn)之前,在代碼庫里對(duì)錯(cuò)誤進(jìn)行修復(fù)。
6. 模塊化
缺少架構(gòu)的代碼是難以修復(fù)bug的主要源頭。只要代碼易于理解,而且理論上行得通,那么對(duì)于程序員來講,找到并快速修復(fù)bug并不是什么棘手的事情。另一方面,越是重要的代碼出現(xiàn)錯(cuò)誤的幾率就越大,找到這個(gè)錯(cuò)誤相對(duì)也就比較困難。
設(shè)計(jì)軟件的組件經(jīng)常需要考慮一點(diǎn)就是所謂的代碼模塊化,代碼模塊化可以幫助程序員更好的用兩種方法來理解軟件系統(tǒng)。第一,模塊化能夠創(chuàng)造出一定層次的抽象感,在沒有完全理解所有細(xì)節(jié)的情況下也能想象出系統(tǒng)的模型。比如,程序員正在構(gòu)建一個(gè)商業(yè)系統(tǒng),可能會(huì)考慮到信用卡處理模塊,然后觀察這個(gè)模塊和其余代碼有什么聯(lián)系,根本不用考慮信用卡處理模塊的所有詳細(xì)內(nèi)容。第二,模塊的詳細(xì)說明,這個(gè)詳細(xì)說明是不會(huì)和別的模塊內(nèi)容混淆的,就像每個(gè)卡只有一個(gè)卡號(hào)是一樣的。
7. 自動(dòng)化測(cè)試
單元測(cè)試和其它類型的自動(dòng)化測(cè)試跟模塊化是有很大關(guān)聯(lián)的,可以說是相輔相承。自動(dòng)化測(cè)試就是一段代碼用特殊的輸入值來運(yùn)行軟件,以此來檢測(cè)程序運(yùn)行是否和預(yù)期的相符合。
單元測(cè)試主要是用來檢測(cè)單個(gè)功能的功能性,然而功能測(cè)試是用來檢查特殊的程序性能,并且結(jié)合單元測(cè)試來檢查軟件系統(tǒng)的整體部分。有很多測(cè)試框架可以用來編寫測(cè)試程序,而且大部分受歡迎的測(cè)試框架都是由Kent Bent編寫的JUnit類庫衍生而來的,Kent Bent是“測(cè)試驅(qū)動(dòng)開發(fā)方法”最早的支持者之一。 Python標(biāo)準(zhǔn)類庫包括一個(gè)JUnit的Python版本,稱之為PyUnit或者unittest的單元測(cè)試框架。
8. 泰迪熊方法(橡皮鴨調(diào)試)

在軟件編程界,就不得不提到傳奇人物Brain Kernighan和Rob Pike,泰迪熊調(diào)試法源于一個(gè)大學(xué)計(jì)算機(jī)中心,在這里,學(xué)生們遇到神秘bug的時(shí)候就可以先把問題解釋給這只擺在桌子上的泰迪熊聽,然后才能向老師或助教求助。所以,有的時(shí)候只跟熊聊天也能解決問題。這一調(diào)試方法真的很管用,以至于風(fēng)靡了整個(gè)軟件工程行業(yè),就像打印語句這一方,不管那些復(fù)雜的工具如何風(fēng)起云涌,輸出語句這一方法仍然在今天很受歡迎。
9. 編寫代碼注釋

注釋的功能就是在更易于理解的層次上解釋代碼的編寫目的,盡可能多寫一些:每行代碼是干什么的,怎么去完成,這些問題都應(yīng)該在通讀代碼之后很容易找到答案才行。另外,給各個(gè)功能和變量取合理的名稱也有助于簡(jiǎn)化代碼實(shí)施的過程。在代碼行下面的空白處填寫注釋來回答為什么要使用特殊的實(shí)現(xiàn)功能,或者一段代碼怎樣和程序的其余部分互動(dòng)等等。
編寫詳細(xì)的注釋可以說是軟件工程里一步可靠地檢驗(yàn)步驟,即使是在沒有bug的代碼里也是同樣受用。這樣,就算bug出現(xiàn)了也不用擔(dān)心,注釋會(huì)幫你節(jié)省數(shù)小時(shí)的排錯(cuò)時(shí)間。
10. 編寫文檔
代碼注釋是程序員以簡(jiǎn)單的方式和個(gè)人的觀點(diǎn)編寫的,而編寫軟件文檔是用來描述軟件系統(tǒng)的功能性,同時(shí)用戶也可以看到這些軟件文檔。根據(jù)軟件類型的不同,文檔可以用來詳述程序界面、圖形界面或者工作流程。
編寫文檔還有一個(gè)好處就是,可以展示你對(duì)軟件系統(tǒng)的理解程度,指出軟件系統(tǒng)不夠完善的部分或者有可能是bug源頭的部分。
相關(guān)文章
偽靜態(tài)技術(shù)介紹與優(yōu)缺點(diǎn)分析(較完整篇)
偽靜態(tài)太適合用在普通的企業(yè)網(wǎng)站上了——既不要求高并發(fā),但同時(shí)又很在乎seo(搜索引擎優(yōu)化),而且也要求后臺(tái)可動(dòng)態(tài)更新。2009-11-11
chatgpt成功解決Access denied 1020錯(cuò)誤問題(最新推薦)
從前兩天網(wǎng)上開始一直開著的chatgpt網(wǎng)頁突然打不開了,提示1020錯(cuò)誤,嘗試換了不同代理軟件或者代理地點(diǎn)仍然無法解決,這篇文章主要介紹了chatgpt成功解決Access denied 1020錯(cuò)誤,需要的朋友可以參考下2023-05-05
JetBrains 學(xué)生認(rèn)證教程(Pycharm,IDEA… 等學(xué)生認(rèn)證教程)
這篇文章主要介紹了JetBrains 學(xué)生認(rèn)證教程(Pycharm,IDEA… 等學(xué)生認(rèn)證教程)文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
鴻蒙(HarmonyOS)實(shí)現(xiàn)隱私政策彈窗效果
但在HarmonyOS中,由于系統(tǒng)彈窗的顯示優(yōu)先級(jí)高于其他組件,即使跳轉(zhuǎn)到Web頁面,彈窗依然會(huì)顯示在最上層,下面給大家分享鴻蒙(HarmonyOS)實(shí)現(xiàn)隱私政策彈窗,感興趣的朋友跟隨小編一起看看吧2024-08-08
C++ Go語言實(shí)現(xiàn)將windows和linux文件刪除至回收站
這篇文章主要為大家詳細(xì)介紹了如何分別使用C++ Go語言實(shí)現(xiàn)將windows和linux文件刪除至回收站,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12

