学习
如何学习一项新技术
面对一项新技术的时候,我们怎样去学习才能循序渐进,最终理解得深刻?
让我们先把可供自学的资料列出来,分析一下
http://kb.cnblogs.com/page/554496/
- Tutorial(入门教程)。由该项技术的官网提供。通常是英文的。这份资料是给初次接触该项技术的人看的,一般是一步一步地教你完成某些例子。当我们说某项技术对于新手不太友好的时候,一般也是因为这项技术的Tutorial部分做得不够好。
- Specification,简称Spec。这是集中体现该项技术的设计思想的东西,是高度抽象的描述。这个一般也是一份完备的、系统的描述,包含该项技术涉及到的方方面面。这部分资料在不同的地方叫法不同,在相对简单的技术项目中,也可能没有;在另一些情况下,这部分资料混杂在其它文档资料之中;它还可能以论文(paper)的形式出现。
- API Reference。大而全的API索引和文档,针对不同的语言接口可能提供多份。当我们使用这项技术进行编程的时候,API Reference自然是个离不开的、总是要不停去查询的一份资料。
- 别人写的技术博客。质量良莠不齐,到底有没有价值,我们要学会去分辨。
- 技术书籍。跟技术博客类似,质量有好有坏。稍后我们和技术博客放在一起来分析。
- Source Code。如果我们要学习的技术是开源的,那么很幸运,我们能得到源代码。这是一份终极资料。
这里就有一个选择性的问题:我们选择哪部分知识加载到“内存”里呢?
- 通读Spec。读完就不再困惑。
- 重要部分的API Reference要通读。里面包含了很多跟实现有关的信息。
- 如果工作需要,还可能需要读到Source Code。特别是对于平常一直在使用的SDK,不一定从头到尾把源码读通,这样工作量太大且效率不高,但一定要把你的开发环境设置成一点击某个调用的方法就能跳转进源码实现。只有这样,你才能把平常开发的时间利用起来,随时随刻都点过去看源码。
对于剩下的知识里80%的部分,应该至少理解到Spec层次。只有这样,我们才能游刃有余地去使用它。
工作一段时间之后,我们发现,似乎身边的技术牛人学东西都比较快,而且在很短的时间内就能对某项新技术达到很深的理解。这是为什么呢?
这并不是因为技术牛人阅读技术资料阅读得快,而是他们知道阅读正确的资料,从而很快能达到知识金字塔更高的一层。
三个阶段
1、Learning
这个是第一阶段,看书、google、看视频、看别人的博客都可以,但要注意一点是“系统化”,特别是一些基础性的东西,例如JVM原理、Java编程、网络编程,HTTP协议等等,这些基础技术不能只通过google或者博客学习,我的做法一般是先完整的看完一本书全面的了解,然后再通过google、视频、博客去有针对性的查找一些有疑问的地方,或者一些技巧。
2、Trying
这个步骤就是解答前面提到的很多同学的疑惑的关键点,形象来说就是“自己动手丰衣足食”,也就是自己去尝试搭建一些模拟环境,自己写一些测试程序。例如:
-
Jvm垃圾回收:可以自己写一个简单的测试程序,分配内存不释放,然后调整各种jvm启动参数,再运行的过程中使用jstack、jstat等命令查看jvm的堆内存分布和垃圾回收情况。这样的程序写起来很简单,简单一点的就几行,复杂一点的也就几十行。
-
Reactor原理:自己真正去尝试写一个Reactor模式的Demo,不要以为这个很难,最简单的Reactor模式代码量(包括注释)不超过200行(可以参考Doug Lee的PPT)。自己写完后,再去看看netty怎么做,一对比理解就更加深刻了。
-
MySQL:既然有线上的配置可以参考,那可以直接让DBA将线上配置发给我们(注意去掉敏感信息),直接学习;然后自己搭建一个MySQL环境,用线上的配置启动;要知道很多同学用了很多年MySQL,但是连个简单的MySQL环境都搭不起来。
-
框架封装了DAL层:可以自己用JDBC尝试去写一个分库分表的简单实现,然后与框架的实现进行对比,看看差异在哪里。
-
用浏览器的工具查看HTTP缓存实现,看看不同种类的网站,不同类型的资源,具体是如何控制缓存的;也可以自己用Python写一个简单的HTTP服务器,模拟返回各种HTTP Headers来观察浏览器的反应。
大部分情况我们还真的只能靠自己模拟,然后等到真正业务要用的时候,能够信手拈来。
3、Teaching
一般来说,经过Learning和Trying,能掌握70%左右,但要真正掌握,我觉得一定要做到能够跟别人讲清楚。因为在讲的时候,我们既需要将一个知识点系统化,也需要考虑各种细节,这会促使我们进一步思考和学习。同时,讲出来后看或者听的人可以有不同的理解,或者有新的补充,这相当于继续完善了整个知识技能体系。
这样的例子很多,包括我自己写博客的时候经常遇到,本来我觉得自己已经掌握很全面了,但一写就发现很多点没考虑到;组内培训的时候也经常看到,有的同学写了PPT,但是讲的时候,大家一问,或者一讨论,就会发现很多点还没有讲清楚,或者有的点其实是理解错了。写PPT、讲PPT、讨论PPT,这个流程全部走一遍,基本上对一个知识点掌握就比较全面了
总结
我们现在可以这样总结,技术的“野路子”,其实是知识结构的不完整和不系统造成的一种状态。
要把知识梳理成系统的结构,要让头脑中的知识层次清楚
如何制定学习目标
http://blog.csdn.net/yunhua_lee/article/details/52710405
一段分解:瞄准目标
技术人员成长过程:
1)0 ~ 1年:菜鸟,需要别人手把手来教
2)1 ~ 3年:初级,需要别人带你做
3)3 ~ 5年:高级,能独当一面,可以带初级技术人员了
4)5 ~ 8年:资深,能独挡多面
5)8 ~ 10年:大牛,统筹规划,高屋建瓴
二段分解:掌握技能:
为了达到一段目标,我需要具备什么样的技能。最方便的就是到一个招聘网站,多看看几个招聘需求的描述, 整理为一个思维导图,详细列出每个技术点,哪里不懂补哪里
二段目标:把三年分为3个阶段,每个阶段6个月
1)2016.06 ~ 2017.01:提升数据库水平
2)2017.01 ~ 2017.06:提升Linux水平
3)2017.06 ~ 2017.12:提升网络和网络编程水平
三段分解:规划执行
例如:
在六个月的时间内分为:1个月或2个月为周期,将技能目标分解为具体要做的事情,然后按照计划执行
1)1个月:通读《UNIX环境高级编程》
2)1个月:通读《Linux系统编程》
3)2个月:通读《UNIX网络编程 卷1》
4)1个月:Linux常用命令实战:tcpdump、ps、top等

浙公网安备 33010602011771号