最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【代碼調(diào)試】有哪些新手程序員不知道的小技巧?

2022-08-26 16:08 作者:C語(yǔ)言編程__Plus  | 我要投稿

無(wú)論你是初學(xué)者,還是軟件開發(fā)領(lǐng)域的專家,都無(wú)法避免代碼中出現(xiàn)錯(cuò)誤。

我們所有人開發(fā)的代碼中都有錯(cuò)誤,因?yàn)椋瑳](méi)有人能夠徹底的了解編碼過(guò)程中發(fā)生的一切。

因此,在項(xiàng)目開發(fā)過(guò)程中需要耗費(fèi)時(shí)間,在Debug過(guò)程中同樣需要耗費(fèi)大量的精力。


我們只能研究我們自己,研究我們的工具,研究我們的bug,找到解決方案,幫助我們更高效的減少開發(fā)過(guò)程中出現(xiàn)的bug。

如何處理bug,我認(rèn)為主要可以分為3個(gè)階段:

一、預(yù)調(diào)試:在開發(fā)過(guò)程中盡量避免bug出現(xiàn)

二、調(diào)試:發(fā)現(xiàn)bug、識(shí)別bug、修復(fù)bug、移除bug

三、調(diào)試后:預(yù)估未知、未出現(xiàn)的bug

下面,我們來(lái)詳細(xì)介紹每個(gè)階段。


預(yù)調(diào)試

就像計(jì)算機(jī)科學(xué)家Edsger W. Dijkstra所說(shuō)的那樣:

"如果說(shuō)調(diào)試是消除錯(cuò)誤的過(guò)程,那么編程一定是引入錯(cuò)誤的過(guò)程。"

如果我們通過(guò)編程給程序引入bug,那就意味著我們需要引導(dǎo)自己減少引入bug的數(shù)量。我把這個(gè)引導(dǎo)自己的過(guò)程稱為 "預(yù)調(diào)試"(Prebugging)。

我在Google上搜索 "Debug"的定義,從牛津詞典上看到的定義引起了我的思考。

“Debug從計(jì)算機(jī)硬件或軟件中識(shí)別和消除錯(cuò)誤的過(guò)程。”

這個(gè)定義引起了我的思考,因?yàn)槲蚁嘈藕芏嘬浖_發(fā)人員都是主動(dòng)進(jìn)行調(diào)試的。他們改進(jìn)他們的工具和自己,以減少他們產(chǎn)生的bug數(shù)量。

雖然這個(gè)定義對(duì)于調(diào)試來(lái)說(shuō)是可以接受的,但是它淡化了軟件開發(fā)人員為減少bug產(chǎn)生而做的其他每一件事。 所以我們現(xiàn)在就來(lái)看看這些事情。



了解你經(jīng)常使用的工具

了解你經(jīng)常使用的所有工具是很重要的,因?yàn)檫@有助于你減少編碼時(shí)產(chǎn)生的bug。

沒(méi)有辦法完全避免bug的產(chǎn)生,但是如果你對(duì)你所使用的工具的基礎(chǔ)知識(shí)非常健全的話,你可以避免產(chǎn)生一些bug。

例如,很多JavaScript用戶記不住什么是返回。而有些人記不住和數(shù)組方法的區(qū)別。

如果你不是JavaScript用戶,只需從你使用的語(yǔ)言中挑選一個(gè)內(nèi)置的方法或函數(shù),然后問(wèn)自己:

這個(gè)方法需要什么樣的參數(shù)?這個(gè)方法會(huì)返回什么?如果提供了一個(gè)無(wú)效的參數(shù)會(huì)發(fā)生什么?

經(jīng)常問(wèn)自己上述問(wèn)題,可以讓你學(xué)習(xí)到很多知識(shí)。

這就是如何讓自己保持對(duì)經(jīng)常使用的工具的基礎(chǔ)知識(shí)的更新,尤其是在你沒(méi)有太多時(shí)間主動(dòng)閱讀的情況下。


編碼前的計(jì)劃

編程似乎是一個(gè)反復(fù)嘗試的工作,你需要不斷嘗試,直到正確為止。

許多初級(jí)軟件開發(fā)人員并沒(méi)有真正理解他們正在開發(fā)的程序,其中一些人在上網(wǎng)搜索報(bào)錯(cuò)信息之前,其實(shí)并沒(méi)有嘗試去理解錯(cuò)誤信息。

現(xiàn)在,每個(gè)人似乎都覺(jué)得編程始終與“代碼,代碼,代碼,搜索,調(diào)試”有關(guān)。

但是有必要真正了解你在做什么,以便你可以快速列出:

我們期望將什么作為輸入以及這些輸入的結(jié)構(gòu)和特征

我們期望如何處理這些輸入

我們最終期望返回的是什么

如果沒(méi)有給出預(yù)期的輸入,需要做些什么

簡(jiǎn)而言之,對(duì)函數(shù)或程序的輸入,過(guò)程和輸出進(jìn)行規(guī)劃不僅可以幫助你減少錯(cuò)誤,還可以幫助你編寫有效的測(cè)試用例。



熟悉常見(jiàn)的錯(cuò)誤信息

如果你已經(jīng)熟悉了一個(gè)錯(cuò)誤或bug,往往很容易修復(fù)。

所以,花時(shí)間研究一些常見(jiàn)的錯(cuò)誤,并學(xué)習(xí)如何去修復(fù)這些錯(cuò)誤是很重要的。現(xiàn)在我們就來(lái)談?wù)勔恍┏R?jiàn)的錯(cuò)誤。

語(yǔ)法錯(cuò)誤

每一種編程語(yǔ)言都有自己的規(guī)則,開發(fā)者要對(duì)違反這些規(guī)則的行為負(fù)責(zé)。

編程語(yǔ)言對(duì)規(guī)則的要求很嚴(yán)格,只要違反了這些規(guī)則,它們就會(huì)拋出錯(cuò)誤。

例如,想象一下,你省略了一個(gè)函數(shù)或方法的括號(hào):function{}

會(huì)拋出一個(gè)錯(cuò)誤。

熟悉語(yǔ)法錯(cuò)誤的錯(cuò)誤信息,以及如何修復(fù)它,會(huì)讓你在調(diào)試時(shí)更有優(yōu)勢(shì)。

我個(gè)人注意到,大多數(shù)語(yǔ)法錯(cuò)誤總會(huì)提到一些關(guān)鍵詞,幫助你找出代碼中出錯(cuò)的部分。


返回的 "undefined"告訴我們,我們要訪問(wèn)的對(duì)象或?qū)傩允遣豢捎玫?。如果我們敏銳地注意錯(cuò)誤信息,就能找出問(wèn)題所在。

你寫的代碼越多,你就越能夠避免語(yǔ)法錯(cuò)誤。你也可以簡(jiǎn)單地使用代碼編輯器、靜態(tài)檢查工具,能夠高亮突出語(yǔ)法錯(cuò)誤。使用這些工具可以給你帶來(lái)很大的幫助。


邏輯/語(yǔ)義錯(cuò)誤

邏輯錯(cuò)誤是非常棘手的問(wèn)題,因?yàn)樗鼈兛瓷饺ナ菦](méi)有錯(cuò)誤的--但你仍然沒(méi)有得到預(yù)期的結(jié)果。

例如,確認(rèn)這種錯(cuò)誤的一個(gè)簡(jiǎn)單方法是在瀏覽器的控制臺(tái)中檢查下面的代碼。

prompt("enter number") +3;

你可能希望輸出一個(gè)數(shù)字,但它會(huì)返回一個(gè)字符串。

簡(jiǎn)而言之,你將不會(huì)得到預(yù)期的結(jié)果。

在編碼前進(jìn)行規(guī)劃,了解你所使用的編程語(yǔ)言的基礎(chǔ)知識(shí),可以幫助你處理邏輯錯(cuò)誤--前提是你要理解給你的程序要求。


編譯錯(cuò)誤

你的程序可能無(wú)法編譯,因?yàn)槟憧赡苓`反了編譯器希望你遵守的一些規(guī)則。

所以,你正在編寫的程序可能無(wú)法編譯。

例如,寫一個(gè)字符串時(shí)沒(méi)有使用通常的引號(hào),會(huì)導(dǎo)致編譯錯(cuò)誤,因?yàn)樽址仨毷褂靡?hào)。所以,代碼將無(wú)法編譯。

const name= Ayobami

這與語(yǔ)法錯(cuò)誤類似,你寫的代碼越多,你就越能更好地處理編譯錯(cuò)誤。

你可以通過(guò)經(jīng)常編譯或測(cè)試你的代碼來(lái)提高工作效率,減少這些錯(cuò)誤。


資源錯(cuò)誤

有時(shí),你的程序可能會(huì)超過(guò)其內(nèi)存限制或用盡可用資源。

這可能會(huì)導(dǎo)致你的應(yīng)用程序停止服務(wù)或出現(xiàn)故障。

下面的代碼是一個(gè)導(dǎo)致資源錯(cuò)誤的代碼的實(shí)際例子。


由于堆棧空間(即瀏覽器分配給函數(shù)調(diào)用鏈的內(nèi)存)被用完,函數(shù)崩潰或使瀏覽器變慢。

在這種情況下,該錯(cuò)誤是資源錯(cuò)誤,因?yàn)樗怯捎谟猛攴峙涞膬?nèi)存(資源)而發(fā)生的。


接口錯(cuò)誤

有時(shí)候,我們?cè)O(shè)計(jì)的程序API是按照一定的方式來(lái)使用的,但是用戶使用程序的方式不同,就會(huì)造成錯(cuò)誤。

這種錯(cuò)誤被稱為接口錯(cuò)誤。

例如,假設(shè)方法期望的是一個(gè)字符串,但我們卻用一個(gè)數(shù)字來(lái)代替調(diào)用它。如果程序的開發(fā)者沒(méi)有考慮到這種情況,就會(huì)導(dǎo)致錯(cuò)誤。

軟件中的大多數(shù)事物都遵循標(biāo)準(zhǔn)。如果你所定義的標(biāo)準(zhǔn)沒(méi)有被遵循,你需要為你的用戶提供錯(cuò)誤信息或指南,以幫助他們弄清楚他們正在錯(cuò)誤地使用應(yīng)用程序。

在這種情況下,記錄你的API可以提供很多幫助。



確保你的設(shè)置與工具相互匹配

有一個(gè)適合你的工具的設(shè)置是很重要的。

有時(shí),你的操作系統(tǒng)可能與你的應(yīng)用程序不兼容--也許是因?yàn)樗枰粋€(gè)較新版本的操作系統(tǒng),或者它需要某個(gè)軟件。

例如,如果電腦上缺少一些微軟的VC運(yùn)行時(shí),WampServer可能無(wú)法在Windows操作系統(tǒng)上正常運(yùn)行。

類似的事情也可能發(fā)生在Linux和macOS上。

你只需要確定你的設(shè)置是適合你的開發(fā)工作的。

對(duì)你的程序的功能要有確定性

"在數(shù)學(xué)、計(jì)算機(jī)科學(xué)和物理學(xué)中,確定性系統(tǒng)是指在系統(tǒng)未來(lái)狀態(tài)的發(fā)展中不涉及隨機(jī)性的系統(tǒng)。 因此,一個(gè)確定性模型將始終從一個(gè)給定的起始條件或初始狀態(tài)產(chǎn)生相同的輸出"。

那么,問(wèn)題是,我們?nèi)绾巫鲆粋€(gè)確定性的程序?

你必須確定你的程序中可以接受的數(shù)據(jù)類型,拒絕任何不符合的數(shù)據(jù)。

簡(jiǎn)而言之,你需要接受預(yù)期的數(shù)據(jù),拒絕不符合預(yù)期的數(shù)據(jù),或者將預(yù)期的數(shù)據(jù)通知用戶。


不懂就不要用

減少bug產(chǎn)生的最好方法之一是只使用你了解的方法、方法和類。

如果你必須使用任何你不理解的方法或樣式,在做之前先研究一下,確定對(duì)它有深入的理解。

每當(dāng)你利用你不了解的東西時(shí),很容易給你的應(yīng)用程序引入不必要的bug。


學(xué)會(huì)準(zhǔn)確打字

打字準(zhǔn)確被低估了,因?yàn)榫幊谈嗟氖撬伎级皇谴蜃?。但在打字時(shí)準(zhǔn)確無(wú)誤可能會(huì)幫助你減少一些語(yǔ)法錯(cuò)誤、類型錯(cuò)誤或錯(cuò)別字。

許多編程錯(cuò)誤都是由簡(jiǎn)單的打字錯(cuò)誤引起的。

準(zhǔn)確打字的能力能夠減少開發(fā)過(guò)程中的bug。

邊調(diào)試邊觀察其他開發(fā)者

另一個(gè)有趣的提高調(diào)試技能的方法是,當(dāng)其他開發(fā)者進(jìn)行調(diào)試時(shí),觀察他們,這有助于看到不同的調(diào)試方法。

總會(huì)有一些我們不知道或不曾使用的工具或方法來(lái)進(jìn)行調(diào)試,觀察別人的調(diào)試讓我們有機(jī)會(huì)發(fā)現(xiàn)那些我們可能不知道的工具或方法。

或者即使你知道那些不同的方法,你也可能不知道為什么或如何使用它們。

觀察別人可以影響我們重新審視這些方法和工具,最終可能提高我們的調(diào)試技能。



調(diào)試

調(diào)試是編程的核心,因?yàn)樗诰幋a時(shí)占用的時(shí)間最多。

調(diào)試主要涉及三個(gè)階段:

(1)發(fā)現(xiàn)錯(cuò)誤

(2)分析并理解錯(cuò)誤發(fā)生的原因

(3)修復(fù)或移除bug

發(fā)現(xiàn)錯(cuò)誤

發(fā)現(xiàn)bug首先需要了解你看到的錯(cuò)誤信息。

毋庸置疑,錯(cuò)誤信息就是一個(gè)bug的指南。

如果你理解了錯(cuò)誤信息,你就可以精確地追蹤到錯(cuò)誤的位置。

但是有些錯(cuò)誤可能會(huì)很繁瑣,因?yàn)樗鼈兛赡軟](méi)有明確的錯(cuò)誤信息和未知。

就像前面所說(shuō),邏輯/語(yǔ)義錯(cuò)誤只是得不到我們想要的結(jié)果。

為了找到bug,你需要:

明確你的期望;檢查你得到的結(jié)果;比較你的期望值和實(shí)際結(jié)果,看看差異;你可以使用調(diào)試器或其他有用的工具來(lái)快速找到這些錯(cuò)誤;然后,你可以根據(jù)你的假設(shè)檢查代碼的不同部分,并執(zhí)行試錯(cuò)來(lái)找到錯(cuò)誤。


分析并理解錯(cuò)誤發(fā)生的原因

找到一個(gè)bug之后,你需要弄清楚為什么代碼會(huì)有這樣的錯(cuò)誤。

這樣做可以幫助你建立一個(gè)高效的系統(tǒng)。

相反,許多開發(fā)人員只會(huì)在谷歌上搜索,并直接從StackOverflow得到的答案。

這在某些情況下是沒(méi)有問(wèn)題的,但最好是了解bug的原因和為什么解決方案有效。

理解bug的原因是修復(fù)bug或刪除bug道路上的重要一步。



修復(fù)或移除bug

在找到并了解了bug的原因后,我們就要修復(fù)這個(gè)bug。

有的時(shí)候,當(dāng)你了解了bug是什么之后,你就會(huì)毫無(wú)壓力的找到解決方案。

但是,有的時(shí)候,我們的理解無(wú)論怎么努力,都找不到任何解決方案。

與其浪費(fèi)時(shí)間,不如在谷歌上搜索錯(cuò)誤信息或任何你覺(jué)得合適的信息。

你也可以問(wèn)另一個(gè)人,因?yàn)槠渌送鶗?huì)有不同的看法。他們是中立的,這種中立性確實(shí)有助于修復(fù)一些bug。

所以,谷歌一下吧!

修復(fù)一個(gè)令人困擾的bug總是會(huì)帶來(lái)巨大的興奮。

但不要太過(guò)沉浸在興奮中,因?yàn)樾迯?fù)一個(gè)bug可能會(huì)引起另一個(gè)bug。

所以,首先要確保你沒(méi)有給程序引入另一個(gè)問(wèn)題。

這就是為什么自動(dòng)化測(cè)試很重要。


調(diào)試后

調(diào)試后需要在你已經(jīng)寫好的程序中預(yù)測(cè)有可能出現(xiàn)的bug。

它指的是你可能使用的所有機(jī)制,以確保未知的bug在危害系統(tǒng)或公司之前能夠很容易被追蹤或管理。

現(xiàn)在的問(wèn)題是你如何做到這一點(diǎn)?嗯,用錯(cuò)誤跟蹤系統(tǒng)。

你應(yīng)該在生產(chǎn)中擁有一個(gè)錯(cuò)誤跟蹤系統(tǒng),這樣你就可以很容易地發(fā)現(xiàn)錯(cuò)誤,因?yàn)樗鼈冊(cè)谀愕膽?yīng)用程序推送到生產(chǎn)后出現(xiàn)。

有很多錯(cuò)誤跟蹤器,它們只需要上網(wǎng)搜索一下就可以了。不過(guò)這里有幾個(gè)大家可以看看。

www.sentry.io

www.honeybadger.io

www.pypi.org

www.airbrake.io

www.logrocket.com

有這么多的錯(cuò)誤跟蹤器,你只需要選擇一個(gè)最適合你的即可。



結(jié)語(yǔ)

調(diào)試是所有軟件開發(fā)人員必須培養(yǎng)的一項(xiàng)重要技能。

它是編碼的核心,如果你做得好,它可以讓你成為一個(gè)更好的開發(fā)者。

要想成為優(yōu)秀的調(diào)試高手,你必須盡可能多地學(xué)習(xí)各種調(diào)試方法,很多方法我在本文中已經(jīng)討論過(guò)了。

現(xiàn)在是時(shí)候成為一名優(yōu)秀的軟件開發(fā)人員了,而調(diào)試可以在這條路上幫助你。

-----------------------------------

為了幫助大家,輕松,高效學(xué)習(xí)C語(yǔ)言/C++,給大家分享我收集的資源,從最零基礎(chǔ)開始的,幫助大家在學(xué)習(xí)C語(yǔ)言的道路上披荊斬棘!

微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地

C語(yǔ)言零基礎(chǔ)入門教程(83集全)

整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)最重要的是你可以在群里面交流提問(wèn)編程問(wèn)題哦!

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!大家也要把握住有限的時(shí)光,抓住成長(zhǎng)的每一次機(jī)會(huì)哦~

編程學(xué)習(xí)書籍分享:

粉絲編程交流:



【代碼調(diào)試】有哪些新手程序員不知道的小技巧?的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
西和县| 麟游县| 鹤壁市| 黄冈市| 大石桥市| 昭平县| 安达市| 廉江市| 龙江县| 兴城市| 开平市| 家居| 盐池县| 临洮县| 松阳县| 皮山县| 萨嘎县| 双桥区| 东明县| 衡山县| 平利县| 临汾市| 新平| 贵定县| 加查县| 新邵县| 花垣县| 连平县| 阿合奇县| 廊坊市| 井研县| 苏州市| 莱阳市| 简阳市| 荃湾区| 舟曲县| 瑞丽市| 安平县| 曲靖市| 青田县| 武胜县|