对于程序员而言,最大的痛苦莫过于对着层出不穷的新语言、新技术和新框架疲于奔命了。 就拿cocos2d-x来说,有些人可能2.x都才刚刚上手,3.0就已经出来了。而他们正准备开始去尝试3.0的时候,可能3.2已经出来了。然后,他们怒了,“你他娘的版本更新速度太快了!”

各种新技术,新语言和新的技术框架,让我们感觉好像有永远也学不完的东西在等待着我们。 所以,有一部分人每当要学习一个新东西之前,会不停地问“我学了这个东西有用吗?”,“这个过时了吗?”。 因此,很多人不愿意去学新东西,因为学那么多新东西,不如精通一门来得强。可是,说到这里,马上就又有一股淡淡的忧伤从心底升起。 这世上偏偏就还有那么一些东西(比如C++),感觉自己一辈子都很难精通。大师还说,要精通一个东西,至少要花费1万小时,积累10年方能修成正果。 “尼玛,在中国,有多少程序员10年后还在编码?”

看到这里,貌似满满的负能量,这当然不是博主的作风。不过博主从接触计算机编程开始,时间也不算短了,整整8年有余了。从一个计算机小白发展到许多人眼里的“大神”,我走了非常多的“弯路”。(为什么“大神”两个字要加引号呢?答案很简单,因为我不是大神。至于“弯路”,因为我的很多思想如果没有那些弯路,可能也很难形成。我学习了很多当时看似没有任何作用的东西,但是后来都慢慢地显示出了它们的价值。)

本文主要谈一些我的学习经验和体会,以及我对待学习新东西的态度和方法。

学习态度

这一小节,主要是一些形而上学的东西,不过往往是这些形而上学的东西对一个人的影响最大。

开放的心态

作为一名有理想有抱负的IT人士,对待任何新事物都应该持开放的态度。不管是苹果新出的Switf语言,还是cocos2d-x新出的3.2版本,我们都应该积极地去拥抱它们。任何一个新东西,它的出现一定是有一个合理的理由的。就像在python社区里面,到现在还有很多人在争论到底是学习python2还是python3,其实大可不必。因为,如果我是一个Python新手的话,我一定会学习最新的。为什么呢?因为新东西的出现,肯定是为了解决旧东西的一些不好的方面。就像学习Emacs或者Vim,我一定会用最新版本,而不会因为几个插件不兼容,我就不去接触最新的版本。

一定要有计划

我们的老祖宗在几千年前就告诫我们,“凡事预则立,不预则废”,学习也是如此。学习一个东西之前,一定要先计划好下面两件事情: 1. 学什么?主要指的是你的学习内容,可以是书籍,博客,官方文档,视频教程等。因为我是新手,所以选择这些学习资料非常关键。看完一本好书和看完一本烂书,那真的是有天壤之别。另外,学习内容要从入门到初级到进阶到高级,循序渐进才好。 2. 怎么学?主要指的是你怎么根据自身的情况安排时间去学习这些资料。 搞清楚这两点非常重要,当然现在如今网络这么发达,相信大多数人都会做这两件事,只是做的好坏的问题了。

不贪多,脚踏实地

有了切实可行的计划之后,一定要严格按照计划去执行。切不可贪多,临时修改计划,添加新的学习内容,甚至更换新的学习对象。最好是等一个阶段,比如一个月过去之后,再回过头去修改计划会比较好。如果学习的时候总是虎头蛇尾,那就很难学会一个东西。虽然现在很多这样的书,《21天精通xxx》,《7周教你学会7种语言》等。这些书只能带你学习一点皮毛,离真正地项目运用还差得远呢!

注重实效

因为,大家平时工作已经很辛苦了。所以,在挑选新技术的时候,尽可能地挑选与工作相关的。比如我是一个c++程序员,我对Lua和OpenGL不是很熟,但是工作中可能随时都要用到这些知识,那么我就可以利用下班时间来补一些之方面的知识。这样,在上班的时候,可能你新学的知识就会派上用场。学以致用,更能够提高学习效率。但是,如果你的工作中用到的技术对你来说已经没有什么挑战了,此时,你就可以挑选一些比较有挑战性的东西来学。比如学习一个新的编辑器Emacs/Vim,或者学习一门函数式语言list/Erlang。

学习方法

本小节,以我学习OpenGL和Lua为例,介绍一下自己的学习方法和学习过程。

Google

“Google是我最好的老师”。

不管是技术上遇到问题了,还是学习一门新技术。我首先想到的就是Google。比如,我要学习OpenGL或者Lua。 我会这样搜索:

"OpenGL ES 2.0 tutorials" "Modern OpenGL tutorials" "Recommended OpenGL books/tutorials" "Best way to learn OpenGL/Lua" "Lua books"

如果我对于一个新东西不了解的话,最好的办法就是先看一个教程,然后动手尝试一下,马上就能有感觉。这一点非常重要。如果你看了教程,弄了三天都没弄出来,那么说明这个东西真的不适合你。 另外,书籍永远是全人类最好的营养品(部分中文书除外)。我一般会在看完一些tutorials之后,选择一本google上面评论很高的英文书开始看。等这本书看完,自己也就入门了,接下来的路该怎么走也会很清晰了。而且很多英文书的最后都会推荐一些不错的学习资源,顺藤摸瓜,想学不好都难。当然这里有个前提,就是一定要坚持看完一本书。看似简单,实则非常困难,特别是工作时间长,压力大的时候。

社区

真心想搞技术的人一定要找对自己的社区,不要每天泡在QQ群和国内的一些论坛里面。多去Github/Google+/Reddit上去看看,那里云集了全世界在那个领域的达人和专家。而且,如果你很礼貌地去这些地方提问,一般都会有人给你提供帮助,教你如何更好地入门和学习这项技术。另外,社区里面的wiki和forum也是非常宝贵的学习资料集中地。

代码导向

学了一个新东西,一定要学以致用。哪怕是写简单的demo,也能证明你学习的价值和效果。比如我学习了OpenGL和Lua以后,我就相应地写了OpenGL教程Lua教程.虽然这些教程可能只是学习笔记,但是它一方面强化了自己所学的内容,同时也给了自己一个归纳总结的机会。如果是工作中需要用到的技术,那么就更好了,直接就可以应用到项目中去。如果是业余学习的,那么最好是做一些个人的小项目,可以是比demo更高级别的那种。另外,学习OpenGL ES,我会把它用到cocos2d-x里面。学习Lua,我会用它们来写一些Lua小游戏,而不只是学习Lua语法。

技术交流

当自己入门以后,此时再去论坛或者Q群里面进行技术交流,这样效果会好一些。否则,如果老是问一些“很基础的问题”,相信“大神”也会烦的。另外,也可以与行业内的一些专家和大牛交流,但是,往往这些大牛可能会比较忙。那么,最好的交流方式其实就是写博客。通过博客把自己的所思所想所感记录下来,一方面可以整理自己的思路,另一方面,别人在看完以后,也可以给自己反馈。这一点与著名的费曼技巧有点类似。

结语

对照自己已经掌握的内容,对比学习新的内容,有时候也会得到不一样的效果。比如我学习Objective-C就增进了我对于C/C++程序的内存管理的理解 。 有时候,我感觉记住“Big Picture”也非常重要。头脑里面记住的知识越少越好,掌握的原理越多越好。

PS:如果您有什么好的学习方法和学习心得,欢迎在下方留言,大家可以相互学习一下。:)