L'uso di tali sistemi è comune in molte università. La maggior parte usa MOSS[1], che è stato sviluppato alla Stanford University. Il suo funzionamento[2] è stato esplorato in un'altra risposta da Michal Young. L'ho usato personalmente nel mio ruolo di assistente all'insegnamento nei corsi di programmazione. Si può mettere un mucchio di file in esso, e sputa fuori punteggi di somiglianza. Questo non è un vero e proprio sistema di rilevamento del plagio, e non è pubblicizzato come tale.
Il problema con MOSS è che controlla solo le somiglianze all'interno della collezione di codice che gli fornisci. Non fa confronti con altre fonti. Per esempio, non controlla se il codice è stato copiato da qualche parte su Internet. Su una scala più piccola, diciamo che avete X anni di compiti che sono stati presentati per un corso, e volete controllare che nessuno stia copiando dagli studenti che hanno seguito il corso in precedenza. Dovreste inserire tutta la vostra collezione di codice per ogni singola richiesta. Questo può diventare impraticabile.
Il sistema generale più popolare per il rilevamento del plagio è Turnitin[3]. Controlla i contributi tra di loro, ma anche con Internet in generale, con i contributi precedenti e con una collezione di database accademici privati. Questo è molto più efficace. Tuttavia, è pensato per la scrittura creativa e i saggi, e non funziona molto bene per il codice, per una serie di ragioni.
La più elementare è che il codice non può essere valutato allo stesso modo del testo. MOSS usa la tokenizzazione seguita dalla creazione di ngram[4], ma questo approccio ha i suoi problemi che non sono banali. Ho fatto alcuni lavori di ricerca in Natural Language Processing nel recente passato, quindi ne ho visti alcuni di prima mano. Non so quale sistema usi la vostra università, e i suoi metodi, le sue complessità e le sue stranezze. Ma ho incontrato un sistema costruito su misura con le caratteristiche che descrivi.
Uno dei miei professori ha creato un sistema che usa tecniche di compilazione per rilevare il plagio. Cioè, non guarda affatto il codice reale. È completamente invariante rispetto allo stile e alla sintassi, e guarda invece il risultato della compilazione; cioè, guarda il funzionamento del codice. IMO, questo approccio ha la più alta probabilità di funzionare, specialmente se può essere accoppiato con il controllo in stile Turnitin contro internet in generale e altre collezioni. Posso testimoniare personalmente l'efficacia di questo sistema, essendo il professore famoso per la cattura del plagio.
Il problema principale con un tale sistema è che c'è un'alta possibilità di falsi positivi. Codice dissimile che utilizza tecniche simili per svolgere un compito potrebbe far scattare un avvertimento. Un altro problema è che non tutti i linguaggi di programmazione e i sistemi producono codice intermedio o compilato che è favorevole a questa tecnica. In terzo luogo, diversi linguaggi di programmazione potrebbero essere più o meno adatti a questo tipo di valutazione. Infine, alcuni compilatori possono usare ottimizzazioni che producono diversi tipi di codice oggetto per lo stesso identico codice di alto livello.
La linea di fondo è che questo è un problema aperto, e che nessuna tecnica è perfetta. Tuttavia, è sicuramente possibile costruire un sistema adeguato e fattibile per rilevare il plagio nel codice. È anche sicuramente possibile imbrogliare un tale sistema. Io sono stato in grado di farlo (non su un compito vero e proprio, ma come compito secondario con la piena conoscenza e cooperazione del professore). Non ho intenzione di dare consigli per farlo, ma devo dire che cambiare i nomi di funzioni e variabili è un metodo estremamente inadeguato e dilettantesco.
Footnotes
[1] Plagiarism Detection[2] http://theory.stanford.edu/~aiken/publications/papers/sigmod03.pdf[3] Turnitin - Wikipedia[4] n-gram - Wikipedia