Ciao Paolo,
per i tool, in maniera di molto alto livello, quello che succede che
viene prima fatta una parsata del codice (commit per commit) utilizzando
roba tipo linguist [1] (e altri tool proprietari che ci siamo scritti in
un
misto ruby/perl per capire il linguaggio dato il repo/singolo file).
Una volta che abbiamo individuato il linguaggio, per ogni linguaggio
abbiamo una collezione di tool (praticamente quelli usati da QA
engineers
[2]) che estraggono metriche. Per un Java, roba tipo java lint, pmd,
sonar,
findbugs, etc. Per un Ruby (vado a memoria) tool tipo Saikuro, Reek,
Flay,
Roodi, Tailor, etc. Usiamo poi altri tool pi generici - cross language -
come CLOC e sloccount (quest’ultimo da varie metriche interessanti
riguardo
alla man-year complexity del progetto; di per se da prendere con le
molle, ma applicato su larghe large scale un ottimo fattore
statistico).
Infine in base al version control system usato (supportiamo nel 90% dei
casi git, ma anche mercurial e svn), ci sono degli analyzer di pattern
di
commit (e.g. commit early / commit frequency) come gitinspector e
gitstats
(che abbiamo pesantemente riscritto/forkato in casa). I pattern di
commit
ci permettono anche di indiduare casi dove il repo non segue pattern
standard e quindi viene “escluso” (e.g. se ti scarichi il sorgente del
kernel e lo carichi con poche commit lo individuiamo…). Poich le
commit
seguono distribuzioni matematiche abbastanza definite, facile trovare
questi casi. Inoltre analizzando ogni singola commit, escludiamo di
attribuire a persone codice non scritto da loro (Dio benedica Git e gli
unique identifiers delle commit!)
Infine dato il linguaggio, separiamo la documentazione dal codice e ne
facciamo data mining - ci sono un monte di informazioni utili nei
commenti…
Ci sono poi molte altre metriche non necessariamente “da codice” che
teniamo in conto - per esempio, popolarit del repo, numero di fork,
numero
di contribuzioni esterne, etc. Questo ci da un senso del “ok hai scritto
per 3 anni questo progetto…ma da solo? nessuno ha mai collaborato?
gliene
frega nulla a nessuno / nessuno a parte te lo usa?”.
Spero di aver dato un senso a quello che facciamo (e questo solo per
la parte di analisi del codice - poi c’ tutta la parte di correlazione
utente su tutte le community, aggregazione sociale, data mining, text
mining, machine learning, etc.)
A presto,
~L
[1] GitHub - github-linguist/linguist: Language Savant. If your repository's language is being reported incorrectly, send us a pull request!
[2] e.g.
List of tools for static code analysis - Wikipedia
2014-02-26 9:48 GMT+01:00 Paolo P. [email protected]: