分享一篇之前看到的文章,也为了之后找着方便。java
几周前一个朋友也打算经过跑步来甩一甩脂肪,控制一下本身那已经严重扭曲了的身材 —— 他便求教我从衣服到鞋,从腕表到心率带,都买了什么装备,性能如何,他好照着原样来一套。我告诉他我什么装备都没买,跑了半年多了,我仍是随便套上件纯棉的T恤,穿条舒服的运动短裤,蹬着跑鞋,抓着手机,就这么跑将起来。他连连说不信,一个连排汗速干的衣服,臂包,运动腕表都没配的人,怎么也能(配得上)跑步?python
这让我想起了我在撰写「程序人生」公众号常常会遇到的一些读者留言:android
「我想学rails,有没有推荐的ruby的入门书籍?」c++
「我想学android,对java掌握到什么程度才能开始呢?」web
「我c/c++还没入门,能直接学python么?」django
这些问题都是初学者经常萦绕心头的疑虑。在咱们本身的现状和想要达成的目标间,老是横亘着一条名为「先决条件」的大河,彷佛除了花费巨大的精力游过这条大河外,别无他法。很不幸,大部分人还没可以接近目标,便被湍急的水流冲走了。然而,仍是有少部分人彷佛坐上了阿拉丁的魔毯,毫无迟滞地直达彼岸,好像学什么技术都不那么费劲。这是怎么回事?ruby
学一门新的语言,或者新的技术,与其说是一种能力,不如说是一种方法。试问什么样的人,或者说人在生命的什么阶段,学习效率最高?效果最好?答案显而易见:婴儿期。个人不到两岁的女儿估计如今也就掌握了几十个名词,十多个动词,三五个形容词和介词而已,但天天从她口中蹦出来的话不下几百句。想一想咱们本身学了多少年英语,才能从口中完整地说出:"hello everybody, so glad to see you",初中?高中?抑或大学?想一想咱们单词量三千的时候能作什么程度的沟通,交流?编辑器
若是你仔细观察,你会发现,婴儿的学习方法极尽实用之能。模仿,试错,练习,无论一切所谓「权威」的语法,词法,一切以用为主。仍是以我女儿为例,她的表达是以短语和句子为主:性能
「爸爸抱抱小宝」- 求安慰学习
「小宝要喝奶奶」- 饿了
「要是小宝不听话呢」- 学会了反问以后你跟她说话她时不时就将你一军
「妈妈妈妈快回家,让我亲亲你吧」- 跟唱歌机学的,卖萌
「goodbye so long farewell my friend」- 跟音乐课学的,卖萌
说出的大部分的句子,她并不知道每一个词的具体含义,但她知道这个句子的模糊的意思,并且从大人的反应中,她能知道她理解的意思是否正确,就这样,一次又一次模仿,试错,得到反馈,不断地累积本身直接能用的「知识」。
这是实用主义者的学习方法:绕过障碍,直奔主题,专一那些你立刻须要学的。几年前,我在开始学某样东西前,会上网搜罗几乎全部能找到的从入门到进阶再到专家的书籍,在看了一大堆各式各样的评论后,心满意足地筛选出所谓的「精品」购买回家,而后把他们垒在书桌前,仿佛这是学习以前必要的仪式。但这样的作法仅仅是成就了豆瓣和亚马逊,堆积的图书每每在我豪气万丈地看到第一本的第X章(X<=5)后便被束之高阁。后来我发现,我被所谓的「学习要先系统地打下扎实的基本功」坑了 —— 我不断地陷入「基础知识」的泥沼,越陷越深,越学越苦,只能苦苦挣扎。这挣扎的结果,80%的状况变成了放弃。
其实我大可没必要去担忧这些「基础知识」,把它们先放在一边,用到多少,便学多少。好比说,我要学rails,那就直接从rails开始,遇到有关ruby的语法障碍,回过头来看看ruby文档中相关的内容,扫清障碍马上回到rails自己,而不是先从ruby啃起。要知道,rails里用到的ruby特性,可能占ruby整体语言和类库特性的20%都不到!从ruby学起,即是走了岔路。
软件开发是个手艺活,它的学习不是各类可能不多用到的知识一股脑的堆积,咱们无法在一切理论知识准备就绪之后再开始学习。scala的做者批评java的低效时曾经说过,java把写程序变成了作仪式,所以毫无乐趣可言。那么,当咱们在桌前堆满了从入门到专家的各类书籍,是否是也把学习变成了一场盛大庄重的仪式?重要的不是堆砌了多少知识,而是学以至用。
仅仅专一并直奔主题还远远不够。学习过程当中你须要大量练习和得到反馈。 婴儿并无在累计了3000个词汇以后才开口说话,而是当身体和大脑准备好后的第一天就张口说话了,而且,尽管说得错误百出,他们依然越挫越勇,屡败屡战。一样的道理,当你学习python而不使用ipython在REPL环境下尝试各类使用技巧,当你学习django而没有从搭建一个可运行的web项目开始,那学习效率确定不高,效果也必然马马虎虎。在健身房里,就算观摩教练的动做一百遍而不是本身亲自尝试,并接受对方的纠正建议,你仍是没法掌握正确的动做要领。我见过有人把书中的例子一个个敲到编辑器中,所有运行正确,而后就心满意足地认为本身「掌握」这门技术了。却不知,这种「练习」并不是有价值的练习。咱们须要试错,就像婴儿学步那样,模仿,迈步,摔倒,爬起来,再迈步。犯错是学习的一部分,当你看完教程掌握了里面所述的内容后,能够本身构思某个应用或者某个使用场景,而后从头写起。你会发现不少问题,也会加深对教程的理解。本身没法回答的问题,能够寻求社区的帮助,大部分和开发有关的问题都能在stackoverflow上获得解决。这样不断地练习和获取反馈,你的开发功底会很快提高。不少非系统的知识和能力(甚至洞见)就是这样经过不断练习和试错在下意识间学到的 —— 它们来得如此悄无声息,以致于除你以外,别人都将其视为你的一种天赋。
那么,何时须要系统地学习呢?当你有了实战所需的技术和经验,须要宏观上对本身所学的内容作一个升华时,或者当你的实战能力遭遇到了瓶颈的时候。有句话说得好:你不须要成为一个优秀的ruby工程师才能用好rails,但若是你想成为一个优秀的rails工程师,则你必须很好地掌握ruby。遗憾地是,不少初学者的问题是:想对一门技术快速入门,却使用了系统学习的方法,还未入门,便倒在了艰苦修行的路上。
做者:陈天