漫談程序員系列:無BUG不生活
我決定談一談世界上最著名的蟲子: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 萬元。事后,二人各攜贓款潛逃。
……
</blockquote>從軟件的角度來講,其實是 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 也不能用了。因此建議還沒有升級的用戶還是不要升級了,而已經悲劇了的用戶目前只能等待蘋果推出修復補丁。
……
</blockquote>有人說這是喬布斯不在的后遺癥……真不知道這幫人為什么總是把喬布斯拿出來說事兒!其實,這就是一次軟件 BUG ,從程序猿的角度來看,這他娘再正常不過了,和喬布斯有一毛錢關系嗎!
再說了,這事兒又不是單單蘋果一家才有,你看人家微軟,根本都不當一回事兒,補丁一個一個一個一個又一個的發,堵的就是漏洞,改的就是 BUG ,這都是那幫程序猿惹的禍,與天上的月亮沒有關系。
心臟滴血漏洞
2014年4月9日,Heartbleed(意為“心臟出血”)的重大安全漏洞被曝光,一位安全行業人士在知乎上透露,他在某著名電商網站上用這個漏洞嘗試讀取數據,在讀取200次后,獲得了40多個用戶名、7個密碼,用這些密碼,他成功地登錄了該網站。
……
Heartbleed 漏洞,這項嚴重缺陷(CVE-2014-0160)的產生是由于未能在 memcpy() 調用受害用戶輸入內容作為長度參數之前正確進行邊界檢查。攻擊者可以追蹤 OpenSSL 所分配的 64KB 緩存、將超出必要范圍的字節信息復制到緩存當中再返回緩存內容,這樣一來受害者的內存內容就會以每次 64KB 的速度進行泄露。
</blockquote>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.
</blockquote>作為開發人員,當然要看得懂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.
</blockquote>在皇帝的說明書里,愛上兒子老婆繼而扒灰最終導致王朝更替這種事情是絕對不被允許的。偏偏唐明皇這么干了……這是他在經歷了長達數年的運行期之后暴露出來的大Bug!有些Bug就是醬紫的,要運行N久才會出現。
根據偉大詩人白居易的描述,其實,唐明皇的遭遇也是可以理解的,因為Bug無處不在又深情款款。它對唐明皇這款軟件許下了海枯石爛的誓言:
在天愿作比翼鳥,在地愿為連理枝。 天長地久有時盡,此恨綿綿無絕期。
</blockquote>如此深情,你怎么能拒絕呢,怕是只能溶化了吧。
來源:安曉輝的博客本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!