天天看點

程式中的Bug是如何産生的?

  ★

  Bug,總是令人讨厭的東西。那Bug是如何産生的呢?作為進階軟體架構師和軟體測試工程師的易哥将在這篇文章中解答這個問題。

  ”

  說起Bug,大家都認為它是被“寫”出來的,即主要在開發階段産生。

  但其實Bug的産生最有可能是在需求階段(意外吧!這是有統計資料證明的),且在需求階段産生的Bug影響最大。當然,在設計、開發、使用階段也會出現Bug。

  接下來我們詳細了解下Bug的相關知識。

  1. 什麼是Bug

  Bug,指軟體中的缺陷,它可能會引發軟體失效。

  關于軟體中的缺陷被稱為Bug,即蟲子,這是有一段故事的。在早期的計算機中,常采用大量的繼電器,用繼電器的開合來表示二進制。馬克二型計算機就是這樣的。1945年9月9日,下午三點,馬克二型計算機無法正常工作了,技術人員試了很多辦法,最後定位到第70号繼電器出錯。負責人哈珀觀察這個出錯的繼電器,發現一隻飛蛾躺在中間,已經被繼電器打死。她小心地用攝子将蛾子夾出來,用透明膠布帖到“事件記錄本”中,并注明“第一個發現蟲子的執行個體。”自此之後,引發軟體失效的缺陷,便被稱為Bug。

  2. 能做出完全沒有Bug的軟體麼?

  很抱歉,答案是不能。

  任何軟體都有缺陷,這是軟體測試領域的一個真理。

  在軟體品質标準中,軟體的可靠度用R(t)表示,它表示在指定的運作條件下,軟體在規定的時間内不發生故障的機率。

  一定有R(0)=1,即軟體在初始運作時刻一定是無故障的,否則說明軟體還沒有開發完成,尚不能運作。一定有R(+∞)=0即任何軟體都是有缺陷的,在無限長時間運作後一定會發生故障。

  3. 在故障原因上,軟體有何特點

  與我們常見的橋梁、樓宇、手機、文具等各類實體産品不同,軟體有一個非常重要的特點:它不會因為複制、運作而發生衰退。

  畢竟軟體不會生鏽、老化、分解等。這算是軟體的一大優點。

  是以理論上,我們可以通過不斷的投入測試成本來降低軟體發生故障的機率。但即便如此,軟體的故障機率會趨向于0,而永遠不會等于0。

  況且,在現實中“不計成本”這種事情是不會發生的。

  現實中的軟體往往存在大量缺陷,其一大原因是因為軟體的複雜性。具體可能産生bug的因素會在下節講。

  軟體測試十分必要。但是要記住一點,軟體測試不是為了清除軟體中的bug,而是減少軟體中的bug。

  4. Bug是如何産生的?

  這就回到了我們問題的重點,Bug如何産生。

  接下來我們按照軟體的生命周期順序一一介紹。

  A: 需求錯誤--未知需求

  問:這個軟體為什麼不能上傳Excel導入資料?

  愣:開發前你有提到過說要用Excel導入資料麼?

  B:需求錯誤--未了解需求

  問:這個軟體為什麼按鈕文字上沒有拼音?小朋友不認識字啊?

  愣:啥?小朋友?啥?拼音?

  C:設計錯誤--模型選擇錯誤

  問:這兩個操作能不能一起執行啊?

  愣:壞了,選的是責任鍊模式,不支援并行啊!

  D:設計錯誤--模式選擇錯誤

  問:再接一個輸入源好不好?

  愣:沒采用擴充卡模式,不好改啊!咋辦?

  F:設計錯誤--架構選擇錯誤

  問:好,那我們去手機端看一下頁面。

  愣:完了,選的架構不支援動态适配。還看啥啊,

二手手機交易平台

界面一定亂了!

  G:設計錯誤--并發不達标

  問:為什麼人少的時候可以,人一多就會停止服務?

  愣:壞了,當時沒考慮這個問題。

  H:設計錯誤--相容性不達标

  問:我們更新了一下别的應用,它就不工作了。

  愣:壞了,寫死綁定那個應用了,那個應用不能更新啊。

  I:設計錯誤--容量不達标

  問:資料一多,就存不進去了。

  愣:壞了,設計的容量出問題了。

  J:開發錯誤--外部依賴缺陷

  問:這個地方報錯了。

  愣:媽蛋!引用的開源包有問題!

  K: 開發錯誤--死循環

  問:點一下就當機了。

  愣:我看看,你這麼輸入的啊……那,壞了,觸發死循環了。

  L: 開發錯誤--越界

  問:數個空格進去,就報錯了。

  愣:壞了,空格被忽略了,但是計數器沒調整,肯定越界了。

  M:開發錯誤--異常未捕獲

  問:沒網絡的時候,點一下就當機。

  愣:壞了,有異常抛到了最上層。

  N:開發錯誤--IO未關閉

  問:重新開機完機器就正常了,過幾天就沒響應了。

  愣:搞半天,每次操作都忘關IO了,導緻socket被耗盡。

  O:開發錯誤--空指針異常

  問:突然就死掉了。

  愣:原來是,檔案沒找到,報了NullPoniterException。

  P:開發錯誤--變量混亂

  問:輸出的結果,驢唇不對馬嘴。

  愣:我去,變量wife和wifi用混了。

  Q:開發錯誤--手誤

  問:為什麼顯示“下樓好”?。

  愣: 奧,輸錯了,應該是“下午好”。

  R: 開發錯誤--日志未關閉

  問:硬碟被打滿了!

  愣:是不是正式版忘了關調試日志?

  S: 開發錯誤--記憶體未初始化

  問:第一遍運作正常,第二遍就有亂碼。

  愣:難不成,變量沒初始化?

  T: 開發錯誤--類型轉換異常

  問:全數字的身份證号是沒問題的,一輸入後面帶字母X的就報錯。

  愣:壞了,把身份證号當數字處理了。

  U: 開發錯誤--顔色設定錯誤

  問:為啥他登陸後名字是綠色的?

  愣:奧,錯了,應該是背景是綠色的,弄混了!

  V: 開發錯誤--忘記屏蔽

  問:為啥她能看到我的密碼?

  愣:我去,大問題!忘了脫密了!

  W: 使用錯誤--忘記插線

  問:為啥滑鼠無法操作?

  愣:我去,你滑鼠線都沒插。

  X: 使用錯誤--輸入錯誤

  問:為什麼總是說資訊輸入錯誤?

  愣:你為什麼在“姓名”欄位寫個“男”

  Y: 使用錯誤--了解功能錯誤

  問:為啥你的軟體不能顯示附近的人?

  愣:這是外賣軟體……約人的活真幹不了。

  是以要想保證軟體的正确,必須保證需求、規劃、開發、使用各個環節都正确。這,太難了。

  可見,軟體開發者不容易。

  寫一個成功軟體的道路沒幾條,而寫一個失敗軟體的道路數不清!

  要不是英文字母不夠了,還能列舉下去!

  Z: 使用錯誤--操作失誤

  問:為什麼不能點贊?

  愣:你點了麼?再點一下試試!

  往期精彩文章:

  高效日志系統搭建秘技!架構師必讀程式員最有成就感的那一刻是什麼時候?遠端過程調用RPC的實作原理:動态代理

  歡迎關注我們,不錯過軟體架構和程式設計方面的幹貨知識。

繼續閱讀