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

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

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

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

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

