阳志平:如何学习编程——来自认知科学的四个建议
如何 学习编程 ?你的做法可能是:
1)先买一堆书,
2)上网搜别人如何学,
3)制定计划,
4)自已一个人慢慢学。
然而,这样做违背认知科学原理,且失败概率极大。
那么,如何科学 学习编程 ?深谙认知科学的 阳志平 老师提出四条建议:1)注重内隐知识;2)将语言与逻辑分开,不断在头脑中进行逻辑预演;3)使用执行意图而非目标意图;4)成为一名认知学徒,教别人学习。具体执行,请看下文。
大家好,欢迎各位同学参加开智学堂 Python 入门班的开学典礼。我是 阳志平 老师,我是一名黑客,我也是一名认知科学家,因此我喜欢将自己定义为心智黑客。黑客精神,尊重个性,捍卫自由,推崇创作。
多年来,我一直在用自己的方式普及黑客文化,从 GitHub 到 Markdown,都留下了我的推广痕迹。当然,成为黑客,总是离不开掌握编程。在黑客文化领袖 Eric Steven Raymond 撰写的《如何成为一名黑客》手册中推荐的就是 Python 语言。因此,开智学堂成立伊始,开的第一门课是 Python 入门。
如何 学习编程 ?大家看过很多文章,有来自计算机科学的看法;也有来自教育学的看法。然而,认知科学作为研究人类心智工作机制的学科,对此有自己的独特建议,这就是我今天分享的主题。
建议 1:为什么你是新手不是专家?
第一个建议是关于新手与专家的建议。为什么你是新手而不是专家?作为编程新手,你与专家最大的区别在于对方掌握了大量内隐知识。
什么是内隐知识?我们小时候学骑自行车,一旦学会,你长大成人,就可以在骑自行车的时候一心两用,这个时候就意味着骑自行车的技能已经变成你的一种内隐技能,不需要再调用你的大脑为它进行额外的付出。专家他的知识率与工作效率比一般人高很多,就是因为他掌握了在他的领域中大量的内隐知识,技能已经自动化。
跟内隐知识相对应的是外显知识。由于你是第一次接触编程,你会了解到 Python 语言包含哪些知识点,你该如何背诵、拆解、调用这些知识点。这些是外显知识。
关于内隐知识和外显知识,要特别提醒大家的是:专家他不仅仅是拥有了上述知识点,他同时拥有一整套行为规范。比如,专家级工程师明白怎么更好的跟别人进行沟通,怎样更好的表达他的需求,怎么去输出他的产品,这也是内隐知识中的一部分。
那怎样从刚刚学习编程的新手,成为一名专家级的工程师?成为专家级工程师,有三个维度。哈佛认知科学家帕金斯一生研究智力,他发现,在任何领域,要想变得更聪明,你都得有神经智力,经验智力,反省智力。
神经智力
神经智力很好理解,假如你的记忆能力、数学运算能力或逻辑推理能力不行,那么你学编程可能比其他人要吃力一些。
经验智力
经验智力意味着是你在这领域,投入了很多的时间,通过十年以上的时间,很多技能已经慢慢被你变成内隐知识。
反省智力
以上两种智力都容易理解,大家容易忽略的是反省智力。绝大多数人不明白,专家和新手最大的区别是专家的反省智力更高:他的内隐知识比别人的效率更高,他的模式更清晰。举个学编程的例子,比如说接触到新的软件、新的编程语言和新的编程术语,绝大多数新手是先去搜索怎么学习该软件或编程语言,他会得到一堆网络链接,然后这位新手把这些文章看完,从大海中淘出对自己有用的一些可以复用的步骤。这是新手的学习习惯。
但是专家级工程师的学习习惯和一般人不同。比如,他接触到了新的软件,他会率先查看官方的帮助文档,明白有什么样的知识点,使得这软件特殊,跟其他软件不一样,这样他的学习效果会高很多。并且专家级工程师具备较强的生态链分析能力,他学的不是 Python 与 Web 开发,而是掌握了 Python 的 Web 开发生态链;他学的不是 Python 与数据科学,而是掌握了 Python 的数据科学生态链。
在接下来的三个月,你会接触到大量的这种专家级工程师才会采取的模式。开智学堂的 Python 课程设计,一上来就把各位同学扔在 GitHub 里面。
这有什么样的好处?你接触到的是实际工作环境。你可以看到专家级工程师,他天天泡在 GitHub 里面,如何进行实际编程工作。 这样对你掌握编程的内隐知识,尤其是内隐知识中的行为规范知识部分,会帮助更大。
建议 2:为什么学习编程,你会失败?
第二个建议是如何提高学习编程的成功率。学习编程真的挺难的。很多人都尝试过多次学习编程,自学、报班,他仍然失败了。偶尔忽悠你二十一天学会编程的,一定没有帮你养成很好的编程习惯。这是为什么?
编程也是一种语言。和大家在 0-3 岁的时候学习讲话,这两个学习过程是一样的。你得掌握各种各样的关键词,用关键词去描述各种各样的现象。
但是编程语言不是用于跟身边的人进行交流,而是用于和计算机进行交流,所以,你要同时掌握逻辑。在人类大脑演化早期的狩猎-采集时代,只是往大脑中写入了人-人交流的进化模块,并不包括人-机交流模块。
这么一来,大脑不得不同时处理语言与逻辑两件事情。而人的大脑不擅长同时处理两件事情,因为受制于我们先天的前额大脑皮层发育特点,大脑有明显的瓶颈,比如只能在短时间内记住不超过 9 个电话号码。金庸小说里边的周伯通左手画圆,右手画方,这是非常困难的操作。
作为学习编程的新手,让你同时在电脑上处理语言,学习怎么用新的关键词去描述世界;处理逻辑;怎样处理各类需求的优先级别。你很难同时学会这些操作,这使得不少人学习编程走向失败。
所以我建议新手一定要把语言和逻辑分别进行训练。一次只训练一件事情,比如你刚开始的时候可以只训练语言。把编程当成语言,像学英语一样,它有哪些常用的高频词汇;以及用什么样的语法才能把这高频的词汇串起来,在初步掌握语言规律后再去掌握逻辑规律,这样会帮助你学习编程。
同时需要提醒的是,就像人类语言是用于人-人交互,编程是跟计算机发生交互的语言。大家想一下,在 0-3 岁的时候,你怎样像阳老师一样学会如此正确但大家又听不懂的湖南普通话呢?其实不是通过看书学习,而是通过跟他的爸爸妈妈学的。
学习编程也一样,因此,你一定不能把所有时间花在看书上,一定要一上来就天天去写代码,学习跟计算机沟通。很多人学习编程有不好的习惯,他有可能先去网上把 Python 相关的书都买了,或者下载一堆如何学习 Python 的文档。这是错误的学习习惯。
想象一下,在你是 0-3 岁的小孩时,你妈扔给你一堆湖南普通话的书,怎么像阳老师一样,把湖南普通话学好?这是学不好的。你要把书扔一边去,从学习编程的第一天开始,就是直接是练习如何像说话一样去写代码。
学习语言,大家都有很多经验,从小时候学习语言中获取的经验;考四六级 GRE 托福获取到的经验,那么,我们如何提高编程所需要的逻辑能力呢?怎样进行逻辑训练,提高思维呢?大家都知道,这是开智学堂所有的课程极其鲜明的特色,比如说学编程、学写作,开智学堂不仅教大家学具体的技能,同时还在教各位同学如何思维。如何提高自己个人的逻辑思维能力?这里给大家的建议就是尽量先在自己的头脑当中进行预演。认知科学家丹尼特把人类的大脑分成四种机制。
第一种是达尔文心智。
假设你是荷尔蒙爆表的男生,你在不同国家看到美女,只要她的腰臀比符合进化心理学规律,你看到这些美女都会兴奋。又如你看到蛇都会害怕;看到红色会兴奋,这些大脑通过千千万万年演化习得的进化模块,对应人类大脑的这一部分工作机制,丹尼特将其命名为达尔文心智。
第二种是斯金纳心智。
假设你像斯金纳一样,发明了他著名的斯金纳箱子,不断地去训练老鼠。按照达尔文心智而言,老鼠看到猫就会害怕。但是训练中,如果当老鼠看到猫的时候就给它一些甜头,老鼠就会不断地去尝试,这种甜头就是刺激。从刺激到行为之间,既可以像巴甫洛夫一样,给予猫与老鼠之间的条件反射;也可以像斯金纳一样,赋予代币等操作。
第三种是波普尔心智。
第一种达尔文心智与第二种斯金纳心智是动物共有的。第三种波普尔心智和第四种格列高利心智则是人类独有的心智。波普尔是著名的科学哲学家,提出了很有名的理论,就是科学是通过可证伪才叫科学。波普尔心智意味着你在头脑中对一些事情提前进行测试,测试一般是动物做不到的。这就是人类最重要的能力——你可以对真实世界予以抽象,然后在头脑中进行测试与预演。优秀工程师无不具备较强的抽象、测试与预演能力。
第四种是格列高利心智。
这是人类更强的能力。第三种波普尔心智,你作为一名编程新手,在头脑中测试的一些假设,有可能是你个人的体悟;但是人类是人类社会,而不是孤独的独狼。因此,人类拥有一种超越波普尔心智的能力,我们可以借助社会文化与思想习俗测试一些假设。因此,丹尼特用英国认知科学家格列高利作为第四种心智的命名。
比如,在前面我提到,很多编程新手碰到新的问题,往往不会去查官方帮助文档,而是去搜索,看博客,这是一种不好的学习习惯。但是人类拥有很强的格列高利心智。一些专家级工程师已经证明了哪些学习方法是正确的,哪些学习方法是低效的。借助于人类文化社会已经证明正确的假设,能够大幅度地改善你的学习效率。
在接下来的三个月时间内,各位开智学堂的同学将天天泡在 GitHub 里边,全世界最厉害的程序员都在这里,我希望各位同学不断摸索,看看他们是怎么写档案的、他们有一些什么样好的习惯,这对大家学习效率会有很大提高。
建议 3:为什么你实现不了目标?
第三个建议是关于树立目标。报了开智学堂编程班,很多同学可能在自己的小本子上偷偷写上一句话:「我要在三个月内学会编程」。虽然说不是 21 天学会编程吧,但很多同学都以为三个月能学会编程。然而,一旦写了这个目标,绝大多数人最终的结果其实是学不会编程,完成不了这个目标,为什么呢?
这是认知科学研究中很有意思的现象。因为人类大脑特别喜欢脑补,一旦把「我要在三个月内学会编程」这个目标写下来,你的大脑会怎么去处理?
它会认为这事情已经完成了。就像「新年我要成为更牛的人,要去周游世界,我要XXX」,因为没有提出一些具体的指令,你的大脑会把这些目标扔到「完成区域」。在未来的三个月内,你的大脑不会有任何行动。这是很不好的制订目标的习惯。
认知科学家格尔维茨(Peter Gollwitzer) 把「我要三个月内学会编程」这样制订目标的习惯称为「目标意图」。与目标意图相反的是「执行意图」。它是这样一种方式,采取的是如果…那么…的句式。就是说它把你更具体的指令下达给你的大脑。「如果每天晚上八点之前回到宿舍,我立即打开笔记本开始登录 GitHub 网站、提交自己的代码」,这是一种新的制定目标的方式:执行意图。这种方式有何不同?
- 第一它包括时间因素:「晚上八点」;
- 第二它包括地点因素:「回到宿舍」;
- 第三它包括具体可操作的事情:「提交代码」。
这样一来,你在上周给自己大脑布置了这样任务,然后很忙,把这个事抛在脑后,但是大家都很明白了,人类大脑喜欢脑补,到了下周晚上八点的时候,你的潜意识就会自动进行脑补,现在晚上八点了,我已经在宿舍了,这个时候我要干什么—— 写代码。
认知科学家研究发现通过改变一种目标制订的方式,学习效率提高了三倍以上。格尔维茨的妻子,另一位心理学家 Gabriele Oettingen 则在执行意图基础上,结合心理对照,提出了 WOOP。这是任何一位开智学堂的学员入门第一课。
接下来在具体的教学中大家会碰到大量的任务,我希望大家用执行意图的方式制订目标。
建议 4:为什么你需要做个「挠痒痒的猴子」?
第四个建议和人类社会结构相关。开智学堂非常有趣,几乎任何课程任何收费活动,男女比例非常均衡,从来都是 5:5 。我想,这可能跟我作为创始人的文艺黑客气质相关(笑)。这是开智学堂很特殊的现象。大家可以想一下,你为什么需要男朋友,女朋友?因为人是喜欢挠痒痒的猴子,这是人类社会进化的一个规律。
最早人类怎样从猴子变成猴群?作为个体的猴子,相互挠痒痒,慢慢地从孤独个体变成猴群,这就是人类从远古时代已经形成的一种思维习惯和一种演化模式。当从 150 人的猴群演化成更大的猴族;当人类社会语言诞生,逐步演化出部落、村庄、城市与国家,这种猴子帮忙挠痒痒行为始终存在。只是语言诞生后,它逐步过渡为八卦。
正是八卦才使得人类社会形成社区,它又演化成更容易传播的故事,帮助更多小部落链接在一起。比如说无论是西方社会还是东方社会,都会流传信息结构差不多的故事:西方有亚当夏娃;中国有女娲补天。
人类社会这样的演化进程同样深深影响了我们的学习过程。因此,人类最早的学习是学徒制,知识就是八卦与故事。⼈类最早的学习是狩猎,部落中的年轻孩子跟随⽗母学习打猎,维持人类生存并促进发展。这种以学徒制为代表的学习方式步⼊业时代之后逐步没落。
然而,到了今天,技术⽣发的第⼆次教育革命中,我们需要重新回到学徒制,所谓认知学徒制。
你怎样才能更好地学习?一定不是天天跟自己死磕。大家可以尝试一下。当你抓住自己的头发,你是打不死自己的,你下不了手。但是让你的小伙伴抓住你的头发,你会感觉到很痛苦。因为这个时候,你的伤害是来自于别人。同样的,你要提高学习效率也是一样的。
安替老师在开智大会上做的演讲中的一句话,成了开智社群的共识:「 借助社会结构让自己被动进步 」。
那么怎样更好地成为认知学徒?通过往期开智学堂的教学经验,我发现学得最好的同学是在社群中提问最积极的同学。往期还有个很有意思的现象,学得最好的同学,是参加线下活动最积极的。
你一定要不断去提问,不断去跟同学互动。在线上的时候,听老师讲编程课,有很多东西听不懂,但是到了线下,老师给你打了个比喻或者同学给你展示了一下,你一下便懂了,这样一来,学习效率便很高。
当然,开智学堂每门课程只有一位老师,加上四位助教,五位工作人员,面对数百位同学,很难做到面面俱到。这个时候,大家要明白另一个较新的认知科学研究。也就是,我们一般都知道,教别人怎样进行学习,能够提高自己的学习效率。但是大家不知道的是。认知科学家最新研究发现:「即使你只是在头脑中想象如何教别人,这时候你的学习效率也是自己学习效率的两三倍以上。」
所以说我希望各位同学,未来踊跃提问,主动尝试解答自己或别人的提问,这样的话能够形成更好地学习氛围,更能帮助自己更好地学习。
这就是最后我给大家小小的建议,希望各位同学,主动去做那一只帮帮人挠痒痒的猴子。
小结
注重内隐知识;将语言与逻辑分开,不断在头脑中进行逻辑预演;使用执行意图而非目标意图;成为一名认知学徒,教别人学习,在头脑中教六个月前的自己学习。这就是我给所有同学的四个建议!谢谢大家。