如何高效学习一门新技术

如何高效学习一门新技术

最近着手学习WCF。举步维艰,故阅读了大量关于学习新技术方法的网页,最终整理如下,一共大家参考。

对于这个较大的话题,我们分两个部分介绍:学习新技术的10个建议 和 学习新技术的具体行动

学习新技术的10个建议

尽管我的建议主要涉及的是软件开发方面,但是这些原则在其他领域也同样适用。

1. 克服惯性

万事开头难,克服惯性是学习新技术的第一步。举个日常生活中惯性存在的简单栗子,当我们看电视的时候会因为遥控器不在身边而懒得换台。幸运的是有很多的小技巧可以调动我们的积极性,帮助我们克服惯性。对于我来说,微习惯是一个很好用的小技巧。与其被手头的任务吓到,不如将任务细分为一个个具体的微任务,然后挑选其中的一个开始做起。就“拿到遥控器”这个例子来说,首先扭动你的脚趾,向前伸出,然后推动整个人离开沙发。下一步,身体滑到地上,用脚拿到遥控器,然后起身。通过完成一个个的微任务,你会发现自己克服了惯性,并且这项任务不再显得难以完成。这个方法可以被应用到学习新技能的过程中。关键就是将大块任务细分为微任务。

 

2. 关注大牛

学习新技能的第一步是明确要学什么。它可以是任何你有激情去学,并且想深入学习的一些东西。这种原始的学习欲望非常重要,这种欲望可以在你的学习低潮期给你提供动力。你想学的或许是一门新的编程语言、应用框架或者是新的工具,一旦你确定了想要的是什么,就立刻去收集相应的优秀群体所做的一些优质的工作成果。这些可以从YouTube、Vimeo、HackerNews、各种博客,甚至是你的微博好友那里获取。关注别人做了些什么可以给你强大的信心,让你觉得“You can do it, too!”

 

3. 建立知识网

当你对自己要学习的东西建立了信心之后,接下来要做的就是做一块海绵,然后开始疯狂地吸收知识。从Google搜索关键词“beginner tutorials”开始吧,搜索一些跟你要学习的知识相关的入门教程。如你所知,Nettuts+上面有成千上百的各种教程供你选择,StackOverflow上面也有很多学习资源。此外,Quora也是一些不错的选择。通过浏览这些网上的资源之后,如果想要集中精力学习某一方面,这时就需要阅读一些相关的书籍了,个人推荐在Amazon上面寻找一些评分较高的专业书籍来提高自己。

 

 4. 多听多看

随着你对技术的深入挖掘,你可能会想利用更多其他形式的学习资料,比如CSDN、开发者论坛等。目前,有很多的网站都有提供在线教育服务。如:W3CSchool 、RUNOOB 、 慕课网…

 

5. 行动起来

现在你已经看了一定的教程以及视频资料,并且对于想学的技术已经有了一定了解,接下来做些什么呢?没错,是时候理论联系实际了,实践是检验真理的唯一标准。

用你所掌握的技术做一个个人的小项目,设计一些简单的功能并且实现他们。毫无疑问,你会遇到很多的绊脚石,当遇到它们的时候,在百度或者Google上面搜索之,解决之。你已经踏上一条成为某一领域专家的旅程,遇到的困难挫折越多,你会变得越睿智。有句老话说得好,“专家是犯错最多的人”,这意味着他们尝试了很多疯狂的事情来探索这门技术的极限,最后,对于这门技术是如何运作的就可以知根知底。拥有这种洞察力之后,他们便可以随心所欲的运用这项技术去按照自己的意愿完成想做的事情(当然,是做好的事情)。

 

6. 写博客

在你进行你的探险之旅的时候,实时记录下你的成长以及犯下的错误大有裨益。在技术领域,博客是最简单易得并且受欢迎的表达载体。当你准备落笔的时候,你会强迫自己整理思路,并且对积累下来的零散的知识片段进行结构梳理。说不定,通过互联网的分享,你的经历和分享会给别人的成长带来帮助。

如果你想走的更远(比如想像Nettuts+上面的职业作者一样),你也可以制作属于自己的screencasts。总的来说,写博客能够提升你的个人沟通能力,这与你学到的技术同样重要。

关于写博客,我们已在多篇文章中鼓励大家去博客。比如这一篇《即便没有读者,你也要写博客》)

 

9. 拥抱GitHub

GitHub是全世界开源项目的标志性建筑物。它是知识以及优质代码的宝库。当你对某项技术自我感觉良好的时候,下一步便是在GitHub中浏览寻找有趣的项目。阅读开源代码,尽可能多的阅读。这样做的话,你能够学到很多东西,比如说:

·        如何管理规模较大的项目

·        项目中应用的有趣的库

·        代码规范以及代码全局设计

·        文档风格

·        测试规范

·        解决诡异问题的方法,以及发现项目中有问题的地方

所有的这些知识都在等待着你去挖掘。有趣的是,这些知识的通过一个简单的标签就可以得到,那就是“好奇心”。

 10. 专注学习

如果你担心上述的学习过程太迟缓,那么你也可以尝试一下快速学习模式。你或许听说过“24小时学会某某某”,但是这种方式不是我所推荐的。我认为更合理的是用几周的时间去学习。你可以尝试一下类似“七周学会七种语言”或者是“七周学会七种数据库”等学习方法。尽管这些讲的是语言以及数据库方面的学习,但是你在学习其他技术的时候也可以运用这种思维。

有一个不太相同的学习风格是“困难学习模式”,这种观点的前提是没有人可以真正掌握一门技术,除非每天都练习。所以,想要成为专家,你就需要不停地进行练习。异曲同工的是你可以查看Katas 和 Koans,他鼓励的使用你学的知识来解决问题。这些可以让你更好地入门以及接受那些陌生的概念,勇敢走出自己的舒适区,开始学习新知识!

 

学习一门交叉的技能

编程是一项左脑的运动,它利用的是大脑的分析能力,一步一步地寻找解决问题的方法。为了发挥右脑的功能,你可以尝试从事一些创造性的活动,比如说画画、3D建模、折纸、乐器甚至是制作家庭相册等。事实上,编程同样需要大量的创造力。或许你曾经遇到过类似的事情,你在睡梦中找到了问题的解决方案。这是因为你的右脑处理问题的方式很不同,它可以从各种地方获得信息。敏捷开发权威人士Andy Hunt就这个话题写了一本书《程序员的思维修炼》。如果你想点燃你的每一个神经元,建议你开始学习一门交叉的技能。

 

总结

掌握一门新技术振奋人心,这是一项影响你思维的新的体验。但是首先,你必须克服你的惯性,一旦你做到了,你便开启了从web的每个角落学习知识的旅程。我希望上面讲的十点能够给你的旅程带来一些帮助或启发。

学习新技术的具体行动

积极开放的心态最重要

学习新技术,就如探索一片新的领域,一般在心态上来说,都会有两种典型的心态,一种是恐慌和抗拒的,一种是积极和开放的,不同的心态会造成不同的结果。

从心理学的角度来说,我们对于外部世界的认识可分为三个区域:舒适区,学习区,和恐慌区。我们所熟悉的技术领域就是舒适区,而新技术是处于学习区或恐慌区。随着对新技术的掌握,新技术会进入舒适区,但是总还会有更新的技术在学习区甚至恐惧区,等着去学习掌握。

如果想高效的学习掌握新技术,在心态上一定得是开放和积极的。

 

       做中学(Learning By Doing)

如果没有@邹欣老师的《构建之法》,我可能没法这么精准的去概括这种边做边学的方法,对于软件技术的学习,最高效的办法应该就是“做中学”。

如何通过“做中学”去学习掌握新技术,我一般分成这样几个步骤:

  1. 整体概览
  2. 明确阶段性目标,选择实践项目
  3. 搜集整理相关文章和开源项目,模仿借鉴

整体概览

所谓磨刀不误砍柴工,在动手去做前有必要先做一些准备工作。在开始学习一门新技术的时候,先对新技术整体有个了解是很有必要的,需要知道它能做什么,有哪些关键的知识点。接下来的步骤,也都依赖于对技术整体的掌握和了解。

这个工作,如果有条件,可以买一本薄一点的,浅显易懂的书,整体翻一翻,基本就能有个了解。但不建议买大块头的书,一般大块头的书适合当词典来查。但现在新技术推出速度太快,往往要等书出来往往是几个月之后的事情了,所以绝大部分时候,还是得到其官方网站去查相关技术文档。明确阶段性目标,选择实践项目

一般一门新技术所涉及的面比较广,如果一开始就想全面掌握并不现实,但如果从一个个点去突破,相对要简单很多。所以一般我会通过一个或多个项目实践的形式,分成几个阶段,逐步去掌握各个知识点,最终整体去学习掌握技术。

例如我以前学习一些服务端语言,都会尝试通过写一个留言板或者博客系统来学习,而这次学习React,主要就是通过用React重构我以前用Angularjs写过的一个聊天室应用,来学习掌握React。通过前面对React的概览性学习,结合自身情况,我对于这个项目实践,简单分成了几个阶段:

1.用React搭建基础框架
React的应用是基于Flux架构,而Flux架构并没有统一的标准,需要选择使用一种Flux架构实现,并基于它搭建基础框架。

2.实现界面基础组件
React是基于组件的方式来编程运行的,所以需要将整个应用拆分成若干基础组件,这个阶段主要就是把界面的元素和交互拆分成若干基础组件
3. 和服务器进行通信
一个完善的程序,离不开和服务端的交互,对于一个React程序,其和服务端交互的方式,和传统应用程序,并不全相同,并且对于和服务器通信的结果数据,还要和界面整合
4. 发布测试完善
对于做好的作品,发布给自己和其他人进行测试,然后继续完善,在这个过程中去进一步学习掌握技术细节

当明确了实践的项目和各个阶段的目标,后面就是如何去达到这个目标了,在实践中学习。

搜集整理相关文章和开源项目,模仿借鉴

书本或文档上一个个知识点的说明,和最终的项目产品,还是有很大差距,项目最终是需要充分运用各个知识点,合理组合,才能写出高质量代码,而对于新技术,一开始很难掌握这些细节,盲目依赖以往经验,很可能就是照猫画虎,最终做出来的东西不伦不类。

在初学习实践新技术时,模仿借鉴很重要,就像小孩子学说话,都是从模仿开始。好在现在通过github这种开源项目托管服务,利用搜索,可以找到非常多的优秀开源项目。

有些程序员写了很多年程序,代码质量不高,一个原因就是因为看的太少,很少去参考学习那些优秀的开源项目。没有见过好的代码是什么样的,自然很难写出来高质量的代码。

 

做中学(Learning ByDoing)

在看书看资料的时候,一个个知识点看起来并不复杂,但是当真正去动手实践的时候,会遇到各种各样的问题(坑),而这些问题只有反复的思考、查资料、问人才能最终解决。

在做中学,听起来很酷,但这个过程总是艰辛曲折的!学习往往就是这样的,只有经历各种各样的磨练,才能真正的去掌握这些知识,把这些知识转变成自身的能力。

我这次用React重构聊天室的经历,如同我以往学习其他新技术的经历一样,充满了艰难险阻,两个月来付出良多。但最终完成的时候,却是成就感满满,感觉到对于新技术终于算是基本掌握了,虽然还有一些知识点没有应用到,也不过是时间问题罢了,再回头看以前的一些程序设计,又有了很多新的思路。

经验教训

以下是总结的一些经验教训

贪多嚼不烂

虽然现在新技术推出很快,但很多技术本质并没有变,在有其他技术“良好基础”的前提下,掌握一门新技术并不需要花太长时间,但“良好基础”就如学习武功的内功,才是真正需要多花时间去培养的。

所以去学习新技术之前,先看看手头的技术是不是掌握好了,如果没掌握好,不妨先学好再说,不然每门技术都浅尝则止,反而是难有成就。

目标不宜太大,要有阶段性成就正向激励自己人的学习热情都是有周期性的,最开始激情满满,一段时间后就会激情逝去,很容易就半途而废放弃了。所以在设定阶段性目标时,最好能目标小一点,现实一点,能多一些正向的反馈,这样能让自己走的远一点。

举例来说,写程序可以优先写单元测试和界面部分,这样很快就有明确的反馈,比如当你看到单元测试全部通过了,能看到界面了。

 

 

 

 

 

 

 

附:

欠缺思考容易导致这样的现象:

不会做设计

遇到了问题,拿见到过的、学到了的熟悉的框架、方案、模式往上套,而不仔细分析其中的利弊,只是尽可能地寻找最接近当前问题的解决途径。

有的是不会做系统设计。和少数所谓的“架构师”接触过,他们“只懂业务,不懂技术”,这样设计出来的系统只能满足功能性需求;而论坛上的一些具体问题的讨论话题,则暴露出一些跟帖讨论者“只谈技术,不提业务”,譬如“XXX大容量的解决方案”、“秒杀系统的终极架构”,企图对某一类宽泛的问题,设计出一套放之四海皆准的通用解决方案。

还有的则是不会做面向对象设计,缺少抽象和解耦的能力,这样的例子就更多了。朋友告诉我,他的单位有一位写Ruby的老员工,一个庞大的工程,代码里面居然只有一个上帝类,就搞定了所有的问题。

不能坚持自己的观点

这一点在面试中最容易观察到。应聘者有刚毕业的学生,也有工作超过10年的有丰富经验的从业者。他给出一个粗略的方案以后,在方案没有细化到一定程度以前,很难给出优劣的评论,但是,如果你轻轻地challenge一下,他就迅速放弃本来的构思,跑到你的思路上来。

例如,SNS系统中,服务端有消息要怎样通知到客户端,这样的一个问题,解决方案有很多种,比如客户端轮询、服务端hold住连接推送等,各有利弊。应聘者应当有自己的观点。

不能细化一个问题解决方案

怎样区分一个空谈家和一个实干家?给他一个具体的问题是最好的办法。在我刚工作的时候,我曾经很钦佩那些在活动中、讨论中高谈阔论的人,我觉得他们很能说。可是后来我逐渐发现,能说的人实在是太多太多了。细化设计、甚至落到编码,才是对一个程序员真实的检验。当然,如果你觉得做软件设计的人可以不熟悉编码、架构师可以不首先是一名高级程序员,那我们也没有什么可谈了:)。

如果你会学习,你可以成长得很快;如果你不会思考,你永远只能跟在别人后面。

在新技术的学习上我认为也应当多思考,不同的人有不同的学习动机。在非外界所迫的情况下,对于新技术的学习,我的观点可以概括为:

它要解决什么问题,就是所谓的问题域,是我关心的吗?

我没有去研究操作系统底层的实现,并非这没有价值,而是我没有兴趣,这就是问题域的影响(不过现在我有兴趣了,我想做一些这方面的事情)。

和过往解决方案它的优势在哪里,是否显著?

这是competition,重复的技术是没有生存空间的(当然,你是微软的话除外:)),就像互联网同一个类型的网站,竞争到最后就那么两三家。就像Groovy,我很喜欢它,但是有了Scala以后,我觉得兴许有一个要死掉(Groovy创始人说,如果他早些知道Scala的话,就没有Groovy什么事了。具体的报道请去Google上搜他的blog)。

它的实现和带来的效果上看,有没有很有意思的思路,是值得借鉴和思考的?

这是最难讲的一个问题。以去年初开始接触的Node.js为例,它可以做到把后端的聚合(譬如portlet之流)放到前端来,后端只保留一种类型的页面服务——页面模板,以及若干易于管理的API接口,大大简化了后端体系的复杂度,而且还能把压力分散到前端来,这是我早些年不曾见到的。

这三个问题想过之后,觉得有价值,我才去学习。要不然,对我而言就是不想深入的东西,了解了解也就罢了。

新技术学习的方式呢,我想说这么几点:

寻找切入点

我很喜欢BlueDavy的blog上的一句话:“理论不懂就实践,实践不会就学理论!”。

最后最好是要落到动手实践上去的,但是倘若习惯从那些原理介绍的文字入手,未尝不是一种不好的选择。而且,现实情况会有一些约束,例如在了解几家互联网公司的云平台的时候(Amazon的EC2,M$的Azure等等),除非你是这几家公司的员工,否则是很难深入其中的。

寻找自己的兴趣点

学习应当是一件有意思的事情,当你的大脑排斥它的时候,我不相信可以很容易地掌握这门新技术。如果你找不到兴趣点,那么,不妨回到我前文对于新技术是否值得你学习的观点上去,既然你没有什么兴趣,你学它干嘛?西安软件培训

善于比较

比较是一种非常容易上手的思考方式,和什么比较?和相似技术比较,和操作系统、网络这些基础设施上面的例子比较,最后,和生活中的例子比较(譬如,JAVANIO的实现是一个很好的例子)。

不断获得回馈

回馈是什么?做出一个HelloWorld的例子,就是一个极好的回馈;理解某一项实现原理,联想到其它类似的实现,产生一种恍然大悟的感觉,也是一种回馈。在学习的过程中,不断产生回馈,意味着你不断地收获成就感,这是继续下去的动力之一。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

发布了11 篇原创文章 · 获赞 19 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览