Martin Fowler:仍無(wú)法衡量軟件開發(fā)的生產(chǎn)效率
我們見到過太多關(guān)于軟件開發(fā)過程、設(shè)計(jì)實(shí)踐以及類似內(nèi)容充滿激情的討論。它們當(dāng)中有很多是無(wú)法驗(yàn)證的,因?yàn)檐浖袠I(yè)沒有能去衡量代表開發(fā)效率的一些基本元素。特別是我們無(wú)法合理地衡量生產(chǎn)效率。
當(dāng)然,生產(chǎn)效率可以通過觀察生產(chǎn)過程的輸入與產(chǎn)出來衡量。所以,要衡量軟件開發(fā)的生產(chǎn)效率,你就必須去衡量軟件開發(fā)的產(chǎn)出。我們無(wú)法衡量生產(chǎn)效率的根源就在于我們無(wú)法衡量產(chǎn)出。
并不是說人們沒有嘗試過。最令我氣憤的就是那些用代碼行數(shù)來衡量生產(chǎn)效率的研究。首先,總是存在不同的語(yǔ)言、不同的計(jì)數(shù)方式、不同的格式化風(fēng)格造成的問題。即使采用一致的計(jì)數(shù)標(biāo)準(zhǔn),衡量相同語(yǔ)言代碼,且代碼被自動(dòng)格式化為統(tǒng)一的風(fēng)格,代碼行數(shù)仍然無(wú)法正確反映產(chǎn)出。
任何優(yōu)秀的開發(fā)者都知道,讓他們?nèi)?shí)現(xiàn)一個(gè)特定功能所需的代碼行數(shù)可能相差巨大。除此之外,精心設(shè)計(jì)以及重構(gòu)過的代碼都會(huì)更短小,因?yàn)樗巳哂?。?fù)制粘貼風(fēng)格的程序會(huì)有更多的行數(shù)以及更差的設(shè)計(jì),因?yàn)樗錆M冗余。這很好證明,只要你使用一個(gè)支持inline method的重構(gòu)工具去修改一個(gè)程序。只需用這個(gè)工具去重構(gòu)那些普通函數(shù),你就可以輕易讓代碼行數(shù)翻倍。
你可能覺得已經(jīng)沒人再用代碼行數(shù)了,實(shí)際上每個(gè)月我都能看到基于代碼行數(shù)的生產(chǎn)效率研究論文,甚至是在類似IEEE Software這樣令人尊敬的期刊上。
也不是說代碼行數(shù)是個(gè)完全沒用的衡量,它能很好代表系統(tǒng)規(guī)模。我可以很確定一個(gè)100 KLOC(KLOC=千代碼行)的系統(tǒng)比一個(gè)10KLOC的系統(tǒng)要大。但是如果我用了一年時(shí)間寫了那個(gè)100KLOC的系統(tǒng),而Joe在一年內(nèi)用10KLOC實(shí)現(xiàn)了同樣的系統(tǒng),這無(wú)法說明我更高產(chǎn)。實(shí)際上我得到的結(jié)論是:我們的生產(chǎn)效率差不多,但我的系統(tǒng)設(shè)計(jì)得更差。
另一個(gè)經(jīng)常被用來衡量產(chǎn)出的方法是使用功能點(diǎn)(Function Points)。雖然我更同情這種做法,但它并不能令我信服。我聽過很多這樣的故事:同一個(gè)系統(tǒng),不同人統(tǒng)計(jì)的功能點(diǎn)數(shù)目相差有3倍之多。
即使我們能夠找到一種方式用功能點(diǎn)精確衡量功能,我認(rèn)為這仍然無(wú)助于解決生產(chǎn)效率的衡量問題??梢赃@么說,衡量功能點(diǎn)是觀察軟件開發(fā)直接產(chǎn)出的方式,但真實(shí)產(chǎn)出確是另一回事。假設(shè)有一個(gè)精確的功能點(diǎn)計(jì)算系統(tǒng),如果我花一年發(fā)布了一個(gè)有100個(gè)FP(功能點(diǎn))的系統(tǒng),同時(shí)Joe也用一年發(fā)布了一個(gè)50FP的系統(tǒng),是不是就能說我更高產(chǎn)?我覺得不是。很可能我做的100FP中只有30個(gè)對(duì)我的客戶來說是真正有用的功能,而Joe開發(fā)的功能則全部都是有用的。我會(huì)這么說:雖然我的直接生產(chǎn)效率更高,但Joe的真實(shí)生產(chǎn)效率更高。
Jeff Grigg向我指出,還存在影響功能點(diǎn)交付的內(nèi)因。我的100個(gè)功能點(diǎn)可能提供的都是很相似的功能,我之所以花了一年時(shí)間,是因?yàn)槲覜]有很好的重用代碼。Joe的50個(gè)功能都是差別相當(dāng)大的(對(duì)他來說可不是個(gè)好消息),所以幾乎沒有重用的可能。盡管需要實(shí)現(xiàn)50個(gè)相當(dāng)不同的功能,并且?guī)缀鯚o(wú)法重用代碼,但Joe真的很棒,他在一年之內(nèi)就全部完成了。
但這些都忽視了一點(diǎn):即使是有用的功能也無(wú)法真正用來做衡量。假設(shè)我有了進(jìn)步,完成了30個(gè)有用的功能點(diǎn),同時(shí)Joe只完成了15個(gè)。但有人會(huì)發(fā)現(xiàn)Joe的15個(gè)功能點(diǎn)為我們的客戶增加了1千萬(wàn)的盈利,但我的工作成果帶來的盈利只有500萬(wàn)。我仍然認(rèn)為Joe的真實(shí)生產(chǎn)效率要比我高,因?yàn)樗a(chǎn)出了更多的商業(yè)價(jià)值。并且我堅(jiān)信任何真正的軟件生產(chǎn)效率衡量必須基于其所帶來的商業(yè)價(jià)值。
這種思想也適用于成功率。通常關(guān)于軟件項(xiàng)目成功的判斷都是虛假的,因?yàn)槿藗儾⒉焕斫馐裁词鞘?。我可以說一個(gè)成功的項(xiàng)目就是產(chǎn)生的商業(yè)價(jià)值大于研發(fā)成本的項(xiàng)目。假如Joe和我各參與了5個(gè)項(xiàng)目,我的4個(gè)項(xiàng)目是成功的,而Joe只有一個(gè)項(xiàng)目成功。這是不是就意味著我干的比Joe好呢?這可不一定。如果我的4個(gè)項(xiàng)目每個(gè)盈利1百萬(wàn),而Joe那個(gè)成功項(xiàng)目的收入比他所有的5個(gè)項(xiàng)目成本的總和還要多出1千萬(wàn),那么他才是那個(gè)應(yīng)當(dāng)獲得提拔的人。
有些人會(huì)說“如果無(wú)法衡量,就無(wú)法管理”,這是站不住腳的。商業(yè)領(lǐng)域中,人們一直在管理著那些他們無(wú)法衡量?jī)r(jià)值的東西。你如何衡量一個(gè)公司里律師的生產(chǎn)效率?如何衡量市場(chǎng)部門、教育機(jī)構(gòu)?你無(wú)法衡量,但你任然需要去管理它們(更多信息參考Robert Austin)。
如果團(tuán)隊(duì)的生產(chǎn)效率都很難衡量,那么個(gè)人對(duì)團(tuán)隊(duì)的貢獻(xiàn)就更難衡量了。通過觀察每個(gè)迭代產(chǎn)出特性的多少,你可以對(duì)團(tuán)隊(duì)的產(chǎn)出有個(gè)大致的概念。這是個(gè)很粗糙的感受,但是你可以感覺出團(tuán)隊(duì)的速率是否有所提高,或者大致感覺出兩個(gè)團(tuán)隊(duì)的生產(chǎn)效率哪個(gè)更高一些。但是個(gè)人的貢獻(xiàn)值就很難計(jì)算了。可能有的成員職責(zé)是實(shí)現(xiàn)特性,而有些成員的角色可能是協(xié)助者——他們負(fù)責(zé)幫助他人實(shí)現(xiàn)特性。他們的作用是提升整個(gè)團(tuán)隊(duì)的生產(chǎn)效率——除非你是這個(gè)團(tuán)隊(duì)中的一個(gè)開發(fā)者,你將很難搞清楚這些人的產(chǎn)出到底是什么。
如果你覺得這些情況還不夠復(fù)雜,在《經(jīng)濟(jì)學(xué)人》(sep 13-19,2003)上有一篇關(guān)于生產(chǎn)效率趨勢(shì)的文章。經(jīng)濟(jì)學(xué)家們似乎發(fā)現(xiàn),由于90年代中對(duì)計(jì)算機(jī)產(chǎn)業(yè)的投資導(dǎo)致了如今商業(yè)領(lǐng)域中生產(chǎn)效率的提升。
這其中的重點(diǎn)是——增長(zhǎng)是落后于投資的:“對(duì)計(jì)算機(jī)方面的投資并不會(huì)自動(dòng)地推動(dòng)生產(chǎn)效率提升,公司同時(shí)也需要重組他們的商業(yè)實(shí)踐”。同樣的滯后效應(yīng)也出現(xiàn)在電力發(fā)明之后。
所以商業(yè)價(jià)值不僅難于衡量,還存在時(shí)延。很可能直到團(tuán)隊(duì)構(gòu)建的軟件發(fā)布多年之后,你才能夠衡量團(tuán)隊(duì)的生產(chǎn)效率。
我可以理解為什么衡量生產(chǎn)效率如此具有誘惑性。如果可以做到,我們就可以更容易、更客觀地評(píng)估軟件。然而錯(cuò)誤的衡量方式只會(huì)使問題惡化。我覺得必須承認(rèn):在這一領(lǐng)域,我們?nèi)匀缓軣o(wú)知。
原文鏈接: Martin Fowler 翻譯: 伯樂在線 - 治不好你我就不是獸醫(yī)