具备高效的学习能力和编程能力同样重要。

作为一名开发者,即使你的精力被微信、微博、知乎(译者注:原文是 Hacker News,Twitter,Reddit,Facebook)分散,你每天在工作中都需要学习。

在上班的时候你经常会遇到新的代码库和技术挑战。回家看看开源项目和别人的作品,也需要你跟进他们的进度。

技术发展变化非常快,你会发现你无时无刻不在追赶着新的工具、语言、框架的潮流。

常言道:学如逆水行舟,不进则退。

在过去的一年里,我从一个连 Chrome 调试台都打不开的小白,变成了一个在一流电子货币加密公司的开发工程师,我非常快地掌握了编程的能力。

但是,学习对我来说并没有那么轻松。

坦白来讲,在学习的过程中充满了煎熬。有太多的未知和不确定。

“这样我怎么坚持的下去呢?”我想。

“要是每天学习写代码这么痛苦,我会疯掉的,看来我对编程并不感兴趣吧?”

“要是我感兴趣的话不应该觉得轻松点么?艺术家搞创作的时候需要绞尽脑汁么?作家也会江郎才尽么?运动员也会遭遇瓶颈么?我们去做自己感兴趣的事情时都会觉得难受么?”

“学习不该使我快乐么?”

学海无涯有捷径么?

有是当然有。学习新的编程知识是很难受的,因为它需要你自律和努力。

但你可以痛并快乐着。

怎么才能获得学习的快乐呢?

很简单: 我改变了我对学习的看法。学习并不是困难的而是有趣的。

请容我在接下来的篇幅里娓娓道来。

万事开头难

学习写代码最难的就是开始。

试想一下你要学习的第一门编程语言。你首先要了解它的语法和格式。你还得理解值、类型、操作符、控制流、函数、高阶函数、作用域、闭包、递归等等……

这就好像是学杂耍——一上来就让你耍 18 颗球一样。

最早我用了好几个礼拜才理解了闭包到底是什么玩意儿。我读文档的时候感觉我理解了,当我准备应用一个闭包时,就又不知所措了。

这是很普遍的,作为一名老师我了解到:想要理解一个新的概念,往往需要你尝试一次、两次甚至更多。

但只要一个人坚持的足够久,总会有豁然开朗的时候。就像当我读完了无数有关闭包的博文、Stack Overflow 和文档之后的体验。

每一段我阅读过的材料都让我有了一些新的理解,直到最后我完全理解了闭包。

理解闭包对我来说意义深远,因为成就感鼓励了我继续前行,后来我甚至自己写了一篇解读闭包的博文。

学习是过程,不是结果

如果我们把“学习”视作我们必须完成的一件事,我们就会急功近利。这样我们才能赶快完成好在课余时间去玩玩别的。

只可惜学海无涯,学无止境。要是你把学习当作一场赛跑,你永远也到不了终点,反而会带来失落和失望。

相反,如果你把学习理解为一种过程,你就能体会和感受到一点一滴的进步,这也将鼓励你继续前行。

学习就好像锻炼一样。太剧烈了会受伤,你的伤痛会一直持续,甚至恢复之后你也忘却不了那种痛苦。以后每次运动的时候你都会记起。除非你每次的痛苦都能得到缓解,你慢慢的习惯和适应了它。最后你获得了强健的体魄和有型的身材,这也将鼓励你继续锻炼下去。

运动是一个积极效应的循环:

这在学习上也同样适用。

学习可以渐入佳境

试想你在构建你的第一款 Web 应用。

最一开始你只能面对一屏幕空旷的代码编辑器。开发工作对你来说像是不可能完成的任务。你什么都不懂,在你真的能开发出来个什么玩意儿之前还有太多东西要学。

令人欣慰的是,你还是勇敢的去尝试了。

从现在开始,你每次只关注和完成一个小点。

首先是构思你的应用。你要做个什么出来?目标用户是谁?有什么困难?

之后,你开始画一些你脑海里构思的草图。并拿给你的朋友或者发到网上给别人看,再慢慢改良它。

再然后,你去搜索那些最适用你开发这个应用的工具、框架、语言。

脚踏实地的,你绞尽脑汁去完成你的目标。

有时候你可能写写代码。

更多的时候是在处理Bug和暂时解决不了的难题。

有时候你实在烦的不行,那就休息一下。

或者别的时候你不想写代码,但是可以去看看相关的文章资料。

最后,经过几周的努力,你终于为你的构想打好了基础。这时,开发你的应用感觉上就不那么痛苦了。你从之前的努力中获得了成就感,接下来你只需要完善功能就好了,就像你之前已经做过无数次那样,这根本就不是事儿。

你把一项令人痛苦和胆怯的工作转换成了循序渐进,享受其中的工作。

这就是成长,这就是进步。不管是编程、跳舞、跑步、阅读:他们都不轻松,而且学习是没有止境。

你要享受你付出其中的过程,享受随之并来的痛苦。你慢慢会理解到那不能称得上是痛苦——而是一种个人努力的成就感和自我满足。

换句话讲,煎熬和享受都是相对的。记住这个循环:

一种学习技术的方法

下面我介绍一种我所掌握的学习方法。可这并不是什么终极秘籍,如果你有不同的意见,可以在评论区提出。

我们拿如何学习 React 来举例。

明确你学习的目的

首先:我要先搜一下有关 React 的文档,了解一下这个框架的背景和它想解决的问题。

明确“为什么”对于你的学习是非常有帮助和意义的,他回答了下面这些问题:

  • 它的独特之处在哪里?
  • 学这个对我有用么?
  • 它主要是为了解决什么问题?
  • 它只是昙花一现哗众取宠的小玩具,还是能够从此改变我对编程的理解?

了解核心概念

其次:我会认真读完文档里的介绍和示例。

到目前为止我还没有上手尝试。阅读一项技术的核心概念一定要在动手实践之前。这对你之后的学习至关重要。

这也使我避免了在不知道 React 是个什么玩意儿的情况下就稀里糊涂地用它,搞堆Bug出来。

尝试编码

之后,当我有一种我已经了然于胸的感觉时,就是我上手实践的时候了。

我开始跟着视频教程试着用这种新框架编写一些非常简单的小东西,或者跟着文档里的教程指引写写代码。

遇到坑

我不可避免地会掉到坑里。

读文档当然小菜一碟,可是自己实践的时候就完全不知所措。

这时我开始有半途而废的念头。但遇到困难正是应该迎头而上的时刻。没有付出哪儿有回报。只有懦夫才会放弃!

接下来我开始做这些事:

  1. 首先我需要确定一下我到底遇到了什么 Bug,之后假设几种导致它的可能性,即使我还不太了解,猜猜也罢。
  2. 接下来离开电脑跟前,稍微放松一下换换心情换换气。可其实心头上总是难以放下那个我没有解决了的问题。
  3. 接下来我根据我的假设开始调试——而不是直接去网上搜答案。要知道,全凭自己的思考获得答案是一种非常难能可贵的体验。即使你犯了很多错误,它也能加深你的印象好下次不再犯。
  4. 如果我的假设被验证了,那么万事大吉!反之,我就会去搜文档,博客,或者 Stack Overflow 或者任何其他可以辅助我的资料。
  5. 当我阅读这些资料的时候,我会把那些可能帮到忙的信息记录下来。
  6. 还是没有办法?没关系,即使我搜的这一大堆资料对解决目前的问题没有帮助,我也通过阅读学到了很多,而且它们也有可能解决我之后会遇到的问题。
  7. 直到这时,我才会在知乎上提个问题(译者注:原文为 Stack Overflow)或者问问同学同事。
  8. 与此同时,我会不断地重复研究这个问题,它总有被解决的时候。

有时候这个过程可能只需要几秒,而有时候需要几个小时甚至更久。无论怎样,在这个过程中你都能学到很多东西。

在编程中解决 Bug 就好像在隧道里寻找射灯一样。你总会找到它,可是沿途你会发现和了解更多有关隧道的信息。在学习上,这些了解正是你的收获。

调试错误其实是一个了解和发现的过程,享受它吧。

温故而知新

在学习的过程中,我开发了一些简单的小东西,跨过了一些坎。就像你所了解的,这过程肯定纠结,我需要用这个新工具进行更多实践。

所以接下来我会在开发一些练手小项目。不是好高骛远地去搞一个大项目,而是做一些可以构建我应用的基础模块。

例如我在网上看到一个用 React 写的有增删改查功能的待办事项应用。那么我可以做一个另外一种形式的增删改查的,确保我能根据参考项目的逻辑写出来的,而不是可能会出错让我受挫的应用。

掌握

熟能生巧,所以我不停地构建小项目,知道我感觉我已经掌握了它的核心概念。

最后,我开始试着不看文档和示例把所有的知识梳理起来。直到这时,我才会开始完全独立地做自己的项目。

在整个学习过程中,我不断地挑战稍微难一些的任务,但也不至于难道打击的我不想干的程度。

最后,我会在这项学习让我厌恶之前,赶快转移注意。

学习使你快乐

通过一些努力和方法,学习编程可以变得非常有趣。最初它看起来很复杂,我想这也是为什么很多人不敢开始的原因——并不是因为它无聊,而是因为它困难。

通过不断地联系这种学习方法,它将会形成一种肌肉记忆。你不用太努力去想它。你只需要驾驭挫折和享受成就。

就好像变魔术一样,学习变得轻松多了。

你是如何学习掌握新知识的?欢迎留言分享!

原文链接:Learning How to Learn: The Most Important Developer Skill,作者:Preethi Kasireddy