最近一次在跟朋友聊天的时候,聊到了抄代码的话题。然后呢由这个话题展开,我就想起自己在自学的过程中,也是不断经过抄写别人代码来学习知识。可以这么说,抄代码已经成为自学路径上不可或缺的部分。对于一些比较晦涩的知识点以及庞大的知识体系,抄代码不接。让我从实践中复习了这些知识,也能加深自己的理解。甚至可以发现一些教程中还为说明的知识点。
下面我分享一下自己在自学过程中抄代码的一些经验,供大家参考,希望对你有所帮助。
抄代码,首先要明确的就是从哪里抄代码?下面我列举了四个抄代码的对象。
一般我们学习某一个框架或者类的使用时,首先接触到的就是源代码。不管是从 ide 中或者是 GitHub、Gitlab 上,都可以直接阅读源代码,包括源代码的注释。我觉得这是非常重要的。在我学习 java 的过程中,大部分的教程都不会很详细的介绍。原理以及为何这么实现。这些问题我们都可以通过阅读源码得到答案。阅读源码还有一个好处就是我可以清楚的看到作者是如何实现的。对于常用的框架和使用类。他们的源代码有非常多的注释。有时候源代码的一半以上内容都是由注释构成的。这些注释就是最好的教程。当然需要一些翻译工具来帮助我们理解这些注释。如果您对某一个方法或者参数的使用存在一些疑问。那么直接阅读源码。既是最快捷也是最准确的方式。
在我们学习新知识的时候。有时并不是直接可以阅读到源码。或者说源码中所包含的信息并不能满足我们的需求的话。所对应的官网是最优的选项,因为官网大概率都会进行社区的宣传我们可以在社区中找到更多志同道合的人。还有非常多热心的人。即使语言不通,我们也可以通过翻译软件进行交流。官网还会有很多比较好的实践的文章,以及更详细的文字介绍。如果有兴趣的话还可以看一看历史信息和未来的规划,这样我们在吹牛的时候,又多了一些素材。从另一个角度来讲,这些会提升我们的兴趣。而兴趣又是最好的老师。
当我们经过一些基础的学习,准备实践这些知识的过程中,还是会遇到各种各样的问题。通常我们是为了解决一个或者以部分实际问题去学习新知识的。而通常这些问题在某个时间已经被别的人实现了。而因为需求的不同,我们只是需要对这些实现方式进行些微的调整和改造。除了直接抄这些解决方案的代码以外,这些优秀实践解决问题的思路和实现方法,也是值得我们学习的。通常来讲,一个解决方案是非常多个问题解决方式的集合。而这些问题的解决方式,就能丰富我们自己的知识储备。
之前听到过一个段子。就是面向搜索引擎编程。搜索引擎的确能够提供非常大的便利性,让我们更快的找到解决问题的方式。我说抄的代码中,绝大部分都是通过搜索引擎找到的。虽然现在大多数时候,搜索引擎中的头三条都不是解决问题的正确方式。但是可以通过技术的手段去进行筛选。这个大家可以通过插件或者说是过滤软件实现这个目的。搜索引擎搜索到的大多都是技术社区的文章。而这些技术社区的文章,有时候会存在以下 3 点问题。第一,文章的时效性比较差。很有可能这个文章的实现方法在几年前是对的。但随着版本的更迭以及技术的革新,会有更好的方法去实现。第二,技术社区的文章可能会存在一些错误。原因有很多,就以我自己举例来讲。主要是因为自己当时理解不透彻以及遇到问题解决方式比较片面。第三,有些技术社区的文章质量很差。存在相互抄袭的问题,甚至机器爬虫,这就导致文章的内容可能跟原始文章存在出入。我有一次就遇到,机器爬虫的文章把作者代码中import
部分和原作者注释丢失。有很多非常优秀的作者喜欢自建博客,这种自建博客在搜索引擎中的排名往往会比较靠后,有时候需要我们耐心的往下翻一翻。
下面我分享一下 FunTester 都主要超过哪些内容,其中都是一些解决方案,并没有太多知识点的实践。给大家分享一个小技巧,如果您对某一个类的使用,或者说某一个方法的使用场景不是很明确的话。需要去搜索引擎中搜索内容时候,可以尝试搜索纯英文关键词,可能会有意想不到的收获。
这是我在一开始做接口测试的时候,抄的最多的代码。首先呢,我是去搜索引擎上搜到了很多的文章,然后我发文章之间实现的 demo 差别太大了。有时候我把别人的代码复制下来,在我本地就是跑不了一直报错。后来我就转去了官网去学习,这里就不粘贴网址了,大家可以去搜索一下。从官网的 api 中,我找到了很多最佳实践。然后我根据最佳实践,然后不断的改来改去,掌握了 API 的使用。进而对 api 的功能结合业务需求进行了封装,形成了 FunTester 的框架最初的代码。
再后来我回头去看网上的文章,总结了为什么抄代码不能直接使用的原因,大部分是因为版本的问题导致的,还有一部分原因是因为 httpclient 实现同样的功能,可以有很多个不同的方法,而不同的方法又可以有一些写法上的不同。特别是执行请求的 execute 方法。当时自己学识浅,缺少分辨这些写法的能力。所以导致了很多失败的抄代码行为。
相信绝大多数测试工程师都接触过 JMeter 这个工具。我是因为要做接口的性能测试,然后才对 JMeter 源码进行阅读,学习。我这个期间也阅读了很多。解读 JMeter 源码的文章,对我帮助非常大。我主要学习了 JMeter 的线程池使用,以及多线程编程技术在性能测试中的应用。通过对 java 多线程的学习,以及对线程池的使用。逐渐的形成了简化版的 JMeter 功能实现,初步实现了并发请求收集数据的功能,这就是 FunTester 性能测试框架的最初的代码。
在做性能测试的过程中,得到了一个贵人的指点,然后我就学习了 Groovy 这门语言。最终形成了我现在 java+groovy 的技术栈。在探索分布式压测框架的时候,ngrinder 框架映入眼帘。我当时还在犹豫使用什么样的用例执行方式,虽然 groovy 脚本语言是支持脚本执行的,但是并没有相关性能测试经验,网上也没搜到相关资料。然后我就去翻了翻 ngrinder 的源码,当我看到它的实现类有一个 groovyscriptengine 类,我就知道这个方案是可行的。这给了我极大的鼓舞和信心。