錯誤植入法與老祖宗的智慧
兩個小組獨立地測試同一個程序,第一組發現25個錯誤,第二組發現30個錯誤,在兩個小組發現的錯誤中有15個是共同的,那么可以估計程序中的錯誤總數是 ___個。
A.25 B.30 C.50 D.60
A.25 B.30 C.50 D.60
當然,任何一個了解估算方法的朋友都可以根據公式計算出最終的結果是50個,這沒有什么問題。——但是,我在這里引用這個題目,是希望我們可以把學習這件事情通過類比變得更加有趣一點。
其實,如何估算一個系統中存在的缺陷數,我們的老祖宗早就有現成的方法了。不信,請看我在我們老祖宗的數學專著中找到的一個實踐問題:“有一口魚塘,不知道其中有多少條魚,如何才能估算出池塘中魚的數量?”(當然,原文不是這樣,請原諒我一下子找不到出處,只好憑記憶用我的語言描述一下了)。我們老祖宗給出的答案是這樣的:
- 首先,從魚塘中打撈出一些魚(假設數量為m);
- 將這些魚做上記號,然后將其放回魚塘;
- 等待一段時間,等到魚均勻分布在魚塘中了之后,再次打撈上來一些魚(假設數量為n);
- 統計第二次打撈上來的魚中的帶記號者(假設數量為p);
- 計算得出魚塘中魚的數量為 S = m / (p/n)
對這個答案最簡單的理解是:假設第一次做了記號的魚在魚塘中是均勻分布的,第二次打撈上來的n條魚中有p條是有記號的,則說明有記號的魚的分布密度是p/n,魚塘中一共有m條有記號的魚,當然總的魚數量就是 S = m / (p/n)了。
再回到我們的原始問題,很容易做一個類比,第一個小組發現了25個缺陷(相當于第一次打撈的魚m),第二個小組發現了30個缺陷(相當于第二次打撈上來的魚n),兩者相同的是15個(相當于是p),所以答案是 50。
所以,從現在開始,不要再認為這個方法是什么深奧的方法——看看,我們的老祖宗都能熟練運用呢

本來,到這里就可以告一段落了,可是我們能不能再深入點思考這個問題呢?
這種方法顯然是可以得到一個估算結果,但這種方法在哪些情況下不合適,使用時有什么注意事項沒有呢?
還是回過頭看我們養魚的例子,很顯然,我們討論的前提是“做記號的魚在池塘中分布均勻”,如果這個條件不滿足,我們的估算結果顯然是有很大的偏差的。就魚塘來說,不同類型的魚由于喜歡的食物種類不同,喜歡分布在不同的層次,這樣一來的話,在打撈的時候就要注意,如果只側重在某一個水層,顯然結果是有很大的偏差的,另外,由于魚塘邊上的溫度相對較低,夏天魚更加喜歡在魚塘邊休息……,可見,要達到“平均”這樣的條件還是有難度的…… —— 等等,我們討論了這么久的魚,和我們的缺陷有什么關系呢?
別忘了,缺陷在系統中的分布和魚在魚塘中的分布可是有異曲同工之妙的哦

關于魚塘和缺陷的故事,如果我們要深究下去,還會發現他們的很多共同點,當然,你也可以提出各種方法來修正我們這個簡單的模型——但這不是我們的重點。我要說的重點是:無論如何,在這條路上的思考是不是會比簡單的背公式更有趣一些呢?
經常有測試工程師問到,應該怎樣才有最高的學習效率呢?
我的回答是:學習、思考是樂趣,不是負擔。我們學習是為了追求它自身的樂趣——獲得知識的樂趣,在自己頭腦中天馬行空的樂趣,發現的樂趣,以及分享的樂趣。