首先要说,这并非一篇教你如何学习的文章,由于到今天为止我也没有找到一种通用的方法来解决如何学习的问题。可是在探索的道路上,我确实产生过一些思路,我想把这些思考的过程分享出来让你们探讨。若是这对你有帮助的话,那我会很是高兴。编程
我最近在学习 Rust ,这是一门很酷可是相对冷门的语言(学习冷门语言多是个人一大爱好,好比我就很是喜欢 CoffeeScript ,这是 JavaScript 的一门方言)。自从在某些语言的温馨区待久以后,常常会产生本身无所不能的错觉,这也是我不断想学习新语言的一大动力。segmentfault
而个人学习过程跟大多数人相似,就是先在网上找文档而后自学。而在看文档的过程当中,我就发现了一些问题。编辑器
“去看文档喽。”这是老鸟在面对新手时最喜欢扔的一句话,我一般也是这么扔给本身的。但当你打开一门语言的手册,你会发现它除了教你语法外,几乎没有教你什么其它东西。因而你会陷入这样一个境地:学习
“背下来了么?”
“背不下来,太难懂了。”
“再看一遍,给我背下来。”
。。。
“背下来了么?”
“大部分背下来了。”
“给我写个程序,实现个XX功能。”
“不会。。。”
“。。。”搜索引擎
在一个高级开发者眼里,你会了语法理所固然就应该会写程序了,但实际状况并不是如此。这让我想起前段时间跟一个朋友关于目前编程教育市场的一个讨论。我出于本身的经验提出一个想法:让大牛开发者来教新手入门。在个人设想中,大牛开发者拥有强大的实战经验,以及丰富的专业知识,更是自带光环,这不比如今市场上那些半吊子的讲师好多了。在我为本身“伟大”的想法得意的时候,朋友给我浇了一盆冷水。他告诉我这样根本行不通,大牛根本不知道菜鸟须要什么知识,你可能觉得基础语法讲清楚就行了,人家却连编辑器是什么都不清楚。设想一下,让一个大学教授去教一群小学生,这对二者来讲都是一种灾难吧。设计
这些语言的创造者,或者文档的做者,无疑都是一些大神。它们在撰写一个语言手册的过程当中,只能尽可能负责地把这个语言的全貌准确地有组织地展示给你。然而这种全面的展示,对于一个没有任何引导的初学者来讲并不彻底是一件好事。简单来讲就是,你会在一些次要的事情上浪费太多时间,而一些主要的概念又没有理解透彻。索引
当以为文档知足不了你的时候,老鸟们每每会扔给你第二招:看代码。看什么代码呢?那还用说,固然是被业界奉为经典的,在 GitHub 上至少有一万颗星的知名开源项目代码啦。接口
当你怀着崇敬的心情,打开扔给你的网址,看着满屏幕的代码时,你会对本身问出那三个经典的哲学问题。这是什么东西?它是怎么作到的?为何要这么写?搞很差某些人还会由于惊吓过分,从而失去了学习下去的信心。ip
那么让咱们一块儿来看看这些代码里有什么鬼东西,会吓得新手信心不足。开发
说一件事大家不要笑,在我仍是个萌新的时候,我曾经对这些穿插在代码中的神秘文字产生了深深的困惑,我还觉得它们对代码有某种加成做用,以致于我还试验过把注释去掉会对代码执行产生什么影响。而现实中好的代码会让后面的维护者方便不少,但很差的甚至错误的注释会让人迷惑不已。
语法糖是个好东西,它大大简化了咱们的编程过程,高手用起语法糖写起代码来简直不要太爽,因此越强大的项目这玩意儿越多。可是对于初学者来讲,语法糖隐藏了一些细节,并且让语法看起来很怪异。有些代码若是你用标准语法来写是很好懂的,但若是用语法糖来写的话很难让人一会儿明白。
初学者为了弄懂这些语法每每要花大量时间,但其实这些时间在这个阶段是不必的浪费。你看不懂它以为它是一个很重要的东西,其实它只是一个作工精巧的小玩意儿,离开了它这些代码照样能工做。而随着你的经验丰富,也能够随时随地用起来,用的方法可能也不尽相同。
对于一个开源项目来讲,每每 50% 的代码可能都是在适配各类不一样的运行环境,将系统的 API 抽象成项目里通用的接口,这部分代码除非你本身要作相似的项目,要否则的话对初学者来讲参考意义不大。更况且,为了适配某些系统奇葩的运行环境,开发者每每会大开脑洞,创造出一些很是奇怪的代码。这些旁门左道充满了玄学和不肯定性,初学者看多了可能会发生如武侠小说里练功出差错的结果:走火入魔。
剩下的代码里 20% 是项目内部的接口抽象和定义,最后 30% 才是真正值得看的东西,它们每每散落在各个地方,但又为了一个设计核心服务。让初学者识别出这些代码来,未免太强人所难。
这是我本身的一个定义,我把一切非官方的开发文档都称为野文档。初学者会在搜索引擎里获得大量的相关文档,他们不少是学习心得,不少人在写这篇文章时水平可能比你也高不了多少。这就形成了这些文档的水平良莠不齐,所面向的重点也不一样,也许你花了大把时间弄懂的是一个错误的或者过期的知识。而大部分号称教你入门的文章,可能也就是告诉了你如何搭建一个运行环境,这门语言的精髓和重点做者本身估计也没弄明白。
而若是你碰到一篇被奉为经典的好的入门文章,那你真的要好好感谢做者。由于这意味着做者付出了大量的深刻思考,深刻浅出这四个字提及来简单,作起来但是须要至关的功底的。
在这么多语言的学习过程当中,我也总结了一些相对比较好的学习方法。我认为看代码是很是有必要的,由于光死记语法是没法掌握好这门语言的。可是去看一些大型项目代码的缺点我在上面也说了,到底该如何是好呢?
我建议你们能够去看官方给出的,专门供初学者学习的 Step-By-Step 代码,这种代码通常在官方的文档页就能够找到连接入口,它有以下好处:
我建议你们一边看手册一边看代码,这样印象会更深入。眼睛看了以后,我认为要尽快找一些好的例子来练手,不须要一上来就搞比较复杂的大型项目,也是由浅入深。这种练手项目去哪里找呢,不少语言的 tutorial 板块就是干这个的,作的比较完善的甚至还提供在线的教学体验环境,你们应该好好利用。
这篇讨论学习方法的文章引起了个人一些额外思考。我常常在开发者社区里看到老鸟和初学者互怼,写这篇文章的过程也让我理性思考了产生这些矛盾的缘由。总的来讲就是一些信息的不对称形成的。老鸟认为这个问题根本不是问题,网上一搜一大把,不肯多讲甚至冷嘲热讽。而初学者却以为这些信息根本理解不能,老鸟的嘲讽就是一种羞辱。
我认为要打破这种不对称须要双方付出耐心,而这种耐心的付出是相互的,你付出的多回报的就越多。而最早迈出付出这一步的,应该是初学者,毕竟从情理上来讲是你请求人家办事。而你须要付出的不过是把本身的问题讲明白,说出你的思考过程,附上必要的信息。一个好学的人是不会让人讨厌的,但前提是你得有一个不让人讨厌的姿态展示出来。
拓展阅读