¿Es incorrecta la programación de copiar y pegar? [duplicar]

14

Con las herramientas de búsqueda Google simple y Google Code es fácil encontrar cómo programar usando algún recurso o resolver ciertos problemas (como crear una clase Java o un bloque FTP en Perl, etc.). Así que los desarrolladores están tentados a simplemente copiar & Pega el código (de una manera reutilizable). ¿Es esto una incompetencia? Lo he hecho yo mismo, aunque creo que soy mejor programador que muchos otros que he visto. ¿Quién tiene tiempo para RTFM ? En esta era de abundancia de información, no creo que copiar & pegar la programación es mala.

¿No es eso lo que hacen los sitios como Desbordamiento de pila de todos modos? La gente pregunta: está bien, aquí está mi problema: ¿cómo resolverlo? Ahora alguien publicará el código completo y la persona que hizo la pregunta simplemente copiaría & Pega la respuesta más votada. No importa cuán pequeño sea el problema.

Estoy trabajando con un grupo de jóvenes programadores que dependen en gran medida de Internet para realizar su trabajo. Veo la conveniencia de copiar / pegar y modificar el código para hacer el trabajo. Por ejemplo, puede ser bastante bueno con los algoritmos y demás, pero es posible que no sepa cómo usar BufferedReader en Java; leería que completa el Javadoc para BufferedReader o busca algún ejemplo de uso en algún lugar?

¿Cuáles son los peligros reales de la copia & ¿Codificación en pasta que puede afectar su competencia?

    
pregunta Peter Mortensen 18.12.2016 - 11:36
fuente

15 respuestas

50

¿Es malo? Tal vez ... para aprender ejemplos pequeños, para probar un concepto, no es tan malo.

PERO ... debes entender lo que estás copiando / pegando. De lo contrario, ¿cómo sabe que el código está realmente haciendo? Claro, obtiene el resultado uno que desea en la pantalla, pero tal vez tenga un rendimiento horrible, quizás tenga agujeros de seguridad, quizás cause pérdidas de memoria, quizás recurra a Cthulhu, tal vez cause tarjetas de crédito al cliente números a filtrar, tal vez contiene una puerta trasera ...

Y es probable que la mayoría , tal vez requiera algunos ajustes para cumplir con los requisitos comerciales y, si no entiende el código, no podrá modificarlo correctamente (o mejor aún: escriba una versión más "correcta") ...

En cuanto a "RTFM", sí, lo hago cuando está disponible. Leería BufferedReader javadocs, y si no puedo obtener suficiente información para que mi código funcione, entonces presionaría en Google y buscaría "Ejemplo de Java BufferedReader". No esperaría que el código que encontré funcionara inmediatamente con mi código, pero esperaría encontrar una muestra independiente que funcione y que pueda usar como ejemplo para corregir mi propio código.

Y cuando está copiando / pegando su código propio , eso suele ser una señal para comenzar a refactorizar.

    
respondido por el FrustratedWithFormsDesigner 28.06.2011 - 18:15
fuente
15

Es quizás la peor manera de programar.

  

¿Es esto una incompetencia?

Sí. Si alguien no puede entenderlo lo suficiente como para escribirlo por sí mismo, realmente necesitan encontrar un nuevo trabajo donde no se espera que codifiquen.

Más importante aún, si alguien puede escribir el caso de prueba de la unidad, debe poder escribir el código. O pruebe que el problema no se puede resolver en un tiempo razonable. Si hay problemas de tecnología, la formación es esencial. Si hay problemas con el algoritmo, entonces la capacitación también es esencial.

  

¿Quién tiene tiempo para RTFM?

Todos.

  

¿No es eso lo que hacen los sitios como el desbordamiento de pila de todos modos?

No.

  

la persona que hizo la pregunta simplemente copiaría la respuesta más votada.

El código más votado puede no funcionar como se espera. Puede que no sea óptimo. Puede que no maneje las condiciones de contorno o los casos especiales correctamente. De hecho, puede que ni siquiera funcione para la arquitectura del interrogador, aunque funcionó para la persona que responde.

  

¿leería Javadoc completo para BufferedReader o buscaría algún ejemplo de su uso en algún lugar?)

Lee el javadoc entero. Siempre.

  

¿Cuáles son los peligros reales de la codificación de copiar y pegar que puede afectar su competencia?

Regla 1: El software es solo conocimiento codificado.

Si no hay conocimiento detrás del software, es una basura aleatoria que parece funcionar para algunos ejemplos. No hay valor en eso.

    
respondido por el S.Lott 28.06.2011 - 19:25
fuente
14

En realidad, es una buena idea saber qué está haciendo tu código. Recomendaría leer Code Complete

  

Considerada ampliamente como una de las mejores guías prácticas para la programación, el CÓDIGO COMPLETO original de Steve McConnell ha ayudado a los desarrolladores a escribir mejor software durante más de una década. Ahora, este libro clásico se ha actualizado y revisado completamente con prácticas de vanguardia, y cientos de ejemplos de códigos nuevos, que ilustran el arte y la ciencia de la construcción de software. Capturando el cuerpo de conocimiento disponible de la investigación, el mundo académico y la práctica comercial cotidiana, McConnell sintetiza las técnicas más efectivas y los principios que debe conocer en una guía clara y pragmática. No importa cuál sea su nivel de experiencia, entorno de desarrollo o tamaño de proyecto, este libro informará y estimulará su pensamiento y lo ayudará a crear el código de mayor calidad.

     

Descubra las técnicas y estrategias atemporales que lo ayudan a:

     
  • Diseño para la mínima complejidad y la máxima creatividad
  •   
  • Aproveche los beneficios del desarrollo colaborativo
  •   
  • Aplique técnicas de programación defensiva para reducir y eliminar los errores
  •   
  • Aproveche las oportunidades para refactorizar (o evolucionar) el código y hágalo de manera segura
  •   
  • Use prácticas de construcción que sean adecuadas para su proyecto
  •   
  • Depurar problemas de forma rápida y efectiva
  •   
  • Resuelva los problemas críticos de construcción en forma temprana y correcta
  •   
  • Genere calidad en el principio, en la mitad y al final de su proyecto ...
  •   
    
respondido por el Tom Squires 09.06.2013 - 13:48
fuente
6

Cuando hablamos de la programación de copiar y pegar como una mala práctica, nos referimos a la programación de copiar y pegar que se hace por pereza. En lugar de programar una clase base adecuada para eliminar el olor del código, algunos simplemente violan DRY por pereza. Además, introduce una gran cantidad de errores, ya que luego se tiende a ignorar las diferencias sutiles del caso de uso y no se aplican los cambios necesarios. Eso es principalmente por lo que se considera una mala práctica.

En general, no creo que sea una mala práctica tomar un fragmento de código aquí y allá de Internet. Pero creo que es una mala práctica cuando toma un fragmento de código que no comprende, ya que introduce un código en su software que nadie puede mantener.

Además, solo mire los sitios web como The Code Project . Cada artículo proporciona una solución a un problema. La mayoría de las soluciones son bastante buenas. Pero cuando reviso la implementación, cada segundo o tercio de ellos me dan ganas de vomitar, y no permitiría que apareciera en mi software una parte del código.     

respondido por el Falcon 10.05.2014 - 22:58
fuente
6
  • Todo buen profesional en cualquier campo copia lo creado por otros en ese campo.
  • ¿Por qué debería reinventar la rueda si ya hay una que se adapta a mis necesidades?
  • La reutilización de código es el santo grial, usamos bibliotecas, componentes, proyectos de código abierto ampliamente; ¿Por qué debemos rechazar esta forma en particular, si funciona bien?
  • La programación de patchwork es un patrón muy productivo, especialmente si el código copiado proviene de una fuente autorizada o ha sido examinado por una comunidad.
  • Si no eres bueno en la programación, entonces no eres bueno en copiar el código de otros, eso es un hecho.
  • No se trata de copiar código dentro de una aplicación, que debe evitarse tanto como sea posible.
respondido por el Ando 10.05.2014 - 23:09
fuente
4
  

¿No es eso lo que hacen los sitios como Desbordamiento de pila de todos modos? La gente pregunta: está bien, aquí está mi problema: ¿cómo resolverlo? Ahora alguien publicará el código completo y la persona que hizo la pregunta simplemente copiaría & pega la respuesta más votada.

Ciertamente no es así como veo el sitio. Lo veo como un lugar para obtener ayuda, no para hacer tu trabajo por ti.

Además, ¿sabe con qué frecuencia las personas votan las respuestas incorrectas? Muy.

Todo lo que realmente puedo decir es: "¡Guau!"

    
respondido por el Crazy Eddie 10.05.2014 - 23:00
fuente
3

Puedes resolver algunos problemas haciéndolo así. Pero no todos los problemas; no vale la pena.

Además, es plagio.

Está bien reutilizar el código hasta cierto punto , pero asegúrese de que entienda el código y que no infrinja los derechos de autor . Para las tareas de programación más comunes, existen bibliotecas, marcos y kits de herramientas, úselos cuando estén disponibles.

    
respondido por el Anto 10.05.2014 - 22:54
fuente
2

La programación de copiar y pegar presenta dos problemas.

  1. hay cierta preocupación por infracción de derechos de autor si usted también mucho de esto
  2. eventualmente un problema vendrá que no puedes resolver con la programación de copiar y pegar, cuando esto pasa no tendrás Obtuve las habilidades necesarias para resolver. por su cuenta.

Aparte de eso, para resolver pequeños problemas, la programación de copiar y pegar puede ayudar a resolverlos de una manera rápida y eficiente.

Una nota final, obviamente, todos dependemos de otras personas para que nos ayuden a resolver problemas de vez en cuando, si se toma el tiempo de entender el código dado y lo implementará, habrá aprendido algo y habrá resuelto su problema.

    
respondido por el Digital Powers 28.06.2011 - 17:35
fuente
2

El programa Copiar y Pegar significa dos cosas diferentes para mí. Una es que unes otros ejemplos de código para obtener un programa. La otra cosa es que estás cortando / pegando un montón de código repetitivo y luego modificándolo ligeramente. Creo que, hasta cierto punto, todos estamos juntando ejemplos de código, si no cortando / pegando explícitamente luego con memoria. En el código repetitivo de cortar y pegar, es un costo en comparación con una recompensa. Para una pequeña cantidad de cortar / pegar o incluso una gran cantidad si no tiene tiempo para hacerlo bien, puede valer la pena cortar y pegar ... pero en general, en algún momento con una gran cantidad, vendrá volver a morder.

Todos copiamos / pegamos programas. Un montón de código es placa de caldera y también lo son los algoritmos. Si estás escribiendo rápido, no lo inventaste. Lo más probable es que haya memorizado una implementación típica de algún lugar, ya sea una conferencia o un libro. Eres una especie de copiar y pegar programación. A veces, puede leer un documento donde se presenta un algoritmo e implementar el algoritmo en el documento. Para mí esto también es copiar y pegar la programación. Además, la mayoría de las bibliotecas están llenas de ejemplos. Aka abre un lector en búfer en Java BufferedReader br = new BufferedReader (System.out); Estoy bastante seguro de haber visto ese código en alguna parte, y si no es exactamente el código ... la estructura / patrón básicos con mis propios nombres reemplazados ... .NET es muy bueno para tener ejemplos de código en toda la biblioteca. Si quiero abrir una página web, buscaré la clase para hacer solicitudes web y luego imitaré el ejemplo del código. A veces regresas y modificas más tarde (por ejemplo, necesitas establecer tiempos de espera) pero en general, básicamente, vas a dar el ejemplo.

En general, diría que la mayoría de los programas son una especie de copiar / pegar programas. Comienzas con ejemplos de núcleo / algoritmos / etc. tomado de la memoria, libros, etc. y luego se modifica para satisfacer sus necesidades. Mientras entiendas lo que estás cosiendo, creo que está bien. No es necesario que entienda exactamente todo lo que está cortando y pegando, solo en general lo que hace y cualquier función. Realmente es como usar una biblioteca, excepto que también tiene el código fuente subyacente. Definitivamente vale la pena ir a las fuentes correctas, y en general, si puede obtener una función al cortar / pegar a partir de ejemplos de código, o una biblioteca ... es mejor ir con la biblioteca, ya que puede actualizarse más adelante.

La segunda cosa es simplemente cortar / pegar su propio código. Tienes un montón de código repetitivo, así que cortas / pegas y modificas. Grandes cantidades de esto hacen que sea un desastre cambiar, y también es muy aburrido y aturdidor ... A veces, la alternativa correcta es usar otro enfoque, pero otras veces cortar y pegar es la mejor manera de hacer lo que se desea, en el que En caso de que debas crear un generador de código para manejar el código repetitivo. Pero si son solo unas pocas líneas o una cosa fuera de lugar, puede que no valga la pena. Cortar / pegar código similar suele ser más rápido que crear una abstracción compleja o crear un generador de código. Al final del día, si se corta y pega, ahorra horas y está listo para sacar un producto antes de que su puesta en marcha se arruine, luego hágalo. Después de todo, si no envía el código, no tendrá futuro. Pero básicamente todo esto se convierte en deuda técnica que debe ser limpiada más tarde. Se trata de comprender la compensación que está tomando y administrar cuando le muerde. P.ej. Apresure el proyecto hoy para que no se quede sin negocio, luego termine reparándolo la próxima semana cuando la duplicación hace que agregar esa nueva característica sea demasiado difícil ...

En general, todos cortamos / pegamos mentalmente para ejemplos / algoritmos. Y en el segundo tipo, se trata de saber cuándo es apropiado y cuándo no ... Como cualquier otra herramienta, debe comprender las ventajas y desventajas de lo que está haciendo ...

    
respondido por el Cervo 29.06.2011 - 05:10
fuente
2

Al copiar y pegar el código, asumo que es un fragmento de código que se copia / pega. Los fragmentos de código son en su mayoría para la demostración de la idea o el algoritmo, no para la producción real, ya que puede que no se alinee con su contexto. Peor que eso, podría contener errores porque el autor del fragmento de código podría nunca haber probado el código en sí.

¿Ejemplo de la vida real? Sí, hay muchos y me encontré con uno como el año pasado. Mi colega intentaba codificar / decodificar Base64 en iOS, y obtuvo esta respuesta

enlace

que luego descubrí que tiene un error desagradable aquí:

char *outputBuffer = malloc(outLength);
outputBuffer[outLength] = 0;

Bueno, si conoce C bien, es posible que pueda detectar el error. El autor solo se quedó con el búfer corto por 1 (aún así logró obtener 8 votos ..). Mi colega solo usa ingenuamente este código para Base64 y funcionó bien la mayoría de la época. Esto causó un tremendo dolor de cabeza a todo el equipo, ya que fuimos muy principiantes en el desarrollo de iOS y la aplicación acaba de salir de la nada. Todos verificamos su código una y otra vez, incluyéndome a mí, pero nunca encontramos lo que iba mal. Hasta que un día, creo que el error decide por sí mismo que debería aparecer. La aplicación se bloquea solo en el simulador y recibí algunos indicios del seguimiento de la pila de que está allí. Vi el error, lo arreglé y el estuche se cerró. Eso fue después de muchas quejas de los usuarios finales de que nuestra aplicación siempre fallaba sin ninguna razón. El daño ha sido hecho.

Entonces, ¿dónde está el mérito de la historia, te preguntarás? El mérito es que el codificador es responsable de cualquier código que se envíe a la base de código, y un codificador incorrecto puede causar horas de desperdicio para todo el equipo. Copiar y pegar el código no es una mala idea en sí misma, pero muchos programadores simplemente creen ciegamente lo que dice Internet y ponen el código allí sin validarlo y sin entender lo que realmente hace. Cuando aparecen errores, lo último que podrían pensar es que el error está en su código pegado porque siempre piensan que los códigos de Internet son mejores que él. Si tienes a muchos programadores colega haciendo copias de pasta-código la mayor parte del tiempo, entonces ten cuidado.

    
respondido por el tia 23.05.2017 - 14:40
fuente
1

El problema de trabajar directamente (y únicamente) desde una referencia de API como Javadoc es que a menudo no proporciona el contexto suficiente para realizar un flujo de trabajo completo. Ciertamente, es útil comprender qué puede hacer la API y qué argumentos y métodos individuales están disponibles, pero conectar eso en una aplicación real no trivial es algo diferente.

Específicamente para Javadoc, encuentro que solo algunos javadocs de Sun / Oracle tienen suficiente texto de descripción general para dar contexto (pero esos mismos proporcionan el mismo código de copiar / pegar). En su mayor parte, incluso Sun / Oracle no proporcionan un contexto completo y es raro encontrar un Javadoc de terceros completo y completamente escrito.

No creo que esto sea culpa de los escritores de Javadoc, sino que a menudo hay una falta de coincidencia de impedancia entre los métodos API y los bloques de tareas de nivel superior.

    
respondido por el G__ 28.06.2011 - 18:58
fuente
1

Mencionaste que todos los programadores jóvenes lo hacen; Eso deberia decirte algo. Si estoy construyendo un prototipo, probablemente lo haré algunas veces porque estoy aprendiendo / tratando de ver si algo funciona. El problema es cuando terminas construyendo todo usando estrategias de nivel junior. Terminas con un "Siempre lo he hecho así y funcionó". La mentalidad y el riesgo nunca salen de ella.

Si quieres convertirte en un mejor programador, necesitarás desarrollar algo de fluidez. Hasta que no apliques y utilices repetidamente lo que has aprendido, esto es difícil de desarrollar. La cantidad de cosas que necesitas para Google debería disminuir. La creación de su propia área de referencia debería evitar buscar la misma cosa una y otra vez. Si está haciendo eso, entonces está creando una copia principal & pegar violación Probaly peor es copiar y pegar su propio código.

    
respondido por el JeffO 28.06.2011 - 20:19
fuente
1

Mi opinión es que copiar y pegar ejemplos / soluciones de la web es un enfoque válido ... como cualquier otra cosa, puede ser objeto de abuso.

Si trabajas en cualquier idioma moderno, hay una tonelada de código que has copiado y que no entiendes completamente (al menos, para el 99% de nosotros). No visualizo rutinariamente el código fuente de las bibliotecas de clases que uso. No sé los detalles de cómo se implementa Array.Sort (). Tengo cero comprensión de lo que entró en los controles de Infragística que utilizo en mis aplicaciones winForms.

Mucha gente tiene una objeción emocional a copiar y pegar códigos de Internet; Pero no veo por qué es diferente. ¿Por qué agregar una función y una lógica de encapsulación que no me molesté en escribir o entender es peor que incluir una referencia a una biblioteca y una lógica de encapsulación que no me molesté en escribir o entender?

La gente dirá: 'Pero, pero ¡podría ser un código incorrecto !' pero eso es cierto para cualquier biblioteca que uses. Claro, con las bibliotecas estándar puede esperar que estén bien implementadas, pero no siempre es así. Todo lo demás es solo 'cosas' en internet. Cualquiera puede publicar 'cosas'. Usted puede 'un poco' confiar en las revisiones y calificaciones; pero los sitios como SO permiten que las personas califiquen los fragmentos de código publicados de la misma manera que lo hacen CodePlex y otros.

Como desarrolladores, podemos reconocer la diferencia entre llamar a una biblioteca y el código que has pegado. Sus usuarios no lo harán. No les importará. Pasé horas saltando a través de todo tipo de aros porque un componente de terceros al que construimos nuestra aplicación tenía una pérdida de memoria y eventualmente colapsaba la aplicación. El hecho de que fuera la biblioteca de otra persona no lo hacía más fácil de arreglar (en realidad, podría decirse que era más difícil porque no tenía la fuente).

Pegar código no es un sustituto para saber cómo codificar. Pero saber cómo codificar no significa que no pueda usar el código existente.

    
respondido por el Rob P. 29.06.2011 - 01:29
fuente
0

Copiar y pegar tiene dos implicaciones, ambas pueden ser malas.

Al copiar el código de una parte de su propia base de código a otra parte, está violando el principio de responsabilidad única de < a href="https://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29"> SOLID diseño de código; ahora tiene la misma línea de código que reside en dos lugares en su base de código, y si una de esas líneas de código cambia, probablemente tendrá que buscar y cambiar la otra (SI aún recuerda que está ahí). Debe preguntarse por qué necesita el código en dos lugares y si hay algo que pueda hacer para mantener el código en un solo lugar mientras lo usa desde otros dos lugares.

Copiar y pegar una línea de código es casi siempre una señal de que el código debe extraerse en un método o colocarse en un bucle, lo que permite acceder a él de manera remota y / o iterarlo.

Copiar y pegar desde un sitio web o blog no es, en sí mismo, intrínsecamente malo; Es un código de trabajo que está adoptando para su uso sin reinventar la rueda. Sin embargo, es fundamental que entienda el código que está copiando, porque si no entiende cómo y por qué, será difícil para usted mantener ese código. Además, por muy bien que funcionen, hay algunos fragmentos de código muy mal diseñados, que si se copian y pegan se convertirán en una pesadilla solo en virtud de su diseño y arquitectura.

    
respondido por el KeithS 10.05.2014 - 23:05
fuente
0

Este tipo de codificación se llama Programación de culto de carga . Como desarrollador de Ruby on Rails en una empresa muy profesional, tuvimos que manejar varios proyectos que los clientes nos pidieron que refactorizamos, después de otro La compañía había logrado arruinarlos de esta manera.

En la programación de Ruby on Rails (o en la programación web en general) este es un mal hábito, quizás provocado y asistido por el uso general de muchas herramientas y complementos y la gran cantidad de ejemplos de códigos y tutoriales disponibles. Terminará con un código que no tiene significado en el contexto de su proyecto específico y con un código que se basa en una funcionalidad que no comprende, no puede cambiar y no puede depurar.

Incluso los complementos destinados a ser incluidos de esta manera pueden fallar. (Recuerde que una versión anterior de acts_as_taggable se ejecuta en un bucle infinito cuando intenta eliminar una etiqueta). El código publicado en la web rara vez se prueba, incluso dentro del contexto en el que se escribió, menos para sus necesidades especiales.

Eso es claramente el lado oscuro de la fuerza. No quieres esto en tu proyecto.

    
respondido por el thorsten müller 10.05.2014 - 23:07
fuente

Lea otras preguntas en las etiquetas