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















 
 
 
 
 
 
 