引言
五一长假这段时间终于可以让自己慢下来。而人呢,一闲下来就会胡思乱想、脑洞大开,又加上最近在读《庄子》,深深的被道家思想所吸引,同时又感觉自己内心有什么被击中了,很多年前的几个零散记忆被点亮了,继而又点亮了周围的记忆。就像是一个装满了珍珠的盒子,其中几颗因为某种原因开始闪烁,然后与之有某种内在联系的珍珠也开始闪烁,就这样盒子大部分珍珠中都加入了闪烁的阵营,而最后浮现在我脑海中的就是这个字——道。当然,道家思想博大精深,我连皮毛都没摸得到,不敢自大到认为自己触及到了这扇门。但每个人都有自己的道,也许我有幸窥到了这扇门中不经意散发出来的那缕光。
谈起道,给人的第一印象就是空泛、神秘、虚无。它似乎是修仙之人才能谈及的话题,与凡人沾不上半点关系。但我却认为道家思想是对现实最具指导意义的思想之一,世间万物,小到一只蚂蚁,大到一个人,甚至是宇宙都有自己的道。这样说不还是看不见、摸不着的虚无吗?接下来让我们先忘记道这个字,聚焦在一个人人都遇到过的,能够描述小范围一般规律的词——理论。
理论与经验
一直以来,我都有复盘和反思的习惯,在解决完一个具体的问题后,我会问自己几个问题。
- 这个问题的产生原因以及解决方案,背后的本质是什么?
- 它们能否被归纳到某个已经存在的底层框架中?(这里指的是认知框架,不是特定的技术框架)
- 站在框架的角度来看,我对这个问题的认知是否是片面的?
- 我之前所遇到的问题中,是否有和这次的问题处于同一框架中的,它们之间有什么异同?
举个例子
在我上篇文章[如何高效的反馈bug]中提到的最小复现步骤,最初我确实是凭借经验找到了最小复现步骤,但这个结果其实是基于我的主观直觉得到的,我无法在自己的经验认知层面去验证它。后来我发现可以用逻辑学中的充分必要条件来理解最小复现步骤这一概念,重新定义了最小复现步骤后,我又发现之前基于经验和直觉去复现 -> 定位 -> 修复bug的过程,其实是可以拆解成一系列可重复的步骤,每一步的结果都可以被验证。在逻辑学理论的指导下,我的主观经验变成了可重复、可验证、可迁移的知识体系。
“纸上谈兵”
我习惯把具体的问题放到一个大框架中去考虑,这种思维方式曾被人戏称是纸上谈兵。在中国,似乎谈“理”色变是一个很普遍的社会现象,认为理论与实战经验是矛盾的两面,甚至出现了“理论无用论”、“读书无用论”这样的观点。如果说社会普遍认可实战经验更重要,那按道理国人的“纸下”能力会比较强,但事实上动手能力一直是我们的短板。在国外留学的那段经历,让我看到国外从来不去争论理论和实战哪个更重要。相反,他们非常重视理论教育,就拿我所学的软件工程专业举例,有一门课叫Software Development Methodology(软件开发方法论),这是一门几乎全是晦涩理论和概念的课程,我也曾认为这是最没用的一门课,但当我真正意识到这门课所学的知识是如此有用时,是在我工作11年之后了。在带领团队参与从未曾涉及过的领域项目、需要跨团队协作的项目、充满变化与不确定性的项目、在资源受限的项目中,这些混沌系统中的大部分问题都不存在1+1=2
这样明确的答案,也没有if...else...
这样的解法。软件开发方法论帮助我站在更高的视角上看待这些问题。但这个例子不是重点,我想表达的是这里存在一个矛盾的点,明明“理论无用”呼声高的中国,实践却偏弱;而动手实践能力相对较强的国外,却很注重理论。这是为什么呢?我认为有一个非常关键的因素,就是顺序。
理论与经验的顺序
不管是国内还是国外,软件工程的专业课程大多分了三个环节,理论、实验、答疑。但在两边,这三个环节的顺序和比例有极大不同。
国内课程
理论(2) -> 实验(1) -> 答疑(0~1)
就拿我母校来说,一般是先上两到三节理论课,之后是一节上机实验课,最后是答疑,答疑不一定有独立的一节课,有时候是在实验课中间穿插进行的。
国外课程
实验(1) -> 理论(1) -> 答疑(1)
而在国外是先上实验,然后是理论,最后是答疑,这三部分是1:1:1,也就是说有一节理论课,必然有一节实验和一节答疑。
国内是先理论,后实验。我认为这样会导致思维固化,实验的目的是验证刚刚学的理论,似乎这个理论就是为了这道实验题而生的一样,学生无法在脑中形成理论与其它实际问题的关联。比如刚学了快速排序算法,实验课就是去实现快速排序,班上大部分同学的代码如出一辙。因为所有人都是照着同一个理论标准去实现的,做完实验也不会产生太多的问题,这就导致了答疑环节无疑可答。
而国外采用先实验,后理论。起初我们这帮中国学生非常不适应,因为完全没有头绪,怎么什么都没教就让做实验,一个个的只能在那里发呆。但有一个先我们一年出国的同学,他就已经适应了这种方式,有条不紊的分析问题,遇到不懂的就查google、文档、读开源代码,更像是在自己做探索式的研究。实验结束后,有一部分问题自己已经找到了答案,而另一部分没找到答案的问题,就会在接下来的理论课上重点去听,因为这些问题是在解决问题时产生的,而且是自己尝试后仍未能解决,这时候一旦问题处于理论的框架内,就能引发共鸣,快速的在大脑中与之前的经验形成关联。先实验的方式没有标准的理论去约束学生的思维,所以每个学生对问题的理解、解决问题的方式、遗留的问题会有很大不同,最后的答疑环节老师会收到大量的反馈,老师基于自己的经验和理论对这些问题筛选、归类、加工、抽象,最后输出体系化的知识,学生不仅解决了自己遇到的具体问题,更重要的是知道了如何用框架思维去解决一类问题。
认知机制
上面的例子只是说明了理论与经验的顺序会影响学习的效果,但为什么会产生这么大的差异?理论是对某一类问题更高抽象层次的描述,它具备更广的通用性,但国内的教育方式却把它限定在实验题目的这个具体场景中,这就像给一个池塘的出水口加了一个漏斗,最后能输送给学生的只是漏斗口粗细的水流。这也是为什么国内花了那么大的力气在灌输理论上,最后却收效甚微的原因,最后给人产生一种理论无用的错觉。
再看看国外的方式,从逻辑学角度来看,更接近归纳法,由具体实验到一般理论,这更符合人类大脑原始的认知方式,就像小婴儿认识红色,爸爸妈妈会用红色的积木、气球、图画等大量红色物体给婴儿看,婴儿最后学会了这些物体都有的这个颜色就叫红色。
演绎与归纳
如果说理论与经验是描述解决问题方法的两个具体的词,那演绎与归纳就是它们对应的更高抽象层次的词。
演绎
先看一个经典例子
大前提: 人皆会死
小前提: 苏格拉底是人
结论: 苏格拉底也会死
再看看演绎推理的定义
人们以一定反映客观规律的理论认识为依据,从服从该事物的已知部分,推理得到事物的未知部分的思维方法
归纳
同样先看一个经典例子
前提: A死了、B死了、C死了、D死了、E死了…..
结论: 所有人都会死
定义
人们以一系列经验事物或知识素材为依据,寻找出其服从的基本规律或共同规律,并假设同类事物中的其他事物也服从这些规律。
通过下表更方便的对这两种思维方式进行对比
思维方式 | 思维起点 | 思维终点 | 准确性 | 关系 | 局限性 |
---|---|---|---|---|---|
演绎 | 一般性 | 特殊性 | 必然真实 | 验证归纳的结论 | 依赖归纳提供前提,不能凭空产生 |
归纳 | 特殊性 | 一般性 | 结论不保证成立 | 为演绎提供前提 | 结论范围超过了前提范围,一只“黑天鹅”便能推翻结论 |
可以看到归纳更多的是基于以往的经验,总结出适用于当前人类认知范围内的一般性规律;而演绎却着眼于推导未来、未知事物的规律。我个人的看法,人类对世界的认知以归纳开始,未来必然归于演绎。主要原因有三个:
- 人类生物性构造的局限性。
- 像中国的二十四节气需要经历数代人的样本收集,才能归纳总结出一套规律。而随着对万物探索的深入,样本在时间、空间和复杂度上超越了人类作为生物能处理的上限。就拿宇宙天体规律来说,动辄就是百万年,上亿年的周期,整个人类的历史在其面前也不过一瞬,无法收集样本;再比如AI技术,人类大脑的生物性构造决定了无法处理如此大的数据量,只能依赖计算机的算力。
- 超越“当下”的抽象规律。
- 在相对论、量子力学出现后,人类研究的很多领域,比如宇宙边缘、黑洞、微观粒子、时间、高维空间等,都远超人类所处时代科技水平所能观测或实验的极限,这就导致归纳缺少特殊性样本,这些领域的规律只能靠演绎推导来突破。
- 新的已知越来越少,未知趋近于无限。
- 归纳是用已知来生成规律,人类对万物规律的探索速度已经远超现存事物的发现速度,用有限的已知来生成无限的未知,本身就是矛盾的。而演绎却不受此限制,可以通过规律推导出新的规律,而得出的规律又可以作为下个推导的前提。
知识迁移
我认为不管是理论,还是经验,它们都是认知的表层工具,都存在局限性。
理论的局限性
现在再回过头思考理论与经验在工作生活中起到的作用。理论往往是抽象的,而我们遇到的问题都是具体的,如果无法将抽象理论与具体问题产生关联,那理论就失去了指导作用。和一个只是背诵了大量理论的人聊具体问题解决方案,会觉得他说了很多零散的名词概念,但最后仍不知道怎么解决问题,而这就是前面提到的纸上谈兵。
经验的局限性
经验是具体的,应该是可以解决具体的问题。那是不是说明经验比理论更重要?我想先举一个实际的例子。
前段时间我收到一份前端工程师简历,这位同学有10年以上开发经验,而简历有足足16页,参与过很多项目,可以说经验是相当丰富。面试时聊到其中一个项目,我问了个问题,“基于现有的架构,如果某一个功能因为业务变化需要做出调整(是一个与原系统高度相关的,并且合理的变化点),你该如何满足?”。他回答了很多功能或者用到的技术,有和这个项目相关的,也有其他项目中的,但却一直在回避我的问题,后来我打断了他,让他回到正题上。他支吾了一会儿,说我们以前的项目没遇到这样的问题,没有什么思路。
这位同学具备大量经验,却仍无法解决我提出的这个问题,他最后的回答就是经验最关键局限性——“以前没有遇到过”。经验的具体性就决定了要使用它解决问题,这个问题必须是和之前的经验一样,至少是非常相似的。但在现实世界,尤其是计算机领域,几乎不存在一模一样的未解决的问题,因为一模一样的问题,通过ctrl+c和ctrl+v就可以解决。
由此可见,在解决实际问题时,不管是理论还是经验,都不是起到决定性作用的因素,真正在背后起作用的,是知识迁移的能力。
什么是知识迁移
演绎和归纳,本质都是在用已有的认知或经验,去领悟新的知识,而这正是知识迁移,它是比演绎和归纳抽象层次更高的能力。
知识迁移是一种学习对另一种学习的影响,是在学习这个连续过程中,任何学习都是在学习者已经具有的知识经验和认知结构、已获得的动作技能、习得的态度等基础上进行的。
对于演绎/理论,知识迁移是能够把抽象的认知具体化;而对于归纳/经验,知识迁移是能够将具体个例泛化,进而举一反三、由此及彼,扩展有限的认知。从知识迁移的层面来看演绎和归纳、理论和经验、抽象和具体不再是对立的,它们是一物的两面,彼此可以灵活转化。是不是很像道家的太极?
知识迁移的分类
同性化迁移
定义
同化性迁移是指不改变原有的认知结构,直接将原有的认知经验应用到本质特征相同的一类事物中去,以揭示新事物的意义与作用或将新事物纳入原有的经验结构中去。
特点
同性化迁移的特点是自上而下,原有认知是上位结构,新认知是下位结构。原有认知结构不发生质的改变,只是被新认知扩充。
举例
原有认知结构中的概念“电脑”,由PC台式机、PC笔记本、iMac、MacBook等构成,当前出现新的知识平板电脑,把它纳入原有“电脑”概念中,对“电脑”进行扩充,并且借助“电脑”这一概念来快速理解平板电脑相关知识。
顺应性迁移
定义
顺应性迁移也叫协调性迁移,是指将原有的经验应用于新情境时所发生的一种适应性变化。当原有的经验结构不能将新的事物纳入其结构内时,需调整原有的经验或对新旧经验加以概括,形成一种能包容新旧经验的更高一级的经验结构,以适应外界的变化。顺应性迁移包含了顺向迁移和逆向迁移,顺向迁移指旧认知影响新认知,逆向迁移指新认知影响旧认知。
特点
顺应性迁移的特点是新旧认知会互相影响,形成一个反馈环,最终形成一种能包容两者的新认知,而这个认知往往是处于更高层级的认知。因此我个人认为顺应性迁移是最重要的一种迁移,这种迁移往往会使人产生顿悟或者觉醒。
举例
原认知是加法,但加法很难处理1万个2相加,这时候调整加法的结构,生成一种新的认知叫乘法。而逆向迁移比如学了高等数学,再去理解初等数学的很多问题,会从更高、更本质的层面看待这些问题。
重组性迁移
定义
重组性迁移是指重新组合原有经验系统中的某些构成要素或成分,调整各成分之间的关系或建立新的联系,从而应用于新的情境。这种经验的整合过程即重组性迁移。
特点
不增加新的要素或成份,仅调整原有认知中要素之间的关系,形成新的认知。
举例
舞蹈的基础动作、武术的基本招式、音乐的基本音符,这些是固定的,但通过变换组合可以衍生出近乎无穷的变化。
迁移是如何产生的
下面是格式塔心理学家苛勒对迁移产生的原理的解释
迁移的产生依赖于两个条件:
一是两种学习之间存在有一定的关系
二是学习者对这一关系的理解和顿悟
其中后者比前者重要。习得的经验能否迁移,并不取决于是否存在某些共同的要素,也不取决于对原理的孤立的掌握,而是取决于个体能否理解各个要素之间形成的整体关系,能否理解原理与实际事物之间的关系,即对情境中一切关系的理解和顿悟是获得一般迁移的最根本要素和真正手段。
可以看到,迁移是从更高层面描述了具体与抽象、理论与经验的关系。
顿悟
格式塔心理学家认为顿悟是迁移的最根本要素。
说到顿悟,我首先想到《将夜》里的大师兄李慢慢。他十三岁开始修行,三十三岁才到不惑,两月后的一天,朝入洞玄,夕入知命,而后三天破五境,达无距。《将夜》中的常规境界分为初识、感知、不惑、洞玄、知命,被称为五境,还有极少数人能突破五境,达到更高一层境界,称为无距。
为了更直观的表现大师兄的修炼历程,我用横轴代表修炼天数,竖轴代表境界,得出这样一条曲线。非常明显他的境界突破与修炼时长不是线性的关系。
也许有人觉得这是小说里的情节,现实中不存在这种情况。那我们来看看心学始祖王阳明,他37岁被贬龙场,一夜之间悟道,创立心学,历史上称为“龙场悟道”。
历史上这样的例子数不胜数。西方心理学,中国的道家,佛家,儒家这些完全不同的思想流派都不约而同的认为顿悟对思想的突破起到了关键作用。那顿悟是如何发生的呢?我认为有两个必要条件:
- 量的积累。这里的量既包含了外部客观刺激的量,也包含了内部主观思考的量。
- 不管是大师兄,还是王明阳、牛顿,他们的顿悟看上去都是发生在很短时间内,但背后却隐藏着长年的积累与大量的思考。
- 使这些量发生关联的触发条件。
- 就拿牛顿来说,他被树上落下的苹果砸中这件事触发了他之前的种种思考联结到了一起,形成知识迁移,最终总结出了万有引力定律。这颗苹果对他的启发看上去是偶然的,背后却隐藏着必然。哪怕没有这颗苹果,未来也可能有一颗这样的桃子、梨子、椰子,甚至是天上落下的鸟屎会启发他。因为启发他的是万有引力规则本身,而这些具体的现象都只是万有引力的一种表现。
顿悟的连锁性
很多开悟的人,不是只得到了一个具体问题的答案,而是似乎在短时间内将一个领域,甚至是多个领域都看透了,甚至有一些是他之前不熟悉的领域。这其实就是知识迁移的连锁反应,当对这个问题产生顺应性迁移,形成更高层次的新认知,这个新认知会可能会成为其他认识的关联点,再次触发顿悟,这个过程可能会重复很多次。下面的动图反映了这个过程。
迁移与境界
在某一领域,所处不同阶段,起主导作用的迁移类型也有所区别
- 积累期。这个阶段也是刚进入一个领域的初期,还没有能力对已有认知结构进行改造,主要任务就是获取这个领域的知识,对认知进行扩充。
- 领悟期。这个阶段已经有一定的知识积累量,逐步形成自己的体系化认知,这个阶段需要有一些理论、框架的加入,对已经积累的知识进行梳理、加工,一方面通过顺向迁移形成更高层面的认知,一方通过逆向迁移将原有认知进行加强和扩充。这个阶段往往是人成长最快的阶段。
- 创造期。当突破了领悟期,已经将领域认知内化和抽象化,不再局限于具体的问题和数量,能够灵活运用领域内的知识,可以将抽象的认知具现化,用以解决问题,或创造新的认知。就像武侠小说里常说的,手中无剑(无具体的剑),人剑合一(内化),无招胜有招(不局限于固定的招式,可灵活创造招式)。
事情好像开始变的有点不正常,从太极到顿悟,似乎离科学越来越远,而离“玄学”越来越近,这其中是否存在更高抽象层次的认知,也许答案就是“道”。
道
道生一,一生二,二生三,三生万物。
道德经里的这段话描述了宇宙的生成规律,同时这也是知识迁移的规律。
“三”是指多个,消除了事物的数量属性,“万物”指的是任何事物,消除了事物的特殊性属性,随着认知抽象层级的不断提升,知识迁移会超越数量与特殊性,最终形成可包容万事万物的知识迁移能力。
代码重构的例子
这是之前工作中遇到的一个代码重构的真实案例。
- BossReporter - 负责收集数据,并且调用boss的上报方法,将数据发送给boss后台
- Boss - 具体的上报类,将数据上报给后台
V1 —— 道生一(初始)
一个BossReporter只会上报给一个Boss数据源。
V2 —— 一生二
海外需求,除了把数据上报给国内的数据源,还需要额外给海外数据源报一份。在BossReporter中增加了一个成员aboardBoss,负责上报给海外数据。使BossReporter依赖了aboardBoss这一具体的实现,破坏了通用性。
V3 —— 对二进行抽象
于是抽象为primaryBoss(主数据源)和secondaryBoss(次数据源),解除海外这一实现。但BossReporter又产生了上报至两个数据源这一数量上的依赖,如果是三个,四个该如何处理。
V4 —— 二生三(消除数量)
将原来的primaryBoss、seceondaryBoss抽象为bosses数组,可以上报给任意多个数据源,消除数量上的依赖。同时又引入了数组这一实现。
V5 —— 三生万物(消除特殊性)
将bosses数组修改为IBossClient接口,由实现接口的SingleClient和GroupClient类来决定上报数据源的数量和类型,消除了实现依赖。而IBossClient接口,是对之前依赖的Boss类的更高层的抽象,它不再限定这个类是什么。
临界值“三”
道生一,一生二,二生三,三生万物。
按道德经的解释一是指混沌,二是指阴阳,万物是指一切。但这句“二生三”显得有些突兀,因为道家体系的太极两仪、四象、八卦等,三并不在这个体系内。三指代的是多个,为什么不用二生多、二生四呢?这里就不得不佩服道家的智慧。“三”在这里指代了一个临界值,当数量到达“三”时,如果能开悟/迁移/抽象/升维,就会形成包容一切的“万物”;否则它就只会是3、4、5…n,也许n可以很大,但它永远只是一个具体的数。
就像上面代码重构的例子,当出现了primaryBoss
和secondaryBoss
后,如果第三个数据源出现,再往里加入一个tertiaryBoss
,那大概率第4、5、6个也会以同样的方式加入,它就会成为那个n,无法成为消除了数量属性后,可以包容任意数量的更高层抽象。
无独有偶,我们在写代码时有一个DRY原则(Don’t Repeat Yourself),指的是尽量不要出现重复代码。神奇的是DRY原则和重构都是以“三”作为临界值的,重复三次就需要对它们进行提取和抽象。而以我以往的工作经验来看,一段代码如果重复了三次,那当第四个需要同样逻辑的地方,也大概率会用ctrl+c和ctrl+v的方式进行重复 —— n或者万物。
我所理解的“道”
回到“道”上,我认为悟道的过程是一个知识迁移逐步升维的过程,而终极之道就是对认知我们认知的能力的迁移,我称为元认知迁移。它迁移的对象不再是某个领域的知识,而是我们的认知本身。
道可道,非常道;名可名,非常名。
大概意思是道如果可以被说出来,那就不是真正恒久的道。
我对此的理解,道是高度抽象的元认知能力,要想用语言表达就必须把它降维到语言这一层级,然后借助语言将它具现化,因此表达出的是道的一具化身,并非原本的那个大道。就像编程里面的抽象类,是无法被实例化的,只能由一个继承它的子类实现其中的抽象方法,最终对外可见的是子类的实例。
有句话叫大道三千,殊途同归。悟道的起点各有不同,但最终都会归于元认知迁移,并不是说所有人领悟的元认知都是一样的,而是元认知迁移是更高层、更包容的迁移能力,它消除了数量与特殊性。通过元认知迁移,哪怕是一个未涉及过的领域,也能快速具现化为这一领域的框架认知。
结语
道家思想博大精深,而我所窥到的微不足道,光是写下这篇肤浅的文章都几乎让我的大脑停机。但也对我产生了顺应性迁移的逆向迁移,站在“道”的角度上重新审视自己的过往,对我自己而言收获颇多。
最后发现就连这篇文章的主线从理论/经验 -> 演绎/归纳 -> 知识迁移,也是一个从具体到抽象,由低维到高维的过程,它依然在“道”的框架中。