bug已經(jīng)成為程序員工作中的一部分穴墅,作為從事嵌入式軟件開發(fā)已有六年的我,經(jīng)手的bug也不少了斋枢。先說說自己對于bug的心態(tài)變化吧帘靡,剛開始工作的時候,自己還是很喜歡bug的杏慰。那時测柠,自己是負責維護別人的代碼,如果發(fā)現(xiàn)了bug缘滥,說明自己工作有成績轰胁;后來,自己開始碼代碼朝扼,這個時候測試人員告訴我有bug赃阀,自己就有些心煩,尤其是當領導知道了這個bug以后擎颖,就會感到很大壓力榛斯;再后來,經(jīng)手的bug變多了搂捧,也變得淡定多了驮俗,而且還逐漸建立自己分析bug的工具箱和分析流程;現(xiàn)在允跑,經(jīng)過幾年的工作王凑,積累了一些經(jīng)驗,開始在設計和編碼階段聋丝,就盡量考慮周全索烹,以減少bug的產(chǎn)生。
下面就說說自己分析bug的一些心得:
1. 建立一套分析bug用的工具箱
正所謂弱睦,“工欲善其事百姓,必先利其器”,分析bug有一套得心應手的工具很重要况木。我的工具箱里就有:網(wǎng)絡抓包工具(用來分析網(wǎng)絡相關問題的)垒拢,讀取、解析日志的工具火惊、獲取設備運行狀態(tài)的工具子库,另外,還配有解壓工具矗晃、UltraEditor等等小程序的安裝程序(因為有些測試用的電腦上沒有安裝這些軟件)仑嗅。我將這些工具放到一個文件中,并將其放在U盤中张症,一旦測試人員告知有bug存在仓技,我就揣著U盤過去。這個“竅門”的來歷緣于自己一段痛苦的經(jīng)歷俗他,自己有段時間膝蓋疼脖捻,特別討厭爬樓梯,但是當時測試人員在開發(fā)人員的樓下兆衅,因此地沮,常因為測試人員的電腦上沒有自己想要的工具嗜浮,自己不得已只能爬上爬下地用U盤拷貝工具。痛苦之下摩疑,就想出了上面的那個辦法危融,呵呵。
2. 建立一套分析bug的流程或步驟
bug產(chǎn)生后雷袋,測試人員告訴開發(fā)人員的都是現(xiàn)象吉殃,而開發(fā)人員要根據(jù)測試人員的現(xiàn)象描述去推測。我同事說楷怒,查bug就像是在“查案”蛋勺,一層一層抽絲剝繭地在分析“案情”,不能放過任何蛛絲馬跡鸠删。分析bug有的時候就好比在黑暗中行走一樣抱完,常常覺得完全無從下手。經(jīng)過幾次痛苦經(jīng)歷后刃泡,我逐漸建立一套分析bug的流程或步驟:
1. 獲取當前測試的版本信息乾蛤;讓測試人員通過版本檢測工具讀取當前測試的版本信息,然后截圖捅僵。此舉家卖,可立即確定是否由于版本不正確導致的問題;
2. 讀取設備的運行日志庙楚;讓測試人員讀取設備的操作日志和運行日志上荡,交由開發(fā)人員解析;
3. 通過設備運行監(jiān)控工具馒闷,獲取設備當前的運行狀態(tài)酪捡,然后截圖;
4. 通過抓包工具纳账,抓包并且將結(jié)果交由開發(fā)人員解析逛薇;(可選,只針對網(wǎng)絡相關的問題)
5. 將獲得的所有信息疏虫,放到一個文件夾中永罚,以bug現(xiàn)象和測試人員姓名命名該文件夾;
這樣的步驟或流程一個最大的好處就是卧秘,不會遺漏可用的信息呢袱。因此,除非是那種一眼就能定位原因的bug以外翅敌,對于所有bug我基本上都會按照上述去做的羞福,其實其目的也很簡單,在還不清楚問題具體情況的狀況下蚯涮,先盡可能地獲得系統(tǒng)的可以獲得的所有信息治专,這些信息會為后續(xù)分析提供了可參考的信息卖陵。這樣做只是麻煩一些,但是絕對沒有壞處张峰。曾經(jīng)就有幾個很難復現(xiàn)的bug泪蔫,就是由于缺少對應的日志信息,給我們分析問題原因帶來了極大的麻煩挟炬。當時,對于沒有及時獲取更多的信息嗦哆,非常之懊悔谤祖。
將所有信息都放到一個文件夾中,是一個非常好的習慣老速,這樣所有與之相關的信息就非常好找粥喜,更不會出現(xiàn)混亂。另外橘券,上述步驟中额湘,我通常都會要截圖,一方面是自己不太相信測試人員的口述旁舰,另外一方面留下足夠的證據(jù)锋华,因為有的時候真是口說無憑啊。
3. 針對不同類型的bug箭窜,適當區(qū)別對待
開發(fā)人員有時候可能同時在分析好幾個bug毯焕,這就要對這些bug分輕重緩急了。我通常將bug按照復現(xiàn)難度分優(yōu)先級磺樱。越容易復現(xiàn)的bug優(yōu)先級越低纳猫,即使該bug的嚴重等級很高。因為能復現(xiàn)的bug竹捉,只要花時間總能夠分析出原因的芜辕,但是很難復現(xiàn)的bug就難說了。其實块差,bug分析和解決有50%取決于該bug能否復現(xiàn)侵续。因此,每當測試人員告訴一個新bug時憨闰,我收集了所有信息询兴,并且分析以后有個初步結(jié)論以后,我才會讓測試人員破壞環(huán)境起趾,讓他復現(xiàn)一下(復現(xiàn)bug可能會導致現(xiàn)象消失诗舰,但是不去復現(xiàn)也沒什么可做的了,畢竟所有的信息都收集完了)训裆。如果這個bug很難復現(xiàn)的話眶根,那么我會先推掉其他事情蜀铲,專心分析這個bug,否則拖得時間越久属百,越難找到原因记劝。
生命不息,bug不止族扰。面對bug厌丑,我們須保持良好的心態(tài),因為它們畢竟已經(jīng)成為我們工作生活的一部分了渔呵,以積極良好的心態(tài)面對它們的時候怒竿,我們也許就能找到比較好的方法解決它們了,^_^
【后記】
對于模塊很多扩氢,功能比較復雜的產(chǎn)品耕驰,一旦發(fā)生bug,一般很難確定bug的原因录豺。這個時候除了盡可能地收集現(xiàn)場信息以外朦肘,還一個分析方法。這個方法很簡單:首先列出會產(chǎn)生這個bug的所有原因双饥,無論列出的原因聽起來媒抠,多么不可能,也要列出來咏花,然后逐個去驗證和排除领舰,可以先從可能性最大或者最容易驗證(或排除)的入手。這個方法背后的邏輯是:
1. 面對一個很復雜的bug的時候迟螺,我們實際上面對的是一團漆黑冲秽,面對的是巨大的不確定性;
2. 人在面對不確定性的時候矩父,會本能地焦慮和慌張锉桑;
3. “列出會產(chǎn)生bug的所有原因”,實際上是給我們提供了一個“落腳點”窍株,讓我們在面對不確定性的時候民轴,覺得有事情可做,覺得有“可以入手”的地方球订,這樣我們在心理上就不會那么焦慮和慌張了后裸;
4. “無論列出的原因聽起來,多么不可能冒滩,也要列出來”微驶,目的是不去限制大家的思維,讓大家可以自由地思考和分析;
5. “逐個去驗證和排除每個原因”因苹,目的是盡可能地縮小問題原因的范圍苟耻;
6. “先從可能性最大或者最容易驗證或排除的入手”,這一點符合人類的行為習慣——先易后難扶檐。
這個方法不能百分之百地保證能夠找到bug的原因凶杖,但是它給分析bug提供了一個方向,指引我們的思維和行為款筑,為解決bug提供了一個“落腳點”智蝠。本人用這個方法幫助公司解決很多棘手的bug,卻發(fā)現(xiàn)了一個有趣的現(xiàn)象:產(chǎn)生bug的最終原因通常不是最開始列出來的那些奈梳,^_^杈湾。
這個方法的靈感來自于美劇《豪斯醫(yī)生》。豪斯醫(yī)生在面對每一個疑難雜癥的時候颈嚼,都會集合助手毛秘,一一列出任何可能的病因饭寺,然后逐個驗證和排除阻课。而且我發(fā)現(xiàn)的那個現(xiàn)象,這個美劇中也有艰匙,就是最終的病因通常不是他們最開始列出來的限煞,這也許是編劇故意制造的戲劇化效果吧,哈哈员凝。
【參考文獻】:
1.?美劇《豪斯醫(yī)生》