完美軟件的經(jīng)濟學(xué)分析
如果問100個軟件公司的CEO,問他們是否愿意發(fā)布含有bug的軟件。他們會說什么?50個根本不愿意回答,會說一些軟件bug是這個行業(yè)中一個需要解決的大問題等不著邊的話;40個會說“當(dāng)然不會!”,并立即給他們的投資者打電話說這是誣陷,會追究法律責(zé)任。9位會低著頭說“無能為力”。而這***一位會直盯著你的眼睛說“當(dāng)然會。”
我不知道這***一位是如何領(lǐng)導(dǎo)一個軟件公司的,因為他明顯學(xué)過經(jīng)濟學(xué)。
軟件不可能沒有bug,如果你希望發(fā)布一個***的軟件,你必須解決藏在代碼里的所有bug。(想把它們擋在門外?不可能,單元測試,敏捷方法,scrum,以及任何當(dāng)今你能想到的方法論,都不能防止bug進入你的代碼庫。如果我錯了,我相信你會在評論里告訴我。)
正如你期望的,你在修補bug中投入越多的時間和資金,你就能解決越多的bug。但是,不幸的是,我們的來自經(jīng)濟學(xué)的死對頭,受益遞減法則,同樣適用于這個過程。專業(yè)的講,這個法則指在投入生產(chǎn)要素后,每單位生產(chǎn)要素所能提供的產(chǎn)量增加發(fā)生遞減的現(xiàn)象。用通俗的話講,這就是說,你能從這個過程中得到的并不等同于你所有投入的。相反,你的產(chǎn)出會隨著投入到增加形成一條迅速下降的曲線,曲線的末端、投入到軸線上,最終成為一條長尾。
舉個例子,假如一個程序有100個bug,我們知道這需要投入100分的努力來找到并修復(fù)這所有100個bug。受益遞減法則告訴我們,頭40分努力將會找到70個bug,而接下來的30分努力能找到20個bug,剩下的30分努力能找到***的10個bug。這就是說,頭70個bug(很簡單的 bug)很便宜,容易找到,算起來每個bug只消耗40 / 70 = 0.571
分努力。接下來的20個bug(藏的較深的bug)要昂貴的多,每個消耗30 / 20 = 1.5
分努力,而***的10個bug(真正難發(fā)現(xiàn)的bug)驚人的昂貴,每個消耗30 / 10 = 3
分努力。消滅這***的10個bug要比消滅起初的70個bug,每個bug需要投入的時間或資金要多出5倍。從付出的努力看,消滅大多數(shù)bug(70%-90%)和消滅所有bug,它們的成本有巨大差別,從數(shù)字上看相差兩倍之多。
而在現(xiàn)實中,實際情況比這更糟糕。因為你不知道何時能干掉這***一個bug——沒有一個像上面例子那樣的倒計數(shù)——你不得不不斷的去尋找更多的bug,即使是它們已經(jīng)全部被干掉了,你也要去證明它們確是全部被干掉了。如果你想消滅所有的bug,你還要計算你的成本。
所以,消滅一個程序中所有的bug是一件代價很大的事。不妨讓我們花一分鐘這樣思考一下:一個軟件公司最終決定要這么做。軟件公司并沒有設(shè)定像“發(fā)布沒有bug的軟件”的目標——他們設(shè)定的目標是“11月19號發(fā)布”——于是,這個目標改變了公司的測試計劃和開發(fā)計劃(不論有沒有計劃),這必然意味著的預(yù)算的增加?,F(xiàn)在,你想象一下,誰會為這多出的預(yù)算買單?公司?(嗨!)如果你沒有在軟件公司工作過,讓我來給你一點提示:非也。軟件公司會把成本轉(zhuǎn)嫁到客戶身上。因此可以得出,你喜歡的軟件都是你支付的起的軟件。我得到的消息是:你喜歡有bug的軟件。(開源軟件也是如此。除非你愿意花更多的錢或等更長的時間。很有可能你會接受去忍受次等的軟件事實。)
現(xiàn)在澄清一下,我并不是說軟件公司應(yīng)該發(fā)布有大量嚴重bug的軟件。我是說他們的軟件里可以有少量的小bug。
如何知道一個bug是大還是小?你應(yīng)該思考誰會遇到它,當(dāng)遇到時會發(fā)生什么樣的壞情況。如果一個用戶,進入第三層菜單,打開一個高級配置窗口,選中三個復(fù)選框,在敲擊“A”鍵時得到了一個奇怪的錯誤信息,這是小bug。它埋的很深,當(dāng)碰到它時人們會說“靠”,然后改為點擊按鈕,然后就會愉快的做其它事情去了。如果在使用你的程序中一個常用的操作時崩潰,那這就是個大bug。大部分人遇到這樣的bug時都會憤怒不已。
所以,我要提出一個判斷你的軟件何時滿足發(fā)布條件的黃金法則。這個黃金法則內(nèi)容是,你應(yīng)該不斷的測試并修復(fù)軟件中的bug,直到發(fā)現(xiàn)這些bug是:
- 不會讓你的公司蒙羞。
- 不會激怒你的客戶。
相比起讓一些用戶遇到這些并不在于的bug的代價,你的要找出程序中所有bug并確保全部糾正的做法代價實在太高。前提條件是,不要讓用戶做你的測試員——如果你這樣做,必定會跟黃金法則沖突——寧愿相信所有的bug并非生來平等,有些能影響一個產(chǎn)品的發(fā)布,而另一些則不然。不要害怕發(fā)布的產(chǎn)品中有 bug。如果你開發(fā)的是人們想要的好軟件,一些bug的存在并不會打攪他們,尤其是當(dāng)軟件升級操作簡便時,比如通過SaaS或Web應(yīng)用。
如果你的軟件測試符合黃金法則,那么,你的客戶最迫切得到的是你的軟件,而不是希望你去修改那些小bug。所以,準備發(fā)布吧!
哦,別忘了去問那***一個CEO關(guān)于炒股的技巧。經(jīng)濟學(xué)家的公文包里總有***的數(shù)據(jù)。