规模
代码规模的老旧资料。
研究软件的源代码指标往往是相当有趣的,但财务软件的感觉一般般。经过多年发展,GnuCash 已从一个小的、方便的电子支票簿发展成一个相当大的多功能桌面程序。
超过30万行代码,1000多个文件;被翻译成23种语言,有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 | 内文 | 合计 | 语言 | 贡献者 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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)。 这两个都很难统计,因为有相当大的格式变化和多个版本。
- 内文
- 面向开发者的设计文件和README文件数量。包括所有子目录中的.txt、.texinfo和README.*文件。 1.7及以后版本,只计算src子目录中的文件(不包括散落在其他地方的六七个文件)
- 语言
- 程序被翻译成的语言数量(po/*.po文件的数量)。括号内是语言文件的代码数量(grep msgid po/*.po |wc),单位为千。
- 贡献者
- AUTHORS文件(1.6及以后)或README文件(早期版本)中被认可的人数。 包括主要开发者、补丁提交者和语言翻译者;还有在 gnucash-docs/AUTHORS 文件中列出的贡献者,但没有在 gnucash/AUTHORS 文件中。


