無論你是初學者,還是軟件開發領域的專家,都無法避免代碼中出現錯誤。
我們所有人開發的代碼中都有錯誤,因為,沒有人能夠徹底的了解編碼過程中發生的一切。
因此,在項目開發過程中需要耗費時間,在Debug過程中同樣需要耗費大量的精力。
我們只能研究我們自己,研究我們的工具,研究我們的bug,找到解決方案,幫助我們更高效的減少開發過程中出現的bug。
如何處理bug,我認為主要可以分為3個階段:
一、預調試:在開發過程中盡量避免bug出現
二、調試:發現bug、識別bug、修復bug、移除bug
三、調試后:預估未知、未出現的bug
下面,我們來詳細介紹每個階段。
預調試
就像計算機科學家Edsger W. Dijkstra所說的那樣:
"如果說調試是消除錯誤的過程,那么編程一定是引入錯誤的過程。"
如果我們通過編程給程序引入bug,那就意味著我們需要引導自己減少引入bug的數量。我把這個引導自己的過程稱為 "預調試"(Prebugging)。
我在Google上搜索 "Debug"的定義,從牛津詞典上看到的定義引起了我的思考。
“Debug從計算機硬件或軟件中識別和消除錯誤的過程。”
這個定義引起了我的思考,因為我相信很多軟件開發人員都是主動進行調試的。他們改進他們的工具和自己,以減少他們產生的bug數量。
雖然這個定義對于調試來說是可以接受的,但是它淡化了軟件開發人員為減少bug產生而做的其他每一件事。所以我們現在就來看看這些事情。
了解你經常使用的工具
了解你經常使用的所有工具是很重要的,因為這有助于你減少編碼時產生的bug。
沒有辦法完全避免bug的產生,但是如果你對你所使用的工具的基礎知識非常健全的話,你可以避免產生一些bug。
例如,很多JavaScript用戶記不住什么是返回。而有些人記不住和數組方法的區別。
如果你不是JavaScript用戶,只需從你使用的語言中挑選一個內置的方法或函數,然后問自己:
這個方法需要什么樣的參數?這個方法會返回什么?如果提供了一個無效的參數會發生什么?
經常問自己上述問題,可以讓你學習到很多知識。
這就是如何讓自己保持對經常使用的工具的基礎知識的更新,尤其是在你沒有太多時間主動閱讀的情況下。
編碼前的計劃
編程似乎是一個反復嘗試的工作,你需要不斷嘗試,直到正確為止。
許多初級軟件開發人員并沒有真正理解他們正在開發的程序,其中一些人在上網搜索報錯信息之前,其實并沒有嘗試去理解錯誤信息。
現在,每個人似乎都覺得編程始終與“代碼,代碼,代碼,搜索,調試”有關。
但是有必要真正了解你在做什么,以便你可以快速列出:
我們期望將什么作為輸入以及這些輸入的結構和特征
我們期望如何處理這些輸入
我們最終期望返回的是什么
如果沒有給出預期的輸入,需要做些什么
簡而言之,對函數或程序的輸入,過程和輸出進行規劃不僅可以幫助你減少錯誤,還可以幫助你編寫有效的測試用例。
熟悉常見的錯誤信息
如果你已經熟悉了一個錯誤或bug,往往很容易修復。
所以,花時間研究一些常見的錯誤,并學習如何去修復這些錯誤是很重要的。現在我們就來談談一些常見的錯誤。
語法錯誤
每一種編程語言都有自己的規則,開發者要對違反這些規則的行為負責。
編程語言對規則的要求很嚴格,只要違反了這些規則,它們就會拋出錯誤。
例如,想象一下,你省略了一個函數或方法的括號:function{}
會拋出一個錯誤。
熟悉語法錯誤的錯誤信息,以及如何修復它,會讓你在調試時更有優勢。
我個人注意到,大多數語法錯誤總會提到一些關鍵詞,幫助你找出代碼中出錯的部分。
返回的 "undefined"告訴我們,我們要訪問的對象或屬性是不可用的。如果我們敏銳地注意錯誤信息,就能找出問題所在。
你寫的代碼越多,你就越能夠避免語法錯誤。你也可以簡單地使用代碼編輯器、靜態檢查工具,能夠高亮突出語法錯誤。使用這些工具可以給你帶來很大的幫助。
邏輯/語義錯誤
邏輯錯誤是非常棘手的問題,因為它們看山去是沒有錯誤的--但你仍然沒有得到預期的結果。
例如,確認這種錯誤的一個簡單方法是在瀏覽器的控制臺中檢查下面的代碼。
prompt("enter number") +3;
你可能希望輸出一個數字,但它會返回一個字符串。
簡而言之,你將不會得到預期的結果。
在編碼前進行規劃,了解你所使用的編程語言的基礎知識,可以幫助你處理邏輯錯誤--前提是你要理解給你的程序要求。
編譯錯誤
你的程序可能無法編譯,因為你可能違反了編譯器希望你遵守的一些規則。
所以,你正在編寫的程序可能無法編譯。
例如,寫一個字符串時沒有使用通常的引號,會導致編譯錯誤,因為字符串必須使用引號。所以,代碼將無法編譯。
const name= Ayobami
這與語法錯誤類似,你寫的代碼越多,你就越能更好地處理編譯錯誤。
你可以通過經常編譯或測試你的代碼來提高工作效率,減少這些錯誤。
資源錯誤
有時,你的程序可能會超過其內存限制或用盡可用資源。
這可能會導致你的應用程序停止服務或出現故障。
下面的代碼是一個導致資源錯誤的代碼的實際例子。
由于堆棧空間(即瀏覽器分配給函數調用鏈的內存)被用完,函數崩潰或使瀏覽器變慢。
在這種情況下,該錯誤是資源錯誤,因為它是由于用完分配的內存(資源)而發生的。
接口錯誤
有時候,我們設計的程序API是按照一定的方式來使用的,但是用戶使用程序的方式不同,就會造成錯誤。
這種錯誤被稱為接口錯誤。
例如,假設方法期望的是一個字符串,但我們卻用一個數字來代替調用它。如果程序的開發者沒有考慮到這種情況,就會導致錯誤。
軟件中的大多數事物都遵循標準。如果你所定義的標準沒有被遵循,你需要為你的用戶提供錯誤信息或指南,以幫助他們弄清楚他們正在錯誤地使用應用程序。
在這種情況下,記錄你的API可以提供很多幫助。
確保你的設置與工具相互匹配
有一個適合你的工具的設置是很重要的。
有時,你的操作系統可能與你的應用程序不兼容--也許是因為它需要一個較新版本的操作系統,或者它需要某個軟件。
例如,如果電腦上缺少一些微軟的VC運行時,WampServer可能無法在Windows操作系統上正常運行。
類似的事情也可能發生在Linux和macOS上。
你只需要確定你的設置是適合你的開發工作的。
對你的程序的功能要有確定性
"在數學、計算機科學和物理學中,確定性系統是指在系統未來狀態的發展中不涉及隨機性的系統。因此,一個確定性模型將始終從一個給定的起始條件或初始狀態產生相同的輸出"。
那么,問題是,我們如何做一個確定性的程序?
你必須確定你的程序中可以接受的數據類型,拒絕任何不符合的數據。
簡而言之,你需要接受預期的數據,拒絕不符合預期的數據,或者將預期的數據通知用戶。
不懂就不要用
減少bug產生的最好方法之一是只使用你了解的方法、方法和類。
如果你必須使用任何你不理解的方法或樣式,在做之前先研究一下,確定對它有深入的理解。
每當你利用你不了解的東西時,很容易給你的應用程序引入不必要的bug。
學會準確打字
打字準確被低估了,因為編程更多的是思考而不是打字。但在打字時準確無誤可能會幫助你減少一些語法錯誤、類型錯誤或錯別字。
許多編程錯誤都是由簡單的打字錯誤引起的。
準確打字的能力能夠減少開發過程中的bug。
邊調試邊觀察其他開發者
另一個有趣的提高調試技能的方法是,當其他開發者進行調試時,觀察他們,這有助于看到不同的調試方法。
總會有一些我們不知道或不曾使用的工具或方法來進行調試,觀察別人的調試讓我們有機會發現那些我們可能不知道的工具或方法。
或者即使你知道那些不同的方法,你也可能不知道為什么或如何使用它們。
觀察別人可以影響我們重新審視這些方法和工具,最終可能提高我們的調試技能。
調試
調試是編程的核心,因為它在編碼時占用的時間最多。
調試主要涉及三個階段:
(1)發現錯誤
(2)分析并理解錯誤發生的原因
(3)修復或移除bug
發現錯誤
發現bug首先需要了解你看到的錯誤信息。
毋庸置疑,錯誤信息就是一個bug的指南。
如果你理解了錯誤信息,你就可以精確地追蹤到錯誤的位置。
但是有些錯誤可能會很繁瑣,因為它們可能沒有明確的錯誤信息和未知。
就像前面所說,邏輯/語義錯誤只是得不到我們想要的結果。
為了找到bug,你需要:
明確你的期望;檢查你得到的結果;比較你的期望值和實際結果,看看差異;你可以使用調試器或其他有用的工具來快速找到這些錯誤;然后,你可以根據你的假設檢查代碼的不同部分,并執行試錯來找到錯誤。
分析并理解錯誤發生的原因
找到一個bug之后,你需要弄清楚為什么代碼會有這樣的錯誤。
這樣做可以幫助你建立一個高效的系統。
相反,許多開發人員只會在谷歌上搜索,并直接從StackOverflow得到的答案。
這在某些情況下是沒有問題的,但最好是了解bug的原因和為什么解決方案有效。
理解bug的原因是修復bug或刪除bug道路上的重要一步。
修復或移除bug
在找到并了解了bug的原因后,我們就要修復這個bug。
有的時候,當你了解了bug是什么之后,你就會毫無壓力的找到解決方案。
但是,有的時候,我們的理解無論怎么努力,都找不到任何解決方案。
與其浪費時間,不如在谷歌上搜索錯誤信息或任何你覺得合適的信息。
你也可以問另一個人,因為其他人往往會有不同的看法。他們是中立的,這種中立性確實有助于修復一些bug。
所以,谷歌一下吧!
修復一個令人困擾的bug總是會帶來巨大的興奮。
但不要太過沉浸在興奮中,因為修復一個bug可能會引起另一個bug。
所以,首先要確保你沒有給程序引入另一個問題。
這就是為什么自動化測試很重要。
調試后
調試后需要在你已經寫好的程序中預測有可能出現的bug。
它指的是你可能使用的所有機制,以確保未知的bug在危害系統或公司之前能夠很容易被追蹤或管理。
現在的問題是你如何做到這一點?嗯,用錯誤跟蹤系統。
你應該在生產中擁有一個錯誤跟蹤系統,這樣你就可以很容易地發現錯誤,因為它們在你的應用程序推送到生產后出現。
有很多錯誤跟蹤器,它們只需要上網搜索一下就可以了。不過這里有幾個大家可以看看。
www.sentry.io
www.honeybadger.io
www.pypi.org
www.airbrake.io
www.logrocket.com
有這么多的錯誤跟蹤器,你只需要選擇一個最適合你的即可。
結語
調試是所有軟件開發人員必須培養的一項重要技能。
它是編碼的核心,如果你做得好,它可以讓你成為一個更好的開發者。
要想成為優秀的調試高手,你必須盡可能多地學習各種調試方法,很多方法我在本文中已經討論過了。
現在是時候成為一名優秀的軟件開發人員了,而調試可以在這條路上幫助你。
-
軟件開發
+關注
關注
0文章
614瀏覽量
27362 -
程序
+關注
關注
117文章
3787瀏覽量
81049 -
函數
+關注
關注
3文章
4331瀏覽量
62622 -
代碼
+關注
關注
30文章
4788瀏覽量
68616
原文標題:【代碼調試】有哪些新手程序員不知道的小技巧?
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論