学习编程语言是一种技巧:做好了,你会感受到掌握新事物之后的快感(dopamine:多巴胺);做不好,就会接二连三的沮丧,甚至放弃。下面这些学习编程语言的最佳技巧是我从多年的著书写作,演讲和培训中总结出来的。这里头很多技巧来源于对高效学习前沿研究做了解释的书籍。
持续测试自己以抵抗胜任力错觉
最不济的学习方法中的一种就是重读或者重看材料。这种重复会给你一种感觉——似乎不用花什么气力,你就理解了话题所涵盖的内容。研究者们把这种现象称作胜任力错觉。
更好的一种方式(你可以掌握的最佳技巧之一)则是持续地测试自己。不要重读一个函数、类或者一个对象是什么,而是让自己定义这些概念或者把它们用到短小的程序当中——强迫你用某种方式显示自己的理解。这一过程常常很不舒服的,但是对形成长期记忆非常有效。更进一步,你可以在阅读材料之前先去行测试,举个例子,尝试在阅读一个章节之前做做练习。值得一提的是,这也被证明有助于记忆的形成。
测试对于学习的显著影响被称为测试效用,下面是一些具体方法可以利用:
在阅读章节或者看视频之前,尝试猜测你将要学习的东西,并写下来。
在阅读章节之前先做做这个章节的练习题。
一直做练习,即使是最难的那些。暂时(永远)放弃一个练习也是可以的,不过至少要尝试一遍。(下个章节会详细谈到)
阅读短小的程序并且尝试不看源码重新写一个。或者,再小一些,写个函数也行。
在学习了对象、类、方法或者高阶函数等新概念之后,立即编码做示例。
创建阐述这些概念的图示,以及这些概念之间的区别和联系。
把你刚刚学到的概念写成博客。
尝试把概念解释给非技术的朋友听。(在写《Clojure for Brave and True》的时候,我常常这么干。这样能够以外行的话阐述一个想法,进而迫使你深入理解想法本身。)
这些技巧的大部分都要规约到编写代码上!说到编程,由于程序都是重文本和概念性的,所以很容易以为我们仅仅通过阅读(代码)就在学习。但是程序同时也是一门手艺,就像其它手艺一样你得操练才能娴熟。编码是暴露你对程序作有错误假设的最佳方式。你越快地这么做,就会越快地纠正错误和提升技能。
如果你想了解更多测试效应的事情,敬请查看坚持:成功学习的科学(make it stick: The Science of Successful Learning)。
花时间放空自己
如果你纠结在一个问题上,或者对刚才读到的东西不能理解,就去散散步甚或洗个澡 —— 只要能进入一种舒缓、放空的状态就行。解除障碍的最佳方式之一就是歇一会儿,这可能听上去有点反直觉,但确实如此。
问题是,当全神贯注解决问题时,我们很容易陷入思维障碍(mental blinder)。我的意思是,这差不多就是“关注”(字面上)的意思。不过,全神贯注会导致我们只能一直探索解决方案空间的一小部分。一旦放空,我们的潜意识就可以探索并联结我们经验中的广泛领域。
对我来说,这就像当你试图在纸质地图上找到一个目的地(是否还记得?)。你不用刻意就确信你想抵达的城市应该就在这里!在地图的左上角的区域,所以你看了一遍又一遍,都没有成功。然后你放下地图,做了深呼吸并让目光游离了一会儿。当你重新看地图时,确切的地点立马映入眼帘。
我们曾经都有过这样的经验,在洗澡的时候突发灵感。现在你对于为什么这么做有了更好的了解,那么也就能刻意地使用这个技巧。个人来讲,如果纠结在某事上,我真的会洗个澡,这个技巧的功效显著。另一方面,我又是多么干净(注:洗澡这件事)。
如果你想多学一些关于思考的关注和分散模式,敬请查看A Mind for Numbers: How to Excel at Math and Science (Even If You FLunked Algebra)
别浪费时间沮丧
和上一个章节相关:别浪费时间为代码沮丧了。沮丧会让我们做一些愚蠢的事情,比如重新编译或者重刷浏览器,期望这次会有所不同。
把沮丧看作你的知识有差距的信号。一旦你意识到自己沮丧了,它可以帮你后退一步,清晰地识别问题。如果你写的代码不起作用,坦率地向自己或者别人说明你期望的结果。使用科学的方法,就非预期行为的根因提出一个假说。然后测试你的假说。再次试验后,如果依然解决不了,就把这个问题放到一边,待会儿回来。
在一些似乎没法解决的问题上,我不知有多少次恼怒地扔掉了自己的笔记本电脑。隔天再看,一个显而易见的解决方案立马跳入脑海。甚至上周就发生过。
确认你正在处理语言的哪个方面
个人观点,我觉得记住这些是有用的——当学习一门编程语言的时候,你实际上正在学四件事情。
怎么写代码:语法、语义以及资源管理
语言的范式:面向对象,函数式,逻辑等
产出物的生态圈:如何构建、运行可执行文件以及如何使用库
工具:编辑器,编译器,调试器,代码质量检测器(linter)
这四项很容易搞混,不幸的结果是,当你遇到问题最终完全找错了地方。
举个例子,某些完全的编程新手,可能准备开始构建iOS应用。他们可能会试着让自己的应用在朋友的手机上运行,只看得到有关需要开发人员证书或其他信息的消息。这是产出物生态圈的一部分,不过小白可能将此视为编写代码的问题。他们可能会浏览自己写的每行代码来尝试解决问题,尽管问题和代码没有半毛钱关系。
如果我系统地处理这些方面,我会发现学习一种语言会更加容易。我将在其它的博客文章中罗列一些待回答的宽泛问题的列表,应该能帮助你学习任何语言。
明确目的,外部模型,内部模型
任何时候你学习使用新工具,明确学习的目的,外部模型和内部模型都是十分有用的。
当你了解了工具的目的时,你的大脑会加载有用的上下文细节,使你更容易吸收新知识。这就好比拼图:当你看到完整拼图之后,更容易把各部件拼到一起。这个道理适用于语言本身以及语言库。
工具的外部模型就是它呈现出来的接口以及它想让你思考问题解决的方式。Clojure 的外部模型就是一个 Lisp,它想让你把编程当做大部分以数据为中心,不可变的转换过程。Ansible 希望你把服务器的整备工作想成定义最终状态,而不是定义抵达那种状态所要采取的步骤。
工具的内部模型就是如何将输入到其接口转换成一些底层的抽象。Clojure 把 Lisp 转换成 JVM 的字节码。Ansible 把任务定义转换成了 shell 命令。在一个理想国中,你不需要理解工具的内部模型,但事实上,理解内部模型总是有用的,因为在某些看上去迷惑或者矛盾的部分,它可以让你有个统一视图。举个例子,当 DNA 双螺旋模型被发现的时候,它帮助科学家们了解更高层次的现象。从我的角度来讲,当然,这篇博文也是历来所有伟大科学成就之一。
很多教程经常混淆工具的外部和内部模型,使学习者感到困惑。意识到这点可以帮你轻松辨别何时你会感到沮丧。
间隔重复帮助记忆
间隔重复被证明是长期记忆中新信息编码的最佳方法之一。 这个想法是以不断增加的时间间隔来测验自己,使用最少重复次数来最小化记忆衰减。 卫报写了一篇很好的介绍性文章。
睡眠和练习
保重身体!身体可不仅仅是你脑袋的载体。如果你想保持专注和高效的学习,就要足够的睡眠和练习,而不是(原文:beats the pants off)狂饮咖啡因和能量饮料。
评论
查看更多