我的出发点是把编程当作一个自学的例子,重点在于学会如何自学,并且通过实践真的习得一个起初你觉得不是刚需,学会之后发现干脆离不开的、不可或缺的技能。另外,这本书的目标里有更重要的另外一个:“让你有能力靠自己能够理解所有的官方文档” —— 书里不用讲官方标准库里的每个模块、每个函数究竟如何使用,因为那些在官方文档里定义得非常清楚……

李笑来的《自学是门手艺》是我非常推荐的一本书。本书在 Github 开源,见 selfteaching/the-craft-of-selfteaching。为了方便阅读,我制作了思源笔记版本,可以下载导入进思源笔记。

链接:https://pan.baidu.com/s/1R4B50NDZttwmvoBGmLSw4A?pwd=suuv
提取码:suuv

推荐理由

  1. 这是我认为最适合入门 Python 的书籍之一:

    • 告诉你编程的本质是布尔运算和流程控制
    • 在讲 Python 的时候,李笑来其实不会太侧重讲基础知识,不会把所有基础函数和模块怎么用给你罗列出来,而是告诉你编程领域最好的教程是官方文档,一步步教你如何读懂官方文档。要知道其实很多编程语言的书籍和网络教程就只是把官方文档 copy 加以改编,学会读官方文档后,你大可以自己去检索学习不必靠别人,有助于编程能力的进阶。还告诉你当一个优秀调包侠的做法是,先粗略知道文档有什么内容,遇到什么需求再去读具体的文档。就好像用一个产品的时候,没必要把说明书就读完,读也读不懂,记也记不住,当需要用哪个功能的时候再翻到那一页去仔细读读怎么用。
    • 每一章进入 Python 教学前,都会有鸡汤文,给你拨乱反正下,告诉你编程不难、自学不难。文笔还很好,助力你读下去。
    • 教你如何上 Github、用 Git、用 Jupyter notebook、用搜索引擎搜索遇到的 bug
  2. 本书不仅仅讲了 Python,它更是讲如何自学的一本书,如果你对编程不感兴趣,完全可以跳过 Python 的部分,只读关于如何自学的部分:

    • 把自学拆解为“学”、“练”、“用”,“造”,强调学习就是一门手艺活,得要刻意重复练习、刻意思考,并且要想方设法去用学到的东西;
    • “过早引用”无处不在,生活不是考试,每张试卷里都是课堂讲过的知识点,面对“过早引用”,要学会——就算读不懂也要读完、就算不明白也要先记住、反复做整理归纳总结、先关注使用再研究原理;
    • 读一本书,应该先 “囫囵吞枣”,然后 “重复重复再重复”,于是就能深刻理解 “读书百遍其义自见”;
    • 遇到难题要拆解学习,你最擅长的技能之一应该要是拆解拆解再拆解;
    • 做个自驱动的人而非被外部驱动的被动的人,要学会主动去学习自己认为重要的东西,自上而下规划学习目标。绝大多数人一生都是被动者,终生只是被外界驱动而已。所以,他们会在某一时刻,“发现” 某个技能是刚需,然后再去学,但可惜却肯定的是,到那时候预算总是并不充裕,总是捉襟见肘。
    • 避免注意力漂移,抵抗诱惑,做重要且紧急的事情,别在不重要的事情上花太多时间、轻重不分;
    • 互联网,应该是你最喜欢的 “书”,而 Google 应该是你最好的朋友 —— 他总是能帮你找到更好的老师;
    • ……

一些摘抄

绝大多数人,终其一生都没有自学过什么。他们也不是没学过,也不是没辛苦过,但事实却是:他们在有人教、有人带、有人逼的情况下都没真学明白那些基础知识…… 更可怕的是,他们学的那些东西中,绝大多数终其一生只有一个用处:考试。于是,考试过后,那些东西就 “考过即弃” 了…… 不得不承认,应试教育的确是磨灭自学能力的最有效方法。

在随后的生活里,尽管能意识到自己应该学点什么,常有 “要是我也会这个东西就好了” 的想法,但基本上百分之百以无奈结束 —— 再也没有人教、再也没有人带、再也没有人逼…… 于是,每次 “决心重新做人” 都默默地改成 “继续做人” 而后逢年过节再次许愿 “重新做人”……

自学没有什么 “秘诀”。它是一门手艺,并且,严格意义上来讲,它只是一门手艺。

手艺的特点就是无需天分。手艺的特点就是熟练程度决定一切。从这一点上来看,自学这门手艺和擀饺子皮没什么区别 —— 就那点事,刚开始谁都笨手笨脚,但熟练了之后,就那么回事…… 而已。

做什么事都有技巧,这不可否认。

PK 掉百分之七八十的人的方法真的很简单很简单啊:把买来的书都真真切切地认真读过就可以了。

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

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

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

习得自学能力的终极目标就是:有能力只靠阅读就能习得新技能。

“不是什么东西都可以从书本里学到的……” 这话听起来那么有道理,只不过是因为自己读书不够多不够对而已。

过了 25 岁,我放弃了读小说,虚构类作品,我只选择看电影;而非虚构类作品,我选择尽量只读英文书,虽然那时候买起来很贵也很费劲,但我觉得值 —— 英文世界和中文世界的文化风格略有不同。在英文世界里,你看到的正常作者好像更多地把 “通俗易懂”、“逻辑严谨” 当作最基本的素养;而在中文世界里,好像 “故弄玄虚”、“偷梁换柱” 更常见一些;在英文世界里,遇到读不懂的东西可以很平静地接受自己暂时的愚笨,心平气和地继续努力就好;在中文世界里,遇到装神弄鬼欺世盗名的,弄不好最初根本没认出来,到最后跟 “认贼作父” 一样令人羞辱难当不堪回首。

读不懂也要读完,然后重复很多遍。

这是最重要的起点。听起来简单,甚至有点莫名其妙 —— 但以后你就会越来越深刻地体会到,这么简单的策略,绝大多数人竟然不懂,也因此吃了很多很多亏。

有经验的读书者,拿来一本书开始自学技能的时候,他会先翻翻目录(Table Of Contents),看看其中有没有自己完全没有接触过的概念;然后再翻翻术语表(Glossary),看看是否可以尽量理解;而后会看看索引(Index),根据页码提示,直接翻到相关页面进一步查找…… 在通读书籍之前,还会看看书后的参考文献(References),看看此书都引用了哪些大牛的书籍,弄不好会顺手多买几本。

这样做,显然是老到 —— 这么做的最大好处是 “尽力消解了大量的过早引用”,为自己减少了极大的理解负担。

囫囵吞枣从一开始就是贬义词。但在当前这个特殊的情况下,它是最好的策略。那些只习惯于一上来就仔细认真的人,在这里很吃亏,因为他们越是仔细认真,越是容易被各种过早引用搞得灰心丧气;相应地,他们的挫败感积累得越快;到最后弄不好最先放弃的是他们 —— 失败的原因竟然是因为 “太仔细了”……

第一遍囫囵吞枣,用个正面一点的描述,就是 “为探索未知领域先画个潦草的地图”。地图这东西,有总比没有好;虽然说它最好精确,但即便是 “不精确的地图” 也比 “完全没地图” 好一万倍,对吧?更何况,这地图总是可以不断校正的,不是吗?世界上哪个地图不是一点一点校正过来才变成今天这般精确的呢?

那些靠阅读机器算法推送的内容而杀时间的人,恰恰就是因为他们有阅读能力才去不断地读,读啊读,像是那只被打了兴奋剂后来死在滚轮上的小白鼠。如果这些人哪怕有一点点自学能力,那么他们很快就会分辨出自己正在阅读的东西不会刺激自己的产出,只会消磨自己的时间;那么,他们就会主动放弃阅读那些杀时间的内容,把那时间和精力自然而然地用在筛选有繁殖能力的内容,让自己进步,让自己习得更多技能上去了。

不管怎么样,先用起来,反正,研究透原理,不可能马上做到,需要时间漫漫。

用错了没关系,改正就好。用得不好没关系,用多了就会好。只要开始用起来,理解速度就会加快 —— 实践出真知,不是空话。

自学是门手艺,编程很大程度上也是一门手艺,掌握它在绝大多数情况下与天分智商全无关系 —— 很多人是在十来岁的时候学会编程的基本技能的。所有的手艺,最基本特征就是:

主要靠时间

真正开始自学且不断自学之后,刚开始总是觉得时间不够用 —— 因为当时的自己和其他人没什么太大区别。

随着时间的推移,不仅差异会出现,自我认知差异也开始越来越明显:别人的时间都白过了,自己的时间都有产出……

到了下一个阶段,在其他人不断焦虑的情况下,自己却开始越来越淡定:因为早已习惯了投入大量时间换取新技能……

等后来真的开始用这些技能做事,不断地做其他人因为时间白过了或者因为投入的 “预算” 不够而学不会做不到的事情 —— 并且还能充分明白,这并不是自己聪明、有天分的结果;只不过是做了该做的事情,投入了该投入的 “成本” 和 “预算” 而已……

我当过很长时间的英语老师。异常苦于一件事:最有用的道理最没人听。

学英语根本就不应该那么难,学了十六年也学不明白 —— 至于嘛!然而,最简单的道理,人们就是听不进去。他们之所以不行,就是因为从未刻意练习。学英语最简单的刻意练习就是朗读。每天朗读一小时,一百天下来就会超越绝大多数人,也会超越自己原本可能永远跨不过去的那个坎 —— 神奇的是,朗读什么无所谓,反正现在有声书那么多…… 更神奇的是,刚开始朗读得好不好听,甚至好不好都无所谓,反正没几天就能体会到大幅进步…… 最神奇的是,这么简单的事,99.99% 的人不做 —— 你身在中国,能理解这个比例真的没有夸张。

很多人学了却没怎么练,有一个很现实的原因 —— 没什么地方用得上。

这也怪我们的应试教育,大学前上 12 年学,“学”(更多是被逼的)的绝大多数东西,只有一个能够切实体会到的用处,考试 —— 中考、高考,以及以它们为目标的无数 “模考”…… 于是,反过来,不管学什么东西,除了考试之外,几乎无法想象其他的用处

一旦我们启动了对某项技能的自学之后,在那过程中,最具价值的刻意思考就是,时时刻刻琢磨 “这东西能用在哪儿呢?”

无论学什么,都有难点。所谓的 “学习曲线陡峭”,无非就是难点靠前、难点很多、难点貌似很难而已。

然而,相信我,所有的难点,事实上都可以被拆解成更小的单元,而后在逐一突破的时候,就没那么难了。逐一突破全部完成之后,再拼起来重新审视的时候就会发现那所谓的难常常只不过是错觉、幻觉而已 —— 我把它称为困难幻觉

把一切都当作手艺看的好处之一就是心态平和,因为你知道那不靠天分和智商,它靠的是另外几件事:不混时间,刻意思考,以及刻意练习 —— 其实吧,老祖宗早就有总结:

天下无难事,只怕有心人……

大家都是人,咋可能没 “心” 呢?

想成为有心人,其实无非就是学会拆解之后逐一突破,就这么简单。

刚识字、刚上学的时候,由于理解能力有限,又由于年龄的关系于是耐心有限,所以,那时需要老师耐心陪伴、悉心引导。这就好像小朋友刚出生的时候,没有牙齿,所以只能喝奶差不多…… 然而,到了一定程度之后一定要断奶,是不是?可绝大多数人的实际情况却是,小学的时候爱上了 “奶嘴”(有人带着阅读),而后一生没有奶嘴就吃不下任何东西

他们必须去 “上课”,需要有人给他们讲书。不仅如此,讲得 “不生动”、“不幽默” 还不行;就算那职业提供奶嘴的人(这是非常令人遗憾的真相:很多的时候,所谓的 “老师” 本质上只不过就是奶妈而已)帅气漂亮、生动幽默、尽职尽力…… 最终还是一样的结果 —— 绝大多数人依然没有完整掌握所有应该掌握的细节。

开始 “自学” 的活动,本质上来看,和断奶其实是一回事。

在学习编程的过程中,你会不由自主地学会一个重要技能:

拆解

这么简单的两个字,在人生中的作用重大到不可想像…… 而且它也的确是自学能力中最重要的底层能力之一。

以后你会越来越清楚的:写程序的主要工作量,往往并非来自于在编辑器里敲代码那个阶段。

更多的工作量,其实在于如何才能在脑子里把整个流程拆解清楚,考虑到各个方面……

所以,编程,更多是拿着纸笔梳理细节的工作。一旦所有的细节都想明白了,落实成代码其实是飞快的 —— 越是工程量大的项目越是如此。

这个道理在哪里都是相同、相通的。不说编程,说写书,也是一样的。

进而,想要把一门手艺搞到真正 “精湛” 的地步,最有效的方法就是尽早进入 “造” 的阶段 —— 所谓的 “造”,就是不断创造的 “造”。

自学这门手艺,很简单,就是不断地学:

地球上有效社交密度最高的地方,是 Github

做个自驱动的人,而非被外部驱动的被动的人。

这基本上是个越早建立越好的习惯。绝大多数人一生都是被动者,终生只是被外界驱动而已。所以,他们会在某一时刻,“发现” 某个技能是刚需,然后再去学,但可惜却肯定的是,到那时候预算总是并不充裕,总是捉襟见肘。

在古代,拜师学艺的确是很难的事情。首先,真正的好老师确实难寻;其次,高手也没空当老师;再次,就算是肯收徒授艺的老师也总是时间精力极其有限…… 更为重要的是,那时候想自学也真不行 —— 根本就没有什么称得上是文献的东西可供阅读或检索,很多重要信息甚至干脆只存在于某些人的脑中,就算它们被落实成了文献,也相当有限,且散落深藏在各处 —— 就算凑齐了,也没有 Google

对,最关键的是那时候没有 Google……

注意力漂移,是我杜撰的一个词,用来作为 “注意力集中” 的反义词 —— 因为更多的时候,我们并不是 “注意力不集中”,而是…… 而是更令人恼火的一个现象:

“注意力所集中的焦点总是不断被自己偷偷换掉……”

比如,你本来只不过就想着去 Google 一个编程错误信息的解读,结果不知道怎么就 “注意到” 了另外一个东西,比如,“某编辑器的皮肤”,然后你就 “顺手” 把它下载下来,然后 “很自然地顺手把它装上”,而后又看了看,觉得有点必要于是 “顺手做了点定制”…… 然后欣赏了一会儿,并自我得意一番之后 “突然发现” 自己还没有解决两小时之前要解决的问题!

早些年,我跟很多人一样痴迷于电脑这个东西,也跟很多人那样,用 Windows 惯出来了坏毛病 —— 动不动就重装系统…… 重装系统很浪费时间的,但那时也不知道为什么总是忍不住去干那事,哪怕有些小毛病,马上就受不了,弄的好像重装一个干净的操作系统会让自己的世界焕然一新一样。

再后来就明白了,这绝对就是自己的毛病 —— 做事不分轻重

说实话,这也不是自己想明白的 —— 我没那么聪明。是因为遇到了一个高人。他的电脑桌面上,乱七八糟摆满了各种图标,从不整理。我问他这不影响效率吗?他说,明明有搜索你不用,到底是谁效率低下?我被问愣了,无言以对。

我又发现他根本没有装杀毒软件…… 我问为什么?他说,“养几个虫子玩玩也没什么不好……” 不过,他转念又告诉了我他的思考。他说,只要平时习惯好,病毒进来了也没啥可偷的,但更为关键的是,他用电脑是干活的,而不是干杀毒的活的…… 脑子如此清楚,让我自愧不如。

但学到了。

虽然我还是做不到桌面上图标很乱,虽然我是因为改用了 Mac OS,所以不装杀毒软件,但注意力要放到应该放的地方,这事我记住了,牢牢记住,从此之后许多年,从未忘过。每次发现自己轻重不分的时候,就会想起他,然后就改过自新。

非常遗憾,绝大多数人对沟通能力的重视远远不够 —— 他们也不是不重视,就是重视的程度实际上太差了。别说双向沟通了,即便是单向沟通,向别人问个问题这么 “简单” 的事,其实也需要 “学” 与 “练”