在咱們碼農生涯,錯誤可謂:“我不來他不走,我來他也不一定走”。bug不離不棄的伴隨這我們。怎么樣找到錯誤,定位錯誤是關鍵,很多情況下我們往往解決錯誤就那么一秒鍾的事情,而定位錯誤這需要漫長的折磨。以下記錄 RIFT 即: “再現(Reproduce)、隔離(Isolate)、改正(Fix)、測試(Test)”
在RIFT之前應該還有一定前提
1、保證程序是最新穩定版本(有時候我們因為一個文件沒有更新到某台服務器而引起了一頓錯誤的折騰,最后發下原來某個文件不是最新的。避免這個問題必須要有一套管理更新版本的相關機制)
2、在定位修改前必須得做備份
3、一定要做好變更歸檔記錄(很多情況下,我們修復了一個bug沒有記錄,下次遇到類似問題單憑記憶去針對變更,這往往會引起錯誤的判斷)
有了以上的准備工作我們可以開始 RIFT了
一、再現(Reproduce)
在進行修改之前,務必要再現系統產生的問題。如果沒有親眼看到問題的表現 很可能無法正在的定位到問題。當我們沒有這個意識的時候,收到一個bug報告之后,知道系統出bug了,但是沒有通過問題的再現就嘗試進行某些修改,然后讓用戶測試下。這種做法偶爾會湊效,很多情況下會出問題,那么用戶會以為公司的技術把他當成了小白鼠在做實驗,這對公司的業務影響是可想而知的。
事實上成功的再現問題已經是完成了一半的修改任務,最難解決的問題莫過於那些很少發生或者我們預期無法測試到的問題,這類問題情況下,我們正需要收集我們任何可以收集到的信息反饋。並且利用任何可以使用的工具和環境,直到成功的建立了一個測試方案。利用問題再現 和配合問題反映的測試環境。在我們的測試程序上對bug進行接下來的工作
二、隔離(Reproduce)
成功的再現問題之后,我們可以開始着手找出問題內在的原因。有時候再現問題不能為我們提供任何線索。在分離階段,我們需要深入的研究問題的本身,找到確切的內在原因。分離階段目標就是確定引發問題的正真原因,在某些情況下,問題根源是由於一些組合因素所導致的,這也使得情況更我復雜,但是我們查找原因是相同的。隔離又有以下寫隔離技巧(這里主要講web項目的隔離辦法)
1、失效隔離(比如服務器突然帶寬很大,訪問很卡,我們可以在不影響這個程度運營的情況下一個一個的站點暫停的方式,來觀察到底是哪個站點問題)
2、Only 1 (然出現問題的站點以最簡單的問題工作,比如我們單獨寫個頁面甚至可以是純html頁面,看能不能正常運行)
3、折半法 (這個其實就是算法中的 二分法查找,定位問題)
5、All but 1 (當我們定位到了問題時候,我們利用問題的各個因素在把相應問題代碼執行一遍,確保問題沒有錯誤的定位)
三、更正(Fix)
一旦找到了問題的錯誤原因,RIFT過程的一步工作就是更正錯誤,這是一項我們可以控制的任務,或者說是一項可以讓相應技術員去做的事情。因為當我們找到了問題,基本上就有了問題的解決思路,這個時候相應交給任何一個程序員都能給做好。
四、測試(Test)
測試步驟一般包括三個:
1、測試再現 (echosong在遇到的技術人員中包括我自己有些時候,修復了問題以后就萬事大吉,不去進行修改測試,就把問題丟給了售后,或者反饋個項目管理人員。這樣倒是客戶或者測試部再測反饋問題沒有解決,而程序員和項目管理人說 “呀,這個問題不是早解決了么。怎么還有問題呀”,這種情況太不應該發生,所以修改錯誤以后,務必要進行自我的測試步驟)
2、修改完畢后,務必清理系統運行環境。 (在測試工作解決后,需要執行清理工作,包括一處所謂臨時用戶,臨時問題解決,注釋代碼,斷點打印。svn的正確提交。echosong也遇到過 在svn提交環境以后竟然有 比如 “php: exit("這里是調試")”這種代碼存在。這是非常離譜的)
3、整理歸檔。 在修改后某些教訓值得我們一文檔的形式 或者svn提交時候說明(最好是單獨文檔記錄) 進行記錄下來,共享給開發團隊,這樣不管是以后自己在處理問題,還是團隊其他人都會受益匪淺。
一個優秀的程序員並在不於精通多少種語言,也並在於能設計多么高深的牛逼的系統架構,而在於解決 問題和 處理的方法上。良好的錯誤定位技術遠遠超越於一些代碼牛人。因為這更考驗一個人的做事條理和基本素質。程序生涯的您是否同意這種說法。如果同意請贊一個O(∩_∩)O~