我们都有两门语言的学习经历:母语和外语。
编程作为一门语言,同样可以借鉴之前的语言学习经验。因此,我们不妨先来总结一下“母语”和“外语”学习中的经验教训。
所有人都会说母语,但会说外语的人很少,说明前者的学习过程更有借鉴意义。
我们按照“目标-路径-老师-学生”四个方面,把过程拆分一下,看看这两者的学习有什么不同。
1.学习的目标(语言)
母语学习者(通常是孩子)的目标是探索世界,满足自己的即时需求。
比如,孩子想吃苹果,就会试着说“苹果”,然后妈妈给他拿过来,需求得到满足。这种即时反馈带来很强的成就感。
而外语学习者的目标通常是考试或应聘,也就是延迟需求。
你今天学了一个单词,不会马上通过考试,明天学了一个语法,也不会马上得到工作。这个反馈周期过长,获得成就感的频率太低。
总结:学习的目标决定反馈周期长度,即时需求优于延时需求。
2.学习的路径(语言)
母语学习的过程,通常从身边的具体事物开始,一层层向外延伸。
孩子会先关注喜欢吃的糖果,喜欢玩的玩具。如果带他们出门,还会好奇小动物,路上的小汽车。
其他和他们暂时不产生联系的事物,无法引起他们的好奇,他们也懒得学习。
而外语学习者则会按照他人既定的路线学习(教材的目录,老师的计划等)。
过程中必然遇到自己不感兴趣,甚至排斥的学习模块(枯燥的语法,无聊的单词)。
因为和自身的关联性较小,也无法引发学习兴趣,所以很容易就变成摆摆样子,应付了事。
总结:学习路径决定学习效率,按照自身情况探索的路径优于他人制定的固定路径。
3.老师的心态(语言)
母语学习者的老师,通常是孩子的父母,他们对于孩子的提问有足够的耐心。
孩子问爸妈时,爸妈很少会说“怎么这个都不会”或者“都教你多少次了”。父母会耐心讲解,并重复很多次。
而外语学习者的老师,通常要求学生一次就记住,耐心的程度也少于母语学习者的老师。
总结:老师的心态决定了学生能获得多少帮助。
4.学生的心态(语言)
母语学习者无知无畏,没有心理负担,敢于犯错。
由于这种心理优势,他们的试错成本非常低,可以多次重复,从经验中学习。
外语学习者则心理负担较重,对于错误有天然的排斥反应。
如果犯错就会觉得自己很蠢,把多数精力都用在“避免犯错”,而不是“如何做对”上。
d
经过以上对比,我们可以总结出“母语”和“外语”的学习过程,以及前者的优势。
学母语时:我们只关注眼前需求,根据自身情况寻找学习目标,老师会把我们当成初学者,耐心讲解,我们对自己要求很低,承认失败是常态,愿意多练习。
学外语时:我们目标比较“远大”,按照别人设定的路径学习,老师不会真把我们当成“初学者”,我们也不会把自己当“初学者”,害怕犯错和重复。
经过上面的总结,就能回答最初的问题了。
问:如何科学地自学编程?
答:尽量运用母语的学习经验。
我根据自己的经验,给大家拆解一下,如何把母语学习的经验迁移到编程学习上。
1.学习的目标(编程)
解决眼前的具体问题,寻找即时反馈。
编程是为了自动化流程,把自己从繁琐的工作中解脱出来,所以用问题作导向,快速获得反馈,进而获得成就感,让自己可以继续走下去。
就像我在另一篇文章中说过,我之前也试着按照教材的路径,想要“系统性”地学习编程。但后来发现,投入了十几个小时,还是没办法解决我的实际问题。
比如,我眼前一个当务之急,就是把文档中包含关键词的句子挑出来,我能不能先学会这个,把事儿办了,后期我再慢慢补充基础知识?
学习其他语言,或许做不到这一点。
我学习外语,没办法马上找一个老外聊天,但学习编程,计算机随时都在待命,只要我想,就可以拿过来用。
所以自学编程时,不妨急功近利一点,先把问题解决了再说,其他的后期再慢慢补充。
2.学习的路径(编程)
遵循自己的具体情况,只解决真实需求,探索属于自己的路径。
别人制定的教材,更多解决的是通用问题。越是通用的教材,可能对于解决具体问题越没用。
就像别人编写的《口语书》,里面都是不痛不痒的“片汤话”,说完了“How are you?”就不知道如何进行了。还是要按照自己的实际情况,来制定要学习点什么。
编程也是一样,先解决眼前的问题,解决完之后,自然会有下一个问题出现,有些甚至是你之前都不知道的(之前能力不够,压根就没出现这个问题)
编程就像玩游戏,面对隐藏的地图,只能看见眼前的一部分。你只好根据角色的能力,一点点向外探索,最后解锁整个地图。
不同的角色,能力和属性都不同,自然不能按照同一路径来探索。即便是一样的地图,过程也都千差万别。
3.老师的心态(编程)
不在一个老师身上期待太多,用数量上的优势,弥补质量上的差距。
这可能是初学者最大的困难,我在那篇文章中也提到了:老师编写的教材非常局限。你也很难找到一个老师,愿意为你不厌其烦地解释。
这时退而求其次的解决方案是:尽量多去搜索教程和老师,然后自己拼凑一个“用得起来”的教程。这里的重点是“用得起来”。
某些老师善于讲概念,某些善于举例子,某些则是反面教材。
说一个我的偏见:国外教程通常优于国内,有机会可以多看看外文教程。
如果说这种偏见有什么理性原因,可能是因为程序本身就是用外语写的(if, while, import等词)
还有就是一些概念,翻译过来不好理解。
比如function本意是功能(程序中是一个实现某功能的模块,我更喜欢把它理解成一个小工具),翻译成中文就变成了“函数”(搞的好像对于数学要求很高一样,增加了初学者的心理负担)
毕竟没人能成为父母一样的老师,所以只能用数量来弥补质量上的不足,不执着在一个老师身上。
4.学生的心态(编程)
学习过程中,一定要有一个自信:如果学不会,全都赖老师;如果没练熟,全都赖自己。
中文的“学习”还是挺准确的,“学”是第一遍的输入,“习”是后面的不断重复。
虽然不是每种知识都能传递(有些只能自己体会),但编程一定是可以的。
看过很多教程,踩过很多坑之后,我发现真的只有说不清的老师,没有学不会的学生。
所以如果你发现这个老师没教会你,那就说明他不行,果断换一个就好,不必自责。
等到学会之后,如果无法自如运用,或者经常忘记,那就是自己的责任了。
对于和我一样,有过多次“半途而废”经历的朋友,我个人有一个额外的建议:学习过程不要公开,不要增加自己的试错成本,等到有阶段成果后,再慢慢晒出来。
今天学了点东西,就急着发朋友圈,多半会被各种点赞绑架,太过在乎别人的看法,让自己动作变形。
这一点,只要忍住装X的冲动,就可以避免了。
以上是对于自学编程的一些总结。
大家其实不必过于执念与“系统性”或者“科学地”这些大词儿。
不妨多回顾一下自己的真实经历,看看自己真正学会的那些技能中,有多少是按照教材学会的,有多少是自己也不知道,做着做着就会了的。
我猜后者的数量应该更多。
所谓“系统”和“科学”更多是爬到山顶的人,按照自己的理解规划的一条上山路径。但每个人在山下的位置不同,体力不同,工具不同,未必都适合。
站在山脚下,还是得试着自己往上爬一爬。