漫談程式設計師系列:無BUG不生活

安曉輝的部落格發表於2015-01-20

我決定談一談世界上最著名的蟲子:BUG !

BUG 困擾了一代又代的程式設計師,不論是傑出的電腦科學家,還是像 Linus Torvalds(Linux核心創始人) 、Bill Joy(傳說三天寫出BSD的前身,vi和csh的作者)等神一樣的傳說,抑或你我芸芸程式猿,都是 BUG 騷擾的物件。 BUG 是絕對狂熱的好戰分子,具有永不停歇的戰鬥慾望,它潛伏在程式設計師的周圍,一雙小眼賊亮賊亮,在你百密一疏時出其不意一擊奏效。而無論你是鋼筋鐵骨,還是羊脂玉體,只要被這隻蟲子襲擊(看過《木乃伊》的話,對聖甲蟲一定印象深刻),就得褪上三層皮,更有甚者,很可能鋃鐺入獄、命喪黃泉或者煙消玉損。《盤點史上最具毀滅性的的Bug》可供參考。

軟體界致命的BUG事件

其實,BUG造成的悲劇天天都在上演,這裡我們先舉幾個比較著名的例子。

許霆案

2006 年 4 月 21 日晚 10 時,許霆來到天河區黃埔大道某銀行的 ATM 取款機取款。結果取出 1000 元后,他驚訝地發現銀行卡賬戶裡只被扣了 1 元,狂喜之下,許霆連續取款 5.4 萬元。當晚,許霆回到住處,將此事告訴了同伴郭安山。兩人隨即再次前往提款,之後反覆操作多次。後經警方查實,許霆先後取款 171 筆,合計 17.5 萬元;郭安山則取款 1.8 萬元。事後,二人各攜贓款潛逃。

……

從軟體的角度來講,其實是 ATM 提款機出現了一個 BUG ,許霆作為測試人員發現了這個 BUG ,然後找來朋友做了多次復現操作。

這是一個軟體 BUG 引發的悲劇,最終上升到了犯罪的高度。

2007 年底,經過一審,廣州市中級人民法院判處許霆“無期徒刑,剝奪政治權利終身,並處沒收全部個人財產”。

2008 年 1 月,廣東省高院裁定許霆案發回重審。經過再審開庭,法院做出了有期徒刑五年的判決。

……

作為程式設計師,我認為開發 ATM 機的公司應當負有責任,他們應當賠償客戶(即銀行)的損失,是他們的軟體 BUG 導致了這個案件。但在銀行這種強力機構面前,個人的聲音微不足道,很難把兩者放在同一個天平上來考量。這中間到底有著怎樣的曲折,時過境遷,我們已無法考量。但是,作為程式猿,我們還是得引起警惕啊,很多時候, BUG 會帶來直接的經濟損失和嚴重的法律後果。雖然你可以辯稱技術無罪,但子不殺伯仁,伯仁因你而死。

錘子手機預約數鬧劇

2014 年國慶假期期間,錘子手機 4G 版現身天貓商城頁面顯示該機預計將在 10 月 18 日正式開賣,售價為 3500 元。據說備貨量為 10000 臺。據說很快天貓商城頁面顯示預約人數超過 8 萬。

後來,有網友爆料稱從頁面原始碼中發現 4G 版錘子手機的預約人數有水分,頁面顯示的數字是實際預約人數的三倍,從而再度把錘子手機推到了風口浪尖上。

後來,天貓對這一事件做出了正面回應。天貓表示,截至 10 月 7 日,錘子手機 4G 版的預約使用者數為 62682 人,但在 10 月 8 日,系統呼叫一個資料埠時,意外將前端該頁面動態資料顯示“清零”。

為了儘可能讓預約資料還原真實,天貓決定將 10 月 8 日起的新預約數,做了“乘以三”的處理,以便後期預約數能快速接近真實資料……

……

注意我標紅的文字,如果天貓的回應符合實際情況,那麼,其實,這是一個 BUG !

真不夠老羅忙活的啊。老羅10月19日在微博上正式回應:預定資料造假的事,跟我們沒有一絲一毫的關係,我們在這件事中扮演的唯一角色,就是躺槍。

這是要上演羅生門的節奏嗎?親們。

對於此事,我不能不感慨:不怕神一樣的對手,就怕豬一樣的隊友……不怕豬一樣的隊友,就怕神一樣的網友——據說這個造假的BUG是因為某個測試人員發現預約數總是3的倍數而發現的。

蘋果 iOS 8.0.1 更新撤銷

蘋果,神壇上的蘋果,以極致使用者體驗而載譽江湖的蘋果,也因為 BUG 而被釘在了恥辱柱上:

(2014年)9月25日訊息:蘋果在今天早些時候釋出了 iOS8.0.1 更新,目的是決解當前版本中的多處 Bug ,但是沒想到的是更新補丁帶來了更多的 Bug ,最終蘋果撤回了該次升級。

據瞭解,本次受到影響的主要是 iPhone 6 、 iPhone 6 Plus 這兩款最新的裝置,後果是隻能接受行動網路無訊號,而且 TouchID 也不能用了。因此建議還沒有升級的使用者還是不要升級了,而已經悲劇了的使用者目前只能等待蘋果推出修復補丁。

……

有人說這是賈伯斯不在的後遺症……真不知道這幫人為什麼總是把賈伯斯拿出來說事兒!其實,這就是一次軟體 BUG ,從程式猿的角度來看,這他娘再正常不過了,和賈伯斯有一毛錢關係嗎!

再說了,這事兒又不是單單蘋果一家才有,你看人家微軟,根本都不當一回事兒,補丁一個一個一個一個又一個的發,堵的就是漏洞,改的就是 BUG ,這都是那幫程式猿惹的禍,與天上的月亮沒有關係。

心臟滴血漏洞

2014年4月9日,Heartbleed(意為“心臟出血”)的重大安全漏洞被曝光,一位安全行業人士在知乎上透露,他在某著名電商網站上用這個漏洞嘗試讀取資料,在讀取200次後,獲得了40多個使用者名稱、7個密碼,用這些密碼,他成功地登入了該網站。

……

Heartbleed 漏洞,這項嚴重缺陷(CVE-2014-0160)的產生是由於未能在 memcpy() 呼叫受害使用者輸入內容作為長度引數之前正確進行邊界檢查。攻擊者可以追蹤 OpenSSL 所分配的 64KB 快取、將超出必要範圍的位元組資訊複製到快取當中再返回快取內容,這樣一來受害者的記憶體內容就會以每次 64KB 的速度進行洩露。

OpenSSL ,著名吧,開源吧,安全吧,它支撐的網際網路站點就像天上的星星一樣,數都數不過來。就這麼一個知名、開源、強大的密碼庫,一樣有 Bug 。

BUG 無處不在!

BUG 對程式猿的追逐,對軟體的痴迷,比現在的死忠粉還要厲害,那簡直是上窮碧落下黃泉,不論你在哪裡,上天入地,我都會與你在一起,不離、亦不棄。

無BUG不生活

計算機先驅 Maurice Wikes 回憶起 1949 年他在英國劍橋工作的情形,在拖著打孔紙帶上樓給雛形計算機 EDASC 裝載程式時,他看到了自己的未來:

我強烈的意識到,生命中剩下的好日子,都將耗費在給自己的程式找錯誤上頭。

Bug的定義

Bug一詞的英文原意是“臭蟲”或“蟲子”。但對程式設計師來講,Bug意味著錯誤、缺陷、問題、漏洞、未按需求實現、不符合需求預期或延伸等等等……那麼,Bug究竟是什麼呢?

我媳婦是搞測試的,軟體測試這塊最著名的一本書就叫做《Software Testing(軟體測試)》,它裡面是這麼描述BUG的:

The software doesn’t do something that the product specification says it should do.

The software does something that the product specification says it shouldn’t do.

The software does something that the product specification doesn’t mention.

The software doesn’t do something that the product specification doesn’t mention but should.

The software is difficult to understand, hard to use, slow, or in the software tester’s eyes will be viewed by the end user as just plain not right.

作為開發人員,當然要看得懂E文了……

其實還有一個粗暴點兒的說法:BUG就是錯誤。

Bug是怎麼來的

《聖經》中有“義人”這個說法,我們有“人無完人,金無足赤”的說法……

人是媽媽生出來的(女媧造人時除外)——你看我總是加各種說明以便堵住漏洞,這樣寫文章真是很累……這實在是和我的開發習慣有關:我總是習慣防禦性程式設計,預先考慮各種錯誤,在編碼期間就努力消除它們發生的條件……

我們說,人是人他媽生的,妖是妖他媽生的,而軟體是程式設計師生的。

爸爸媽媽在備孕時,很多爸爸會戒菸戒酒戒加班,所謂封山育林也。媽媽會補葉酸測排卵期計算最佳受孕時間……總之一句話,優生優育。可是,孩子出生後依然會有毛病,隨著孩子長大,各種毛病都會顯現出來。有的孩子有先天缺陷,比如原發性高血壓、先天性心臟病、兔脣、痴呆、智障……有的孩子長著長著有毛病了,近視、斜視、小兒麻痺、跛腳、自閉症……作為父母,這都是我們很難接受的事實,可是必須面對和接受。

軟體是程式設計師的孩子,在生它之前,你可曾封山育林、可曾熟悉自己的生理週期?哇哈哈哈哈,太扯淡了不是!包不同(《天龍八部》中慕容復四大家臣之一,非常有趣)搖搖頭說,非也非也。然也!開發軟體其實也要經歷這些過程,更重要的是,我們一定要意識到:

程式設計師在生產軟體,也在生產BUG!

再牛逼的程式設計師,寫出來的軟體也有BUG。BUG就是軟體與生俱來、不可脫逃的好基友,就在那場說走就走的旅行的一開始,它們就情根深種難分難捨了……

So,Bug是程式設計師寫出來的……

不管你願不願意承認,事實就是這麼令人沮喪。連Maurice Wikes都承認了這一點,你就別倔犟了吧親。

程式設計師對Bug的態度

每個程式設計師都是不同的……

絕對不可能……

測試MM對阿猿說發現了一個Bug。

阿猿矢口否認:不可能,絕對不可能!

MM:真的有Bug,你過來看一下!

阿猿:我都不用看,在我這兒好好兒的。

MM:你來看一下嘛……

阿猿:看什麼看,我都測過的,絕對沒問題。

伴隨著凳子響,阿猿不情願的起身,臉上不耐煩的表情,心理卻嘀咕著怎麼回事兒呢這是……

過了一陣兒,阿猿不好意思的聲音響起:真沒想到是這兒的問題……你怎麼測的……一般使用者都不會這麼用的……

耶,你找到Bug啦

測試MM嫋嫋婷婷地走到阿猿跟前,小聲說:你來我這裡看個現象。

阿猿:好,馬上來。

阿猿立馬起身跟MM走了,過了一會兒,響起阿猿的聲音:哇,你太厲害了,這種問題都被你發現了,我測了很長時間都沒測出來,太好啦!

然後大家看見阿猿腳步輕快地走回工位,邊走邊頻頻點頭,兩隻手像得了帕金森一樣來回劃拉,嘴裡神神叨叨的唸唸有詞……

結果到工位上時,阿猿一拍額頭,小聲說:知道啦,原來是這樣。

過了兩分鐘,阿猿找MM說:問題解決了,是這麼這麼回事兒……

MM一臉崇拜的看著阿猿:你太厲害了,這麼快就解決了!然後小聲說:大家都像你就好啦……

阿猿說:有什麼問題立即叫我看。

我很忙,沒空管Bug

測試MM想在jira上提個Bug,先在QQ上對阿猿說:有個Bug,你過來看下?

阿猿:忙著呢,焦頭爛額的。

MM:一分鐘都用不了,你來看下吧。

阿猿:思路一打斷就不好恢復了,等會兒!

MM:你不看我提到jira上了啊。

阿猿:隨便,你不就是愛提Bug嘛。

……

One day,團隊review Bug,TL問阿猿:這個Bug怎麼回事兒?

阿猿撓撓頭:我也不知道啊。轉身問MM:咋回事兒,提Bug也不通知我一聲兒,我都不知道怎麼回事兒。

MM:當時給你說你沒時間看,後來……

阿猿:行啦行啦,我待會就看,以後提Bug要通知我一聲。

MM無話可說,只能用滿含幽怨的眼睛鎖定阿猿,直到阿猿別過頭去……

都是需求的錯?

阿猿收到了來自jira的郵件,他被告知有一個Major級的Bug,看了之後,黎叔很生氣,後果很嚴重——阿猿轉身就喊:MM,怎麼回事啊你,給我提了個Major級的Bug,明明是需求問題啊!

MM趕緊過來確認:哪個Bug?

阿猿氣呼呼地一指電腦螢幕:就這個,需求問題,你仔細看看,別老給我整這種Bug。

MM:我們們找需求文件看看……

……

MM:你看,需求是這樣描述的……

阿猿:需求描述有問題,實現起來太複雜了,也沒意義,誰會這麼用啊。

MM:我是按需求寫的用例……要不我們們和產品經理一起討論一下?

阿猿:算啦算啦,麻煩,先不管啦,到時再說!

……

還沒好,怎麼會!

begin:

MM:阿猿,你提交的版本有問題,Bug還沒好……

阿猿滿臉自信:怎麼會,我都測過了,各種情況都考慮到了。

MM:真的,不信你來看。

阿猿:看就看,你告訴我你怎麼測的……

MM:這樣進來,這點一下,馬上再點一下,趁那個按鈕還沒刷出來,再點,然後就報“XXX已停止執行”。

阿猿:使用者不可能像你這麼用!

MM:可能。

阿猿:不可能,我從來沒這麼用過。

MM:我先給你Reopen,你再改改吧。

阿猿:不要Reopen,根本沒問題。

MM:我都遇到了……

阿猿:算啦,你別Reopen,我先改改,馬上給你一個新的版本。

過了幾分鐘,阿猿提交了版本。

goto begin;

測試環境沒問題!

經過多次延期,經過幾個晚上的集體猛搞,軟體終於釋出了,大家都送了口氣兒,第二天都休假去了,只有阿猿留了下來。

剛上班,阿猿就被氣急敗壞的老闆叫到辦公室:趕緊把版本回退回去,攤上大Bug啦!

阿猿一臉無辜:測試都沒問題啊,什麼Bug?

老闆:兩個小時,升級了800多個使用者,有40多個電腦當機的!

阿猿:不可能啊,測試環境都測過了……

老闆:趕緊停止升級,下線版本!

老闆還說:一切皆有可能,一定不能忘記李寧。你們就是太大意了,沒有好好測,都不當回事兒。

阿猿:其實大家也是蠻拼的,都搞了好幾個通宵啦……

老闆:趕緊下線,拼不拼不重要,沒問題是目標。

阿猿:要不我們聯絡幾個使用者,升級測試一下,重現了就好定位問題!

老闆:哪個客戶願意當小白鼠!趕緊下線!你們自己想辦法,多用點心,別不當回事兒,我們都被告到消協啦,這樣下去早晚玩兒死。

阿猿:測試環境真測不出來……

阿猿面對老闆噴火的雙眼,心有不甘轉身出了辦公室,嘴裡唸叨著:為毛生產環境總是出問題呢……

怎樣才能告別Bug

怎樣才能告別Bug?

有人說提高程式碼質量,參見《程式碼大全》。

有人說提高自我修養,參見《程式設計師修煉之道:從小工到專家》。

有人說提高效率,參見《高效程式設計師的45個習慣》。

有人說……

其實,這個問題早在唐代就被白居易蓋棺定論了。《長恨歌》大家都知道吧,其實它描述的就是唐明皇的Bug引起的故事。

唐玄宗是一國之君,前幾年乾得很不錯,軟體執行正常,開創了“開元盛世”,大家都以為這款軟體很不錯,不會出現Bug,可是後來外部環境變化,玄宗的愛妃死了,他心傷之際被兒子的媳婦楊玉環所驚豔,終於偏離了正常執行軌跡,造成了長達八年的“安史之亂”。你看,這就是大Bug的大影響!

優秀的軟體也會隨著外部環境的變換而老化,最終不能滿足使用者需求或者無法按預期工作。

唐玄宗滿足的是《Software Testing》中的這一條:

The software does something that the product specification says it shouldn’t do.

在皇帝的說明書裡,愛上兒子老婆繼而扒灰最終導致王朝更替這種事情是絕對不被允許的。偏偏唐明皇這麼幹了……這是他在經歷了長達數年的執行期之後暴露出來的大Bug!有些Bug就是醬紫的,要執行N久才會出現。

根據偉大詩人白居易的描述,其實,唐明皇的遭遇也是可以理解的,因為Bug無處不在又深情款款。它對唐明皇這款軟體許下了海枯石爛的誓言:

在天願作比翼鳥,在地願為連理枝。 天長地久有時盡,此恨綿綿無絕期。

如此深情,你怎麼能拒絕呢,怕是隻能溶化了吧。

相關文章