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!
Si sottolinea che questo è codice sorgente (e documentazione) realizzato e corretto da umani; NON si tratta di codice generato automaticamente. Alcuni strumenti (quali glade o g-wrap) sono in grado di generare un'enorme quantità di di righe di codice automaticamente; queste non sono state conteggiate. Ogni singola riga conteggiata in questa sede, è stata più volte scritta, modificata, ordinata, regolata dal lavoro umano.
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.