Cómo desarrolló mi universidad un software para detectar similitudes de código en los trabajos de los estudiantes?

El uso de estos sistemas es común en muchas universidades. La mayoría utiliza MOSS[1], desarrollado en la Universidad de Stanford. Su funcionamiento[2] ha sido explorado en otra respuesta por Michal Young. Personalmente, lo he utilizado en mi papel de asistente de profesor en cursos de programación. Puedes poner un montón de archivos en él, y escupe las puntuaciones de similitud. Este no es un sistema de detección de plagio real, y no es facturado como tal.

El problema con MOSS es que sólo comprueba las similitudes dentro de la colección de código que usted alimenta a él. No compara con otras fuentes. Por ejemplo, no comprueba si el código ha sido copiado de algún lugar de Internet. En una escala más pequeña, digamos que usted tiene X años de tareas que se han presentado para un curso, y quiere comprobar que nadie está copiando de los estudiantes que han tomado previamente el curso. Tendrías que introducir TODA tu colección de código para cada una de las consultas que dispares. Esto puede llegar a ser inviable.

El sistema general más popular para la detección de plagio es Turnitin[3]. Comprueba los envíos entre sí, pero también contra el Internet general, los envíos anteriores, y contra una colección de bases de datos académicas privadas. Es mucho más eficaz. Sin embargo, está pensado para la escritura creativa y los ensayos, y no funciona muy bien para el código, por una serie de razones.

La más elemental es que el código no puede ser evaluado de la misma manera que el texto. MOSS utiliza la tokenización seguida de la creación de ngramas[4], pero este enfoque tiene sus propios problemas que no son triviales. He realizado algunos trabajos de investigación en Procesamiento del Lenguaje Natural en el pasado reciente, así que he visto algunos de ellos de primera mano. No sé qué sistema utiliza su universidad, ni sus métodos, complejidades y peculiaridades. Pero me he encontrado con un sistema construido a medida con las características que describes.

Uno de mis profesores ha creado un sistema que utiliza técnicas de compilación para detectar el plagio. Es decir, no mira para nada el código real. Es completamente invariable de estilo y sintaxis, y en su lugar mira el resultado de la compilación; es decir, mira el funcionamiento del código. En mi opinión, este enfoque es el que más probabilidades tiene de funcionar, especialmente si se puede combinar con una comprobación al estilo de Turnitin en Internet y otras colecciones. Puedo atestiguar personalmente la eficacia de este sistema, siendo el profesor notorio en la detección de plagio.

El principal problema con un sistema de este tipo es que hay una alta posibilidad de falsos positivos. Un código diferente que utiliza técnicas similares para llevar a cabo una tarea podría disparar una advertencia. Otro problema es que no todos los lenguajes y sistemas de programación producen código intermedio o compilado que se preste a esta técnica. En tercer lugar, diferentes lenguajes de programación pueden ser más o menos adecuados para este tipo de evaluación. Por último, algunos compiladores pueden utilizar optimizaciones que producen diferentes tipos de código objeto para exactamente el mismo código de alto nivel.

La conclusión es que se trata de un problema abierto, y que ninguna técnica es perfecta. Sin embargo, es definitivamente posible construir un sistema adecuado y viable para detectar el plagio en el código. También es posible engañar a dicho sistema. Yo he sido capaz de hacerlo (no en una tarea real, sino como una tarea secundaria con el pleno conocimiento y la cooperación del profesor) . No voy a dar consejos para hacerlo, pero debo decir que cambiar los nombres de las funciones y variables es un método extremadamente inadecuado y amateur.

Notas

[1] Detección de plagio[2] http://theory.stanford.edu/~aiken/publications/papers/sigmod03.pdf[3] Turnitin - Wikipedia[4] n-gram - Wikipedia