最近不少读者加我探讨了一些算法,Java 或如何看书等学习方面的困惑,我觉得这些都挺有共性的,所以就想着结合自己的经历来谈谈有关学习的一些话题,希望能给读者一些启发。
提升自己的起点
先简单介绍我自己,我大学是双非普通一本,非科班出身,目前在某独角兽公司担任技术专家职位,相信大多数人的出身和我一样,普通院线毕业,想渴望着能一步步走上技术专家乃至更高级别的职位,那既然是普通院校毕业,与那些 985 院校科班出身的同学相比本身就有天然的劣势,所以我们就更要提升自己的起点了。
何谓提升自己的起点,比如对于技术人员来说搜索资料就应该用 Google, 而不是百度,查不到就去 Stackoverflow 提问,大部分资料用英文都能搜到,日积月累,你的英文水平就算再蹩脚也能完成华丽蜕变,为什么要强调英文水平呢,现在是移动互联网时代,各大主流平台 iOS, Android,甚至一些领先的框架如 Flutter 等都是国外出的,第一手资料全是英文的,所以如何用英文查资料,无压力读取英文官方文档这是技术人的基本素质,再者就算是翻译难免也有瑕疵,所以一定要持续提升自己的英文水平,坚决用 Google!
再比如大多数人学习可能主要通过各种博客来学,这样确实可以学到不少东西,但是博客的问题是各种知识点比较散,而且多数是作者对知识的提炼和总结总结,总结的过程中可能省略了很多知识点,也漏掉了书中的一些精华,所以如果要提升自己,系统地构建自己的知识体系,一定要看书!看书确实是一件很费力的事,但长期来看,对你知识体系的构建大有裨益!看书一定要看好书,怎么去找好书呢,推荐大家看看图灵社区(https://www.ituring.com.cn/) 很多书都很经典,也可以去豆瓣上搜搜那些高分书籍,看看底下的评论到底好在哪,买东西我们都会货比三家,更何况一本好书对你的成长大有裨益,所以值得你多花点心思来挑本好书!另外值得一提的是一开始很多人入门可能摸不着门道,这时候看视频快速入门是没问题的,但后期一定要回归到书本的学习中来!看书是达成知识技能进阶的必要条件!
再举个我自己的例子吧,目前我一直在运营着公号,坚持原创!一周至少发一篇精品文章,其实我也可以多多转载下别人的文章多吸点粉,但我没有这样做,转载只需要五分钟,确实方便,但对我个人写作能力地提升没有任何帮助!所以我一直坚持着原创,努力地写文章,这样虽然很苦,但对自己写作能力的提升,逻辑思维的构建长远来看帮助很大!这就叫提升自己的起点。
提升自己的起点会带来什么效果,这里给大家介绍一下复利曲线
前期的增长势头非常慢,但日积月累,到达某个拐点之后,增长就如火箭上升一般,势不可挡,就像我另一个做公号的朋友 cxuan 一样,前面几十篇文章少有人问津,但最近写文章带来的粉丝量突然爆发,其实也是因为之前的几十篇文章给他带来了足够强的写作能力,奠定了强大的写作基础,所以现在就像上面的后期的复利曲线一样,势不可挡。所以坚持提升自己的起点长期来看一定能给自己带来足够强的复利!
底层能力很重要
什么是底层能力,算法,数据结构,操作系统这些就属于底层能力,这些为什么重要,这些是上层语言,工具的根基!这些属于心法,内功,学好之后对你后期势能的爆发大有裨益!内功很重要,工具不重要!不少人误把工具用得熟练程度当作自己的资本,甚至在 V 站上看到一个人对刚入职的同事不会用 git 而大加吐嘈,这是大错特错的,工具为什么不重要,想想杨过在武功大成后用玄铁重剑和木剑对他来说差别大吗,对于一个内功深厚的人来说,工具的掌握只要稍微看下文档,Google 一下即可掌握,信手拈来!内功决定程序员的上限,而工具的掌握甚至连下限都不算,内功最重要。
再举一个和大家工作息息相关的例子,曾经一个人来我司面试,我面了之后觉得不错,但上司面试之后觉得人不够聪明,所谓不够聪明指的是给出一道相关设计题,在多方引导下仍然没有思路,所以最后没拿到 offer,所以大厂为什么喜欢考虑算法,我在之前的文章里也说过了,其实就是考你的构建模型,修改模型的能力,这样是判断一个人是否聪明的重要标准,所以掌握算法这些底层能力十分重要,算法的学习很枯燥,这里推荐一位我一直关注的吴师兄的「五分钟算法」,Github 全球排名 51
用动画讲解算法,清晰易懂!关注后输入 github 可获得全部动画。当然只是看懂还不够,一定要多练!熟能生巧!学习算法最好先掌握理论,掌握之后再去 leetcode 上多刷下题,学习算法理论建议大家可以学学极客时间上王争老师的「数据结构与算法」教程,对每个点讲得都很透彻!再结合吴师兄的动画题解与自己的多加练习,相信大家掌握算法不成问题。
多读源码
要掌握好一个框架,学习它的底层原理,读源码是必不可少的,这样才能在面对多个框架的选型时根据框架的优劣性做出取舍,同时多读框架的源码你还会对它底层的思想有更深刻的理解,能够做到知其然,更能知其所以然,举个简单地例子,在 Java 中有一个 Arrays.sort 的方法可以对数组进行排序,一开始我以为是个简单地快排,读它的源码之后才发现它虽然是用的快排,不过它用的是 dual-pivot 快排,这就让我产生了深厚的兴趣, 后来了解到这个 dual-pivot 快排比经典快排节省了 12% 的元素扫描,扫描元素的个数这种新的算法把内存的流量的因素考虑进去,比较适应新时代。看到一种框架可以不断地引出新的知识点,深挖这些新知识点,这样框架的优劣性也就吃透了。
曾经做 iOS 的时候国内优酷就有一个大神 ibireme 通读各类框架源码然后设计了 YYKit 等框架,引起轰动!甚至引来 Facebook 挖角,所以通读框架源码对于提升自己的能力非常有效!那怎么读一个框架源码呢,这又是一个大的话题,后面我会结合 HttpClient 的源码阅读来谈谈我的一些心得体会,这里推荐一位我的朋友 why 神,对 dubbo 等框架的源码剖析非常透彻,也是致力于把问题解清楚的一位很用心的作者,强烈建议大家关注学学
以教为学
学完了某些知识点,怎么确定自己就掌握它了呢,可以试着把这些知识点写成博客,在写博客的过程中要反复思考这些知识点怎么让小白也看得懂,如果写出来之后小白也看懂了,那么基本可以肯定这些知识点可以算掌握了,同时在写博客的过程中,如果有问题,读者说不定也会帮你指出来,这样对自己知识的盲点是个很好的补充,写博客最好的时间是十年前,其次是现在!强烈建议读者现在都开始写博客,一方面是对自己知识体系的一个梳理,另一方面也能与读者探讨,一举两得!如何把知识点说明白呢,这里强烈推荐我的另一位朋友,轩辕之风的 「编程技术宇宙」
一个致力于用故事的形式来把技术讲清楚的写作人,试图打造一个编程技术界的「漫威宇宙」,读他的文章仿佛进入了一个故事与技术的奇幻之旅!
谈谈 Java 学习
由于我的主业是 Java ,所以也有不少人来和我交流 Java 的学习,这里推荐几本书吧
新手必备
1、《Java 核心技术:卷 1 基础知识》
对于新手来说非常友好的一本技术书,也是 Sun 公司的官方用书,对 Java 的基础有深入剖析,初学者必读!
2、《Head first Java》
Head first 公司出品的书都非常耐读, 这本书对 Java 的各种基本概念的讲解非常到位,清晰易懂!推荐阅读英文版哦,如果你英文不好,更要阅读这本书了,还记得我们上文提得:请提升自己的起点吗,刚好可以通过读取这本书要慢慢地养成读取英文书的习惯,技术书籍其实英文并不是很难,要多读读,养成读取英文版书籍的习惯
进阶
1、《深入理解 Java 虚拟机》
要进阶一定要对垃圾回收原理, JVM 调优,字节码,Java 线程模型有较清晰地认识,这本书可以说是这些补齐这些知识点的不二之选!经典书籍,谁看谁知道!
2、《Effective Java》
这样书对如何写好 Java 总结了很多有用的知识点,也是经典书籍了,必看
3、 《Java编程思想》
这本书可以说是 Java 编程的圣经了,要学好 Java 就绕不开本书,豆瓣评分 9.1 分,也是必看书籍,不过不推荐小白一开始就看这本书,建议还是先看完上述所说的新手必备书籍后并且阅读一些框架的源码或工作过一段时间后再看,对里面的知识点体会会更深
暂时就推荐这么多吧,其还有一些像《Java并发编程实战》,netty 等书籍等进阶到一定阶段后其实也可以看看,不过这些都是后话了,大家啃完上面的几本书对于再去学其他书问题不大。
另外这里强烈推荐一位我的一位好友狗哥的公众号:一个优秀的废人,名字虽然比较自黑,但有很多 Java 干货哦
身为 Java 后端开发,只了解 Java 就够了吗, 至少你要对网络知识,MySql 这些也要做一定的了解吧,所以 《TCP/IP 详解》《高性能 Mysql》也是你进阶的不二书籍,至少要对 TCP 的慢启动,拥塞机制有所了解,要对索引,如何优化 Mysql 性能有一定的了解吧,这里只是举个例子。我们可以先对后端工程师应该具备哪些能力画出一个技能树(如下图),然后再对这个技能树上的每个点再各个击破!
再谈学习
前面说了多次看书的好处,这里也推荐大家学习一下极客时间的教程,我基本上每出一个教程必买,有人会说,你看得过来吗,其实我们都陷入了一个误区,买这些教程一定要看完吗,其实只要它的的某个知识点能帮助到你,你就赚了!能完整地看完当然更好,但如果暂时没时间,可以利用碎片化时间选择对自己有帮助的点先学习啊!很多面不都是由这些点一个个组成的吗,将这些点串联起来,这样就能逐步构建自己的知识体系和学习框架。
最后
前面谈了很多学习方面的一些个人体会,这只是我个人的一些学习感悟,希望对大家有帮助,最后欢迎大家加我微信一起探讨^_^