規模
代碼規模的老舊資料。
研究軟體開發專案背後的原始碼通常相當有趣。但財務軟體就很難說。這也不奇怪,經過這麼多年的開發,GnuCash 已從當年方便的電子支票簿發展成一套相當大的多功能桌面應用程式。
GnuCash 目前包含了大約三十萬行程式碼,這些程式碼散佈在超過一千個檔案中。其被翻譯成二十三種語言,並有超過 139 名作者與貢獻者的貢獻。
對如此巨量的源代碼還是沒有概念,換個角度想,將其打印並裝訂好,這將相當於數十本《戰爭與和平》,整整一書架寬的源代碼。
提醒您,這是由真人製作與除錯的原始碼(與文件),而非自動產生的程式碼。工具(例如 glade 或 swig)可以自動產生無數行程式碼;但我並不想要這些東西。這裡的所有程式碼都是人工多次輸入、編輯、縮排、調整過的。
鑑於 Bugzilla裡有大約400個未解決的 bug,這相當於每千行代碼有一個 bug,或者每50頁打印輸出有一個 bug,這個比例對軟件項目來說並不意外,接近常態。
下表是 GnuCash 的一些歷史代碼和文件數量指標。請注意,並不是所有的代碼都會被計算在內,如:Makefiles、configure.in 及autogen.sh;自動生成的文件、從其他項目“借用”的文件;實驗性文件、雜項perl 腳本、各種轉換器、附加組件和實用程序;最後,glade 文件也沒有計算,儘管GUI 的大部分都在glade 中。
還需要注意的是,KLOC 不是衡量程序員生產力的好指標,甚至 wc 也不是計算 KLOC 的好方法。更好的標準是複雜度,例如,if-then-else 塊的數量和大小、所有塊的數量和大小或者每條語句的數學運算符數量。也許某一天我們會使用這些標準,但現在KLOC 最直接,而且我們試圖只統計手工編寫的代碼,避免自動生成的代碼影響KLOC 計數(這就是不計算glade 文件的原因:它們體量很大、而且是自動生成的)。
表一.歷史開發統計
| 版本 | engine | backend | register | ledger | motif | gnome | 雜項應用 | import-export | reports | scheme | business | test | docs | 内部txt | 總計 | 語言 | 作者签名 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| xacc-0.9 Sept 97 | - | - | - | - | 34 files (7.5+0.9) | - | - | - | - | - | - | - | 5 files (0.4) | 1 file (0.1) | 40 files (8.8) | 1 | 1 |
| xacc-0.9w Dec 97 | - | - | - | - | 51 files (13.8+1.5) | - | - | - | - | - | - | - | 9 files (0.8) | 1 file (0.1) | 61 files (16.2) | 1 | 2 |
| xacc-1.0.17 Feb 98 | - | - | - | - | 52 files (14.8+1.8) | - | - | - | - | - | - | - | 12 files (1.4) | 4 files (0.3) | 68 files (18.3) | 1 | 7 |
| gnucash-1.1.15 Aug 98 | 24 files (6.2+1.5) | - | 31 files (6.1+1.7) | 5 files (1.4+0.4) | 30 files (7.4+0.7) | 17 files (3.4+0.5) | - | - | - | 3 files (0.3) | - | - | 16 files (1.9) | 17 files (1.8) | 159 files (34.7) | 1 (0.17) | 25 |
| gnucash-1.2.2 Aug 99 | 41 files (10.2+3.6) | - | 28 files (5.5+1.7) | 14 files (2.4+0.6) | 26 files (8.7+0.5) | - | - | - | - | 14 files (1.4) | - | - | 30 files (2.6) | 15 files (1.8) | 168 files (39.0) | 3 (0.54) | 41 |
| gnucash-1.3.6 April 2000 | 41 files (12.9+4.0) | - | 32 files (6.8+2.1) | 19 files (4.0+0.8) | - | 78 files (32.2+3.0) | - | - | - | 74 files (4.0+0.7+12.3) | - | - | 33 files (7.8) | 25 files (4.5) | 302 files (95.1) | 5 (4.3) | 61 |
| gnucash-1.4.6 Sept 2000 | 43 files (13.0+3.6) | - | 27 files (5.9+2.0) | 24 files (5.4+1.8) | - | 82 files (33.8+3.0) | - | - | - | 68 files (4.0+0.7+15.5) | - | - | 36 files (9.3) | 36 files (4.8) | 316 files (101.9) | 7 (6.0) | 82 |
| gnucash-1.4.12 April 2001 | 43 files (13.1+3.6) | - | 27 files (5.9+2.0) | 24 files (5.4+1.8) | - | 82 files (33.5+3.0) | - | - | - | 73 files (4.0+0.7+17.7) | - | - | 43 files (11.5) | 39 files (6.0) | 331 files (108.2) | 12 (17.8) | 97 |
| gnucash-1.5.2 Sept 2000 | 46 files (14.9+3.7) | - | 29 files (6.3+2.0) | 25 files (5.7+1.8) | - | 83 files (35.8+2.9) | - | - | - | 73 files (4.6+0.8+16.8) | - | - | 37 files (10.7) | 48 files (8.2) | 341 files (114.2) | 8 (7.8) | 89 |
| gnucash-1.6.0 June 2001 | 139 files (42.8+8.3) | - | 28 files (5.7+2.0) | 23 files (10.1+1.5) | - | 132 files (60.0+4.2) | - | - | - | 102 files (6.2+0.8+27.3) | - | - | 64 files (12.1) | 69 files (12.9) | 455 files (193.9) | 11 (18.7) | 123 |
| gnucash-1.7.2 November 2002 | 104 files (28.7+7.8+3.3) | 89 files (30.0+3.3) | 34 files (5.2+2.0) 29 files (10.5+1.2) |
17 files (9.4+0.7) | - | 143 files (56.0+4.7+0.9) | 75 files (17.0+2.5+5.1) | 78 files (11.1+1.5+7.3) | 38 files (2.4+0.1+14.2) | 17 files (3.4) | 94 files (19.9+1.9+4.5) | 72 files (7.9+0.1+0.7) | 83 files (22.2) | 62 files (11.6) | 935 files (297.1) | 21 (56.1) | 130 |
| gnucash-1.8.4 June 2003 | 100 files (29.7+8.3+3.4) | 89 files (30.1+3.3) | 35 files (5.3+2.0) 31 files (10.7+1.2) |
17 files (10.2+0.8) | - | 151 files (58.7+5.1+1.1) | 71 files (16.9+2.6+5.2) | 86 files (13.3+1.8+7.5) | 52 files (2.4+0.2+15.1) | 17 files (4.1) | 98 files (21.5+2.0+5.1) | 76 files (8.6+0.2+0.7) | 24 files (13.8) 199 files (80.3) |
69 files (14.3) | 1115 files (385.5) | 23 (62.4) | 139 |
每個單元格顯示的信息如下:
.c、.h 和.scm 代碼的行數(.c + .h + .scm);如果沒有.scm 文件,則只顯示(.c + .h);如果括號中只有一個數字,那就是正確的KLOC。
其中 KLOC == 千行代碼,由 wc 報告。如上所述,wc 並不是一個非常好的代碼度量,但它是最方便的。
- engine
- src/engine 和 include 目錄的內容,1.1版從 motif 代碼分離出來;數據存儲後端(file-io,sql)在1.5版本中分離
- backend
- src/backend 目錄(1.7及以後)或 src/engine/file、src/engine/sql(1.6及以前)的內容
- register
- src/register(1.6及以前) 目錄或 src/register/register-core(1.7及以後)的內容。寄存器在1.1版從motif代碼中獨立出來。統計可以看出,寄存器代碼一直相當穩定,1.7 及以後版本,這個單元格顯示了第二個計數:src/register/register-gnome 中的代碼行數 (以前作為 gnome 的一部分)
- ledger
- 僅在src目錄下的.c、.h文件(1.6及以前)或src/register/ledger-core(1.7及以後)
- motif
- src/motif目錄下的內容(1.2及以前)。 motif的代碼在1.2版本之後就停止了,因為大部分非gui代碼都被移到了引擎、寄存器或分類賬中。
- gnome
- src/gnome 和src/register/gnome 的內容(1.6 及以前)。 1.7及以後的版本,它由src/gnome、src/gnome-search和src/gnome-util組成
- 雜項應用
- 與程序相關的雜項目錄(1.7及以後):src/app-file、src/app-utils、src/calculation、src/core-utils、src/gnc-module、src/network-utils、src/tax/ us
- import-export
- 導入/導出各種文件格式的代碼:src/import-export 目錄下的內容。
- reports
- 生成報表和圖表的代碼:src/reports目錄。
- scheme
- 方案和guile代碼在目錄src/scm加上src/guile中(1.6及以前)。 1.7及以後版本,這些代碼大部分分離進報表、導入/導出和獨立模塊,只剩下雜項代碼。
- business
- 增加小規模企業功能的代碼:src/business目錄。
- test
- 執行自動回歸測試的代碼:src/*/test目錄。
- docs
- 英文文檔,包括在線幫助和手冊(HTML、SGML 或 XML)。 1.8.4及以後版本,欄下數字是翻譯的非英文文檔(目前是de、es、fr、pt_PT)。這兩個都很難統計,因為有相當大的格式變化和多個版本。
- 内部txt
- 面向開發者的設計文件和README文件數量。包括所有子目錄中的.txt、.texinfo和README.*文件。 1.7及以後版本,只計算src子目錄中的文件(不包括散落在其他地方的六七個文件)
- 語言
- 程序被翻譯成的語言數量(po/*.po文件的數量)。括號內是語言文件的代碼數量(grep msgid po/*.po |wc),單位為千。
- 作者签名
- AUTHORS文件(1.6及以後)或README文件(早期版本)中被認可的人數。包括主要開發者、補丁提交者和語言翻譯者;還有在 gnucash-docs/AUTHORS 文件中列出的貢獻者,但沒有在 gnucash/AUTHORS 文件中。


