查看原文
其他

李笑来:为什么把编程当作自学的入口?附LEO用Anki学习编程的经验

李笑来 & Leo 学习骇客 2022-06-25

“学习科学”系列第40/96篇
本文分成上下两部分,第一部分转载李笑来老师的文章,第二部分分享我用Anki学习编程的方法,希望能给读者一些启发。

tips: 文章有点长,除了阅读文字,还可以使用讯飞有声APP来听。

转载的原因有两个:一是我和一些学员今年都把学习编程作为主要学习任务,大家时常在学员群讨论编程与学习方法,恰好和李笑来老师这篇不谋而合;二是碰到很多同学毕业好多年了仍然还在学英语,可问ta为什么学也说不清楚,于是想借用这篇推荐他们改学编程,至少在入门阶段,编程和英语一样,都是“单词+语法”。

微信公众号:学习骇客

该部分内容引用自李笑来老师的开源电子书:http://t.cn/EMdPj8h 

以下是正文~~

很多人误以为 “编程” 是很难的事情。

…… 实则不然 —— 这恰恰是我们选择 “编程” 作为自学的第一个 “执行项目” 的原因。

一本关于自学能力的书,若是真的能够起到作用,那么它就必须让读者在读之前和读之后不一样 —— 比如,之前可能没有自学能力,或者自学能力很差,之后就有了一定的自学能力……

然而,这很难。不但对读者来说很难,对作者来说更难 —— 我当过那么多年被学生高度评价的老师,出版过若干本畅销且长销的书籍,所以更是清楚地知道例子的重要性。

道理当然很重要;可是,在传递道理的时候,例子相对来看好像更重要。

同样的道理,例子不准,人就可能会理解错;例子不精彩,人就可能听不进去;例子居然可以令人震惊,那就可以做到让听众、让读者 “永生不忘”。

许多年前,有位后来在美国读书已经博士毕业了的学生来信,大意是说:

好多年前,我在新东方上课,听您讲,人学习就好像是动物进化一样…… 很多人很早就开始停止了进化,本质上跟猴子没啥区别。

那段类比好长,我记不太清楚细节了…… 可是,当时我是出了一身汗的,因为我忽然觉得自己是一只猴子。可是,突然之间,我不想继续做猴子,更不想一直做猴子!

从那之后,我好像变了一个人似的…… 现在我已经博士毕业了,觉得应该写封信告诉您,我不再是猴子了,最起码是大猩猩,而且我保证,我会一直进化。

……

所以啊,在我看来,写书讲课之前,最重要的工作,也是做得最多的事情,其实就是 “找到好例子” —— 那即意味着说,先要找到很多很多恰当合适的例子,而后再通过反复比较试验,挑出那个效果最好的例子。了解了这一点,将来你准备任何演讲,都会不由自主地多花一点时间在这方面,效果肯定比 “把幻灯片做得更花哨一些” 要好太多了罢?

后来,我选中了一个例子:“自学编程” —— “尽量只通过阅读学会编程”。

(一)

选择它的理由,首先就在于:

事实证明,它就是无论是谁都能学会的 —— 千万别不信。

它老少皆宜 —— 也就是说,“只要你愿意”,根本没有年龄差异。十二岁的孩子可以学;十八岁的大学生可以学;在职工作人员可以学…… 就算你已经退休了,想学就能学,谁也拦不住你。

它也不分性别,男性可以学,女性同样可以学,性别差异在这里完全不存在。

它也不分国界,更没有区域差异 —— 互联网的恩惠在于,你在北京、纽约也好,老头沟、门头沟也罢,在这个领域里同样完全没有任何具体差异。

尤其是在中国。现状是,中国的人口密度极高,优质教育资源的确就是稀缺…… 但在计算机科学领域,所有的所谓 “优质教育资源” 事实上完全没有任何独特的竞争力 —— 编程领域,实际上是当今世上极为罕见的 “教育机会公平之地”。又不仅在中国如此,事实上,在全球范围内也都是如此。

(二)

编程作为 “讲解如何习得自学能力的例子”,实在是太好了。

首先,编程这个东西反正要自学 —— 不信你问问计算机专业的人,他们会如实告诉你的,学校里确实也教,但说实话都教得不太好……

其次,编程这个东西最适合 “仅靠阅读自学” —— 这个领域发展很快,到最后,新东西出来的时候,没有老师存在,任由你是谁,都只能去阅读 “官方文档”,只此一条路。

然后,也是最重要的一条,别管是不是很多人觉得编程是很难的东西,事实上它就是每个人都应该具备的技能。

许多年前,不识字,被称为文盲……

后来,人们反应过来了,不识英文,也是文盲,因为科学文献的主导语言是英文,读不懂英文,什么都吃不上热乎的;等菜好不容易端上来了吧,早就凉了不说,味道都常常会变……

再后来,不懂基本计算机操作技能的,也算是文盲,因为他们无论做什么事情,效率都太低下了,明明可以用快捷键一下子完成的事情,却非要手动大量重复……

到了最近,不懂数据分析的,也开始算作文盲了。许多年前人们惊呼信息时代来了的时候,其实暂时体会不到什么太多的不同。然而,许多年过去,互联网上的格式化数据越来越多,不仅如此,实时产出的格式化数据也越来越多,于是,数据分析不仅成了必备的能力,而且早就开始直接影响一个人的薪资水平。

你作为一个个体,每天都在产生各种各样的数据,然后时时刻刻都在被别人使用着、分析着…… 然而你自己却全然没有数据分析能力,甚至不知道这事很重要,是不是感觉很可怕?你看看周边那么多人,有多大的比例想过这事?反正那些天天看机器算法生成的信息流的人好像就是全然不在意自己正在被支配……

怎么办?学呗,学点编程罢 —— 巧了,这还真是个正常人都能学会的技能

(三)

编程作为 “讲解如何习得自学能力的例子” 最好的地方在于,这个领域的知识结构,最接近每个人所面对的人生中的知识结构。

这是什么意思呢?

编程入门的门槛之所以高,有个比较特殊的原因:

它的知识点结构不是线性的

我们在中小学里所遇到的教科书,其中每个章节所涉及到的知识点之间,全都是线性关联。第一章学好了,就有基础学第二章;在第二章的概念不会出现在第一章之中……

很遗憾,编程所涉及到的知识点没办法这样组织 —— 就是不行。编程教材之所以难以读懂,就是因为它的各章中的知识点结构不是线性排列的。你经常在某一章读到不知道后面第几章才可能讲解清楚的概念。

比如,几乎所有的 Python 编程书籍上来就举个例子:

print('Hello, world!')

姑且不管这个例子是否意义非凡或者意义莫名,关键在于,print() 是个函数,而函数这个概念,不可能一上来就讲清楚,只能在后面若干章之后才开始讲解……

想要理解当前的知识点,需要依赖对以后才能开始学习的某个甚至多个知识点的深入了解……

这种现象,可以借用一个专门的英文概念,叫做 “Forward References” —— 原本是计算机领域里的一个术语。为了配合当前的语境,姑且把它翻译为 “过早引用” 罢,或者 “前置引用” 也行。

学校里的课本,都很严谨 —— 任何概念,未经声明就禁止使用。所以,学完一章,就能学下一章;跳到某一章遇到不熟悉的概念,往前翻肯定能找到……

在学校里习惯了这种知识体系的人,离开学校之后马上抓瞎 —— 社会的知识结构不仅不是这样的,而且几乎全都不是这样的。工作中、生活里,充满了各式各样的 “过早引用”。为什么总是要到多年以后你才明白父母曾经说过的话那么有道理?为什么总要到孩子已经长大之后才反应过来当初自己对孩子做错过很多事情?为什么在自己成为领导之前总是以为他们只不过是在忽悠你?为什么那么多人创业失败了之后才反应过来当初投资人提醒的一些观念其实是千真万确的?—— 因为很多概念很多观念是 “过早引用”,在当时就是非常难以理解……

自学编程在这方面的好处在于,在自学的过程中,其实你相当于过了一遍 “模拟人生” —— 于是,面对同样的 “过早引用”,你不会觉得那么莫名其妙,你有一套你早已在 “模拟人生” 中练就的方法论去应对。

(四)

另外一个把编程作为 “讲解如何习得自学能力的例子” 最好的地方在于,你在这个过程中将不得不习得英语 —— 起码是英文阅读能力,它能让你在不知不觉中 “脱盲”。

学编程中最重要的活动就是 “阅读官方文档”。学 Python 更是如此。Python 有很多非常优秀的地方,其中一个令人无法忽视的优点就是它的文档完善程度极好。它甚至有专门的文档生成工具,Sphinx:

Sphinx is a tool that makes it easy to create intelligent and beautiful documentation, written by Georg Brandl and licensed under the BSD license.

It was originally created for the Python documentation, and it has excellent facilities for the documentation of software projects in a range of languages. Of course, this site is also created from reStructuredText sources using Sphinx!

最好的 Python 教程,是官方网站上的 The Python Tutorial,读它就够了。我个人完全没兴趣从头到尾写一本 Python 编程教材,不仅因为人家写得真好,而且它就放在那里。

虽然你在官方网站上就是很难找到它的中文版,虽然就不告诉你到底在哪里也显得很不厚道,但是,我建议你就只看英文版 —— 因为离开了这个教程之后,还是要面对绝大多数都是英文的现实。

为了照顾那些也想读完本书,但因为种种原因想着读中文可以快一些的人,链接还是放在这里:

  • https://docs.python.org/zh-cn/3/tutorial/index.html (for v.3.7.2)

  • http://www.pythondoc.com/pythontutorial3/ (for v.3.6.3)

我曾经专门写过一本书发布在网上,叫《人人都能用英语》。其中的观点就是,大多数人之所以在英语这事上很矬,是因为他们花无数的时间去 “”,但就是 “不用”。学以致用,用以促学。可就是不用,无论如何就是不用,那英语学了那么多年能学好吗?

自学编程的一个 “副作用” 就是,你不得不用英语。而且还是天天用,不停地用。

当年我上大学的时候,最初英语当然也不好。不过,因为想读当时还是禁书的《动物庄园》(Animal Farm),就只好看原版(当时好不容易搞到的是本英法对照版)…… 然后英语阅读就基本过关了。

这原理大抵上是这样,刚开始,英语就好像一层毛玻璃,隔在你和你很想要了解的内容之间。然而,由于你对那内容的兴趣和需求是如此强烈,乃至于即便隔着毛玻璃你也会挣扎着去看清楚…… 挣扎久了(其实没两天就不一样),你的 “视力” 就进化了,毛玻璃还在那里,但你好像可以穿透它看清一切……

自学编程,也算是一举两得了!

(五)

当然,把编程作为 “讲解如何习得自学能力的例子”,实在是太好了的最重要原因在于,自学编程对任何人来说都绝对是:

  • 现实的(Practical)

  • 可行动的(Actionable)

  • 并且还是真正是可达成的(Achievable)

最重要的就是最后这个 “可达成的”。虽然对读者和作者来说,一个做到没那么容易,另一个讲清楚也非常难,但是,既然是所有人都 “可达成的”,总得试试吧?但是,请相信我,这事比减肥容易多了 —— 毕竟,你不是在跟基因作斗争。

这只是个起点。

尽量只靠阅读学会编程,哪怕仅仅是入门,这个经历和经验都是极为宝贵的。

自学是门手艺。只不过它并不像卖油翁的手艺那样很容易被别人看到,也不是很容易拿它出来炫耀 —— 因为别人看不到么!然而,经年累月,就不一样了,那好处管他别人知不知道,自己却清楚得很!

你身边总有些人能把别人做不好的事做得极好,你一定很羡慕。可他们为什么能做到那样呢?很简单啊,他们的自学能力强,所以他们能学会大多数自学能力差的人终生学不到的东西。而且他们的自学能力会越来越强,每学会一样新东西,他们就积累了更多自学经验,难以对外言表的经验,再遇到什么新东西,相对没那么吃力。

另外,自学者最大的感受就是万物相通。他们经常说的话有这么一句:“…… 到最后,都是一样的呢。”

(六)

最后一个好处,一句话就能说清楚,并且,随着时间的推移,你对此的感触会越来越深:

在这个领域里,自学的人最多……

没有什么比这句话更令人舒心的了:相信我,你并不孤独

~~上部分结束。

微信公众号:学习骇客

除去前期的试错和摸索,LEO正式学习编程有将近两个月了,当前学习的内容为前端,对现在的学习效果也比较满意。下面就分几个方面来给大家分享一下我的“自学手艺”。

A.学习的原则

拓展式练习原则。在上一篇先分后总,斯坦福也在用的拓展式练习技术里有详细介绍,在学习阶段,把知识化解成自己刚好能接受最小单元,小块知识学会了以后,再组合学习更大块更高一层的知识,从而实现由易到难、由繁到简的学习。

精熟学习原则。这是可汗学院倡导的一项学习技术,即如果前面的知识是后面知识的铺垫,一定要在前面知识掌握扎实的情况下再继续。判断是否掌握的方法有几个,可以通过Anki笔记复习时的熟练程度判断,也可以通过学习资料里的测验内容判断。

Quiz思维。在学习和记笔记的过程中,不是简单的摘抄句子,最好是抱着“自问自答”的心态提取问题和组织答案,并把需要巩固的心得记录到Anki笔记里。有时候一段话复杂了,可以从多个维度拆分知识单独学习。有时候某处的介绍和前面的有关联了,也可以通过前期的知识储备重新组织当前知识。更详细的解读可以阅读往期文章Anki之后,继续优化学习的方向在哪里

B.学习的工具

CodeCademy。早期我也试过其他工具,比如看书,或者是看网络视频课程,但最后都没有这个方式更顺手,CC也符合前面李笑来老师说的几个特征,如文本的形式适合更思考阅读,英文的形式能让前后学习的语言一以贯之。另外,知识都被拆解成最小的单位,通过最合理的方式组织起来,也符合前面说的拓展式练习原则和精熟学习原则。再者,平台的讲练同步、即时反馈也都为学习提供了强大的支撑。最后,我在今年特别关注的Quiz思维在CC上也得到了最佳实践,学习之外不仅有多个Quiz,还有手机版APP可以反复刷题,这比单纯的用Flashcards进行重复又更深一层了。

这是一个基础功能免费增值功能收费的编程学习网站,通过http://ssqt.co/mQfeish这个链接注册(sign up)可以领取一周的付费用户资格,感兴趣的同学不妨一试。

欧路词典。主要用来查在CodeCademy学习的过程中碰到的英语单词和翻译看不懂的句子,李笑来老师在前面也说了,学习编程的过程也是学习英语的过程

在基本功能方面,欧路词典(www.eudic.net)和其他软件差不多,如取词、查词、生词本功能等等,但我看重的是以下几个独特之处。首先,它可以从设置里一键选择专业词典添加到查词窗口,例如截图显示的计算机词汇。其次,查了某个词或翻译了某句话之后,我可以自己添加一些笔记,并且高亮显示某个部分。现阶段学英语,我不太关心词典里囊括了多少专业词典,我只想把特定场景下遇到的问题弄清楚,然而大部分词典查过标准解释之后都没办法把我遇到的问题以笔记的形式加进去。

Anki与图床。这其实是一套工具和流程,包括七牛云服务、图床工具、截图工具和Anki,学习编程要用大量配图,最好的解决方案还是以前介绍过的图床,介绍图床和截图工具的历史文章如下。

  1. 1/5 “一图胜千言”在Anki中的最佳实现

  2. 2/5 如何在Windows平台使用图床为Anki添加图片素材

  3. 3/5 如何在Mac平台使用图床为Anki添加图片素材

  4. 4/5 如何在iOS平台使用图床为Anki添加图片素材

  5. 5/5 怎么获取七牛云图床的参数

如上图、上文所示,将七牛云服务嵌入图床工具Mpic,在学习的时候使用截图工具Snipaste截图,后台的MPic或自动将图床转换成链接,然后粘贴到Anki里,Anki会通过HTML模式把文字链接转化成图片,行云流水一气呵成。

下图就是其中若干笔记的截图,文字和图示结合,学习起来负担很轻,很多时候真应了那句“一图胜千言”。

C.学习编程的路线

LEO曾在微信里请教一位编程领域的畅销书作者:“如何才能学好编程?”老师给的答案是三个词:“名师领路、多敲代码、多读文档。”

要做到“名师领路”,选择CodeCademy,并跟从它的学习路径,一定是没错的。

多敲代码”就要靠自己在学过复习过之后,多练CodeCademy平台提供的Project,并在适当的时候脱离平台独自练习了。

多读文档”和李笑来老师说的一样,官方的文档常常是最好的补充学习材料,通过CodeCademy的学习建立框架,再多读文档去完善这个框架。

最后的话

为了自己的辛苦付出能有着落,建议那些不知道为什么要学习英语却还在埋头苦学的职场读者,不如通过学习编程来学习英语吧。

前些天徐静波老师在喜马拉雅FM的“静说日本”节目里说过,日本从今年新学期开始就要在小学阶段普及编程教育了,加之按李笑来老师说的文盲标准,我们这一代如果不懂得编程,很可能在以后陪孩子完成编程作业时,真的会被孩子笑为“文盲”了。

如果说自学是一门手艺,那学习编程或许对大多数人来说就是打磨这门手艺的不二选择。下图是LEO打印的CodeCademy的课表,已经进行到3/14了,也希望本文能帮大家迈出第一步。

勤而行之:根据文中线索试试,先通过上文链接注册CodeCademy账号,使用Pro身份体验一周。学得少些,学得慢些,先感受学到知识的那种获得感,并且养成良好的习惯。
觉得这套工具流有困难?你还可以选择LEO的一对一增值服务,用半天时间上手这套打磨了多年的学习流程。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存