Dimensioni
Può rivelarsi interessante studiare le statistiche del codice sorgente relativamente a un progetto di sviluppo di un programma. Niente di originale: dopotutto si tratta di contabilità. GnuCash è cresciuto nel corso degli anni da un piccolo e pratico registro degli assegni elettronico, fino a divenire un'applicazione desktop relativamente estesa e con molte caratteristiche.
GnuCash attualmente consiste di oltre un terzo di milione di linee di codice distribuite in oltre un migliaio di file. È stato tradotto in 23 lingue e allo sviluppo hanno contribuito oltre 139 persone fra autori e collaboratori.
Nel caso non ci si rendesse conto del volume di codice sorgente, lo si può immaginare in questo modo: stampato su carta, e rilegato in volumi, ammonterebbe a diverse dozzine di copie di "Guerra e pace" di Tolstoy, circa la larghezza di una libreria di codice sorgente!
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.
Dato che sono segnalati su bugzilla circa 400 bug non risolti, significa che che mediamente è presente un bug per ogni centinaio di linee di codice, o anche un bug ogni 50 pagine stampate. Questo numero di bug è tutt'altro che atipico per i progetti di sviluppo di programmi: si può affermare che è nella norma.
La tabella seguente mostra i dati storici relativi al numero di linee di codice e al numero di file per il progetto di sviluppo di GnuCash. Non sono contabilizzate tutte le linee di codice: per esempio, i file Makefiles, configure.in e autogen.sh non sono contati. Anche i file generati automaticamente non sono stati considerati, come anche i file "presi in prestito" da altri progetti. Non sono contati neanche i file sperimentali, i vari script di perl, gli addon e le utility. Infine, non sono contabilizzati nemmeno i file glade anche se buona parte dell'interfaccia grafica è descritta nei file di questo tipo.
Si noti anche che le KLOC non rappresentano una misura attendibile della produttività di un programmatore, e anche che wc non è il modo più adatto per conteggiare le KLOC. Misurazioni migliori derivano da conteggi complessi che, per esempio, esaminano il numero e la dimensione di tutti i blocchi, o il numero di operatori matematici per espressione. Forse un giorno il codice di GnuCash verrà analizzato con uno di questi strumenti; per ora questo è quello che si ha a disposizione. D'altra parte, si è cercato di conteggiare solamente quei file che contengono codice elaborato esclusivamente da umani. Questo è stato fatto per evitare di aumentare il valore delle KLOC includendo anche il codice generato automaticamente (per questo motivo i file di glade non sono computati: sono molto grandi e generati in automatico).
Tabella 1. Statistiche storiche di sviluppo
| Versione | engine | backend | register | ledger | motif | gnome | applicazioni varie | import-export | reports | scheme | business | test | docs | txt interni | Totale | Lingue | Ringraziamenti |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 |
Ogni cella visualizza:
numero di file *.c, *.h e *.scm (KLOCS in *.c + KLOCS in *.h + KLOCS in *.scm). Se non sono presenti nella directory dei file di tipo *.scm, allora sono visualizzati solamente (KLOCS in *.c + KLOCS in *.h). Se tra le parentesi è presente un solo numero, questo rappresenta il conteggio KLOC appropriato per quella statistica.
dove KLOC == kilo-lines-of-code (migliaia di linee di codice), come riportato da wc. Come messo in evidenza in precedenza, wc non è un perfetto contatore di codice, ma è ciò che si ha a disposizione.
- engine
- Contenuto della directory src/engine e delle sue sotto directory. Il motore è stato separato dal codice motif nella versione 1.1. Il backend per l'archiviazione dei dati (file-io, sql) è stato separato nel corso della versione 1.5.
- backend
- Contenuto della directory src/backend (versione 1.7 e successive) o di src/engine/file, src/engine/sql (versione 1.6 e precedenti)
- register
- Contenuto della directory src/register (versione 1.6 e precedenti) o src/register/register-core (versione 1.7 e successive) . Il registro è stato separato dal codice motif della versione 1.1. Come si può notare dalle statistiche, il codice del registro è piuttosto stabile. A partire dalla versione 1.7, questa cella mostra un secondo conteggio: il numero di linee di codice in src/register/register-gnome (prima conteggiate come parte di gnome)
- ledger
- file *.c, *.h nella sola directory src (versione 1.6 e precedenti) o src/register/ledger-core (versione 1.7 e successive)
- motif
- Contenuto della directory src/motif (versione 1.2 e precedenti). La versione in motif del codice è stata abbandonata dopo la versione 1.2, allorché la maggior parte del codice non relativo all'interfaccia grafica è stato spostato o al motore,o al registro o al libro mastro.
- gnome
- Contenuto della cartella src/gnome e src/register/gnome (versione 1.6 e precedenti). Per la versione 1.7 e successive, consiste di src/gnome, src/gnome-search e src/gnome-util
- applicazioni varie
- Contenuto delle directory relative ad applicazioni varie (versione 1.7 e successive): src/app-file, src/app-utils, src/calculation, src/core-utils, src/gnc-module, src/network-utils, src/tax/us
- import-export
- Codice per l'importazione e l'esportazione di file in vari formati: contenuto della directory src/import-export
- reports
- Codice per la generazione di resoconti e grafici: contenuto della directory src/reports
- scheme
- Codice in scheme e guile nelle directory src/scm e src/guile (versione 1.6 e precedenti). Nella versione 1.7 e successive, la maggior parte di questo codice è stato destinato ai resoconti, all'importazione ed esportazione e ai moduli individuali; di conseguenza rimane solamente del codice vario.
- business
- Codice per l'implementazione di funzioni dedicate alle piccole imprese: contenuto della directory src/business
- test
- Codice per l'esecuzione di test di regressione automatici: contenuto delle directory src/*/test.
- docs
- Documentazione dell'utente in lingua Inglese, inclusi l'aiuto in linea e il manuale (html, sgml o xml). Per la versione 1.8.4 e successive, il numero sotto alla barra si riferisce alla documentazione tradotta (attualmente de, es, fr, pt_PT). Entrambi questi valori sono abbastanza difficili da calcolare a causa dei vari formati e versioni.
- txt interni
- Il numero di documenti di progetto e di file README rivolti agli sviluppatori. Sono inclusi i file *.txt, *.texinfo e README.* in tutte le sotto directory. Per la versione 1.7 e successive, sono state contate solamente quelli nella sotto directory src (lasciandone fuori qualche mezza dozzina sparpagliata qua e là)
- Lingue
- Il numero di lingue in cui i messaggi dell'applicazione sono stati tradotti (il numero di file po/*.po ). Tra parentesi, è riportato il numero in migliaia di messaggi nei file dei messaggi (grep msgstr po/*.po |wc)
- Ringraziamenti
- Il numero di persone riportate nel file AUTHORS (versioni 1.6 e successive) o nel file README (versioni precedenti). Sono inclusi gli sviluppatori principali, coloro che hanno fornito delle patch e i traduttori i cui nomi sono riportati nel file docs/AUTHORS e non nel file principale gnucash/AUTHORS.


