知识是学不完的,我们必须要找到正确的学习方法才能加速成长。就像查理.芒格所说,人类只有发明了发明的方法之后才能快速发展;我们只有学习了学习的方法之后才能成为高手。我将学习归纳成三点:要点+坚持+手段。
首先我们要找到哪些是以前很重要,现在仍然重要,未来可能同样重要的知识。在我看来这些知识大都偏向底层基础,就像习武修炼内功一样。学好了基础,就如同打通了任督二脉,再领悟上层的招式就易如反掌了(下一篇【编程篇】再细致讨论)。
然后学习贵在坚持,终身学习已成不可逆转的趋势。这两个公式能反映坚持的效果:1.01的365次方=37.8, 0.99的365次方=0.03。
后是学习的手段,当然每个人可能会有不同的适合自己的手段。我的学习手段是看书+实践+交流+构建。
看书。不要当一个“百度”或“google”程序员。我见过很多的程序员不看书的,他们喜欢去看别人的博客或者百度搜索的文章,浅尝辄止。这样学习的知识是零散的,过几天很快就忘记了。 实践。知识如果不能改变行为,就没有用处。而知识一旦改变了行为,本身就立刻失去意义。所以我们需要不停的去实践学到的知识,会得出新的认知,再去实践,形成良性循环。
交流。可以避免思维定势,闭门造车,而应该从外部吸收一些好的想法和建议来取长补短。正所谓三个臭皮匠,赛过诸葛亮。
构建。通过思考,对比(横向),总结(纵向)。通过关联将知识结构化,结成网络,达到融汇贯通,举一反三,后条条大路通罗马。(为什么通过关联可以更有效的学习,有兴趣的同学可以了解一下大脑的缘脑阻断机制。我更愿意相信天赋是别人找到了这扇门的钥匙)。
下面是我采用的学习手段中关于构建的分享:
计算机世界是对人类现实世界的模拟,所以计算机里面的概念都能在现实世界找到原型。比如代理模式(中介),IOC(好莱坞法则),缓存(藏书室-书架-书桌),分层(分工),队列(生活中排队),适配器(转接头)等。在学习过程中带着这种类比的思维去学习,很好理解且记忆深刻。
知识的积累是一个集合结构>线性结构>树形结构>图形结构的过程(还记得数据结构中的四种逻辑结构吗)。知识结构如果形成纵向(面向对象继承思想)+横向(面向切面思想)的纵横交叉网络,会更加的牢不可破。这里我举三个例子。
1 负载均衡这个根节点下,包含子节点nginx,LVS, 硬件负载均衡如F5等。纵向我们要关注凡是负载均衡都要面临的问题(调度算法,会话问题,反向代理知识等);横向可以从osi七层网络模型角度进行对比。因为负载均衡工作的网络层次,决定了它的性能、特点和场景。这就是为什么计算机网络基础很重要的原因。
2 面向对象语言这个根节点下,有子节点java, c++,python, javascript等。 纵向我们要关注的是所有面向对象语言的特性——继承,多态与封装; 横向可以从静态语言/动态语言,解释型语言/编译型语言,强类型与弱类型语言的特点等角度进行对比。语言的设计运行采用了那些方式,决定了语言的性能,灵活性,安全性等。
3 数据库这个根节点下,包括Mysql,redis,mongodb,cassandra等 。纵向我们要关注所有数据库共同的特点如数据模型,持久化方式,事务支持,索引,日志等。横向可以从高可用与高性能下的多节点(包含主从,集群,分片三种模式。每种模式有这多种实现方案,都会包含相同的技术比如sentinel,proxy,副本集,分表,选举,复制等。这些技术都需要解决相同的问题如一致性,主从切换等)等角度进行对比。
这样在面对一个同类型的新技术时,应变能力强,学习速度快,就不用从零开始。所以现在有些人不断追求新的框架,其实是本末倒置的。我认为一个的工程师需要三大能力1编程能力2、架构能力3、工程能力。接下来的三篇文章【编程篇】,【架构篇】和【工程篇】将分别来讨论。