昨天公司里碰到一件令人哑然失笑的事情。帮朋友公司做的一个项目,做SIT测试的时候发现一些bug,仔细查了下原因,原来是因为当初觉得这个项目比较简单,交给了几个新入职的新丁,也算是给他们练练手,结果其中一位写了一段代码出现了问题结果导致bug的出现。

虽然问题不大很快就修复了,但是正所谓初生牛犊不怕虎,这位出问题的新丁不太服气,一直嚷嚷着他这段代码是从CSDN上找到的,别人都说好用他才用的。问了问他是否理解原文中那么写的原因,结果才支支吾吾了半天讲不清楚,最后也承认他只是看到那段代码的结果是他要的,并不是理解中间一些方法的运用到底是什么逻辑。

真是又好气又好笑,想想现在的年轻人真是有个性,自己当年遇到这种情况只敢虚心求教,哪敢都没明白就去用一段代码,别人指出问题还忿忿不平。

也许是自己老了吧。晚上和一个刚从国外归国的同学说起这个事情,他倒是深有体会,说到他们在国外留学时,遇到技术问题想到网上咨询用的最多的是StackOverflow,相比起国内的CSDN,他觉得StackOverflow上提问题的人和回答的人都更加严谨,不会有太多的废话和问题之外的讨论。按他的理解,CSDN上很多国内的技术新手纯粹是缺乏独立思考的能力,都只是来求代码完成目标,不去探究为什么这么写,本身CSDN上问题回答质量不高,这样很容易出事。

同学的看法,一方面可能是因为国内程序员需求极大,但整体浮躁、功利性的大环境导致很多培训机构没有培训到位,很多程序员都是一边开始工作一边学习;但另一方面,不排除他崇洋媚外的自满情绪。于是,我便去查阅了下StackOverflow上面的内容和相关资料。

仔细研究后发现,其实StackOverflow没有同学说的那么好,即使是该网站上的回答,也有很多有问题的代码。看来这还是一个世界性通用的难题~

对于国外的程序员来说,StackOverflow就是他们的CSDN,是他们遇到各种问题查询的第一选择,很多国外的程序员,会到StackOverflow上需求帮助,找到他们需要的解决问题的代码,然后不假思索的直接复制使用,和我公司出问题的那位年轻人一样,这个习惯很不好。

代码复制本身来说并不是什么坏事,我们学开发的时候,肯定老师都教过我们代码复用能有效提高软件的开发效率。已经被解决了的问题,实在没有必要再去重新写一遍代码。但是这个前提是,使用者,也就是开发人员,必须知道你要用的这段代码的来龙去脉真正含义,就是你要真正明白你用的代码。

简单举个例子:

  • 几年前,很多程序员发现,在windows上使用Docker老是会碰到无法启动的问题,原因一直不明,很多人都是重装了系统什么的才解决。后来有一个大神发文解释原因后我们才知道了为什么

当 Windows 后台启动了 Razer Synapse 时,再去启动 Docker 就会触发此问题。根本原因是,Razer Synapse 运行后,Docker 就会认为已经有一个 Docker 实例正在运行中,所以不会再启动一个实例,也就是真的Docker。

为什么会有这种情况呢?

因为有一段代码中,返回的 GUID 类型是 System.Reflection.RuntimeAssembly(系统层面的运行时程序集),而不是 Windows 中对应 Docker 程序集中定义的类型。Docker处理的逻辑就是在同一时间只允许运行一个实例,判断的方式就是通过判断 GUID 是否存在,但在获取GUID 时,用的是系统层面的而非自己独立程序集里面,从而导致了这个问题。问题代码如下:

var name = string.Format("Global\{0}", (object)
Assembly.GetExecutingAssembly().GetType().GUID);

当然了,如果系统只有一个应用程序使用了上面的错误代码,那么这个问题还是不会出现,因为只有一个实例。但实际情况是很多应用程序都使用了这一段错误代码,结果就不允许两个实例同时运行。

那这些应用程序,想必你已经猜到,都用了这段代码,而且都是从StackOverflow上下载后不假思索的使用导致的。

  • Andreas Lundblad,国外一位大神,Palantir 的 Java 开发人员,同时也是 StackOverflow 上排名最高的贡献者之一。

他有一段代码,作用是将字节计数转换为更易于阅读的格式。打个比方,1024字节转换为1kB,1048576 字节转换为1MB。他最初在2010年将这一段代码放到了StackOverflow上,根据官方统计,他的这段代码是StackOverflow上被拷贝次数最多的Java代码,GitHub上使用这段代码的项目有6千多个。

当Andreas Lundblad知道此事后,出于负责,很小心谨慎的重新检查了下这段代码,随后发现这段代码里有一些问题,于是他马上更新了版本,并发博告诉大家:

  • StackOverflow 上的代码可能存在 bug,不管他的好评是多少。

  • 如果你拿了StackOverflow的代码,一定记住要测试所有的可能的情况。

  • 在复制代码时,一定要包括其来源和贡献者,当出问题时,能快速帮你定位。

同样的,在去年,国外另一位大神Morteza Verdi发表了一篇研究论文指出,StackOverflow上流传最广的一段c++代码存在着69个重大安全隐患漏洞,GitHub上使用这段C++代码的项目也有近3千多个。

所以,无论是StackOverflow还是CSDN,无论是国外和国内,都务必记住一点,在复用别人的代码时,一定要搞清楚别人代码的含义,并做好充分的测试工作,并不是说你运行了一次没问题,就是真的没问题,可能只是你运气好,没有触发问题场景罢了。

引用 Ryan Donovan 的一句话,就是:

If you borrow things and you don’t understand the content of what you’re borrowing, then you fall in this trap of reusing code that has potential vulnerabilities. Then you are just spreading those things around.”

If you’re going to reuse code, you need to understand that code.

复用代码,一定要理解代码!

  • 本文参考资料:https://medium.com/better-programming/why-code-snippets-from-stack-overflow-can-break-your-project-ced579a48ddb

你复用代码时遇到过什么问题?一起讨论下吧!

听说又有兄弟因为用YYYY-MM-dd 被锤了...

2020-12-30

FFmpeg迎来20周年生日!凭一己之力养活全球无数播放器!

2020-12-30

电梯到底是什么调度算法?每次都要等半天!

2020-12-30

夜宵是福利?那为什么不能随便吃?浅谈华为员工夜宵事件

2020-12-29

Payment Spring Boot 1.0.2.RELEASE 发布,接入微信支付分、先享卡功能

2020-12-29

卧槽,QQ号也能改了!!!赶紧来改!宇宙唯一ID赶紧来抢注!

2020-12-28

扫一扫,关注我

知晓前沿科技,领略技术魅力

加入 Spring 技术学习群

DD自研的沪牌代拍业务

深度交流

技术 + 社会

职场 + 创业

为什么 StackOverflow 上的代码片段会摧毁你的项目?相关推荐

  1. 一段堆栈溢出的代码_为什么堆栈溢出的代码片段会破坏您的项目

    一段堆栈溢出的代码 Stack Overflow has been the saviour of many programmers, including me. Some of us have nev ...

  2. 【JS】1070- 8个工程必备的JavaScript代码片段(建议添加到项目中)

    8个工程必备的JavaScript代码片段,听过这样起博客标题可以提高阅读量.???? 最近写博客好累,让8月征文活动搞的,今天水一篇好了,麻烦不要给我点赞,不想看到消息通知的小红点. 1. 获取文件 ...

  3. 8个工程必备的JavaScript代码片段(建议添加到项目中)

    点击上方 前端瓶子君,关注公众号 回复算法,加入前端编程面试算法每日一题群 8个工程必备的JavaScript代码片段,听过这样起博客标题可以提高阅读量.???? 最近写博客好累,让8月征文活动搞的, ...

  4. input文件上传代码片段

    需求:自己留个记录 <div class="button-2" @click="uploadFile"><input type="f ...

  5. Visual Studio使用技巧,创建自己的代码片段

    1.代码片段的使用示例 在编写代码中常会使用代码片段来提高我们的编写代码的效率,如:在Visual Studio中编写一个 for(int i = 0; i < length;i++) { } ...

  6. 使用git创建仓库,并上传代码

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 1.创建仓库 2.上传代码: (1)在项目的根目录,初始化新版本库 git init (2)在根目录创建.git ...

  7. iOS开发常用代码片段:总有你用得上的功能

    使用方法:查看文章目录,查找需要的功能. 代码片段目录 1.禁止手机睡眠 2. 隐藏某行cell 3.禁用button高亮 4..切换window的根控制器 5.去除数组中重复的对象 6.给一个vie ...

  8. 微信js sdk 授权上传头像下载代码片段和注意事项

    /*  * 描述:当前页授权  * @param url   例:index.html / 如果有参数,需加密index.html?id=1     */ 1.对需要运用js sdk的页面授权 get ...

  9. python语言代码片段-有用的Python代码片段

    我列出的这些有用的Python代码片段,为我节省了大量的时间,并且我希望他们也能为你节省一些时间.大多数的这些片段出自寻找解决方案,查找博客和StackOverflow解决类似问题的答案.下面所有的代 ...

最新文章

  1. linuxsvn源代码版本库建立
  2. c++ 定时器_【话说定时器系列】之十:PWM输入模式测量脉宽及占空比实验
  3. UE3 虚幻编辑器控制台命令
  4. REST测试工具之curl(URL多参数)
  5. 常见路由器初始密码合集
  6. fragment 淡入淡出_一种模型淡入淡出时透明面重叠问题的解决方案
  7. 【CVPR2022】论文阅读:Revisiting Skeleton-based Action Recognition
  8. JAVA设计模式之桥接模式
  9. 使用office tool plus清除office激活状态
  10. 手把手带你调参Yolo v5 (v6.2)(训练)
  11. java学生成绩分90及格_Java基础练习:题目:利用条件运算符的嵌套来完成此题:学习成绩=90分的同学用A表示,60-89分之间的用B表示,60分以下 的用C表示。 - 菜鸟头头...
  12. DEDE源码分析与学习---index.php文件解读。
  13. Python 之心有猛虎,细嗅蔷薇
  14. js如何取到ajax回调函数值,js怎样获取调用回调函数的参数值
  15. 广东计算机二级考试大纲,全国计算机等级考试二级考试大纲(Fortran)
  16. 如何使用 DiskGenius 合并分区教程
  17. auto.js教程:找图函数,图片内随机点击
  18. Android R AVB分析方法
  19. docsify部署静态文件服务器,云开发 Docsify 文档部署
  20. Shuffling Machine(C语言实现)

热门文章

  1. 正式入住博客园----附07年写的短评,虽然稚嫩但已实现,那年我大三。
  2. 用putty生成密钥SSH远程登录(解决)
  3. php 一句话木马简介
  4. 提高使用比特币的匿名性
  5. linux c 编译警告 warning: this decimal constant is unsigned only in ISO C90
  6. linux grub修复 手动引导进入系统
  7. 错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
  8. 无线传感器网络--分簇或者不分簇
  9. linux系统调用挂钩方法总结
  10. 如何利用魔棒工具抠图_3秒搞定抠图!免费在线抠图工具