Statistieken
Het kan vaak heel interessant zijn om de statistieken van een software ontwikkelingsproject te bestuderen. Een evidente interesse: boekhouding en statistiek gaan tenslotte goed samen. Door de jaren heen is GnuCash uitgegroeid van een een klein, handig, elektronisch chequeboekje to een redelijk grote bureaublad toepassing met een uitgebreide functieomvang.
GnuCash bestaat momenteel uit meer dan driehonderd vijftigduizend broncoderegels verdeeld over meer dan duizend bestanden. Het is vertaald naar 23 talen en heeft bijdragen ontvangen meer dan 139 auteurs.
Als je je die massa broncode moeilijk kan voorstellen, beschouw het dan als volgt: afgedrukt op papier en in boeken ingebonden, zou dit overeenkomen met een paar dozijn exemplaren van Tolstoj's "Oorlog en Vrede", ongeveer een volledige boekenplank gevuld met broncode.
Mind you, this is source code (and docs) crafted and debugged by actual humans, this is *not* autogenerated code. Tools (such as glade or swig) can generate gazillions of lines of code automatically; I'm not counting those. Every last line counted here was typed in, edited, indented, tweaked, multiple times, by human hands.
Gezien dat we ongeveer 400 open bugs hebben in bugzilla, komt dit uit op ongeveer één bug per duizend regels code, of één bug per 50 afgedrukte pagina's. Deze bug verhouding is eigenlijk niet abnormaal voor software projecten; ze is in de buurt van de norm.
De onderstaande tabel toont enkele historische aantal-coderegels en aantal-bestanden statistieken voor het GnuCash ontwikkelingsproject. Merk op dat niet alle code geteld is: bijvoorbeeld, de Makefiles, configure.in en autogen.sh zijn niet geteld. En ook bestanden die automatisch gegenereerd worden, zijn niet meegeteld, net zo min als bestanden die van andere projecten 'geleend' werden. Voorts niet geteld zijn experimentele bestanden, allerlei perl scripts, diverse conversie hulpmiddelen, toevoegingen en hulpmiddelen. Tenslotte, glade bestanden worden niet geteld, hoewel grote delen van de algemene GUI in glade bestanden beschreven is.
Merk ook op dat KCR's geen goede maatstaf zijn voor de productiviteit van ontwikkelaars. Bovendien is wc
geen goede manier om KCR's te tellen. Veel betere metingen zijn complexiteitsstatistieken die bijvoorbeeld het aantal en de grootte van if-then-else blokken tellen, of het aantal en de groote van alle blokken, of het aantal wiskundige operatoren per statement. Misschien gebruiken we ooit wel eens zo'n hulpmiddel op deze code. Voorlopig is dit wat we hebben. Van de andere kant hebben we geprobeerd om enkel de bestanden te tellen die door mensen bewerkte code bevatten, d.w.z., bestanden die rechtstreeks door mensen bewerkt zijn. De reden hiervoor is het artificieel opblazen van de KCR tellingen te vermijden door automatisch gegenereerde code mee te tellen (dit is waarom glade bestanden niet meegeteld worden: deze zijn groot en automatisch gegenereerd).
Tabel 1. Historische ontwikkelingsstatistieken
Versie | engine | backend | register | ledger | motif | gnome | diverse app | import-export | reports | scheme | business | test | docs | interne txt | Totaal | Talen | Auteurs |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |
Elke cel geeft het volgende weer:
aantal *.c *, .h en *.scm bestanden (KCR's in *.c + KCR's in *.h + KCR's in *.scm). Al er geen *.scm bestanden zijn in de map, dan wordt enkel (KCR's in *.c + KCR's in *.h) getoond. Als er maar één enkel getal tussen haakjes staat, dan is dat het geschikte KCR-aantal voor die statistiek.
waarbij KCR == kilo-coderegels, zoals weergegeven door wc
. Zoals eerder vermeld is wc geen bijzonder goed meetinstrument, maar het is wat we beschikbaar hebben.
- engine
- Inhoud van de src/engine en de include mappen. De engine is van de motif code afgesplitst in versie 1.1. De data opslag backend (file-io, sql) is afgesplitst in de loop van versie 1.5
- backend
- Inhoud van de src/backend map (versie 1.7 en later) of van src/engine/file, src/engine/sql (versie 1.6 en eerder)
- register
- Inhoud van de src/register map (versie 1.6 en eerder) of src/register-core (versie 1.7 en later). De register code is van de motif code afgesplitst in een aparte component in versie 1.1. Zoals afgelezen kan worden uit de statistieken, is de registercode vrij stabiel gebleven. In versie 1.7 en later toont deze cel een tweede telling: het aantal coderegels in src/register/register-gnome (voordien meegeteld als deel van gnome)
- ledger
- *.c, *.h bestanden, enkel in de src map. (versie 1.6 en eerder) of in src/register/ledger-core (versie 1.7 en later)
- motif
- Inhoud van de src/motif map (versie 1.2 en eerder). De motif versie van de code is opgeheven na versie 1.2, nadat de meeste non-gui code verhuisd was naar engine, register of ledger.
- gnome
- Inhoud van src/gnome en src/register/gnome (versie 1.6 en eerder). Voor versie 1.7 en later bestaat dit uit src/gnome, src/gnome-search en src/gnome-util
- diverse app
- Inhoud van allerei mappen die verband houden met de toepassing (versie 1.7 en later): src/app-file, src/app-utils, src/calculation, src/core-utils, src/gnc-module, src/network-utils, src/tax/us
- import-export
- Code voor de import en export van diverse bestandsformaten: inhoud van de src/import-export map.
- reports
- Code om rapporten en grafieken te genereren: inhoud van de src/reports map.
- scheme
- scheme en guile code in mappen src/scm en src/guile (versie 1.6 en eerder). In versie 1.7 en later is veel van deze code verhuisd naar reports, import/export en naar individuele modules; hierdoor blijft de restcode over.
- business
- Code om functies voor kleine ondernemingen toe te voegen: inhoud van de src/business map.
- test
- Code om automatische regressietesten uit te voeren: inhoud van de src/*/test mappen.
- docs
- Gebruikersdocumentatie (enkel Engelstalig), inclusief de online hulp en handleiding (html, sgml of xml). Voor versie 1.8.4 en later telt het getal onder de streep de vertaalde, niet-Engelstalige docs (momenteel de, es, fr, pt_PT). Beide getallen zijn tamelijk moeilijk te tellen door vrij grote veranderingen in het bestandsformaat en verschillende concurrerende versies.
- interne txt
- Het aantal ontwerpdocumenten en README-bestanden bestemd voor ontwikkelaars. Dit omvat *.txt bestanden, *.texinfo bestanden en README.* bestanden in alle submappen. Voor versie 1.7 en later worden enkel deze in de src map geteld (hiermee ruim zes andere vindplaatsen negerend)
- Talen
- Het aantal talen waarin de toepassingsberichten vertaald zijn (het aantal po/*.po bestanden). Tussen haakjes het aantal berichten in de berichtenbestanden (grep msgstr po/*.po |wc), in duizendtallen.
- Auteurs
- Het aantal mensen vermeld in het AUTHORS bestand (versie 1.6 en later) of het README bestand (eerdere versies). Dit omvat hoofdontwikkelaars, instuurders van patches en vertalers. Bevat tevens extra vermeldingen uit het gnucash-docs/AUTHORS bestand die niet vermeld zijn in het gnucash/AUTHORS hoofdbestand.