單一項原則真的很有用,特別是用於找出問題的根源.
上週改一個bug,bug的現象是:
在火狐中,打開界面(當然是公司產品的界面,不便給出地址),點擊導航項時,除了打開導航的模塊,同時會打開一個空白的頁面.
我是怎麼解決這個bug的呢?
我找到導航的那段代碼,以及相應的事件處理的js,copy到一個簡單的html頁面中.
如下:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script type="text/javascript" src="jquery-1.11.1.js"></script> <script type="text/javascript"> $(function(){ if($("#intro").length > 0){ $('#intro').click(function(){ window.open("http://hw1287789687.iteye.com/"); }); } }) </script> </head> <body> <a id="intro" href="javascript:void(0)" target="_blank">功能介紹</a> </body> </html>
首先,我想到的是要在火狐上重現.於是很容易地重現了.
然後我就試圖找原因,不斷的嘗試,因爲就這個簡單的頁面,沒有其他因素的干擾,所以很快就找到了原因和解決方法.
注意:以上的bug在chrome中無法重現,必須在火狐中才能重現.
請問,我爲什麼不深入產品的代碼中去找原因呢?
(1)如果使用產品的代碼找原因,首先我得讓它在我本機運行起來,光搭建環境就很費勁,麻煩!
(2)不便於測試,因爲產品的代碼很多,功能模塊多,比較龐大,刷新一下頁面就得兩三秒,問題是大部分資源的請求與這個bug一毛錢關係都沒有;
(3)干擾因素比較多,不確定是這個模塊的問題,還是那個模塊抽筋.而我把關鍵代碼抽出來,思路就很清晰了,影響的因素就只有一個了.這就是我要說的單一項原則.
單一項原則,核心思想就是無論在什麼情況下,都必須保證只有一個因素在影響,或者說只有一個變量.必須是一次方程,不是二次方程(初中數學裏面的).
x+3的結果就只與x有關,如果它的結果增加了10,我們就能夠確定是x增加了10,因爲它的結果只與x有關係.
x+y+3的結果同時與x,y有關,如果它的結果增加了10,我們無法判斷是x的影響還是y的影響,抑或是x,y共同作用的結果.
之前不知道在哪裏(知乎?)看過一篇文章說的好像是關於"最強大腦"(呂飛龍用聲音吹破玻璃杯)的,說這個人可以通過口吹氣把玻璃杯吹破 ,表演時第一次沒有成功,他要求再試一次,並且提出用自己的手拿着玻璃杯.有一個教授站出來不同意他用手接觸玻璃杯,解釋說如果他用手接觸玻璃杯的話,就會對結果有干擾.
到底是吹破的,還是捏破的呢?
因爲有兩個因素,所以不確定是哪個在起作用.所以這是不符合單一項原則的.但是現場的嘉賓竟然同意了呂飛龍的(扯淡的)要求,唉,真理經常站在少數人一邊.那個正直的教授竟然被人罵....
總結:我們在思考問題的時候,也要充分利用單一項原則,這樣我們的思路就會豁然開朗,也更容易抓住主要(關鍵)因素.