昨天公司里碰到一件令人哑然失笑的事件。帮敌人公司做的一个我的项目,做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-pro...
你复用代码时遇到过什么问题?一起探讨下吧!
欢送关注我的公众号:程序猿DD,取得独家整顿的收费学习资源助力你的Java学习之路!另每周赠书不停哦~