好的程序员“借”,伟大的程序员“偷”

【CSDN编者按】复制和粘贴可能是不安全的,同样地,如果做得不小心,处处会给软件开发埋下祸端 。在这篇文章中,作者将研究一下代码复制对软件开发的实际意义,并讨论一下如何高明地“窃取”代码,以及复制错误的陷阱 。

好的程序员“借”,伟大的程序员“偷”

文章插图
作者 | Ryan Donovan
翻译 | 苏本如,责编 | 夕颜
头图 | CSDN付费下载自视觉中国
出品 | CSDN(ID:CSDNnews)
以下为译文:
对于程序员来说,一个公开的秘密是,在Stack Overflow网站上发布的一些作为问题答案的示例代码,最终会出现在生产环境中 。也许你在Stack Overflow上问了一个问题,得到了完美的循环交换 。也许你找到了一个很好的答案,它包含了完全适合你的应用程序的async await实现 。
你需要的最后一本编程书
pic.twitter.com/cnObD8GYGZ
— 开发社区(@ThePracticalDev) 2016年3月4日
因此,当我在推特上看到这条宣传代码窃取好处的推文时,我情不自禁地想:复制和粘贴代码真的有好处吗?
更聪明地工作 。
窃取代码 。
— Laurie (@laurieontech) 2020年5月14日
复制和粘贴代码可能是不安全的,同样地,如果做得不小心,软件开发的许多方面也可能是危险的 。在这篇文章中,我将研究一下代码复制对软件开发的实际意义,并且解释什么是好的代码窃取,以及复制错误的陷阱 。
在此申明,我并不主张你随意地从我们的公共Q&A网站复制和粘贴代码,在某些情况下,这样做会给你带来麻烦 。然而,正如我们的播客嘉宾Anna Lytical向我们展示的那样,借助此方法确实是可以快速制作出一个功能原型 。
如果你复制了示例代码,请记住提供其归属信息 。根据代码最后一次在网站上编辑时间的不同,示例代码的归属和许可是依据Creative Commons许可证的某个版本授予的,Creative Commons许可证的最近的一个版本是CC BY-SA 4.00,这个版本需要提供归属信息 。
一次编码,数百万次运行
从Stack Overflow上复制代码是代码克隆(复制)的一种形式;从项目内部或项目之间复制代码并重用是代码克隆的另一种行式 。取决于你提问的对象,少至5-10%,多至7-23%的代码都是从其他地方克隆过来的 。至于克隆代码的方式是好是坏,尚有待商榷 。
不管确切的数量是多少,代码克隆都是非常常见的 。样板模版代码本质上是在整个项目中定期重复的代码 。很有可能有些编码人员在项目过程中从来没有手工输入过一行这样的代码 。像Lombok这样的工具试图减少对样板模版的需求,但现实的情况依然是:
  • 一些代码片段在项目中反复出现 。
而且:
  • 由于这些代码片段在不同的地方可能需要稍做不同的修改,因此无法将它们归并到单独的函数或依赖项中 。
说到库和依赖项,它们是一种在不重用代码的情况下重用功能的有效方法 。这几乎就和代码复制一样,只是你不需要负责维护它 。今天的大多数Web应用都运行在各种框架和插件库上,这些框架和插件库简化了开发过程 。以库的形式重用代码是非常高效的,它让每个功能明确的库非常擅长它所做的事情,并且只做它所擅长的事情 。与学术界不同的是,许多库甚至不需要任何东西来表明你正在使用或基于其他人的代码进行构建 。
JAVAScript包管理器npm将这一点发挥到了极致 。你可以通过命令行在项目中安装一些很小的单函数库 – 有些甚至小到只有单行代码 。你可以从超过一百万个开源软件包中抓取任意一个你需要的函数库,然后开始在你的应用中构建它们的功能 。
当然,和每一种工作方法一样,这种方法也有缺点 。通过安装一个软件包,你放弃了对代码的一些控制 。一些恶意代码编写者先是创建一个合法有用的软件包,等到这个软件包有了一个像样的采用率后,他们就更新代码来窃取比特币钱包 。值得称赞的是,npm的工作人员很快就成功地阻止了这种攻击,然而,你拥有的外部依赖项越多,你的受攻击面就越大 。
即使Stack Overflow答案本身也不能免受代码克隆的影响 。一位独立的研究人员发现了几个例子,其中一些Stack Overflow的答案是从其他地方复制过来的代码 。比如说,一个Java代码片段就在超过40个Stack Overflow答案中出现了 。
好的艺术家“借”,伟大的艺术家“偷”


推荐阅读