【未生指】用10年来学编程

Image

这是【未生指】的第3篇,关于“编程”。

如果你不清楚【未生指】是什么,可以来看一下这篇介绍

学会编程到底难不难?

任何一个单一维度的问题,其实都没有办法回答,因为有太多模糊的定义。

什么叫做“学会”?能够编出一个程序,帮你批量处理文本,可以叫做学会;能够按照自己的想法,开发一个网站,可以叫做学会;一个人像一个军队一样,能独立开发一款牛逼的APP,更能被称为学会。

对于难度的定义也同样困难。不同的背景,不同的职业,甚至不同的智商,都会影响你对于这门技术的掌握速度。再加上,你通过什么样的语言入门,选择了哪一类的教材,练习的时间是否足够,这些都会影响编程在你眼中的“难度”。

标题里的“10年”并不是我的建议,而是一位叫Peter Norvig的技术大牛给出的建议。

他现在是Google研究院主管,这样资深的背景,说出来的话应该具有参考意义。

Image

实际上,他用这个标题写了一篇文章,在技术界非常有名。如果你对于编程感兴趣,想要学习的话,一定会在某一天读到这篇文章。而对于我的读者来说,“某一天”就是今天。

原文比较长,我已经把中文和英文的双语版本,贴在了我的博客上,大家可以点击文末的“阅读原文”来阅读。

这里我把一些重要的节选贴(斜体部分)出来,顺便加上我的一些解读。

1.

为什么每个人都这么急

我在【未生指】的序言里说过,学习编程其实和学习外语一样,只不过你的说话对象变成了计算机。

在任何一个图书网站上搜索“天搞定”这个关键词,就会看到诸如此类的搜索结果:

Image

可能包括我在内的不少人都买过这样的书,有没有真的搞定呢?大家心里都有数,反正我是不好意思说,买这类书都花了多少钱。

类似的情况,在编程领域同样存在,似乎这些“奸诈”的书商私底下接受过培训,知道人性并不会因为换了一个领域,就会出现任何的不同。

Peter Norvig也发现了这个现象,当你在亚马逊搜索编程类的书籍时,第一批跳出来的结果,几乎就是上面这张图片的翻版。他挑出了其中的一条,做了一点简单的分析,很值得我们来看看。

让我们分析一下,《24小时自学C++》到底指的是什么:

  1. 自学:在这么短的时间里,你不可能写出什么重要的程序,并从自己的失败或者成功的经历中学习到什么。

  2. C++:你可能可以学习到一些C++的语言(如果你已经掌握了另一门别的语言的话),但是你很难学到怎么样真正去使用这门语言。

  3. 24小时:很不幸,这还远远不够,下面我会进一步分析。

任何一个速成的教材,往往会强调其中的“速”。“XX天”、“XX小时”,时间越短越好,速度越快越好,成功太慢,快乐减半。

但是他们往往会淡化,甚至刻意去回避“成”的定义。这部分是留给读者自己想象的部分,不好戳破他们对于成功的意淫,只有这样才能造成“低成本高回报”的错觉,读者才愿意买单吗。

我不想把这种现象简单归结为什么“浮躁的社会”,想要速成的心理是人性本身,哪怕把几十年前或者几百年前的人来到现在,他们也依然喜欢今天的一片面包,而不是明天的自助餐。

这也是为什么【未生指】的一大块会用来记录人性,不期待能够克服它们,至少在做决定,或者制定计划的时候,把这部分稍微考虑进去。

2.

用10年时间学习编程

十年的时间是如何得来的?这是芝加哥大学的教授Benjamin Bloom给出的一个研究结果,他把这项研究写成了一本书,名叫《如何培养天才》(Developing Talent in Young People)。

Image

这里研究的都是各行各业最顶尖的专家,不过鉴于多数人每天的练习时间没有那么长,也不会有那么大的强度,如果想要把编程学到一个半专业的程度,这个时间段也应该是合理的。

谈到这一段的时候,Peter Norvig写到:

研究人员发现,想在任何领域成为一名专家都需要十年的时间,这些领域包括下棋,作曲,绘画,弹钢琴,游泳,网球,还有神经心理学和拓扑学的研究。

其中最关键的就是“刻意练习”:它不是简单的一遍遍重复,而是通过设定一个刚刚超过自己能力范围的目标,并通过不停地尝试,分析,纠错来达到提升的目的。

关于“刻意练习”,我之前已经写过一篇比较详细的文章:《总是半途而废?那是因为你还不会“刻意练习”

根据我个人学习编程的经验来看,十年不光是练习的时间,更是你消化学习成果的时间。任何学习的过程,都有一个“延时内化”的过程。换句话说,不论你今天觉得“学会了”还是“没学会”,等到你真正掌握一门技能,甚至把它变成一种本能,都需要一段时间的消化过程。

而只有等你走的更远,回过头来复习的时候,才会发现原来当初自己的理解其实很片面,有很多精髓的部分,要等到后期才能更加深刻的理解。而这样的时间,短则一两个星期,长则需要几年的时间,所谓的顿悟其实就是时间发酵的一个过程。

既然编程和其他技能没有多少本质的差别,那么如果想要学好它,最好也要做好“打持久战”的准备。

3.

10年里应该做点什么

作者在文章的后半段,给出了自己一些具体建议,我挑出其中比较容易典型的和大家分享一下,想要看完整版可以点击“阅读原文”查看。

1.保持对编程的兴趣,跟随兴趣去做,否则很难持续做10年

我觉得想要持续做一件事,一般有两个路径。

一个就像作者说的那样,你要对它有兴趣,即便不给你钱,你也愿意在日常生活中花时间去研究和探索。另一个就是你在这方面有点天赋,开始就比别人做得好,进而形成一个良性的循环,一直持续下去。

对于第二种路径来说,其实只是在起始阶段需要一个启动,最终还是会落到“感兴趣”的轨道当中。

说白了,一件事情如果你做的特别痛苦,不论给你多少回报,可能都很难让你长期坚持下来。这一点我很认同村上春树说的那句:喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

2.编程,在实际操作中学习

编程的好处在于,从你学习到看到成果,路径相对较短。哪怕你只是刚刚学习了一个语法,也可以敲出一段属于自己的代码,让机器执行你的命令。

我在学习的过程中,很深的一个体会就是,编程一定要大胆尝试。很多东西,开始的时候不懂,但是你试试这个,试试那个,最终会找到一个走得通的道路,到时候回过头来看自己的轨迹,就会发现自己在这个迷宫里是如何徘徊的。

这一点,我会在往后的【未生指】编程篇里慢慢展开来和大家分享。

3.多和其他程序员交流,看他们写的代码

我之前写过,写作其实是一种高效的社交。

而对于编程来说,一个个程序,一行行代码,更是最好的交流手段。所以想GitHub这样开源代码的仓库,其实一个大型的社交场所,人们通过自己写的代码来交流,通过下载和点赞来投票,没有任何虚假的客道,牛逼的人自然会脱颖而出。

看看他们写的代码,思考对方的思路,这是一个绝佳的学习路径,因为那就是最鲜活的例子。如果有不明白,不清楚的地方,也可以在下面和同样看这篇“程序员文章”的读者交流。

4.多学几门编程语言

这一点要补充多说两句。

即便在编程世界里,也存在着各种不同的语言,他们分管着不同的领域,有些是针对类抽象,有些是针对函数抽象等。

这些差别在于什么,我现在还无法向大家解释,因为我还没有学过。但即便如此,我也知道不同编程语言的设计思想有差别,想要解决的问题也有所不同。就像同样是刀,有些更适合削果皮,有些更适合剁排骨。

我想作者给出这条建议,一方面是为了拓宽大家的编程思路,接触过不同的编程思想,就知道什么时候应该用什么工具,而不至于用水果刀去剁排骨。另一方面是为了让大家不要变得狭隘,认为只有自己熟练掌握的这门语言才是最好的,其余的都是垃圾。

就像有人觉得法语是世界上最美的语言一样,说这话本身就挺土鳖的。

最后,Peter Norvig还提醒了大家一句:

不要迷信书籍

他用了自己的一段经历,来解释这个问题:

我第一个孩子出生前,我读了几乎所有关于“如何养孩子”的书籍,但依然是一头雾水、茫然无措。

两年后,我们家老二出生,你以为我又去翻那些书了么?错!这次我依靠着之前的经验,发现比什么专家写的东西都靠谱。

这一点和我之前在【碎片】里说过的一样,一定要重视自己的体验,只有你的体验才是真正适用于自己的,他人的经验最多只能做一个参考,无法真正迁移到你的身上。

每次看到那些“我的成功可以复制”之类的屁话,我就想说:

问题是我没地方粘贴啊!

我对于编程感兴趣,而且也愿意花10年的时间,一点点把它学好。就像我在序言中说过,编程对于未来的重要性,相当于英语对于现代的重要性。即便我们不成为程序员,也需要会利用这个工具,帮助自己提升竞争力。

【未生指】的编程篇会陆续更新,敬请期待。

推荐阅读:

【未生指】自己有货,顺带写作

上一篇:【未生指】自己有货,顺带写作

下一篇:【碎片】不论多难,也要创造自己的作品