我很早就了解到,从长远来看,剪切和粘贴别人的代码需要花费更长的时间来编写自己的代码。在我看来,除非您真正理解它,否则剪切和粘贴代码可能会遇到解决噩梦的问题。
不要误会我的意思,我的意思是找到其他人的代码并从中学习是必不可少的,但我们不仅将其粘贴到我们的应用中。我们重写的概念进入我们的应用程序。
但是我一直在听到有人剪切和粘贴的消息,他们谈论这就像是通常的做法。我还看到其他人的评论,这表明这是普遍的做法。
那么,大多数程序员会剪切并粘贴代码吗?
我很早就了解到,从长远来看,剪切和粘贴别人的代码需要花费更长的时间来编写自己的代码。在我看来,除非您真正理解它,否则剪切和粘贴代码可能会遇到解决噩梦的问题。
不要误会我的意思,我的意思是找到其他人的代码并从中学习是必不可少的,但我们不仅将其粘贴到我们的应用中。我们重写的概念进入我们的应用程序。
但是我一直在听到有人剪切和粘贴的消息,他们谈论这就像是通常的做法。我还看到其他人的评论,这表明这是普遍的做法。
那么,大多数程序员会剪切并粘贴代码吗?
Answers:
两种一般情况:
从一个项目到另一个:
大多数程序员都以这种方式剪切和粘贴代码。他们可能会在网上找到先前的项目或其他内容,然后精确地复制/粘贴或复制/粘贴并对其进行更改。我认为这种做法通常很好。经过验证的代码尤其有用。(示例:过去的项目运行良好的某种实用程序对象,或者可能来自博客而只需要很少的更改)。可能不好的地方是复制不理解的代码时,或者代码不好的地方,或者比粘贴的代码有更好的替代解决方案的地方。
在同一个项目中:在同一个项目中 复制和粘贴通常不是一个好主意。这是一种难闻的气味,正在复制的代码应该只在某个方法/类中的某个位置并被重复调用。对此有一些例外,但是程序员通常应该考虑:“ 是否有一种方法可以参数化正在复制的代码? ”。
我的编程口头禅之一是:“如果我复制和粘贴代码,那我做错了事”。本质上是DRY。
我认为显而易见,代码重用意味着将代码用作资源,而不是重复代码。有时我会复制并粘贴自己的代码,在大多数情况下,我会以样板代码或看起来非常相似的内容结尾。
在花了更多时间使用该代码之后,我得到以下结果:
我们是否应该复制和粘贴代码是有争议的,因为客户端/老板不在乎(至少直接和短期内),您可能会得到相同的结果,但是问题确实出在当它导致错误,模块化的丧失,并最终导致维护麻烦。
没有人会编写完美的代码,即使它可以工作,即使您没有复制和粘贴并且它是您自己的代码,如果您对此不太满意,也只需在注释中添加注释(例如docblock“ @todo”)以提醒您您自己应该重构什么以及为什么……即使您自己不重构它,也可能成为维护者感到幸福与完全沮丧之间的区别。
最终,即使复制和粘贴,您最终也将获得良好的代码。
通过XKCD
当我陷入困境并寻找可以解决我的问题的东西,并且遇到一些有用的代码片段时,我自然就会复制它。有时只是它的要旨。然后,我根据自己的需要对其进行更改。当我深入研究自己不擅长的事情时(当前是Objective-C),这种情况会经常发生。
我总是花时间从代码中学习一些东西,因此对我来说,这是学习和避免重新发明轮子的好方法。
我将在这里谈论复制/粘贴其他人的代码。从我的个人资料库中抓取部分自己的作品是公平的游戏。我了解它们并按定义理解它们。
我发现,“剪切和粘贴”代码的最常见情况是遇到特殊问题时,我遇到了解决该问题的博客文章。多数情况下,我将解决方案重新输入到项目中(毕竟,如果没有别的话,它可能是以博客作者的风格编写的)。这并不是我的代码,但是我在那种情况下使用它并不感到不好。
我不了解如何获取整个方法或系统以将其按原样粘贴到我的项目中并称其完成。前几天在StackOverflow上有一个问题,完美地说明了这样做的问题。
用不同的代码部分拼凑出科学怪人的怪物就不可能那么高效。我的意思是,如果您擅长于此,则意味着您要一遍又一遍地复制相同的解决方案,或者您已经充分了解了其他人的代码,因此不再需要相同级别的复制/粘贴。通过不必解决不兼容的代码示例之间的问题,可以提高生产率。
我个人没有遇到很多大规模复制/粘贴的程序员。我见过很多将自己编码到最深和最黑暗的角落的人,但这是另一回事。根据我的个人资料,我会说大多数程序员不会一起复制/粘贴整个应用程序,但是确实很难确定。
不好:一遍又一遍地复制和粘贴相同的代码块
如果您发现自己正在执行此操作,则可能应该花一点时间考虑可以从正在复制的代码中抽象出什么,并创建一个函数/方法来对其进行处理。这就是DRY(请勿重复)原则的重要性。
良好:复制已知有效的代码块
DRY(不要重复自己)在这里也适用,只是意义不同。IE,不要重复您过去已经完成的工作。如果您花时间编写了一段代码,请对其进行调试,测试,并证明它可以在生产代码库中使用;您会很笨拙,不要重复使用它。
大多数人会给复制粘贴带来不好的说唱,因为许多初学者程序员花时间在网上搜索和复制/粘贴其他人的代码,却不了解它的实际作用。
每次都从头开始编写所有内容并没有任何好处。我知道有很多老派的纯粹主义者,所有东西都应该从头开始编写,我希望我不会被他们束缚。如果您有5年的编程经验,则应该拥有一个相当丰富的代码库,可以重复使用。它是经验丰富的程序员可以带到餐桌上的最好的资产之一,因为它可以节省大量的开发时间。
如果您一开始对旧代码不了解,请花一点时间阅读注释并重新熟悉自己。如果您的评论很糟糕……那完全是另一个问题。
经过25年的编写代码,有些时候(无法访问我为前雇主编写的代码)我希望可以剪切和粘贴。但是,这种情况很少见(并继续阅读)。
最好的例子也许是我几年前为unix操作系统设计的一个非常简单的命令行解析器。一个简单的循环遍历args并处理选项。它非常简单而优雅,从那以后,我已经多次使用它(更多地用作一种模式,而不是文字上的剪切和粘贴)。这是例外,而不是规则。
通常,简单的ole剪切和粘贴是完全不适当的-它更重要的是剪切和粘贴概念或算法。
我不太自豪-我会很乐意四处搜索以找到一种非常快速的奇偶校验或海明码验证算法或类似的东西。然后花几个小时了解它,看看它是否真的是我所追求的超快速度,还是天真烂漫的垃圾。
我担心每当有人只是复制代码而不暂停理解它的时候。他们要么是个天才(一眼就理解了它的所有精妙之处),要么是个傻瓜。两者之间没有太多空间。哦,也没有很多真正的天才。
如果不了解,您真的不知道在快乐的情况下,在不快乐的情况下或输入条件下,您刚刚真正投入的工作。有时候这并不重要,因为您会很幸运。有时这会带来长期的痛苦。
在通常情况下,您基本上需要这样做以提高生产力。
除非您有一个可行的示例,否则很难学习任何您不熟悉的技术。因此,您可以复制并粘贴该文件以使其具有实际运行的功能,然后开始进行修改。
作为一个新的程序员(我的第一份工作开始已经四个月了),我非常依赖帮助(无论是来自SO还是其他地方)。我提出了不要盲目复制和粘贴其他代码的观点。即使提供的代码是我将要使用的代码,我也将其键入到程序中,然后花一点时间确保我完全了解它的作用及其原因。
我想确保自己不断学习,而不仅仅是剪切和粘贴方面的专家
我对这个话题有很多感触,但我不能坦白地说任何一个都是客观的。
剪切和粘贴其他人的代码到您的应用程序中有很多参数。其中有些可能有意义,有些可能没有意义。例如,如果您从某人的博客中获得了一种方法,该方法接受输入并运行某种复杂的数学算法,而该算法超出了您的数学能力,并且吐出了结果(这是剪切和粘贴的参数),请获得作者使用其许可的权限编码并归因于他们-这是光荣的事情。
有人提出不重新发明轮子的说法-从理论上讲,这也是有道理的。但是,如果您不花时间熟悉要剪切和粘贴的代码,则不知道是否有解决此问题的更好方法,也不知道代码中是否有错误。如果您粘贴的轮子坏了怎么办?
速度和效率存在争议-您建立了别人的代码库,这些代码被盗用,被盗,窃或以其他方式窃听,您甚至可能甚至不需要知道如何在Frankensteining某些应用程序之外进行编程一起从回收零件中取出。
在某些时间和地点,我认为这种行为是完全可以接受的。为了将不是为长寿而设计的快速扔掉的工具凑在一起,而是为了完成任务,现在就可以通过钩子或骗子来完成。为了进行原型设计和研究,在理论上学习和发展,我认为这是完全公平的游戏。
剪切和粘贴其他人的代码是窃-如果您能得到他们的祝福,并且了解自己要粘贴的代码,并且适合您的应用程序的编码标准,那么,我承认这是公平的游戏。
作为专业软件工程师,我将获得报酬以维持标准和道德规范。我没有因为窃取,窃或侵犯他人版权而得到报酬,这使我的客户面临被起诉的风险。除此之外,还有一个非常真实的风险,那就是当您运行上述剪切/粘贴的代码时,会带来灾难性的副作用。
约翰不是针对您的答案,我知道您在诸如此类的话题上非常有道德倾向,因此,这实际上只是问题本身的一般说法。
附录:也就是说,我认为在项目之间剪切和粘贴自己的代码是完全可以接受的-除非它被编写为他人的可租用作品,在这种情况下,您不拥有版权,您应该获得许可您为其编码的人的人。我发现,除非代码与专有功能概念相关,否则大多数雇主都可以让您将自己的想法重新用于其他客户。
鉴于在一个开放源代码存储库中,所有方法的15%从一个项目复制到另一个项目(pdf),答案似乎是肯定的。
如果代码是好的,那么应该将其复制并粘贴到公共库中,而不是复制并粘贴。但是人们不必为重构而烦恼,他们更喜欢通过复制和方法来传播相同的功能。
人们应该知道何时使用它,而不是拥有普遍的绝对的复制和粘贴法则是好是坏。
复制和粘贴的优点是:使您快速入门缺点:同一代码分布在多个地方,发现/解决的任何问题都需要解决,如果不是将一个粘贴/粘贴的问题用作公用库,则更新将传播到各处。对于使用库而不是将相同的代码分散到各处的少量初始投资。
选择是最初是否要节省大量时间,然后再复制和粘贴才是可行的方式,否则将其重构并放在一个公共库中。