疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

怎样学习一门新技术


 

1、每个人在生活与工作中都在不断学习新东西、新事物,这其中既有主动学习的,即出于个人需要、工作需要、家庭需要等等因素自发学习;也有被动学习的,即根据周围环境、项目需求等外在因素迫使自己学习某项技术或是技能。无论是主动学习还是被动学习,最终都是在学习,经过了一段时间后,自己就会或深或浅地掌握了某项技能。可以说,学习是每一个人的终生要事,在当今时代,很难想象一个人走出校门后就不再学习会变成什么样子;因此,每个人都会有自己的学习方式和方法以及习惯等,这其中既有好的习惯,也有不好的习惯;无论好与不好,个人其实是很难感知得到的,正所谓:不识庐山真面目,只缘身在此山中。学习方法是一个老生常谈的话题,好的学习方法会提升学习者的学习效能、使得知识与技能的学习能够提速且得到不错的结果。
2、本文将从我个人的视角谈谈我是如何学习一门新技术的。当然了,这里面所谈及的方法都是我自己的,未见得适合你,这也是再正常不过的事情了。但我相信,这其中也一定会存在某些细节是普适的。因此,只要文中所谈及的一些观点你觉得有用并付诸实践,然后改进了自己在某些方面的学习方式,那就很好了。由于自己是一名程序员,因此我将从一个开发者的视角谈谈对于技术学习的理解和方法。
3、首先我想说的是,现在所谓的『新技术』实际上很少会有全新的技术,也就是里面的概念、观点、想法都是你闻所未闻的。这样的技术也许会有,但我相信不会很多。对于软件从业者来说,在学习一门新技术时,里面的一些概念可能你早就已经知道了或是了解一些,但这些概念落实到这门『新技术』上可能会发生一些变化或是出现一些改进,这都是正常不过的事情。其实,我们在日常的开发中所遇到的大多数『新技术』都是这种类型的。那我在面对一门『新技术』时所采取的学习路线是怎样的呢?首先,将相关的软件包、程序库下载到本地,该安装安装、该配置配置,这部分工作应该花不了太多时间。然后我会对照着软件的README或是官方的指南先写出一个『Hello World』示例。可以这么说,我在学习任何一门技术时,都会首先写一个『Hello World』,这一点大家如果之前看过圣思园的面授视频就会感受得到,我在讲每一个技术点时,都会通过一个『Hello World』示例开头。因为,我讲课时其实就是复原了我在学习时的经历而已。写完『Hello World』只是刚刚开始而已。接下来要做的事情才是最为重要的。如果软件包里面提供了Example,我基本上会将里面的所有示例全部运行一遍,这个过程中我会比较少地直接编写代码,而是运行官方提供的示例。这些示例既然是官方提供的,那么权威性与正确性就会得到极大的保障。但遗憾的是,很多程序库或是软件组件并未提供直接可运行的示例,那接下来我会做什么呢?
4、我会迅速读一遍官方文档,这个过程主要是让自己对这门技术有一个比较粗浅和全面的理解,知道这个技术是干什么的,在什么场景下使用,优势在于什么,存在哪些劣势(当然了,很多技术文档其实并不会说自己不好的话,都是说自己怎么怎么好,比如说在介绍自己时就说简单易上手啊、学习曲线低啊、开箱即用啊,这就需要学习者自己去辨析了)。这个过程我同样不会编写多少代码,只是看和想。在读文档的过程中,我会不断将其与自己已有的知识进行比对和分析。当然,这都是下意识进行的,并不是主动而为之的,可能形成了条件反射了吧。比如说在学习Apache Kafka时,我先将Kafka下载下来,然后根据官方文档的介绍对配置文件进行少许配置,接下来分别启动ZooKeeper和Kafka进程,然后创建Topic、生产者发送消息,接下来启动消费者看看是不是接收到了消息。仅此而已,我并不会太深入地了解框架底层是如何运作的,集群是如何搭建的,只是配置一个单机即可,这个过程的主要目的在于让一个软件系统能够成功运行起来,然后让一个非常简单的程序能够成功得到你期望的结果,这就足矣。这里我要强调的是,在学习过程中,持续的反馈是至关重要的。那么什么是持续的反馈呢?就是一定要自己动手,然后验证自己的想法,一定要看程序的运行结果是不是自己想要的。因此,在阅读官方文档的过程中,我花费的时间其实并不太多,感觉当下用不到的东西就直接跳过,一般这个阶段会花费1到2天的时间。看完后,只不过是对这门技术有一个总体和宏观的了解,或者说是囫囵吞枣,不求甚解。
5、当这个阶段过后,接下来就是耗时最长的阶段了,我会仔细阅读官方文档的每一个章节,然后将每一个示例都自己运行一遍,这其中会出现很多问题。这些问题很多在官方文档中都没有详细的讲解,这时就是Google与StackOverflow大显身手的地方了,基本上大部分问题通过搜索都能找到解决方案。除了官方文档外,看书也是必不可少的一个环节。针对一门『新技术』,我会购买几本、甚至十几本相关图书,因为每本书都会有自己的侧重点,多看一些相关的书我极大提升自己的理解速度的。值得注意的是,这个阶段也是大多数人放弃的阶段,毕竟学习一门『新技术』是要花费不少时间与心力的,耐不住寂寞很容易半途而废。因此,这也是我方才说提到的即时反馈的重要性。千万不要光看文档、光看书,不写代码。因为,文档与书给出的都是正确的讲解,但只有通过自己的动手和运行才能从根本上加深对某个知识点和技术点的理解。而且,自己动手写完代码后会给出非常直接的反馈。这就是所谓的正向激励,会让你更有信心学习后面的内容,否则学习一周可能就直接放弃了;另外,光看不动手还存在另外一个致命的问题,那就是看完就忘,基本上看完后不动手,两天之后你当初所看的东西基本上就忘光了。这是因为,现代软件系统越发复杂,除了代码还有大量的配置文件,这些东西如果不经过自己的亲手试验,我相信很快就回忘的烟消云散,起码我就是这样的。
6、除了官方文档与相关图书外,我还会看学习视频,我认为视频是最直观、最行之有效的学习方式之一。但遗憾的是,我所学习的很多技术,相关视频都是非常少的,有时我会在YouTube上查找,有时官方也会提供,但数量其实并不多。另外,视频的讲解质量其实也很重要,比如我当初学习Python时就是看了一个视频(忘记是哪个了),讲解的很不错,让我的学习速度大大提升。将官方文档、图书与视频,再加上Google、StackOverflow与GitHub,这基本上就是我在学习一门『新技术』时的全部武器了。这个阶段会比较漫长,尤其是所学技术比较复杂时,时间可能还会很长。比如我最早的Struts2视频,就是在Struts2刚刚发布时开始学习的,那时的资料极其稀少,自己也是不断摸索、不断尝试进行学习的,总体加起来差不多学习了2个多月的时间。很多技术在经历了这个阶段后基本上就算是学完了,然后最为重要的是要用。不用的话你会迅速将其忘掉。能在工作中使用当然是最好的,如果工作中暂时用不上,我建议你也要给同事做几次分享,这会刺激你深入学习。我一直认为,教是最好的学。
7、有一些特别重要的技术,比如说Spring、Netty,在经历了上面这个阶段后,我会开始分析其源码。一些程序库我们是没必要掌握到源代码层次的,比如像是Apache Commons包、JDom等等,能熟练使用就可以了。毕竟,精力与时间有限,人人都不可能将所有技术源码分析一遍。但对于像是Spring和Netty这种及其重要的框架,我认为掌握其底层的运行机理是非常重要的,因为每天工作都会接触到他们。了解了底层运作机理,会让你更好地理解框架的设计与使用,也更有自信编写出优秀的代码。分析源码这部分会持续更长的时间,也更加枯燥。这就需要一个人能真正静下心来。同时,在工作过程中都会比较忙,因此这部分工作很多都是在工作之余进行的。但我相信,这个工作是极具价值的,无论是对自己还是对团队都是如此。我从来不会在一开始学习某项『新技术』时就分析其源码,从来不会。我个人认为,这是一种本末倒置、顺序颠倒的做法。也不符合我学习的习惯;相反,我都是在掌握了如何用之后在来学习为什么这么用。一直以来,我都是按照上面的顺序学习『新技术』的,希望能对你有所启发!