|
英文原文:Measuring Code
(編者注:原文譯者將Measure譯為“評(píng)估”,這里改為了“測(cè)量”)
你的代碼寫(xiě)得怎么樣?如果你不屬于平庸的80%,我敢打賭你的代碼一定寫(xiě)得很棒。也許你正在維護(hù)遺產(chǎn)代碼(不再被廣泛支持的系統(tǒng)相關(guān)的源代碼),這些代碼究竟能有多糟糕?情況會(huì)有所好轉(zhuǎn)嗎?雖然有一套方法可以幫助測(cè)量你的代碼,然而并非每個(gè)人都對(duì)此表示認(rèn)可。
優(yōu)點(diǎn)
我個(gè)人認(rèn)為測(cè)量數(shù)據(jù)非常有用。通過(guò)類似Emma這樣代碼覆蓋率計(jì)算工具,能夠讓你徹底了解你的代碼中究竟哪些已經(jīng)被測(cè)試覆蓋,還有哪些沒(méi)有被測(cè)試到。在開(kāi)始著手某個(gè)包進(jìn)行大規(guī)模代碼重構(gòu)之前,目標(biāo)代碼的覆蓋率究竟如何?這些信息會(huì)告訴我,也許應(yīng)該在改動(dòng)代碼前先提高一下這部分的代碼覆蓋率。
代碼行數(shù)是另一個(gè)種有意思的數(shù)據(jù)。當(dāng)你在遺產(chǎn)代碼上工作的時(shí)候(誰(shuí)不是在這樣的代碼上工作呢),如果你既能夠保持開(kāi)發(fā)速度(你肯定還在開(kāi)發(fā)新的功能),又能保持與過(guò)去相同甚至更少的代碼,那么你不但能夠在交付價(jià)值而且同時(shí)還能讓代碼變得不那么糟糕。任何一個(gè)傻瓜都能夠?qū)懗龀啥训男麓a以完成新功能,但是真正的高手能夠在交付新功能的同時(shí)減少原有的代碼。
缺點(diǎn)
任何數(shù)據(jù)都會(huì)面臨一個(gè)問(wèn)題,那就是利用這些數(shù)據(jù)的人。你最不想看到的恐怕就是過(guò)度渴望監(jiān)控這些數(shù)據(jù)的經(jīng)理了。
不能度量就無(wú)法控制(You can’t control what you can’t measure)。
– Tom DeMarco
在你得到數(shù)據(jù)之前,報(bào)告缺陷數(shù)量就已經(jīng)和獎(jiǎng)金掛鉤了。還有可能大家都希望代碼覆蓋率能夠達(dá)到某個(gè)“期望值”。
只要管理層用數(shù)據(jù)作為目標(biāo),聰明人就會(huì)利用系統(tǒng)作弊。我已經(jīng)數(shù)不清有多少次看到人們對(duì)代碼覆蓋率造假了。雖然初衷很好,但經(jīng)理們受到錯(cuò)誤思想的誤導(dǎo)。為了討經(jīng)理開(kāi)心,開(kāi)發(fā)者會(huì)不斷編寫(xiě)沒(méi)有斷言的測(cè)試。當(dāng)然,代碼依然能夠運(yùn)行而且不會(huì)出什么大問(wèn)題。但這種行為有意義嗎?天知道!當(dāng)你的代碼引入了新bug,那些測(cè)試能夠檢測(cè)到嗎?見(jiàn)鬼,當(dāng)然不會(huì)!因此,這種代碼覆蓋率毫無(wú)用處。
盡管達(dá)到了指標(biāo),但是潛在的目標(biāo)即改進(jìn)軟件質(zhì)量卻被忽視了,而且未來(lái)也不會(huì)達(dá)到。
丑陋之處
任何測(cè)量的目標(biāo)都是評(píng)測(cè)代碼并從中得出有意義的數(shù)據(jù)。以代碼覆蓋率為例,我們真正感興趣的是缺陷覆蓋率。也就是代碼中的所有可能的缺陷,有多少缺陷能夠在測(cè)試中被發(fā)現(xiàn)?我們想知道,能夠在怎樣的程度上避免重寫(xiě)代碼。
問(wèn)題在于,我怎樣才能衡量一個(gè)系統(tǒng)中“所有可能的缺陷”?基本上這是不可能知道的。為此,我們使用代碼覆蓋率作為近似。考慮到測(cè)試能夠保證代碼運(yùn)行得到正確的結(jié)果,因此“被執(zhí)行代碼率”是對(duì)能夠捕捉到bug數(shù)量的一個(gè)很好的預(yù)測(cè)。如果我的測(cè)試執(zhí)行了50%的代碼,最好的情況下我們能夠捕捉到50%的bug。如果bug出現(xiàn)在另外50%的代碼中,那么通過(guò)我的測(cè)試捕捉到這些bug的幾率為0。代碼覆蓋率是測(cè)試覆蓋率的一個(gè)上限。但假如你的測(cè)試代碼很差,那么相應(yīng)的測(cè)試覆蓋率也會(huì)降低。至于沒(méi)有斷言的測(cè)試代碼,它們基本上毫無(wú)用處。
這就是測(cè)量數(shù)據(jù)困難之處:測(cè)量那些真正管用的數(shù)據(jù)即我們的軟件的質(zhì)量,即便有可能,也是非常困難的。因此,我們要盡可能地進(jìn)行測(cè)量,但并不總是能夠清晰地知道哪些內(nèi)容與我們真正的目標(biāo)相關(guān)。
這些數(shù)據(jù)意味著什么?
有很多類似Sonar這樣的優(yōu)秀工具能為你的代碼進(jìn)行各種常用的數(shù)據(jù)評(píng)測(cè)。通常的問(wèn)題在于,開(kāi)發(fā)者并不了解(或者在意)這些數(shù)據(jù)的含義。類的復(fù)雜度是17.0是好還是壞?我的代碼關(guān)聯(lián)系數(shù)是5.6%,但是也許有更好的理由這么做。怎樣的數(shù)據(jù)對(duì)這段代碼而言才算是合理的?LCOM4(缺乏內(nèi)聚性的方法指標(biāo))是好事還是壞事?坦率的說(shuō),這聽(tīng)起來(lái)更像是治療癌癥。
當(dāng)然,如果我足夠積極主動(dòng)的話,我應(yīng)該能夠深入并且了解每種數(shù)據(jù)的含義,并且試著達(dá)成合理的目標(biāo),等等等等。拜托,我正忙著給客戶交付有價(jià)值的工作,沒(méi)有時(shí)間扯淡。這些數(shù)據(jù)是在讓人難以捉摸,索性忽略掉好了。當(dāng)然,領(lǐng)導(dǎo)們不這么認(rèn)為。
一種更好的辦法
一定有一種更好的辦法來(lái)測(cè)量“代碼質(zhì)量”。
1. 達(dá)成一致
無(wú)論你測(cè)量的是什么,測(cè)量的內(nèi)容一定要得到團(tuán)隊(duì)成員的贊同和理解。如果團(tuán)隊(duì)中有一半的人表示反對(duì),那么測(cè)量的結(jié)果一定不會(huì)很好。一些人努力想要改進(jìn),而其余的人則會(huì)讓事情變得糟糕。實(shí)際效果一定會(huì)讓人大失所望。
2. 測(cè)量最重要的部分
不必測(cè)量“標(biāo)準(zhǔn)”的內(nèi)容,像是代碼覆蓋率或者圈復(fù)雜度(cyclomatic complexity, 一種代碼復(fù)雜度的衡量標(biāo)準(zhǔn))。只要團(tuán)隊(duì)成員一致認(rèn)為這是一項(xiàng)有用的數(shù)據(jù),每個(gè)人都認(rèn)為需要在這個(gè)方面改進(jìn)并且做出承諾,那么測(cè)量它就是有用的。
我在youDevise的一個(gè)同事,花了10%的工作時(shí)間構(gòu)建了一個(gè)可以跟蹤測(cè)量數(shù)據(jù)并能夠以圖形的方式展示結(jié)果的工具。然而,非常特別的是,這個(gè)工具并沒(méi)有計(jì)算很多大型靜態(tài)分析工具給出的那些常見(jiàn)測(cè)量數(shù)據(jù),而更多地統(tǒng)計(jì)了更加常見(jiàn)和具體的問(wèn)題。那么,哪些是更貼近自己且更容易測(cè)量的呢?
• 如果你有一個(gè)上帝類,那么可以統(tǒng)計(jì)文件的代碼行數(shù),行數(shù)越少越好;
• 如果你有一個(gè)想要避免使用的第三方函數(shù)庫(kù),那么可以統(tǒng)計(jì)使用它的次數(shù);
• 如果你有一個(gè)想要移除的類,那么可以統(tǒng)計(jì)引入這個(gè)類的次數(shù)。
這些簡(jiǎn)單的測(cè)量代表了我們真正想要擺脫的技術(shù)債務(wù),通過(guò)減少技術(shù)債務(wù)我們能夠改進(jìn)自己代碼的質(zhì)量。與此同時(shí),測(cè)量的方法也會(huì)異常的簡(jiǎn)單,最直接的方式只需要執(zhí)行g(shù)rep和wc命令就可以。
測(cè)量什么并不重要,只要團(tuán)隊(duì)相信你測(cè)量這些內(nèi)容會(huì)得到改進(jìn)。通過(guò)測(cè)量你們關(guān)心的內(nèi)容,你會(huì)真正了解到你的代碼質(zhì)量。
3. 讓結(jié)果更直觀
最后,請(qǐng)把測(cè)量結(jié)果貼到顯示器上,與實(shí)際構(gòu)建狀態(tài)越接近越好。這樣每個(gè)人都能夠看到你正在做什么,并且能夠不斷提醒人們質(zhì)量的重要性。反饋是非常重要的,你能夠看到事情正在朝著更好的方向發(fā)展;同樣重要的是,當(dāng)質(zhì)量開(kāi)始滑坡時(shí),數(shù)據(jù)圖能夠把問(wèn)題上升的趨勢(shì)展示出來(lái)。
簡(jiǎn)單,明了
代碼質(zhì)量是一個(gè)非常抽象的概念,因而很難測(cè)量。因此,你應(yīng)當(dāng)轉(zhuǎn)而關(guān)注那些容易測(cè)量的東西。測(cè)量?jī)?nèi)容越簡(jiǎn)單、越容易理解,改進(jìn)起來(lái)也越容易。如果你需要花時(shí)間解釋這些測(cè)量的意義,那么這里肯定有問(wèn)題。嘗試一次只關(guān)注一部分內(nèi)容,如果你同時(shí)關(guān)注100項(xiàng)不同的數(shù)據(jù),讓這些方面都能夠得到改進(jìn)幾乎是不可能的。如果我們只關(guān)注其中的幾項(xiàng),我就能記住他們,至少不會(huì)讓它們變得更差。我有可能把它們清晰的記下來(lái),這樣才能夠改進(jìn)它們。
你在測(cè)量自己的代碼嗎?如果是的,你測(cè)量的內(nèi)容是什么?如果不是,你認(rèn)為可以測(cè)量哪些方面呢?
英文原文:David Green
it知識(shí)庫(kù):測(cè)量你的代碼 - Measuring Code,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。