什么是开发者最重要的技能?

对于开发人员来说,每天繁杂的工作已经把我们湮没了,我们还要学习新的技术跟上时代的变化。可是,计算机的知识浩如烟海又不断更新,我们想学到核心,究竟什么是最重要的?

2019年09月13日

成为一个高效的学习者比成为一个高效开发者至少同样重要。

如果你是一个开发者,每天除了刷微博、逛朋友圈等让人过瘾的事,你的工作还要求你学习。

在工作中,你持续性的会遇到新的代码类型和新的技术挑战。无论是参与开源项目还是个人项目,新的问题和挑战等待着你去处理,这时候总让人力不从心。

技术的世界瞬息万变,你需要时刻掌握最新的工具、语言和框架。

长话短说:学习是一件不容的事情。然而,你需要学会怎样快速并且有效的搞定它。

在过去的一年里,我做到了从一个不知道怎么样用谷歌浏览器调试的门外汉到在一个领先的加密货币公司做软件工程师的转变。在这个过程中,我迅速学会了一项新的技能(码代码)。

说起来,要学这么多东西对于我来说并不容易。

坦白的讲,每一个新的概念对于我来说都是一个煎熬,有太多的未知和不确定。

我对自己说:『如果世界这么艰难,它是怎么持续下去的呢?』。

『如果我每天都像这样煎熬着学习编码,我会很痛苦的,这真的是我的热情所在吗?』。

『如果编码是我的热情所在,难道不应该是一件容易的事情吗?艺术家都是煎熬着产出了一个作品?画家都是煎熬着完成了一个著作?运动员都是煎熬着在运动场有出色的表现?当你充满热情追求一件事情的时候,难道注定要煎熬吗?』。

『我是不是应该在这个过程中找到一些快乐?』。

这种情况发生转机了吗?

是的。一年之后,掌握新的编程思想仍然需要不断探索和努力。

但是,学习的过程变得令人充实而不是身心疲惫。

是什么让我过去的一年有如此大的转变?

简单来说:我改变了看待学习的角度。曾经我认为的『困难』变成了『挑战』。

说说这神奇的变化吧

万事开头难,学习编程也是一样。

例如,回想一下你学习的第一个编程语言。你想掌握像语法或者格式这样基础的东西,但是首先你要深入理解核心的概念,例如,变量、类型、控制流、函数、优先级、作用域、递归等等。

这就像小孩子玩过家家一样,但不是玩两个而是十八个。

当我第一次学习『作用域』,几乎花费了我数周的时间去理解这个概念。我认为我看了书并且懂了,当我真正尝试去分辨或者使用『作用域』时,我发现我并没有真懂。

这样的情况并不罕见。在任教的过程中,我也发现了同样的现象:新的概念第一次、第二次甚至第十次出现的时候都不容易被大家接受。

但是对于那些坚持足够时间的人,将会有一个拐点出现,那时候,所有的事情都会变得清晰起来。对于我来说,我坚持读一篇又一篇的博客、Stack Overflow问答和网络上有关『作用域』的文章。

阅读和经历的过程都给了我新的视角。到最后,关于『作用域』是如何工作的我有360个视角,这时候我真正弄懂了什么叫『作用域』。

像我这样弄懂『作用域』是如何工作的尤其重要,因为它鼓励并且帮助我不断进步,包括写博客阐述我所理解的概念。

学习是一个过程而不是目的

如果把学习看成『不得不做』的事情,我们会匆匆忙忙的完成了它,然后在剩余的时间里做一些更有趣的事情,也就是我们『想做』的事情。

问题是你不可能一下子弄懂所有的东西,所以把学习看作是竞赛是一件令人疲惫和失望的事情。

相反,如果你把学习看作是一个过程,你会被小小的成功所激励并且看到远方的曙光。这样会驱动你持续不断的进步。

你可以把学习与锻炼作比较。锻炼时很痛苦,一旦锻炼结束,痛苦就随之消失。但这并没有完事,等到你下次锻炼的时候,痛苦就会减轻,你学会了怎么应付它。久而久之,你会熟悉了锻炼过程中的这中痛苦,把它变为健身的一部分。健康的身体和有型的体格不断激励着你坚持前进。

锻炼时你会进入一个良性的循环:

锻炼良性循环图

把学习变为一个主动参与的过程

回想一下你做过的第一个web项目。

起初,你只有一个空白的文本编辑器和恐惧感,要完成一个项目的制作似乎是不可能的。你知道的太少了,要完成这个工作需要学习一切未知的东西。

不过还好,你下定决心来做这件事情了。

从那以后,你专注于每一次完成一小步。

首先,你有了一个很好的想法,要做什么,谁是终端用户,眼前还有哪些困难。

其次,根据你的想法你制作出了设计原型,不断向你的朋友和网络寻求反馈,迭代优化。

再次,你要选择适合项目的语言、工具和框架。

一步一个脚印,你把所有的精力都指向了同一个目标。

有些时候,你在编码。

更多的时候,你在改『Bug』。

你也可能某个时候什么都不想做,没关系,停下来休息一下。

其他时候,你不像在编码。没关系,你在花时间做项目相关的调查或者研究。

最后,你经过几周的努力,项目的基础工作终于完成了。这时候,你突然发现做这个工作没有那么痛苦了,初始的积累有了一些成果,剩下的仅仅是一些重复性的工作,而这些工作之前已经做了不止一百次了。

你成功的把之前看起来恐惧并且无法完成的工作转变为艰巨的和富有挑战性的工作。

这就是成长的过程。无论是编程、舞蹈、运动或者阅读:『都不是一件容易的事,并且都不是一件可以一劳永逸的事情』。

相反,把你的精力投入的某个事情中,享受这个过程中带来的痛苦。你会慢慢发现你不再把这种感觉描述为『痛苦』,因为曾经痛苦的经历代表着前进的一步,这是一种自我实现的满足感。

换句话说,『痛』和『快乐』是可以相互转化的,正所谓『痛并快乐着』描绘的就是这样的一个感觉。记住这样的一个循环过程:

锻炼良性循环图

学习技术主题的方法

我把自己学习技术的方法总结了一下,并非适合每一位读者,如果你有更好的建议,欢迎在评论区回复,在这方面我是一个小白。

就用我学习『React.js』的过程作为示例。

我学习的目的是什么?

第一步:『谷歌搜索关于React.js的一些文档,读一些这个库相关的背景和目的』。

了解任何技术背后的一些问题至关重要:

  • 这项技术和其他技术有什么不同?
  • 这项技术对我的作用是什么?
  • 这项技术旨在解决什么问题?
  • 这仅仅是一项随手随用的工具还是能从根本上改变我对编码的认识?

阅读并且理解核心概念

第二步:阅读一些介绍性的文章和小示例。

注意我还没有写任何的代码。动手操作前一定要阅读并且深入理解相关的核心概念,这样做极其关键,因为它是后续学习的基础。

尽管一上来我不关注核心概念我也可能会使用React.js,但当我遇到bug时候,又不得不返回来重新学习相关概念。

上手写代码

经过上面两步,我们经常认为已经入门了,甚至已经完全掌握。这时候就该上手写代码了。

一般来说,在我做自己的项目之前,我会跟着视频尝试做一个小的项目或者写一个主题相关的教程。

当卡着的时候

读技术说明文档似乎是一件容易的事情,但真正在项目中用的时候往往会令人感觉到不知所措。

这时候往往会给人『就这样放弃吧』的感觉。但是我没有屈服于这样的想法,我时刻提醒自己『煎熬==成长』,中途放弃总是令人尴尬的。

这是我怎么处理的:

  1. 我首先定位并且找出来我卡在哪里了。例如,遇到了一个问题,即使我不知道问题出在哪里,我先假设这个问题的根本原因或者有可能的原因,我仅仅是做了一个猜想。
  2. 然后,我先放开这个问题做一些其他事情来放松一下自己。实际上这是件相当困难的事情,尤其当我正在对卡着的事情烦恼的时候,但从问题中脱离出来往往能有转机。(难道没有注意到很多伟大的想法都是在洗澡的时候出现的吗?)
  3. 现在我尝试着在心里按照我的假设进行debug。在没有网上查找答案的情况下,我尽可能的寻找问题的答案,当你真正尝试深入思考怎么解决问题的时候,惊喜的事情总会发生。即使你走错了方向,你为之所作出的努力也教会了很多并且当你再遇到相同的问题时,印象会更加深刻。
  4. 如果根据我的假设找到了问题的所在,太棒了,已经解决了问题。否则,谷歌查找相关的文档、博客文章或者是Stack Overflow问答来帮助进一步接近答案。
  5. 当我阅读的时候,我会记下所有有可能帮助解决问题的信息。
  6. 仍然找不到答案?没关系,我很确定通过我的阅读我学到了很多有价值的东西,即使这些东西没有直接帮助我找到问题的答案,但谁又知道这些信息会不会在下次遇到问题时起作用呢?
  7. 这时,如果还有问题,我会在Stack Overflow上发布一个问题,或者询问一下我的同事。
  8. 否则,我会不断的总结和重复,答案往往会不期而至。

有时这样的过程可能会花费几秒钟,有些时候可能花费几个小时或数天。不管是什么情况,过程本身对于一个开发真来说收益无穷。

当你被一个Bug卡住的时候就像是在黑暗的隧道里试图寻找一线亮光。最终你找到了,在这个过程中你获得了和隧道相关的很多信息,就是这样的信息让你作为一个开发者会变得强大。

总结和重复

目前为止,在学习这条道路上,我已经克服了一些困难并且有所收获。诚如你所见,这是一个煎熬的过程,很显然我需要做更多的探索。

因此,我尝试着做一些自己的东西。我没有直接陷入到一个很大型的项目中,而是寻找一个开源的项目作为基础。

例如,如果有一个开源的『CURD』项目使用了React.js,也许我会写一个相似的『CURD』项目,和开源的项目有足够的不同,但又不是完全不同。这样既能激励着我不断的开发,又能避免中间出现失误时绝望。

完全掌握

想要完全掌握需要不断的重复,因此我会不断开发一下小的东西,直到我能够完全理解核心的思想为止。

最终,我能把很多的东西给串起来而不需要一遍又一遍查询参考文档和示例。到那个时候,我才会尝试从零到一的做一个东西。

在整个过程当中,我主动寻找快乐的感觉。我持续要求自己做能力范围外的事情,但又不至于脱离太远以至于失望和泄气。

最后说明一点,当我一旦对某个项目陷得太深而又很沮丧的时候,我会马上离开。

学习是有趣的

经过一定的努力和过程,学习编程会变得非常有趣。首先,它很复杂,这也正是为什么很多人都害怕编程,事实上并不是因为它很『枯燥』,而是很『难』。

多次经历上述的学习过程之后,掌握新的概念会变得游刃有余。那时候,你真的不会想到,你仅仅是靠着学习给你带来的煎熬就能得到很好的回报。

就像学习魔术一样,变的不再那么难了。


你是怎么学习新技术的的?有好的观点和想法欢迎在评论区留言。