Programmgröße
Es kann bisweilen recht interessant sein, die Größe des Quelltext hinter einem Softwareprojekt zu untersuchen. Es mag nicht überraschen, daß es sich immer noch um Buchhaltung handelt. Aber GnuCash ist über die Jahre von einem handlichen elektronischen Scheckbuch zu einer ziemlich großen Buchhaltungsanwendung mit vielen Merkmalen gewachsen.
GnuCash besteht inzwischen aus über einer Drittelmillion Zeilen Anweisungen verteilt über mehr als tausend Dateien. Es wurde in 36 Sprachen übersetzt und über 200 Menschen haben Beiträge geleistet.
Falls Sie Schwierigkeiten haben, durch diese Menge Quelltext zu schwimmen, stellen Sie sich bitte folgendes vor: Ausgedruckt und gebunden wären es mehrere Dutzend Exemplare von Tolstois "Krieg und Frieden", ungefähr ein Bücherregal breit, voll mit Quelltext.
Wohlgemerkt, dies sind Quelltext und Dokumentationen, welche von wirklichen Menschen erstellt und entwanzt wurde. Dies ist *kein* automatisch generierter Code. Werkzeuge wie Glade und Swig können beliebige Mengen Code automatisch erstellen; diese wurden hier aber nicht mitgezählt. Jede einzelnen hier gezählte Zeile wurde von menschlicher Hand eingegeben, geändert, eingerückt, optimiert, davon viele mehrmals.
Angenommen, wir haben ca. 400 offene Fehlermeldungen in Bugzilla, dann ergibt das etwa einen Fehler pro tausend Zeilen Code oder einen Fehler pro 50 Seiten eines Ausdrucks. Diese Fehlerzahl ist nicht untypisch für Software-Projekte; sie ist nah an der Norm.
Die folgende Tabelle zeigt einige historische Maße für Quelltextzeilen und Dateienzahl für das GnuCash-Projekt. Man beachte, daß nicht alle Zeilen gezählt wurden: z.B. die Makefiles, configure.in und autogen.sh wurden nicht mitgezählt. Ebenso wurden weder Dateien mitgezählt, die automatisch erzeugt wurden, noch Dateien, die von anderen Projekten "ausgeliehen" wurden. Ebenfalls nicht gezählt wurden experimentelle Dateien, verschiedene Perl-Skripte, diverse Konverter, Add-Ons und Utilities. Schließlich wurden glade-Dateien nicht gezählt, obwohl weite Teile der graphischen Oberfläche in glade-Dateien definiert wurden.
Beachten Sie auch, daß weder KLOC's (1000 Zeilen Quelltext) ein gutes Maß sind, um die Produktivität von Programmierern zu bestimmen, noch .wc
eine gute Methode ist, um KLOC's zu messen. Viel bessere Maße sind Komplexitätsmaße, welche beispielsweise die Anzahl und Größe von if-then-else-Blöcken, die Anzahl und Größe aller Blöcke, oder die Anzahl der mathematischen Operatoren pro Anweisungszeile. Möglicherweise werden wir eines Tages eine derartiges Werkzeug auf den Quelltext anwenden. Zur Zeit ist dies aber, was wir zur Verfügung haben - andererseits haben wir versucht, nur die Dateien mit tatsächlich direkt von Menschen editiertem Code zu zählen.
Tabelle 1: Historische Entwicklungsstatistik
Version | engine | backend | register | ledger | motif | gnome | verschiedene Aplikationen | import-export | reports | scheme | business | test | docs | internal txt | Summe | Sprachen | genannte Autoren |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |
Jede Zelle enthält folgendes:
Anzahl von *.c-, *.h- und *.scm-Dateien (KLOCS in *.c + KLOCS in *.h + KLOCS in *.scm). Wenn keine *.scm-Dateien in dem Verzeichnis sind, werden nur (KLOCS in *.c + KLOCS in *.h) angezeigt. Wenn nur eine Zahl in den Klammern ist, handelt es sich um die zugehörige KLOC-Zahl für die Statistik.
wobei KLOC == kilo-lines-of-code (1000 Zeilen Code), wie von wc
berichtet. Wie zuvor bemerkt, ist wc kein besonders gutes Codemaß, aber es ist das, welches wir griffbereit haben.
- engine
- Inhalt von src/engine und Unterverzeichnisse. Die Maschine wurde in Version 1.1 aus dem Motif-Code ausgegliedert. Das Datenspeicher-Modul (file-io, sql) wurde im Verlauf von Version 1.5 abgetrennt.
- backend
- Inhalt des src/backend Verzeichnisses (Version 1.7 und später) oder von src/engine/file, src/engine/sql (Version 1.6 und früher)
- register
- Inhalt von src/register directory (Version 1.6 und früher) oder src/register/register-core (Version 1.7 und später). Das Register wurde als separates Modul aus dem Motif-Code in Version 1.1 herausgelöst. Wie man in der Statistik sieht, hat sich das Register als ziemlich stabil erwiesen. Ab Version 1.7 zeigt die Zelle einen 2. Eintrag: die Anzahl der Codezeilen in src/register/register-gnome, welches zuvor als Teil von Gnome gezählt wurde.
- ledger
- *.c, *.h files im src Verzeichnis allein (Version 1.6 und früher) or src/register/ledger-core (version 1.7 und später)
- motif
- Inhalt des src/motif Verzeichnisses (Version 1.2 und früher). Die Motif-Version des Codes wurde nach Version 1.2 aufgegeben, nachdem der größte Teil des nicht die Oberfläche betreffenden Codes verschoben war, enweder in die Engine, das Register oder nach Ledger.
- gnome
- Inhalt von src/gnome plus src/register/gnome (Version 1.6 und früher). Für Version 1.7 und später, besteht dies aus src/gnome, src/gnome-search und src/gnome-util
- verschiedene Aplikationen
- Inhalt von verschiedenen anwendungsbezogenenen Verzeichnissen (Ab Version 1.7): src/app-file, src/app-utils, src/calculation, src/core-utils, src/gnc-module, src/network-utils, src/tax/us
- import-export
- Code, um verschiedene Dateiformate zu im- und exportieren: Inhalt des src/import-export Verzeichnisses.
- reports
- Code zur Erzeugung von Berichten und Graphiken: Inhalt des src/reports Verzeichnisses.
- scheme
- Scheme- und Guile-Code in den Verzeichnissen src/scm plus src/guile (bis Version 1.6). Ab Version 1.7 wanderte viel von diesem Code nach reports, import/export und in individuelle Module; so daß nur vermischter Code übrig blieb.
- business
- Code des Geschäftsmoduls in src/business.
- test
- Code, um automatisierte Regressionstests durchzuführen: Inhalt des src/*/test Verzeichnisses.
- docs
- Englischsprachige Benutzerdokumentation einschließlich Online-Hilfe und Handbuch in HTML, SGML und/oder XML. Ab Version 1.8.4 enthält die Zahl unter dem Strich die übersetzten, nicht englischen Dokumente (de, es, fr, pt ...) Diese beiden Zahlen sind etwas schwierig zu bestimmen, wegen der Durchmischung mit Format-Anweisungen und teilweise mehreren konkurrierenden Versionen.
- internal txt
- Die Anzahl der Design-Dokumente und Readme-Dateien, welche zur Unterstützung der Entwickler gedacht sind. Dies schließt *.txt-, *.texinfo- und README.*-Dateien in allen Unterverzeichnissen ein. Ab Version 1.7 werden nur jene im src-Verzeichnis gezählt, wodurch etliche zerstreute ausgelassen werden.
- Sprachen
- Die Anzahl der Sprachen, in welche die Meldungen des Programms übersetzt wurden, also die Anzahl der po/*.po-Dateien. In Klammern die Anzahl der Meldungen in den Übersetzungsdateien (grep msgstr po/*.po |wc), in Tausend.
- genannte Autoren
- Die Anzahl der Personen, welche in der Autoren-Datei AUTHORS (ab Version 1.6) oder davor in der Liesmich-Datei README genannt werden. Diese schließt führende Entwickler, Einsenderinnen von Verbesserungen und die jeweiligen Übersetzer ebenso ein wie zusätzlich in gnucash-docs/AUTHORS genannte Personen, die nicht bereits in gnucash/AUTHORS genannt sind.