三月份,準備搞一個C/C++單元測試在線培訓,草擬了一份課程提綱,發給一位老朋友(馬工)徵求意見,馬工在一家研究院工做,領導一個近百人的開發團隊,單元測試推廣和實施都頗有經驗,給個人意見只有幾句話:
「刪除開源框架部分,這個太昂貴,用的企業會愈來愈少,講這個浪費聽衆的時間。我猜你花一大段時間來說開源框架,目的僅僅是爲了減小宣傳商業工具的嫌疑,課程只要考慮聽衆的真正利益(學到有用的東西)就行,何須考慮別的。」
課程內容刪除開源框架部分,這個我立刻接受,由於當初加上這部份內容,緣由正是馬工所猜的。不過,用「太昂貴」來形容免費的開源框架,有些匪夷所思,我知道用開源框架作C/C++單元測試很難且成本很高,但從沒想到「昂貴」這個詞。在電話裏和馬工聊了半天,討論了C/C++單元測試框架「太昂貴」的理由,整理以下。
免費的反而「昂貴」,這很日常,好比企業要派一我的從成都到北京出差,能夠坐飛機、坐火車、租汽車,也能夠借一輛自行車騎過去,前幾種都是要付錢的,騎自行車免費,毫無疑問,騎自行車是最昂貴的,「昂貴」表如今:費錢(不算別的,工資就很嚇人)、費力(這種累死人的事誰願意幹?)、誤事(這個不用解釋吧?)。[點評:我個比喻我也用過,不過沒那麼透徹,真是有實踐者所見略同]
使用C/C++單元測試框架作單元測試,其結果跟騎自行車很像,也是費錢、費力、誤事。
費錢:工具能夠免費,人才不能免費,相反,人才極昂貴,並且愈來愈最昂貴。一個程序員,若是月薪1萬,企業實際要支付的所有成本爲1.5到2萬,折算成每小時的成本,大概是100元,也就是說,寫1小時的測試代碼,企業要付出100元,這是使用開源框架的成本,是否是比自動化工具昂貴得多?[反駁:用工資低的實習生或初級程序員來寫測試代碼,成本不就下降了嗎?答:那就別作單元測試了,單元測試是程序員本身作的,要邊開發邊作,越是重要的程序員越要作(由於他寫的代碼也越重要),過後讓別人作單元測試,那是毫無心義的,除非每一個函數都有很是詳細的文檔,但是誰作獲得?]
費力:程序員爲何不肯「寫」單元測試?請注意,是「寫」單元測試,不是「作」單元測試。程序員不是不知道單元測試的好,而是不肯意寫測試代碼,由於太煩了。程序員不怕難,最怕煩。創造每每很難,但倒是程序員的最愛,也是程序員的價值所在。測試代碼既然用工具均可以生成,天然沒有創造性,程序員怎麼可能喜歡寫呢?讓程序員作本身很不喜歡作的事,這是很累人的,特別費力。
誤事:誤事表如今三方面:
1、花不少時間來寫測試代碼,延長了項目的週期,嚴重時可能失去市場機會。
2、太費力,程序員可能消極應對,最終作不下去,折騰很長時間,又回到原點。
3、測試不充分,不少測試點,是手工編寫代碼難以達到的,舉個簡單的例子,要讓malloc()在第一個用例返回NULL,其餘用例正常申請內存,手工編寫代碼就很難作到。用開源框架,完成代碼覆蓋都幾乎不可能,而使用合適的商業工具,完成MCDC覆蓋一點也不困難。