打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
能工摹形,巧匠窃意:论克隆代码的正确姿势

copy 抄其形,steal 取其髓。齐白石曾说过:“学我者生,似我者死”。作为优秀的程序员,克隆代码的正确姿势又该是怎样呢?

在程序员中,有一个公开的秘密,那就是在 Stack OverFlow 上作为答案的一部分发布的一些示例代码,最终会出现在生产代码中。也许你请教了一个问题,得到了有关 for 循环的完美答案。也许你找到了一个很好的答案,其中已经有了适合你应用程序的 async await 实现。  

所以,当我在推特上看到这条推文时,它宣扬偷窃代码的好处,我就想知道,复制和粘贴代码真的会有什么好处吗?

复制和粘贴这一动作可能会带来危险,但话说回来,软件开发的许多方面又何尝不如此呢?在本文中,我将阐述代码复制对于软件开发实际意味着什么,好的代码“偷窃”又意味着什么,以及槽糕的代码复制有什么陷阱。

郑重声明,我并不主张你随意从我们的公开问答网站上的代码进行复制和粘贴,有些情况下,这样做会给你带来麻烦。但是,正如 我们的播客嘉宾 Anna Lytical 向我们展示的 那样,复制和粘贴能够很好地快速生成功能原型。

如果你确实复制了代码示例,请记得标注资源来源。根据 Stack OverFlow 上 最后一次编辑代码的时间,它是在创作共用(Creative Commons)许可协议版本下授权的,最近的版本是 CC BY-SA 4.0,需要署名。

一次编程,永远运行

从 Stack Overflow 中复制代码是一种代码克隆的形式;也就是说,从项目内部或项目之间复制代码,并对这段代码进行重用。根据你询问的对象,从其他地方克隆的代码少则 5~10%,多则 7~23%。这些克隆是 好 是 坏,还有待商榷。

不管确切的数量是多少,代码克隆这个行为是非常普遍的。样板文件代码本质上就是在整个项目中定期重复的代码。很有可能这些样板文件代码并不是程序员逐个手工输入这些内容。像 Lombok 这样的工具试图减少对样板文件的需求,但事实依然存在:

  • 在某个项目中,会有一些代码片段反复出现。

以及

  • 由于它们可能需要进行少量修改,因此这些代码片段不能划分到单独的函数或依赖项中。

说到这里,库和外部依赖项是在不重用代码的情况下重用功能的一种高效方式。这几乎就像复制代码一样,只不过你不用负责维护它。真见鬼,今天大多数 Web 都是在各种各样的框架和插件库上运行的,这些框架和插件库简化了开发。以库的形式重用代码是非常高效的,并且让每个专注的库都非常擅长它所做的事,而且只做这一点。与学术界不同的是,许多库甚至不需要任何东西来表明你正在用别人的代码或在别人的代码之上构建。

JavaScript 包管理 npm 将这一点发挥到了极致。你可以通过命令行在项目中安装微小的单一函数库(有些甚至小到只有一行代码)。你还可以从超过 100 万个开源软件包中选择任何一个,然后开始将其功能构建到你的应用程序中。

当然,和所有的工作方法一样,这种方法也有缺点。通过安装包,你就放弃了对代码的一些控制。一些恶意程序员创建合法拥有的软件包,等他们有了一个像样的采用率之后,再 更新代码来窃取比特币钱包。值得称道的是,npm 的工作人员能够很快阻断这类攻击,但你的外部依赖项越多,攻击面就会越大。

即使是 Stack OverFlow 的答案本身也不能幸免于代码克隆。一位独立研究人员发现,有一些例子,其中 Stack OverFlow 的答案中有一些代码是从其他地方复制过来的。一个 Java 代码片段就被发现出现在 40 多个答案中。

能工摹形,巧匠窃意

在艺术界,偷窃是伟大作品诞生的部分原因。我记得有一次去阿姆斯特丹的梵高博物馆,看到了梵高的一些早期作品。我被震撼到了,但当时我不知道的是,这些早期作品其实都是梵高 对日本艺术和木刻的研究。我曾以为是那个时代独特的风格,实际上是一个连续体的一部分,而不是我所认为的那个连续体。他没有沿着荷兰大师们他面前铺就的道路前进,而是从在巴黎发现的日本版画中汲取了思想——构图、笔法,并将它们融合到一起。

毕加索有一句名言:“拙匠抄,巧匠盗。”毕加索本人从非洲和波利尼西亚艺术中汲取了许多思想,并将其与自己的研究结合起来。偷窃听起来是不对的,事实上,把别人的作品说成自己的就是剽窃。但这句话用“偷”这个词,是为了表达一些不同的东西。借来的物品仍然属于别人;哪怕你复制了一种风格,它也仍然属于别人。然而,偷就是将这个想法变成你自己的想法。借用别人的创意,就是借鉴;理解一个创意并将其融入到自己的作品中,这就是毕加索所称的“偷窃”。史蒂夫·乔布斯就是这句话的拥趸,Apple 在他的领导下取得了成功,因为他们做到了偷窃、整合、精益求精。

当你克隆代码时,你只是冒着借用代码的风险。借来的代码只要能编译或不出错,就会被大量复制到项目中,但它可能会有一些你不知道的 Bug 或恶意意图。失败的复制代码,或修改后复制的代码,其风险是巨大的。事实上,大多数关于克隆代码的投诉都可以追溯到抄袭代码的人。如果你不理解代码,那么你很可能会在本应只是概念演示的内容中 留下安全漏洞。即使是 从 Stack OverFlow 中复制次数最多的代码片段也有一个 Bug。

另一方面,当你偷窃代码时,你必须确切知道这段代码是做什么的。它的核心、怪癖,所有这些都成为你自己代码的无缝部分。如果你能凭记忆把它再写一遍,那就是一个很好的偷窃的标志;重新加工后,你所拥有的东西已经不仅仅是克隆了,而是原创性的东西。

是的,偷窃代码。接受它,理解它,并在你自己的项目中实现它。让它成为你自己的代码。你可以提高效率,改进你的项目,甚至可以改进你的简历(又名 Ctrl+C、Ctrl+V)。但是,如果你在没有完全理解新获得的代码及其功能的情况下就贸然进行复制,那么你就有可能会使代码变得更糟。

作者介绍:

Ryan Donovan,Stack OverFlow 博客编辑。曾在多个行业的软件开发团队中担任过十五年以上的技术撰稿人。现居纽约。

原文链接

https://sourl.cn/ujjwrH


你也「在看」吗?👇

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
好的程序员“借”,伟大的程序员“偷”!你同意否?
中国程序员常去的社区,别告诉我你没去过
重新敲一遍代码,胜过拷贝粘贴
这款“程序员人工智能助手”,会成为下一个 GitHub 吗?
编写代码注释的最佳实践
调查8万开发者:工作十年的PHP程序员只能拿Golang的一半工资
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服