修復(fù)每個 bug 后都要問這 3 個問題

姓名:李興宇? 學(xué)號:16030110084

轉(zhuǎn)載自:http://home.bdqn.cn/thread-113125-1-1.html,有刪節(jié)。

【嵌牛導(dǎo)讀】:你是否曾經(jīng)修復(fù)了一個 bug ,隨后又發(fā)現(xiàn)了一個跟剛修復(fù) bug 有關(guān)的 bug ,又或是修復(fù) bug 的方式引起了另一個 bug ?

【嵌牛鼻子】:編程,修復(fù)bug,設(shè)計(jì)評審,代碼審查

【嵌牛提問】:我們該如何找到并修復(fù)所寫程序中出現(xiàn)的 bug?

【嵌牛正文】:

當(dāng)我修改 bug 時(shí),我會問自己三個問題,以確保我已經(jīng)仔細(xì)考慮了它的意義。每次你認(rèn)為發(fā)現(xiàn)并修改了一個 bug 時(shí),可以使用這些問題來提高生產(chǎn)力和代碼質(zhì)量。

這些問題背后的主要思想就是:每一個 bug 都是底層進(jìn)程的一個不良表現(xiàn)。你必須處理這些癥狀,但如果你僅僅是處理這些外在癥狀,你就會有永遠(yuǎn)解決不完的問題。你應(yīng)該找到產(chǎn)生 bug 的進(jìn)程,并且修復(fù)這個進(jìn)程。當(dāng)你確定究竟發(fā)生了什么和發(fā)生這些的原因時(shí),也許你就會明白產(chǎn)生 bug 的基礎(chǔ)進(jìn)程不是隨機(jī)的,而是可控的。

在問這三個問題前,你需要克服面對 bug 的這種天生的抗拒,仔細(xì)分析 bug 。查看代碼并解釋出錯的原因,從能觀察到的現(xiàn)象開始,向后分析,不斷地問為什么,直到你可以找到產(chǎn)生 bug 的模式。通常,你該跟同事一起做這件事, 因?yàn)榻忉屇阏J(rèn)為會發(fā)生的事情,將迫使你面對一些假設(shè)——這些程序是做什么的。

“它溢出了,因?yàn)橄聵?biāo)J越界了。”

“為什么?”

“J 是 10,但數(shù)組最大下標(biāo)為 9。”

“為什么?”

“J 是一個字符串長度,數(shù)組的起始下標(biāo)是 0,所以字符串長度為 1 的最后一個字符的索引是 0。”

找到 bug 后,查找其他意外情況。檢查程序出錯時(shí)主要的程序變量的值,是否可以解釋這些值。

“為什么 name 是 null?”

“為什么它總是輸出錯誤信息呢?”

記錄下你做了哪些操作,發(fā)生了哪些變化。你需要知道究竟發(fā)生了什么,這樣做就意味著你時(shí)刻有一把標(biāo)尺和歷史記錄。

當(dāng)完成這些步驟后,你可以準(zhǔn)備問第一個問題了。

1. 其他地方也會出現(xiàn)這個錯誤嗎?

查看代碼中使用相同模式的地方,系統(tǒng)地改變模式找出類似的 bug 。

“我還在其他什么地方使用長度作為下標(biāo)的嗎?”

“所有數(shù)組的起始下標(biāo)都一樣嗎?”

“對于一個長度為 0 的字符串會發(fā)生什么?”

試著描述這部分代碼中應(yīng)該是正確的,但是這些 bug 沒有遵循的規(guī)則。尋找這個不變量的過程將幫助你找到其他潛在的 bug 。

“起始偏移加上長度減去1就是結(jié)束的下標(biāo),除非數(shù)組長度為 0”。

對于你發(fā)現(xiàn)的每一個 bug ,你都可以解決一批 bug ,這是非常高效的。嘗試用概括性的語言描述這些 bug 也能提升你對程序的理解程度,并幫助您避免在程序中引入更多的 bug 。

2. 這個 bug 后面隱藏著什么其它的 bug ?

一旦你確定了如何修復(fù)這個 bug ,你就需要考慮一下修復(fù)后會發(fā)生什么。這個執(zhí)行失敗的語句后面的語句也可能有問題,但是程序還沒有執(zhí)行到此就不知道有沒有 bug ,或者有些代碼因?yàn)槟阈迯?fù) bug 而第一次出現(xiàn)在程序中,這些代碼也可能有問題。查看這些未執(zhí)行的語句,檢查代碼中的 bug 。

“下一條語句會正常運(yùn)行嗎?”

當(dāng)你在想程序的控制流的時(shí)候,可以弄清楚還有哪些地方程序沒有執(zhí)行到。

“是否有我從來沒有測試過的功能組合?”

在程序中插樁(instrumentation)并不會耗費(fèi)太多時(shí)間,在運(yùn)行程序各個部分的過程中就可以進(jìn)行檢查,但是你會驚訝地發(fā)現(xiàn)開發(fā)者測試過的代碼還有很多都不能正常運(yùn)行。

“我可以測試出所有的錯誤信息嗎?”

注意一個地方的改動可能會引起其他地方的 bug 。一些變量的局部改動可能會在執(zhí)行時(shí)違反后來的假設(shè)。

“如果僅是從 J 中減去 1,當(dāng)長度為 0 時(shí),后面的語句會操作數(shù)組中 -1 位置的元素。”

如果程序已經(jīng)做了大量改動,就要仔細(xì)考慮是否有必要增加另外一個補(bǔ)丁,或者是時(shí)候考慮重新設(shè)計(jì)和重新實(shí)現(xiàn)了。

3.我應(yīng)該做些什么防止類似 bug 的產(chǎn)生呢?

問問自己如何改變編程方法,根據(jù)定義避免 bug 的出現(xiàn),通過改變方法或者工具,經(jīng)常可以移除整個類的錯誤而不用一個一個的解決 bug 。

從“ bug 是何時(shí)引入的”這個問題開始:在程序開發(fā)生命周期的哪一個階段可以阻止 bug 的產(chǎn)生?

“設(shè)計(jì)是沒問題的;我在編程時(shí)引入了 bug 。”

仔細(xì)檢查 bug 產(chǎn)生的原因,考慮 bug 產(chǎn)生時(shí)正在運(yùn)行的進(jìn)程,并想想怎么改變它來阻止 bug 的產(chǎn)生。

“將偏移的數(shù)據(jù)類型和長度分離出來將會在編譯時(shí)捕獲這個錯誤。”

“每一個文本項(xiàng)可以用隱藏了下標(biāo)計(jì)算的宏輸出,然后我就可以一次找到它。”

不要滿足于膚淺的答案。假如你對于一個 bug 的解釋是,“我記不清了”,那還怎么改進(jìn)這個過程,讓你不再需要記住它?你可以更改編程語言,使被忽略的細(xì)節(jié)可以完全隱藏,否則你遺漏的部分會被檢測到從而導(dǎo)致編譯問題。對這個問題域,你可能使用了預(yù)處理器或者智能的編輯器,有默認(rèn)值,錯誤檢查,智能提示和快速文檔。這個 bug 可能是編程團(tuán)隊(duì)溝通的問題,亦或是需要討論的設(shè)計(jì)沖突。

思考發(fā)現(xiàn) bug 的方式,并問問自己如何能更早發(fā)現(xiàn)它。測試怎么可以更嚴(yán)密一些?能否進(jìn)行自動化測試?是否要添加代碼實(shí)時(shí)檢測功能,以便可以及時(shí)捕獲錯誤信息?

“我應(yīng)該在我的測試單元中嘗試長度為 0 的數(shù)組”。

“我應(yīng)該進(jìn)行下標(biāo)檢查,提前捕獲不符合的下標(biāo)”。

有必要創(chuàng)建一些系統(tǒng)方法和自動化工具,用于編譯、構(gòu)建和測試,它們可以減少長時(shí)間的調(diào)試和查明具體事實(shí)的過程。

這個技巧的應(yīng)用

養(yǎng)成這樣一種習(xí)慣:每當(dāng)你發(fā)現(xiàn)一個 bug 時(shí),問自己這三個問題,甚至你不必等到有 bug 時(shí)才使用這三個問題。

在設(shè)計(jì)和審查過程中,你都可以用這三個問題來處理你得到的每一條意見。審閱意見是潛在的溝通過程的結(jié)果,使你可以有所改進(jìn)。如果你認(rèn)為讀者評論是錯誤的,比如,你可能會問是什么使你的文章沒被理解,如何更好地與審稿人溝通。

設(shè)計(jì)評審和代碼審查是找出 bug 的強(qiáng)有力手段,你可以對審查過程出現(xiàn)的每一個缺陷都提出三個問題。如果審查徹底,前兩個問題不會出現(xiàn)太多新的 bug ,但第三個問題可以幫助你找到方法,用來避免未來可能會出現(xiàn)的 bug 。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內(nèi)容

  • 這些問題背后的主要思想就是:每一個bug都是底層進(jìn)程的一個不良表現(xiàn)。你必須處理這些癥狀,但如果你僅僅是處理這些外在...
    OSET我要編程閱讀 644評論 0 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,643評論 25 708
  • 雷豆豆是我見過最標(biāo)致的女子娃,那眼睛,那鼻子,那嘴,叫人就看不夠。尤其是給人冷的感覺,那種冰雪少女,孤傲自賞,...
    雷一凡閱讀 808評論 0 0
  • 我現(xiàn)在大二,沒有過多的感情經(jīng)歷,算起來只有兩次,一次是我初二的時(shí)候,一次是我高一的時(shí)候,之后再也沒有。 總的來說,...
    愛檸檬的陳姑娘閱讀 1,502評論 6 3
  • 接觸時(shí)間管理是在去年底,自從生了寶寶之后都是白天工作,晚上回家?guī)Ш⒆樱刻煜萑霟o何止的忙碌中。正如老師所說,人越忙...
    Lily淳兒閱讀 267評論 0 0