Copié (y no pude citar) dos líneas de código de la fuente OpenJDK para un proyecto de estructuras de datos de pregrado. Sin embargo, la comparación de códigos muestra una cantidad alarmante (40%) de similitud. Aquí está la comparación lado a lado con mi archivo.
Con base en estos motivos, mi profesor quiere darme un -100 % en la tarea, lo que reduciría mi calificación general en un 15 % en total, lo que probablemente provocaría que no llegue a la pared C (dependiendo de qué tan bien lo haga en la prueba). examen final). Por esta razón (y mi conciencia), decidí apelar.
Sin embargo, creo que la mayor parte de la similitud en el informe proviene de mi copia de las líneas 142-152:
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
No cité estas dos líneas, pero tenía la intención de borrarlas más adelante.
De hecho, toda esta función se puede eliminar sin afectar en absoluto al programa, lo que da como resultado esta comparación de archivos.
Entonces, solo las líneas 114-126 son un problema:
MyEntry<K, V>[] newArr = new MyEntry[newSize];
// Copy
for (int i = 0; i < data.length; i++) {
MyEntry<K, V> e = data[i];
if (e != null) {
data[i] = null;
do {
MyEntry<K, V> next = e.next;
int j = e.hash % newSize;
e.next = newArr[j];
newArr[j] = e;
e = next;
} while (e != null);
Sin embargo, este fragmento es mío. Escribí estas líneas sin hacer referencia a HashMap.java , y este es un algoritmo común para encadenar que puedo explicar a fondo y que conozco desde hace años.
Sí, sé que el hecho de que copié las otras dos líneas compromete mi integridad y convertí el 20 % en un 40 % para empezar, entonces, ¿cómo puedo probar esto?
No estoy seguro de cómo defender todo este caso ante una Junta de Conducta Estudiantil que sabe muy poco sobre programación. Mi audiencia con la junta es dentro de un mes. ¿Estos dos fragmentos de código constituyen plagio de todo mi proyecto? ¿Es justo un -15 % de mi calificación general?
Notas al margen:
java.util.*
(como más de 1k líneas para cada proyecto en 8 días), y no copié ningún otro código. Diría que la implementación de la estructura de datos real solo debe tomar alrededor de 1/5 de nuestro tiempo invertido por proyecto.Parece muy probable que haya plagiado, y si este es el caso, sería mejor proceder reconociendo su error que continuar discutiendo.
Mirando su código, hay mucho que parece haber sido tomado del archivo HashMap.java. Sospecho firmemente que comenzó con este código y luego lo modificó para producir su propio código, o lo siguió de cerca como plantilla al escribir el suyo propio. Las secciones de código resaltadas han recogido algo de esto, pero otras secciones también se parecen mucho al otro archivo, aunque con comentarios y orden ligeramente alterados.
Si este es el caso, entonces el código que nos ha mostrado no es su propio trabajo original, sino una versión plagiada de HashMap.java. Dejar las dos líneas que no están conectadas es una prueba irrefutable del vínculo que probablemente sea concluyente para el panel. Su punto de que son innecesarios en realidad contará en su contra porque no podrá explicar por qué están allí en absoluto. Y ya sea que esta haya sido su intención o no, es probable que el panel (y su profesor) vean sus cambios en los comentarios y el orden como un intento de encubrir sus huellas y ocultar su plagio de las herramientas automatizadas.
Es más probable que el panel muestre indulgencia con un estudiante que parece al menos arrepentido y reconoce que ha cometido un error, que con un estudiante que niega haber actuado mal frente a pruebas aparentemente muy sólidas.
En mi opinión, el título de su pregunta "¿dos líneas de código copiado constituyen plagio?" no es exactamente exacto.
Creo que le resultará muy difícil argumentar que esto no es/no fue plagio. Las similitudes entre su código y HashMap.java no terminan en las dos líneas o en un solo "algoritmo común".
1) Escogió exactamente la misma capacidad y factor de carga predeterminados:
/** Has to be a power of 2 */
private static final int DEFAULT_CAPACITY = 16;
/** The load factor */
private static final float DEFAULT_LOAD_FACTOR = 0.75f;
versus
// The default initial capacity - MUST be a power of two.
static final int DEFAULT_INITIAL_CAPACITY = 16;
// The load factor used when none specified in constructor.
static final float DEFAULT_LOAD_FACTOR = 0.75f;
De hecho, el comentario "Tiene que ser una potencia de 2" ya significa que lo atraparon con las manos en la masa, porque, de hecho, no hay una buena razón para requerir que la capacidad sea una potencia de dos en su código. El hecho de que el tamaño sea una potencia de dos solo se usa para una optimización en la versión HashMap.java del código, y esta optimización no se usa en su código. Probablemente tengas suerte de que la junta de conducta estudiantil no sepa mucho sobre programación.
2) Los dos get
métodos son muy similares:
public V get(K key) {
if (key == null)
return null;
int hash = key.hashCode() % data.length;
// System.out.printf("Getting %d %d %s\n", key.hashCode(), hash,
// key.toString());
for (MyEntry<K, V> e = data[hash]; e != null; e = e.next) {
if (e.hash == hash && (e.getKey() == key || key.equals(e.getKey())))
return e.getValue();
}
return null;
}
versus
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
Parece extraño que ambos eligieran exactamente la misma forma muy específica de hacer la comparación de claves (primero comparando los hashes, luego los punteros de las claves y finalmente usando key.equals).
3) ...como es el put
-método:
public MyEntry<K, V> put(K key, V value) {
int hash = key.hashCode();
// System.out.printf("Adding %d %d %s\n", key.hashCode(), hash, key.toString());
int i = hash % data.length;
// Collisions
for (MyEntry<K, V> e = data[i]; e != null; e = e.next) {
if (e.hash == hash && (e.getKey() == key || key.equals(e.getKey()))) {
MyEntry<K, V> old = e;
e.setValue(value);
return old;
}
}
addEntry(hash, key, value, i);
return null;
}
versus
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
4) ...como son los métodos add
y grow
:
void addEntry(int hash, K key, V value, int bucketIndex) {
MyEntry<K, V> e = data[bucketIndex];
data[bucketIndex] = new MyEntry<>(hash, key, value, e);
keyList.add(key);
if (size++ >= threshold)
grow();
}
/**
* Grows the array 2x current size
*/
private void grow() {
int newSize = 2 * data.length;
@SuppressWarnings("unchecked")
MyEntry<K, V>[] newArr = new MyEntry[newSize];
// Copy
for (int i = 0; i < data.length; i++) {
MyEntry<K, V> e = data[i];
if (e != null) {
data[i] = null;
do {
MyEntry<K, V> next = e.next;
int j = e.hash % newSize;
e.next = newArr[j];
newArr[j] = e;
e = next;
} while (e != null);
}
}
data = newArr;
threshold = (int) (newSize * DEFAULT_LOAD_FACTOR);
}
versus
void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<>(hash, key, value, e);
if (size++ >= threshold)
resize(2 * table.length);
}
void transfer(Entry[] newTable) {
Entry[] src = table;
int newCapacity = newTable.length;
for (int j = 0; j < src.length; j++) {
Entry<K,V> e = src[j];
if (e != null) {
src[j] = null;
do {
Entry<K,V> next = e.next;
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
} while (e != null);
}
}
}
Por supuesto, una HashTable es una estructura de datos bastante común y hay pocas formas de implementar un algoritmo dado. Sin embargo, las dos líneas copiadas muestran que definitivamente usó HashTable.java como punto de partida para su propia implementación, y las similitudes adicionales en el diseño, los comentarios ilógicos y la estructura del código lo llevarían a creer que tomó más que solo un pequeña "inspiración" de HashTable.java.
Tenga en cuenta que tanto su método como el método put y get utilizan un bucle for para iterar sobre una lista enlazada, mientras que los métodos de crecimiento/transferencia utilizan un bucle while para hacer lo mismo. Parece extraño que ambas piezas de código tomen esta misma decisión de forma independiente.
Nuestros proyectos son bastante extensos ya que no se nos permite usar java.util.* (como 1k+ líneas para cada proyecto en 8 días), y no copié ningún otro código. Diría que la implementación de la estructura de datos real solo debe tomar alrededor de 1/5 de nuestro tiempo invertido por proyecto.
Parece claro que no se le permitió usar HashMap.java y que, si hubiera querido usar una tabla hash, necesitaría implementar la suya propia. Al copiar grandes partes de HashMap.java, ha intentado eludir esta restricción. "Es solo una pequeña parte del proyecto" no quita el hecho de que tomó el código, que no era su propio trabajo, y trató de hacerlo pasar como propio (aunque la expectativa era que escribiría esto parte de la tarea usted mismo).
Si las asignaciones fueran realmente poco realistas dado el lapso de tiempo asignado, hubiera sido mejor entregar una solución fallida. Si muchos estudiantes entregaron una solución fallida, el profesor podría haber considerado la posibilidad de que la tarea fuera demasiado difícil. Si el plagio hubiera pasado desapercibido, entonces el profesor podría haber concluido (incorrectamente) que la tarea tenía la dificultad adecuada, penalizando a los estudiantes que (intentaron) completar la tarea de manera justa y de acuerdo con las reglas.
Las sanciones por plagio pueden variar mucho según la institución. -100% en su asignación podría ser una mano dura, pero en nuestra institución la sanción podría haber sido desde 0% en la asignación, una suspensión automática del curso en cuestión hasta la expulsión de sus estudios durante 12 meses. El plagio, en la mayoría de las instituciones, se trata de manera similar a hacer trampa en un examen y los castigos pueden ser estrictos. Si el único castigo fuera obtener 0% en la tarea plagiada, entonces no habría ningún daño en "intentar" plagiar si de todos modos reprobaras la tarea sin recurrir al plagio.
size()
"Devuelve el número de asignaciones de clave-valor en este mapa"? al ambiguo "Devuelve el tamaño de la matriz"?El plagio es hacer pasar el trabajo de otra persona como propio. Por lo que veo, has pasado el trabajo de otra persona como propio. En su defensa, proporciona una lista de declaraciones:
No puedo ver cómo alguno de ellos es relevante para el problema en cuestión. La pregunta central es: ¿ha utilizado el trabajo de otra persona en el suyo propio sin referencias? Si lo hiciste, plagiaste y te enfrentas a las consecuencias. Aprende la lección y no vuelvas a repetir el error.
i++;
sería plagio excepto por el primer uso histórico de esta línea. Espero que sea obvio lo ridículo que sería si se manejara así. Debería haber un límite claramente definido, pero no he oído hablar de ninguno...Preguntas que debes hacerte:
Aunque el tema del plagio cruza diferentes campos, no todos los campos son iguales. Escribir un programa no es lo mismo que escribir un ensayo. Aunque ambos comparten componentes similares de pensamiento, gramática = tabuladores/espacios, sustantivos = objetos, preposiciones = punteros, etc. Funcionalmente son diferentes. Como parte de su tarea, ¿mencionó que obtuvo las secciones de código de una biblioteca de código abierto? Incluso si no fuera una cita formal, ¿tal vez dentro de los comentarios que vinculan a la biblioteca?
Si la tarea fuera sumar una lista de enteros. ¿Sería plagio si el código de 10 programadores usara sum (objeto)?
un algoritmo común para el encadenamiento que puedo explicar a fondo
Aquí es donde debe argumentar que hay un punto en el que una determinada pieza de código se ha convertido en información común, pero debe demostrar que, de hecho, es común. Un no experto no tendría el conocimiento previo para suponer que lo que dices es correcto. Tendrías que dar ejemplos. (Piense en Hello World, ¿quién realmente lo 'posee'?)
IANAL, pero parecería que la ley en sí misma es complicada.
Más del 30 % de la clase ha sido denunciado por violaciones de la integridad académica en proyectos durante el semestre, y el profesor recién graduado no parece pensar que él mismo o sus tareas sean el problema.
Un profesor de ciencias de la computación no es un abogado, pero él o ella ciertamente tiene la capacidad de comprender las preguntas de las ciencias de la computación y preguntarse a sí mismo si hay o no una intención maliciosa involucrada. Si los reclamos de plagio se pueden abordar con un documento simple donde cita sus fuentes (bibliotecas, proyectos de código abierto, repositorios de github), entonces los reclamos deberían disminuir.
El conocimiento y el aprendizaje no ocurren en el vacío.
Gracias por esto. Como dije antes, citar código es extraño para mí (y he estado programando desde los 8 años), y NO (pero DEBERÍA haber) citado esas líneas. Sin embargo, olvidar citar dos líneas y cometer plagio en todo el proyecto son dos cosas diferentes, especialmente en un proyecto de este tamaño. ¿Cómo abordarías eso?
Usted argumenta que las pruebas actuales para determinar el plagio (como en inglés) no funcionan bien cuando se trata de programación y secuencias de comandos, citar y documentar sus fuentes es funcionalmente diferente. En un ensayo, la cita es para demostrar de dónde sacaste la idea. En un programa, es para documentar cómo el fragmento de código lo ayudará a lograr sus objetivos. El propósito cambia de 'dar crédito donde se debe' a 'cómo va a ayudar esto y qué hace'.
Con esto en mente, mira "hola mundo". Es una introducción universalmente conocida a los lenguajes de programación. Pero ningún programador experimentado necesita 'citarlo' para entenderlo. Se ha vuelto 'común' en todos los idiomas. Sin embargo, un compilador específico en C que le permita controlar un brazo robótico no es lo suficientemente común como para que un programador experimentado (independientemente del idioma) lo reconozca fácilmente, de ahí la necesidad de documentación. Sin embargo, dentro del mundo de Java, depende de usted demostrar que el código que utiliza es lo suficientemente 'común' como para no requerir una cita.
En cuanto al caso en sí, puede argumentar que sus acciones no constituyen las definiciones tradicionales y prueban el plagio. Pero no espere que su audiencia (compañeros) entiendan dada la severidad y las credenciales del demandante (su profesor). Otra vía sería argumentar cómo la severidad del castigo -100% no es consistente con el alcance del presunto plagio. Se alega, no se prueba. Hasta que se emita un juicio definitivo, está abierto a debate.
Reprobar a un estudiante unilateralmente por plagio sería y debería ser apelado a una "autoridad superior" o, al menos, revisado por un panel de personas con conocimientos (en lugar de laicos). Dijo que esta clase tiene un porcentaje (en mi opinión, enorme) de reclamos de plagio. Si bien no tengo estadísticas para respaldar mi declaración, el 30% es ridículamente alto. En mi carrera académica, el plagio era un hecho RARO. Entonces, otro punto que puede señalar es si el profesor está aplicando incorrectamente el concepto de plagio tradicional a un campo en el que es fundamentalmente diferente.
Otro argumento que puede hacer es que el profesor de la clase nunca enseñó/enfatizó/esperaba la cita del código. Antes te enseñaron qué era el plagio, muy probablemente cuando se trataba de redactar ensayos, pero nunca te enseñaron cómo se aplicaba a la codificación. Aunque a este argumento puede faltarle una o dos patas (especialmente en el ámbito de, ya debería saberlo), pero ¿cómo sería razonable responsabilizarlo por algo que nunca le han enseñado a cuidar?
Gracias, ese es un buen punto para plantear. Simplemente usa MOSS de Stanford, como vinculé en el OP. No conozco su límite de porcentaje de similitud antes de acusar a la gente.
Un detector de plagio como ese es una herramienta para dar crédito a que X fue plagiado, una herramienta entre muchas. De ninguna manera es una prueba definitiva para determinar el plagio.
Tome una prueba de aliento para DUI, por ejemplo, si comí semillas de amapola y di positivo, ¿habría factores atenuantes ? Si todo lo que su profesor está usando para determinar el plagio es una herramienta, pregunte si las herramientas pueden tener fallas o no.
Aunque esto es más retórica y lógica que programación, estoy seguro de que nadie puede afirmar que un programa es perfecto. (Excepto COBOL, porque es 100% perfecto) Entonces, si de hecho es la única métrica que usa su profesor, ¿cuál es la posibilidad de falsos positivos ? ¿Sería justo castigar injustamente a los estudiantes si un programa determina que hicieron trampa?
Dicho esto, lea su manual del estudiante si puede tener un asesor académico durante el proceso. También comuníquese con los servicios de su ombudsman si su escuela tiene uno. Esta oficina puede arbitrar asuntos como este si la institución lo permite.
En mi opinión, un panel de compañeros de estudios (sin antecedentes legales o de programación) no sería el más adecuado para determinar si ocurrió un plagio de programación.
Aclare, ¿es -100% en realidad 0%? ¿O su profesor no solo le está dando un 0% por la tarea, sino que también lo está penalizando con una cantidad adicional? Es decir, A+B+C=100 (A=20,B=20,C=60), un 0 % en A significaría un total de 80 %, un -100 % en A significaría un total de 40 %. - Azulejo
Me está penalizando aún más con una cantidad adicional. No recibiría un cero en el proyecto (que mi calificación podría permitirse), pero en realidad mi calificación general se ve perjudicada MÁS que el 7% que vale el proyecto. –TheSmartWon
Algo complicado aquí... (dada la actualización) si la junta falla a su favor, esto no significa que el profesor lo trataría como lo haría con otros estudiantes en el futuro. Es posible que te encuentres bajo un escrutinio aún más cercano.
@ user2264247 Miró el MOSS conmigo durante unos 5 minutos hoy (exactamente el que publiqué en el OP), y solo se centró en esa función hash. Ni siquiera sabía qué hacía la función antes de que habláramos, así que no creo que la haya revisado previamente. Él y su colega (no sé por qué ella estaba en la habitación) dijeron que porque copié dos líneas, todo mi programa es culpable de plagio y que me acusarían. Realmente no parecían pensarlo dos veces ni preocuparse por ello, probablemente debido a la gran cantidad de casos por los que pasan. – TheSmartWon
@FrankFYC Ese colega y él también publican artículos juntos e imparten cursos complementarios. Ellos son buenos amigos. Es solo su nombre acusándome en el "informe de violación de la integridad", pero lo mencionaré con seguridad. No tengo idea de lo que estaba haciendo en la habitación, todo lo que hizo fue descartar rápidamente todos mis argumentos que, de lo contrario, mi profesor podría haber escuchado . Le trajo alegría demostrar que estaba equivocado en cada punto que planteé, fue un poco sádico. ¡Era como otro insecto atrapado en su red! – TheSmartWon
Si esto fuera Estados Unidos. Lea acerca de FERPA . No soy un experto, pero presumiría que si su profesor le permitiera a otro miembro de la facultad ver sus calificaciones, sería una violación. Este podría ser el acto que les explote en la cara. Si se encuentra en los EE. UU., asegúrese de establecer el hecho de que ambos profesores estaban en la misma sala que usted cuando discutieron el informe.
Consulte la respuesta de aeismail a una pregunta .
Dada la cantidad de otros casos, ¿supondría que el otro profesor también estuvo en esos casos? Como en, ¿el otro profesor estaba al tanto de la calificación de otro estudiante?
Pueden negarlo todo lo que quieran, pero si más de un estudiante afirma que ambos profesores estaban en la sala, esto sería en efecto, un problema de acción de clase (ja, perdón por el juego de palabras).
Documente todo y programe una cita con el coordinador de FERPA de su universidad (como un departamento creado para recibir quejas de FERPA).
A primera vista, su argumento parece totalmente razonable. Es decir, si copió dos líneas de código (suponiendo que eso estaba permitido) pero simplemente no incluyó una cita u olvidó eliminarla (como ha afirmado), entonces eso podría atribuirse básicamente a un error honesto, en -par con un error tipográfico. Tal error sería desafortunado, pero difícilmente merecería un castigo mayor.
Sin embargo, como otros han notado, una mirada más cercana al código hace que parezca que usted copió completamente el código original y luego hizo todo lo posible para tratar de ofuscar ese hecho. Esto hace que toda la simpatía se vaya por la ventana; en todo caso, es posible que te estés bajando demasiado a la ligera.
Pero, luego está su atractivo. La apelación en sí parece estar basada en una premisa deshonesta, al igual que esta pregunta. ¡Parece que estás mintiendo al consejo de honor!
Tal mentira parecería ser motivo de más castigo. Es decir, primero fue el engaño -cuya gravedad ahora ha llamado la atención- y luego también la defensa aparentemente fraudulenta.
no se que decirte Por un lado, esto es bastante asqueroso y en realidad podría ser mejor si aprendieras la lección ahora. Pero como respuesta a esta pregunta, suponiendo que está tratando de minimizar el castigo, parecería que desearía salir de la apelación y dejar las cosas en paz, en lugar de arriesgarse a empeorarlas.
En el sistema legal estadounidense, a veces se piensa que los acusados pueden alegar inocencia sin más sanciones si luego se descubre que esa afirmación es falsa. Esto se deriva de la Quinta Enmienda de la Constitución de los Estados Unidos , que otorga protección contra la autoincriminación.
La parte divertida de esto es que, si ve muchos programas del tipo Law-and-Order (como hacen muchos estadounidenses), puede estar acostumbrado a la idea de que los acusados pueden mentir sobre no ser culpables sin recibir una sanción, lo cual podría inclinarse a aplicar a otros entornos similares a los de un tribunal, por ejemplo, una revisión del consejo de honor.
Lo que pasa es que los consejos de honor no son tribunales de justicia; no aplica el derecho a no autoincriminarse. Entonces, si mientes en tu defensa ante un consejo de honor, aún estás mintiendo ante las mismas personas que te juzgarán por esa mala conducta.
Editar: Fui a verificar los hechos sobre este punto, y parece que la Corte Suprema dictaminó que mentir en defensa propia puede aumentar las sentencias:
La Corte Suprema dictaminó hoy por unanimidad que los acusados de delitos que suben al estrado y testifican falsamente en su propia defensa pueden estar constitucionalmente sujetos a tiempo adicional en prisión por obstruir la justicia.
La decisión revocó un fallo de un tribunal federal de apelaciones en Richmond, que sostuvo en 1991 que la Constitución prohíbe a los jueces imponer una sentencia adicional según las pautas federales como castigo por "una negación de culpabilidad bajo juramento incrédula".
- "La corte dice que el testimonio falso puede traer una sentencia más larga" , NYTimes (1993).
Entonces, aparentemente, los acusados pueden ser sancionados por mentir en su propia defensa, incluso en los tribunales estadounidenses.
Puede que no haya muchos algoritmos razonables que implementen el encadenamiento, pero hay literalmente miles de millones de posibles algoritmos hash de 32 bits. No tiene sentido afirmar que uno de ellos en particular es "de conocimiento común", o que está publicado bajo GPL, o que estabas a punto de eliminarlo. Si lo eliminara , su caso se vería completamente diferente y diría que debería reclamar una duplicación independiente. En su posición actual, no creo que pueda convencer a nadie de que ha elegido el mismo algoritmo hash independientemente de OpenJDK.
Así que creo que su mejor opción es reconocer la irregularidad y luego argumentar que la cantidad de código realmente plagiado es relativamente pequeña y que la sanción que su profesor quiere aplicar es desproporcionada.
Tengo experiencia tanto en la enseñanza (y en el manejo del plagio) como en litigios y patentes de software.
He calificado grupos de tareas que muestran el mismo error o la misma imperfección. He visto a estudiantes que no pueden iniciar su IDE con soluciones de tarea concisas y expertas, donde todas las variables tenían nombres como "elContador", "variableA" y "yo mismo", pero aparte de eso, parecía que su autor ya tenía 10 años de experiencia en el campo, y claramente no necesita un título universitario.
Un caso de patente de software puede reducirse a probar que una sola línea como "x=0" ha sido plagiada. Esto incluye probar el motivo, las personas (el hecho de que la empresa A haya atraído a personas de la empresa B) y el estado del arte en el momento del presunto plagio (y no ahora, cuando el enfoque propuesto es obvio para todos). Los juicios de patentes de software no son discusiones estériles sobre cómo se desempeñó el algoritmo de Smith-Waterman en el código del demandante y del demandado.
En tu caso, parece que al menos "miraste" el código OpenJDK antes de iniciar el tuyo. La evidencia irrefutable es la función hash: la probabilidad de replicar esto por casualidad, según Mr. Data y C-3PO, es una en 67 billones de billones. Está más claro que no estaba buscando una función hash, sino una implementación de mapa hash. La búsqueda de "función hash para cadenas" o "función hash para cadenas java" no arroja ningún resultado de OpenJDK.
Una vez que haya visto la implementación OpenJDK de hashMap, el problema fue sencillo para usted. De todas las formas posibles de abordar el hashMap, consciente o no, has elegido la de OpenJDK, porque estabas terriblemente sesgado.
Sus comentarios de código son inútiles. Comentar "longitud" como "la longitud" demuestra que no comprendió el problema, y el objetivo de comentar aquí es simplemente cumplir con un requisito de calificación. Pierdes el tiempo del calificador. Lo correcto sería: "hash = el Hash del elemento a buscar", "Longitud: el tamaño de la tabla hash" "devuelve la posición en la tabla hash de longitud especificada para el elemento de hash h. Nunca excede la longitud menos uno". Además, dice "obtener devuelve el valor en el índice", lo cual es flagrantemente incorrecto para un mapa hash. Get devolvería el valor en la clave. Mezclar clave e índice es un "delito capital" si hace estructuras de datos.
Mi juicio aquí sería "culpable de los cargos". No dedicó tiempo a pensar en la solución, pero tomó una solución existente y probablemente la implementó de forma independiente. Derrotó el propósito de la tarea, que tenía la intención de hacerte pensar en estructuras de datos. Citar la fuente de OpenJDK solo haría que su culpa sea más obvia (un caso clásico de autoincriminación durante la defensa). Es como si te dieran un problema de matemáticas y terminaras citando el libro y la página que muestra la solución del problema. Hiciste un buen trabajo de búsqueda, pero la intención del problema era que lo resolvieras.
Otras respuestas han abordado cuestiones filosóficas/morales como "¿Es plagio?" "¿Está mal?" etc. Pero, diría que debería centrarse en el problema práctico en cuestión, que es:
No estoy seguro de cómo defender todo este caso ante una Junta de Conducta Estudiantil.
Así que tienes un caso que discutir...
Primero, lea los documentos legalmente relevantes:
Luego determine si se le permite, y si es una buena idea, ser representado por alguien: un abogado; un estudiante de derecho; un miembro de la facultad; un miembro del consejo estudiantil, etc. Si eso está disponible para ti, al menos deberías consultar a uno (incluso si no terminas llevándolos contigo), seguramente tienen más experiencia que tú.
Ahora, determina si realmente quieres argumentar que "esta parte de lo que copié no constituye plagio". Tal vez podrías hacer ese argumento, no lo sé. Incluso para los legos: si tiene suficiente tiempo (que puede que no tenga), puede explicar cómo se compilan los programas a partir del código fuente y cómo algunos códigos no se usan realmente. Podría presentar ejemplos de lo que parece un plagio, pero en realidad es un código casi idéntico escrito de forma independiente por diferentes personas.
Francamente, dudo que esto te lleve muy lejos considerando las circunstancias. Incluso si tiene razón teóricamente (una pregunta sobre la que no voy a comentar), e incluso si pudiera explicar esto a la junta, es posible que no quiera escuchar ese argumento.
Por otro lado, supongo (¡sin fundamento!) que un argumento más convincente podría ser algo como (breve resumen):
Lamento mucho lo que he hecho y no niego que fue desautorizado, inapropiado e inmoral.
Tuve la tentación de plagiar debido a ABC, que, si bien no excusa mi comportamiento, también ha llevado al 30% de la clase a tener la tentación de plagiar, lo que sugiere un problema objetivo además de mi falla personal.
He hecho las paces de maneras XYZ.
En los casos C1 y C2, que sostengo son comparables, la sanción fue mucho menor.
Finalmente, me gustaría que la junta tome en cuenta mis circunstancias personales DEF al considerar este caso.
Respetaré cualquier decisión que tome la junta.
Y dejar las cosas así.
Definitivamente debería protestar por el castigo propuesto, porque muchas instituciones no permiten un castigo como el que su profesor quiere evaluar. (En otras palabras, su instructor no puede darle una calificación de -100 %, o cualquier calificación inferior a cero para una parte determinada de su calificación).
En cuanto a la cuestión de copiar código como plagio, esa es una afirmación mucho más espinosa. Usar el código de otra persona es un problema, pero si realmente no hay otra manera de hacer algo, entonces, ¿cómo denuncias el plagio? El plagio no se extiende a declaraciones "obvias". Por ejemplo, no es plagio si dos libros de texto de cálculo resuelven una integral usando una serie de ecuaciones de la misma manera, porque básicamente es la única forma en que puedes hacerlo. Por otro lado, si escribes un montón de texto a su alrededor que es el mismo, entonces has cometido plagio.
El plagio es un tema difícil en informática, ya que solo hay un número limitado de piezas de código que conducen al mismo resultado, y solo una de ellas puede considerarse una solución óptima.
De hecho, copió el código de las bibliotecas de Java, tanto el código real como el nombre de las variables lo sugieren. Por lo tanto, hubiera sido su deber citar esto correctamente. En este estricto punto de vista tu profesor tiene razón, y probablemente también lo tenga en los otros casos que mencionas. Si muchas personas cometen errores, sigue siendo el problema de la persona que comete el error, no de la que lo corrige.
Sin embargo, si es ético es un tema completamente diferente.
Al programar funciones complejas, es una buena práctica no reinventar la rueda , sino usar código existente y probado de otros. Sin embargo, según el artículo vinculado, "a menudo es necesario reinventar la rueda para solucionar las incompatibilidades de licencias de software".
Si tenía la orden específica de no copiar el código existente y no obedeció esa orden, el problema está de su lado. Las patentes de software son un problema grave en los Estados Unidos, varias empresas más pequeñas quebraron a causa de ello, las empresas más grandes poseen ciertas patentes solo para usarlas para contrademandar en caso de ser demandadas (ver Apple vs Samsung). Esencialmente, las patentes de software se han transformado en una especie de arma que se puede utilizar para eliminar la competencia no deseada del mercado. Por lo tanto, es importante que cualquier desarrollador de software (en su país) pueda detectar y solucionar estos problemas de licencia.
No conozco las intenciones de su profesor, pero es posible que haya agregado esa cláusula específicamente porque es consciente de las consecuencias del "robo de código", y su dura reacción es una forma de enseñarle a evitar esos problemas. en situaciones en las que realmente dolería.
En otras partes del mundo no tan estrechas de miras, las patentes de software o el 'plagio' como en su caso son un problema mucho menor. Esto significa que en otros países tu trabajo podría haber sido considerado de manera diferente, algunos incluso podrían haber reducido tus puntos por no copiar el código existente (reinvención innecesaria de la rueda). Pero usted no vive en "otros países", por lo que también desde un punto de vista ético, su profesor puede ser duro, pero aún tiene razón.
ff524
t sar
Grifo
patricia shanahan
natural
Azor Ahai -él-