天天看點

你的代碼糟粕比精華要多得多

新的研究發現,一個程式的核心功能僅在于一小部分封裝的代碼。

如果你是一個軟體開發人員,有人問你,你寫的代碼中有多少是真正在實作實際功能的,有多少是填充物、無價值的或者隻是因為實際運作程式設計語言所需要的? 95%? 75%? 50%?都不是!新的研究發現,隻有大約5%的代碼是真正在提供核心功能。

研究人員認為,就像自然語言一樣,一些——甚至可能是絕大多數——寫下的代碼其實對于功能是不起作用的。《stalks of wheat》一文的作者認為,隻有一部分代碼代表了功能的語義核心,我們稱之為精華,而其他的則是糟粕。

你的代碼糟粕比精華要多得多

該作者表示,一個功能的核心可以被封裝于一個小型的關鍵字集合中,這被稱為“minimum distinguishing

subset” (“最小的差別化子集”)或minset。我們可以通過将方法分解為詞素(即,通過空格或标點符号分隔代碼),丢棄那些對函數行為不重要

的内容,同時把剩下的映射到關鍵字中。然後将那些關鍵字導入到minset。

為了檢驗此理論,即minset中的代碼隻占全部代碼的一小部分,研究人員下載下傳了1000個來自apache、eclipse、github和

sourceforge最受歡迎的java項目。在合計超過10億行的java代碼中,先剔除簡單的方法( tokens低于50)。就隻剩下不到190

萬的不同方法,然後從中随機抽取10,000條,确定它們的minset。研究中使用的代碼和資料可從bitbucket下載下傳。

以下為研究發現的主要結果:

minsets出奇的小。方法的平均minset大小為1.55個關鍵字,最大值為6。

minset的大小并不随方法規模的增加而變大。事實上,如果隻看最大的1000個方法,其平均和最大minset關鍵字分别為降到1.12和4,這表明,正如作者所言:“即便是對于一些異常龐大的方法,minset也是一項既獨特又靈活有效的名額。”

大多數代碼幾乎盡是糟粕。平均來說,在一個方法中隻有4.6%的獨特詞素可以位列minset。也就是說,95%以上的代碼都是糟粕。

不過有幾處關鍵的地方需要指出來。首先,minset本身是不可執行的:它隻是表征了核心功能的代碼的最小集合。剩下95%中的一些代碼(前面稱之

為糟粕)也不是無用的,因為還需要它們來運作程式。其次,盡管這項研究僅着眼于java代碼,不過由于語言的相似性,作者表示這些發現應該也适用于其他語

言,特别是c語言和c++。

關于此項工作的意義?研究人員指出了minsets的潛在應用:

改進代碼搜尋——minsets可用于基于相似查詢的代碼搜尋結果排名。

智能ide——具備了minsets索引資料庫的ide可用于提出類似的代碼,支援自動代碼填充,加快調試過程。

備選的程式設計形式——minsets可用于支援基于關鍵字的程式設計,也就是說,我們可以通過一個小型的關鍵字組來建立可用的代碼。

來源:51cto