通过这段时间的看书学习和对编程的思考,结合自己的亲身的学习经历,今天想和大家聊一聊如何高效学习编程技术。
我们可以把学习编程技术的人分为下面四种情况。
第一种是既懂方法又努力的,学的又快又好,但大家会觉得这是他们有天赋,甚至称他们是天才,而并没有看到他们的方法和努力。
第二种是不懂方法但努力了,这类人学的不快但愿意花时间学,不过由于学习编程技术所需的时间一般比较长,一些人没有坚持下去便放弃了,而一些人则坚持了下来,最后学的很好。
第三种是知道方法但并不是一直都很努力,这类人学习的持续性比较差,一些技术学的比较好,而另外一些技术学的不好。
第四种是既不懂方法又不肯努力的,这类人自然是学不好编程技术的。
注意我这里说的只是对于学习编程技术的,并不代表编程学的不好的,学习其他事情也是这样,切莫以偏概全。比如在实际生活中,一个编程学的不好的,但唱歌唱的却特别好。
我文章的读者,大都也是和编程专业有关的学生或者是已经工作了的前辈,群里也经常把那些技术比他们好的人称为大佬或大神,除了羡慕外,也能看到他们对于成为大佬的渴望。按照上面的情况划分,他们可能是属于第二种或第三种情况。一个人的努力是看自己,这个别人也教不了,所以我这里和大家聊的是学习编程技术的一些方法,这是对我学习编程技术的总结,这些方法可能并不一定对你有效,所以你大可作为一种参考。
学习编程技术,最开始都是从某一门编程语言开始学起的,拿我来说,之前我也不知道学什么语言好,听别人说 Java 好,才学的 Java(现在看,觉得 Java 真的很好,至少现在来说,在企业级的项目开发中,Java 还是应用最广泛的)。所以往往我们对于一门语言并不知道他们能干什么的时候,或者说是他们的优势在哪,就急于开始学习了,很可能到最后才发现原来有更好的语言做这个,当时花了那么大力气,反而效果并不好。对于语言是这样,对于框架也是这样,就像我之前并不知道 Shiro 的优势是什么,自己手动写权限控制,最后发现还是框架好用(这里先不谈该不该自己造轮子的话题)。
所以学习一门语言或者框架时,第一步并不是上来就扎进去学,而是应该站在”远处“,用客观的眼光去看待它,找出它的优点和缺点,看看是不是符合自己的需要。比如说,你要从事人工智能方面的研究,目前来说 Python 是最好的选择(这里先不谈 Python 的性能问题)。对于语言的认识,对于新手来说,并不简单。看网上的文章,肯定也是各执一词,因为没有哪一种语言是完美的,没有缺点的,知乎上的大牛还是比较多的,你可以去那里看看他们对该语言的评价,好的坏的都看看,相信你应该可以得出自己要不要学的结论。而对于框架,我觉得认识它的最好方法是去它的官网,看官方文档,因为这是最一手的资料。但这些资料往往是英文的,所以英语对我们学习技术是至关重要的(老实讲,现在我们用的编程技术 99% 是来自西方,我们还停留在全面模仿和学习西方的阶段),所以在很长一段时间,我们都要接受英文文档,同时提高自己的英文阅读能力。实际上,文档中框架介绍的英文并不多,少的也就几个关键字就把框架的特点概括了,学习过英语的人借助字典翻译都是可以看懂的,只是需要你耐着性子看下去罢了。
上面便是学习编程技术的第一步——认识它,就算你现在用不上,了解一下也是挺好的。现在每个人都订阅了不少的微信公众号,群消息和朋友圈也被公众号文章充斥着。我也订阅了不下几十个的公众号,大多是编程技术方面的,也有一些投资理财的(个人对这些也比较感兴趣)。而我看的更多的是介绍技术或者某个知识点的背景,除非我对某个技术比较熟悉,不然很少看涉及很多具体细节的文章。我的看法是,公众号是一种碎片化学习的一种方式,一些作者的实践总结和经验之谈,一些优秀的文章还是值得一看的。但倘若只靠看公众号文章学习,知识是成不了体系的。所以一些公众号文章作为认识技术的一种方式,是个不错的选择,当然一些优秀的博客也可以。认识了技术之后,即使时是向别人介绍时,也可以说出来一些。你也可以试着介绍自己学过的一些技术,看自己能否清晰的说出来你对它的认识,或者只是知道一些技术细节,对整体的认识并不够。
学习编程技术的第二阶段就是学着使用它,如果已经有书籍和视频可以帮你学习它,那么这两种方式肯定是比较好的。学习语言和一些常见的框架,基本上都是有视频和书籍的,视频可以在网上找些培训机构(这里也不谈培训结构好不好),只要对你有帮助的资源你就应该利用起来学习,我学习使用某项技术时,也是看了不少视频。如果某个框架没有相关的书籍和视频,那么只能找些文档和去官网学习了,对于前端框架(库)来说,这是很常见的。学习需要一个过程,没有基础,看视频是最好的方式。有了基础后,我觉得看书是更好的选择,也可以节省你的时间,我就是买了很多书,现在学习也基本都是看书来的。当然没基础的时候还是推荐看视频,虽然要花很长时间,但是后面你就会发现自己学习其他技术会越来越快。在这个阶段遇到问题,也是很正常的,在网上一般都是可以找到答案的,自己解决问题的能力也会慢慢锻炼出来。在一些社区也可以发你的问题,CSDN、知乎、Stack Overflow 都很不错。
学习编程技术的第三个阶段是掌握(第二阶段和第三阶段的分界线其实并不是很明显),能够用这个技术做出一点东西来,就说明你逐渐掌握它了,比如你学完 Java Web,自己可以动手做出来一个简单的管理系统网站,这就可以了,并不需要考虑复杂的业务场景,这些在工作时会学到的。这个阶段更多的关注技术本身的细节,比如 Java 中的多线程编程有几种方式,最好自己动手写写笔记或者博客,这些都是很好的学习方式。学习框架,也可以看看官方文档,部分技术文档也有中文版的,毕竟写官方文档的人一般都是这个技术的开发者,他们肯定是最懂这个的。学习编程技术就像铸剑一样,需要经过反复的淬火,剑才能变得更加锋刃,学习也是需要不断地回顾和总结的过程,这样才能强化和巩固所学的知识。每个人的记忆力都是不一样的,根据自己的情况,时不时的复习非常非常有必要的。
学习编程技术的第四个阶段是深入,对于语言,可以看看实现的源码(这里又要提到 Java 的好处了),在第二个阶段学着使用它时,肯定会有一些概念和知识点,比如在 Java 中,ArrayList 对象中的数组是可以动态扩容的,但是你是否知道在 Java 中具体是怎么实现自动扩容的呢?如果你回答不了这个问题,那只能说明你还需要进一步的学习 Java,大部分的 Java 源码你都可以直接反编译查看,这里推荐 Intellij IDEA IDE,查看 Java 源码非常的方便(但 Java 也有一些本地化的方法,和操作系统关系密切,并不是 Java 写的,不能直接查看),而 Eclipse 还需要手动导入源码,不是很方便。学习框架,这个阶段要关注框架的设计思想和实现,也需要看源码,一些热门的框架,找几本经典的书籍来看也是不错的。还是推荐国外的书籍,毕竟很多框架都是从国外传入国内的,国外优秀的书籍会比较多些,当然我们国内也有一些,但总体还是国外多些。如果没有相关的书籍,那么就只能去相关的技术社区和看源码了。如果是开源的技术,一般都会推管到 GitHub 上,可以去 GitHub 上看看,不懂的可以提个 Issue,甚至学到一定程度也可以贡献你的智慧,到这个阶段,不用我说,你都知道该怎么做了。
如果身边有和自己学习同一种编程技术的,可以多多交流,肯定可以碰撞出思维火花的。没有的话,也可以加一些群,欢迎在文章末尾讨论交流,大家可以一起交流。或者看一些优秀作者的书籍,我读了杨冠宝大牛(孤尽,也就是《阿里巴巴Java开发手册》的作者,下面称之为杨老师)的《码出高效——Java开发手册》,当一些观点和作者不谋而合时,那种感觉非常爽。比如在谈到面向对象时,杨老师说可以从哲学的角度看 Object 类中的方法,我是谁(getClass 方法、toString 方法),从哪里来(Object 构造方法、clone 方法),到哪里去(finalize 方法),之前我也这样想过,但是没杨老师总结的好。有时,你也可以从书中发现一些错误和不恰当的地方,比如刘欣老师在《码农翻身》一书中,举 Maven 和 Ant 对比的例子时说这是 ”约定重于配置“,而 ”约定重于配置“ 是在对比注解和配置时才会说的,是明显地举例不当,但这些都是很正常的,每个人都难免会有出错的时候。有时候读书发现这些,也是很有趣的。在读吴军博士的《态度》一书时,他给二女儿讲为什么要读非小说类的名著时,说阅读不能只看一些期刊和杂志,即使严肃杂志上的文章质量非常高,但作者观点的前因后果由于篇幅都被省略掉了。零星的观点也是形不成知识体系的,而书的知识完整性是比较高的。所以在学习编程技术时,读书是很有必要的。但是也不要因为学习编程技术,而只看相关的书籍,这样你的视野会受限制,这点我这段时间才感受到,也是最近才开始看些编程无关的书籍,包括金融和经济学相关的。读这些看似与编程无关的书,能开阔人的眼界,增长人的见识,码农只是程序员的下限,优秀的程序员绝对不只会写程序。上面提到的的书籍,如果你感兴趣也可以看一看,相信你会从中受益的。
考虑到这篇文章的受众,所以写的是比较基础的,我这段时间也在思考如何写好文章。我算是比身边的人多学习了点东西,不能保证这篇文章就是很好的高效学习编程技术的方式。所以这里谈谈到的一些做法,未必对你来说就是有效的。这段时间看刘欣老师的《码农翻身》,很佩服他能够将一些技术由来和关键点融入到故事中,并且还能讲的那么有趣。如何写好文章也是我今后的学习方向,也欢迎你在后台留言,提出你的建议和观点。