发布于:2020-12-24 16:14:46
0
273
0
在Stack Overflow上作为答案的一部分发布的一些示例代码最终变成了产品代码,这在编码人员中是一个公开的秘密。也许你问了一个问题,得到了一个完美的for循环。也许您已经找到了一个很好的答案,它已经有了完全符合您的应用程序的async await实现。
所以当我看到宣扬偷代码的好处时,我开始思考:复制和粘贴代码真的有用吗?
复制和粘贴可能是危险的,但同样,如果不小心进行,软件开发的许多方面也可能是危险的。在这篇文章中,我将讨论代码复制对于软件开发的实际意义,好的代码盗窃的意义,以及糟糕复制的陷阱。
郑重声明,我并不是主张你随意地从我们的公开问答网站复制和粘贴代码,在某些情况下这会给你带来麻烦。但是,正如我们的播客嘉宾Anna Lytical向我们展示的那样,快速生产出功能性原型是可以做得很好的。
如果你复制代码的例子,请记得提供署名。根据代码最后一次在Stack Overflow上编辑的时间,它使用Creative Commons许可证的一个版本进行授权,最近的版本是CC BY-SA 4.0,它需要署名。
编写一次代码,就会运行数百万次
从堆栈溢出复制代码是代码克隆的一种形式;也就是说,从项目内部或项目之间复制代码并重用它。根据你问的人,有5-10%或7-23%的代码是从别处克隆出来的。这些克隆体是好是坏还有待讨论。
不管具体的数量是多少,代码克隆都是非常普遍的。样板代码本质上是在整个项目中定期重复的代码。很有可能这些程序员并不是手工输入每一个。Lombok等工具试图减少对样板文件的需求,但事实仍然是:有一些代码会在项目中反复出现和因为它们可能需要一个小的修改,所以这些代码片段不能被分流到单独的函数或依赖项中。说到这里,库和外部依赖关系是重用功能而不重用代码的有效方式。它几乎就像复制代码一样,只不过您不负责代码的维护。更糟糕的是,现在的大多数web都运行在各种框架和插件库上,这些框架和插件库简化了开发。以库的形式重用代码是非常有效的,并且允许每个集中的库在它所做的事情上非常出色。而且与学术界不同的是,许多库甚至不需要任何东西来表明您是在使用他人的代码或在他人的代码之上构建的。
JavaScript包管理器npm将这一点发挥到了极致。您可以通过命令行将很小的单个函数库(有些只有一行代码)安装到您的项目中。您可以从超过一百万个开源包中获取任何一个,并开始将它们的功能构建到您的应用程序中。
当然,和所有的工作方法一样,这种方法也有缺点。通过安装一个包,您放弃了对代码的一些控制。一些恶意的编码者已经创建了合法的有用的包,等到他们有一个不错的使用率,然后更新代码来偷比特币钱包。值得赞扬的是,npm工作人员设法很快地击退了这类攻击,但是您拥有的外部依赖越多,您面临的攻击面就越大。
即使堆栈溢出答案本身也不能幸免于代码克隆。一个独立的研究人员发现了几个例子,堆栈溢出的答案从其他地方复制的代码。一个Java片段找到了40多个答案。
好的艺术家借鉴,伟大的艺术家偷窃
在艺术世界里,盗窃是伟大作品产生的一部分。我记得去阿姆斯特丹的梵高博物馆看了他的一些早期作品。我被震撼了,但我当时不知道这些其实是日本艺术和木刻的研究。我所认为的那种风格在那个时代是独一无二的,实际上是连续体的一部分,而不是我所认为的连续体。他从巴黎找到的日本版画中汲取灵感——构图和笔法——并将它们融合在一起,而不是仅仅沿着荷兰绘画大师们摆在他面前的道路前进。
毕加索有句谚语称赞他:“好的艺术家借鉴,伟大的艺术家偷窃。”毕加索从非洲和波利尼西亚艺术中汲取了很多灵感,并将它们与自己的研究相结合。偷窃听起来是错误的,事实上,声称别人的作品是自己的就是剽窃。但是这句话用“steal”这个词来表达有点不同的意思。借来的物品仍然属于别人;你复制了一种风格,但它仍然属于其他人。然而,偷窃,就是把这个想法变成你自己的想法。把别人的想法归功于自己就是借用;理解一个想法并将其融入自己的工作中,这就是他所说的盗窃。史蒂夫·乔布斯是这句话的粉丝,在他的领导下,苹果公司成功了,因为他们窃取、合并和改进。
当您克隆代码时,您可能只是借用了它。借来的代码大量进入项目,只要它编译或不抛出错误,但它可能有bug或恶意的意图,你没有意识到。代码被严重复制或代码被修改的风险是巨大的。事实上,大多数关于克隆代码的抱怨都可以追溯到借款人。如果您不理解代码,就很可能在仅仅用于演示概念的代码中留下安全漏洞。即使从堆栈溢出复制最多的代码片段也有错误。
另一方面,当你偷代码的时候,你知道它是做什么的。它的核心,那些怪癖,所有这些都成为你自己代码的无缝组成部分。如果你能凭记忆再写一遍,这就是偷窃行为;一个重做,让你得到的不仅仅是克隆,而是原始的东西。
是的,偷代码。接受它,理解它,并在你自己的项目中实施它。让你的。你可以更有效率,改进你的项目,甚至改进你的简历(也就是你的ctrl+C ctrl+V)。但是,如果在没有完全理解新获得的代码及其功能的情况下进行复制,就有可能使代码变得更糟
作者介绍