20小时学习新事物

引言

在互联网时代,我们有学不完的新知识,特别是处于软件行业,每天出现新的语言、框架、领域。比如Vue、Spark、微服务、React、机器学习、Sass/Pass都是最近才火起来的。我时常怀疑一个程序的一生到底能够学习多少编程的知识,而学习多少才算是足够,这个领域有学不完的知识,而且在不断的更新。

直到前一段时间我在知乎上看到一个答案:The first 20 hours-How to learn Anything 以及相应的TED演讲。学习一个完全陌生的领域到足够使用的程度仅仅需要20个小时的练习

重点在于足够使用,20个小时的学习不可能让学习者成为这方面的专家,但是足够掌握其中最核心的概念,熟练最常用的操作。如果是学习编程语言,足以拿一门语言的最核心和常用的特性来进行开发。我们需要的仅仅是20个小时。另外一个同样重要的点在于练习,单纯的接收信息和记忆不足以使你真正的理解和掌握它,必须靠足够长的练习来锻炼自己的大脑或者身体来掌握这些新技巧。

你或许已经在怀疑到底20个小时能不能真正掌握新的技艺。大量的跟学习有关的研究表明,早期阶段的练习是非常有效的,只需要一点点的训练就会得到极大的进步。进步曲线跟对数曲线差不多,开始部分很陡峭,到后面就越来越平坦。说明刚开始进步是最快的,学习是最有效的,而达到一个很高的水平想要再进步就很难了。我们需要的不是精通这门技艺而是刚刚好足够使用,20个小时的训练就能达到。如果真的投入20个小时去全身心的练习,或许真的会被自己的能力而震撼。

方法

如何有效的在短时间内达到足够使用的程度?不是简单的往前冲就够了。这里有4个简单的步骤来帮助我们达成目标。

  1. 解构技能: 以目标为导向,根据学习完之后希望去做的事情,比如学习一门新的编程语言来写一个Web服务器,学习吉他来弹某一首歌曲,学习游泳来自由泳4个来回,学习lambda来以更优的方法来解决问题。具体的事情是一个度量标准,来决定到底哪些部分是最重要的——那些能够直接帮助完成事情的才是最重要的。不要沉迷于别的没有那么直接关系的部分,那只会拖慢进度,降低效率。只有从最重要的部分开始训练才能在最短的时间内尽可能的提高自身。作为整体的技能其实是由一个个小的部分组成的,如果这个技能被解构成越小的部分,就越容易找到哪些才是真正需要学的。整个解构步骤是学习的开始,最重要的开始,通过解构已经学习到了整个技能的脉络和枝干了,虽然此时还没有深入到细节。
  2. 学到可以自我纠正就够了: 学习的材料不要太多,只需要3~5个对应的材料,比如:视频、书籍、网络、音频或者别的材料。学习的时候有太多的材料不是什么好事,我们不可能在这么短的时间内把它们都过一遍,更不用说吸取其中的知识,3~5个就够了。我们需要的尽快的开始练习,学到足够开始训练能够自我纠正就行了。在不断的练习,不断的犯错的过程并纠正的过程中,效率是非常高的。这些反馈能够加深印象,而一味的被动接收是达不到这种效果的。
  3. 远离干扰: 全身心的投入自己到训练当中去,尽可能远离干扰联系的事情。比如网络、电视、手机、闲聊这些都必须被控制。在一个没有任何这些东西的环境中能够带来更大的投入。除了自己的意志,没有更好的办法了,必须控制自己。
  4. 至少练习20个小时: “万事开头难”所以真正难的是如何开始,我们任何人都对自己不熟悉的东西感到不舒服,觉得自己笨手笨脚,感到沮丧而愤怒。这是难以真正学成一门技艺的最核心的原因——害怕那不舒服的一步,所以必须要做的事就是走出自己的舒服区,勇敢的踏出那一步。在任何你希望学成的技艺上花费20个小时去训练,仅仅需要两个工作日,我保证你会尝到经历辛苦而成功那种极大的满足感。一定要坚持够20个小时。

学习这件事最大的阻碍不是智力上不足,也不是太辛苦。而正是开始的害怕阻挠了真正开始学习,没有人想让自己看起来很笨。但是仅仅需要花费20个小时,就有可能看到一个不同的风景,值得为之一试。

应用到编程学习上

当涉及到编程领域的学习时,该怎样改进呢?一味的读学习材料——可能是书、入门文章、视频——肯定是错误的方式,真正重要的是尽快开始练习。那么该怎样联系呢?我尝试在Google上查找关键词:programming practice project,搜索引擎给出了大量符合预期的结果。

  • The dailyprogrammer on reddit 给出了大量的编程题,分为容易、中等、难三个等级,有详细的描述和给定输入得到相应输出来验证实现并且评论中给出多种语言的最佳实现。
  • Mega Project List 是一个练习项目的列表,可以用任何编程语言去完成,所有的解决方案都可以在Projects-Solutions找到。这个列表受到了Martyr2’s Mega Project List的启发而得到。
  • Martyr2’s Mega Project List Martyr最初整理了这份练习项目列表,并且得到了很多人的关注,以及发展。125个项目被分到10个不同的主题下,比如:Numbers、Text、Networking、Classes、Threading、Web、Files等等,完整的列表被整理到《THE PROGRAMMERS IDEA BOOK》书中。
  • Reddit learnprogramming faq 这里给出了对学习编程语言的各个阶段的建议,比如:怎样选择编程语言?怎样从初学者达到中级水平?去哪里找好的项目来研究?我已经N岁了,如果我现在开始学习编程是不是太晚了?——这个文档永远鼓励你勇敢去学习编程。

同时我还找到了Programming Ideas: For Teaching High School Computer Programming(compiled by Chris Robart),这份文档给出了另外一个全面的练习项目列表。以上这些练习项目能够对任何编程语言的学习有所助益,如果在20小时内把其中挑选出来的练习做完,相信是可以掌握这门新学的编程语言的。如果涉及到算法类、网络或密码学的话,尝试去搜索相应的主题练习项目,相信一定可以找到对应的好的练习项目。如游戏编程我找到了:49 Ideas for Game Clones to CodeStarting out on Game Programming以及Old Game, New Twist: A Great Way to Practice Your Gamedev Skills