暗时间
•人总喜欢沿袭以往习得的经验,并通过类比来进行外推。 •人喜欢从关联当中寻找因果 •人类大脑经过长时间的进化,先天就具备一些特定的“思维定势”,以使得人类能够在面对进化过程中经常出现的适应性问题时能够不假思索的做出迅速的反应。然而,在现代社会,很多这类思维定势已经不适应了。 如果只做一件任务,就不会有此损失。这就是为什么专注的人比不专注的人时间利用效率高得多的原因。任务切换的暗时间看似非常不明显,甚至很多人认为“多任务”是件很好的事情(有时候的确是),但日积月累起来就会发现,消耗在切换上的时间越来越多。 工作之后的状况就是,首先需要处理的事情变多,导致时不时需要在多个任务之间切换;另一方面,即便能够把任务的优先级分配得比较合理,也难免在做一件事情的时候心中忽然想起另一件事还没做的焦虑来,因为没做完的事情会在大脑中留下一个“隐藏的进程”,时不时地发个消息提醒你一下,中断你正在做的事情。只有具备超强的抗干扰能力,才能有效地利用起前面提到的种种暗时间。 如果你把任务分割了,你就有了进度条,你就知道,事情在不断的进展,你总会完成任务或到达你的目标,你会有一个时间估计。反之如果没有这个分割,整个的任务或目标对你来说就只有两种状态——“完成”和“未完成”,如果不幸是一个比较漫长的目标,那么你会发现你的进度条总是“未完成”,一次又一次的等待未果会耗尽你的耐心。 而所谓的规划其实就是针对这种心理弱点的做事方法。 过早退出的原因往往在于对于未来的不确定性,对于投资时间最终无法收到回报的恐惧,感受到的困难越大,这种恐惧越大,因为越大的困难往往暗示着这个任务需要投资的时间越大。所以其实我们都是直觉经济学家,当我们说“畏难”的时候,其实我们畏惧的不是困难本身,而是困难所暗示的时间经济学意义。 问一问自己作出退出的决策是否基于足够的信息,我是否进行了足够的调查,至少,是否去简单用了用搜索引擎。模仿高德纳先生的名言:过早退出是一切失败的根源。兴趣遍地都是,专注和持之以恒才是真正稀缺的。 1. 自尊心受到打击算不上实质性的损失。2. 你想不出能问出什么特别的信息并不代表就真的问不到重要的信息。别把不知道当成没有。 来源于过来人的信息则是信心最靠谱的保障。 推迟决定是最差的决定,在推迟决定期间,时间悄悄流逝。 知识的表象细节会迷惑我们的眼睛,阻碍我们对知识的转移运用(推广),在这个例子中,两个问题领域表面上是不相似的,但本质上是一样的。然而就是因为表面上不相似,而我们的记忆提取又是很大程度上依赖于一些表象上的线索来提取的,因此这些表面不相似性便阻碍了我们在问题之间进行的类比,阻碍了我们将在一个情境下掌握的道理运用到另一个情境下。 经常与别人讨论,或者讲给别人听。经常和朋友讨论交流,说说一段时间总结的东西,这样别人也学到新东西,你也从别人那里学到新东西,并且彼此在表达的过程中都强化了自己的记忆和理解,双赢的事情。 将一段时间学习的知识按照一个主题系统地“串”起来大大地丰富了知识之间的关联,平添无数提取线索。 在我们的记忆中,关于自己的知识和关于别人的知识是泾渭分明的。设身处地地“虚拟经历”别人经历过的事情。努力设想自己处于别人的境地,经历别人所经历的事情,感受它们,使它们和你的情绪记忆挂钩(进化赋予我们的情绪是提取的绝佳线索,也是强化记忆的最佳催化剂),虽然仍然不够亲身经历那么深刻,但似乎已经是我们能做到的最好的办法了。 人类大脑最杰出的能力之一就是强大的归纳推理(inductive reasoning),或者我们常说的:泛化、推广、举一反三、抽象。意思都差不多,都是将特例中得到的规律推广到一般情况。 如果不懂得看到问题的本质(如:经济决策),便很难利用之前推广出来的结论(如:投入/回报,风险估计等等),而是会被我们的原始大脑的一些可预期的非理性所控制(例如从众、从权威、甚至最可怕的行为陷阱——“推迟决策”),成为正常的傻瓜。 警惕“沉默的证据”、事后偏见、自利归因:读他人的传记的时候,不管传记是本人写的还是传记作家通过访谈写的,都会有意无意地犯事后偏见,例如最常见的将成功归因为个人能力,忽略机遇因素。将偶然看作必然。 观察、阅读,并别忘带着你的理性去审视(包括本文),弄清娱乐是娱乐,知识是知识,如果你想真正得到一些知识,最好过滤一下你的信息。否则你只是在别人的思考中得意着。 许多人对琐事错误的采取了主动式关注,比如常常回到家就开始想“今天还有哪些事没做完”,实际上,让这些不重要的事情自己来找你就可以了,即中断式被动关注,后者可以防止空转轮询浪费的时间,从而把最集中注意力的时间利用在最重要的事情上。 做读书笔记。一是将自己阅读的时候的思考(包括闪念)总结下来,二是将书中的好例子摘抄下来。(这个习惯是一年前才养成的,发现受益极大。)有了google note,笔记可以加上tag,非常便于回顾,加深理解。我觉得,人与人学习的差距不在资质上,而在花在思考的时间和思考的深度上(后两者常常也是相关的)。 利用走路和吃饭的时候思考,还有睡觉前必然要弄一个问题放在脑子里面,在思考中迷糊入睡。发现这样一来往往在不知不觉中多出来大量的思考时间。 大脑的工作重心就从情绪模块转向了推理模块了,而且这思考也可能顺带更有效地解决了导致焦虑的问题呢。/*个人的体会是,面对焦虑感最有用的办法就是解决焦虑的问题。否则焦虑就会因为行动的延迟而剧增。抑郁时最抵抗与人接触,而实质上,与人倾诉是最好的缓解抑郁的良药。莫非情绪总是起到相反作用,是恢复正常态的阻力?*/ 很多看上去紧急的事情实际上并不是真的"不能再拖了",有的干脆就并不需要或值得去做。有很多事情都是可以先放一放甚至完全let go的。 一个经过时间检验的信念往往是更靠谱的。只不过可惜的是靠谱不代表最佳,一个信念能让你活下来并不代表能让你活得最好。 条就是如果你真想改掉习惯,就需要在过程中常常注意观察自己的行为,否则习惯会以一种你根本觉察不到的方式左右你的行为让你功亏一篑。有一个认知技巧也许可以缓解更改习惯过程中的不适:即把居住在内心的那个非理性自我当成你自己的孩子(你要去培养他),或者你的对手(你要去打败他)也行。总之不能当成自己,因为每个人都不想改变自己。 设想需要讲给一个不懂的人听。(迫使自己去挖掘知识背后最本质、往往也是最简单的解释)。 很多人感叹跟不上新技术。应对这个问题的办法只能是:抓住不变量。大量的新技术其实只是一层皮,背后的支撑技术其实都是十来年不变的东西。底层知识永远都不过时。算法数据结构永远都不过时。基本的程序设计理论永远都不过时。良好的编码习惯永远都不过时。分析问题和解决问题的能力永远都不过时。强大的学习能力和旺盛的求知欲永远都不过时。你大脑的思维方式永远都不过时。 别担心你会漏掉什么宝贵信息,真正宝贵的信息,在其他来源你也会接触到的。 “理解”的感觉很多时候只是假象。学会反问自己对知识到底把握了多少,是很有价值的。 好资料的特点:从问题出发;重点介绍方法背后的理念( rationale ),注重直观解释,而不是方法的技术细节;按照方法被发明的时间流程来介绍(先是遇到了什么什么问题,然后怎样分析,推理,最后发现目前所使用的方法)。坏资料的特点是好资料的反面:上来就讲方法细节,仿佛某方法是从天上掉下来的,他们往往这样写“我们定义… 我们称… 我们进行以下几个步骤… ”。 1. 现象是什么?2. 解释是什么?3. 支撑这个解释的理由是什么?4. 例子是什么? 问题卡住解决不了,第一时间要做的就是分析到底为什么解决不了,而不是直接求救。 对程序员来说,硬件体系结构是essential的,操作系统的一些重要的实现机制是essential的,主流编程范式(OO、FP)是为了满足什么需求出现的(出现是为了解决什么问题),是怎么解决的,自身又引入了哪些新的问题,从而适用哪些场景)。这些我认为都是essential的。我想补充一点的是,并不是说硬件体系结构就要了解到逻辑门、晶体管层面才行(其实要了解到这个层面代价也很小,一两本好书就行了),也并不是说就要通读《Computer Architecture: Quantitative Approach》才行。而是关键要了解那些重要的思想(很长时间不变的东西),而不是很细的技术细节(易变的东西)。 /*了解技术特点,技术细节及时查询,只会背诵的的博物家不可取。拿嵌入式linux举例,了解系统内核结构,削减系统的判断方法,移植的注意要点,交叉编译理念。freertos:任务分配,调度,事件标志...及时提取技术核心!*/ essential的知识也往往正是那些需要较长时间消化掌握的东西,不像Ruby的mixin或closure这种翻一下manual就能掌握的东西。 /*找到技术底力,什么东西最难啃,最硬,大家最不愿意看?*/ 作为知识的主要载体,任何时候都少不了它,如果不具备英语能力,这个就会成为个人知识结构的短板或瓶颈,而且由于需要长时间才能获得这项能力,所以这个瓶颈将持续很长时间存在。 /*这个东西之所以重要是因为无法短期弥补,由此会牵连出更多相关的技术漏洞*/ 再好的分析能力也并不是每个问题都能分析出该用哪些知识然后再去查手册的,很多时候是在工具和问题之间比较,联想,试探性的拼凑来解决问题;/*这就涉及到一个技术结构的问题,如何使技术串联而不是简单地单个复制粘贴。掌握底层知识,就能掌握技术边界,从而找到路径*/ 你必须首先熟悉你的工具,才能有效地使用它(须知工具的强是无敌的,但这一切得以“了解你的工具”为前提,甚至得以“了解目前可能有哪些工具适合你的问题”为前提)。一门语言,你必须了解它的适用场景,不适用场景(比如继承能解决你的问题不代表继承就是解决你的问题的最适合的方案,须知问题是一个复杂系统,解决方案总是常常引入新的问题)。你必须了解它支持的主要编程范式,此外你还必须了解它的traps和pitfalls(缺陷和陷阱,如果不知道陷阱的存在,掉进去也不知道怎么掉的。)这些都是essential knowledge,如果不事先掌握,指望用的时候查manual,是很浪费时间的,而且正如第2点所说,正因为你不知道这些知识(如适用场景),从而用sub-optimal的方式使用了一门语言自己可能还不知道(最小白的例子是,如果你不知道语言支持foreach,那么可能每次都要写一个冗长的循环,较常见的例子是不知道有很方便的库设施可以解决手头的问题所以傻乎乎的自己写了一堆代码),因为人的评价标准常常是:只要解决了最醒目的问题并且引入的新问题尚能忍受,就行。注意,熟悉并非指熟悉所有细节,而是那些重要的,或者无法在需要用到的时候按需查找的知识。比如上面提到的:适用场景不适用场景,编程范式,主要语言特性,缺陷和陷阱。 糟糕的判断与决策令我们的生活变得糟糕,这还不是最关键的,最关键的是我们从来不会去质疑自己的判断,而是总是能“找到”其他为自己辩护的理由。 你能想象有人宁可天天花时间剪报纸上的优惠券,却对于房价的1%的优惠无动于衷吗?/*找大头儿*/ 学习一个小领域的时候,时时把“最终能够写出一篇漂亮的Survey”放在大脑中提醒自己,就能有助于在阅读和实践的时候有意无意地整理知识的结构、本质和重点,经过整理之后的知识理解更深刻,更不容易忘记,更容易被提取。 /*拿论文survey的心看领域知识,然而获取领域知识的方式不就是看论文survey吗*/ 遇到知识性问题第一反应就是上 Google ,或者上 Wikipedia 。然而,在实际生活当中遇到一些生活问题的时候,往往第一时间想到的却不是 Google ,而是之前解决生活问题的时候建立起来的习惯(比如询问身边的朋友,或者干脆放一边不管) 认知失调与自我辩护。如果我们在听到别人的道理之前已经有了一个心理上的倾向,那么即便别人给出一个有一定说服力的理由,根据认知失调理论,我们也会竭力为自己辩护;又由于世界是复杂的,所以我们几乎总是能够找到辩护的借口 正确的做法不是一概而论地听取直觉的意见或者一概而论地不听取,而是将它当成一个启发式的判断,然后利用自己的理性大脑对其进行进一步的客观的、逻辑的检验(Critical Thinking)。 对于了解贝叶斯方法的同学,这个“光线来自上方”的假设就是先验(prior)的。我们的大脑有一个神经网络模块负责识别人脸,这也是一块硬编码的神经网络,也就是说我们天生就对任何(类似)人脸的图像敏感,所以随处都看到人脸,稍微类似人脸的图像就会被优先解释为人脸。 大脑的逻辑是这样的:如果假设光照来自上方,那么根据阴影来推断这就应该是一张凹陷的脸。但我们又知道所有的脸都是凸的,因此必须推翻光线来自上方的假定才能符合“事实”——当大脑中的两个假设相冲突的时候,更强硬的那个获胜。 要消解二义性其实很简单,引入新的evidence。 我们的大脑会综合图片中所有的evidence,以及大脑中原本就有的先验假设,给出最可能的解释。但必须注意的是,如果按照统计学派的观点,应该让数据本身说话,不引入先验假设的话,二维图片就是二维图片,每种解释的可能性都是均等的,但如果考虑了先验假设,那么往往只有一种或几种可能性是靠谱的(plausible)。 尽管同一物体在不同光照条件下反射的光线差异很大,即视网膜接收到的光线差异很大,但视觉皮层对视网膜接收到的光线又进行了一层处理,这层处理就是从视网膜接收到的光线中“抽取”出物体的“真实颜色”。但我们的神经回路如何计算目前还并不最终明确,但有靠谱的逼近算法(被称为retinex algorithm),其中一个简洁的版本是这样的:假设目标物体周围的邻近环境中存在完全反射光线中的绿光成分的物体、也存在完全反射光线中的红光成分的物体、也存在完全反射光线中的蓝光成分的物体,那么只要将眼睛采集到的环境光线中最强的绿光成分Gmax,最强的红光成分Rmax,最强的蓝光成分Bmax分别记录下来,然后算一下目标物体所反射的光线的RGB对(Rmax,Gmax,Bmax)的比例即可。 他所得到的信息仅仅是他的丈人坚持要他给礼钱,他并没有得到关于丈人这么做的意图的信息。丈人的意图只是他自己的推断,他对丈人意图的推断只是一种可能性,并非唯一的可能性。然而他仍然还是不可避免地陷入了对自己推断的过分信任的陷阱,一旦脆弱的自尊被触发,接踵而来的便是一连串情绪化的、自动化的行为(仿佛汽车挂上了自动挡)。 我们总是混淆“事实”和“推断”,尤其是当我们对推断的确信度很高的时候,或者某种推断对我们有利的时候,或者当这个推断源于大脑天生的偏见的时候,例如,将关联误当做因果就是我们的认知死穴之一。 我们现在的知识体系和古希腊相比固然得到了极大的进步,但是我们真的变得更“聪明”了吗?要知道推理的引擎(演绎和归纳)几十万年来却并没有变化,我们只是站在巨人(数千年知识的积累)的肩膀上,但这个巨人的高度并不属于我们自己,我们有什么理由五十步笑百步呢? 我们的记忆并不像电脑的存储设施那样,忠实记录,然后忠实读取,而是在记录和读取的时候都是相当程度上“构建性”的,而构建所用的“素材”则是我们之前在生活中积累出来的经验。 对基于统计(特别地,基于贝叶斯)的垃圾邮件过滤的基本机制有所了解的同学应当知道,在判别公式里面有两项分别是P(S)和P(H),分别代表一封邮件是垃圾邮件和非垃圾邮件的(先验)概率,一项统计表明现实世界中这个比例是8/2,即80%的邮件是垃圾邮件。这个就是过滤器眼中的世界,“八成的人都是坏人”,这个就是过滤器的“偏见”,或者“先验假设”,来一封邮件不管三七二十一首先作一个最坏的打算。正如机器学习方法的偏见来源于训练数据集,我们头脑中的偏见也来源于我们大脑中神经网络的训练数据集——现实生活。 由于8/2的比例并非时间无关的稳定比例,或者其他什么原因(如保守起见),目前大多数贝叶斯垃圾过滤系统实际上将这个比例设为5/5,表示“无偏见”,不设先验。这就基本上将贝叶斯这个词扔掉了。但我个人觉得这并不能称为“无偏见”,如果现实就是“有偏”的,保持公平也是一种偏见。 如果现实世界背后的模型本来就是“有偏”的,假装不引入“偏见”本身就是“偏见”。只不过我们所观察到的现实世界纷繁的表象往往只是一个局部有偏样本,导致我们看上去随机抽取的数据其实还是有偏的,如果我们蒙上眼睛骗自己说这就是真正随机的抽样,那么训练出来的模型肯定也是有偏的,为了补偿这种偏差我们有时候宁可扔掉从训练数据中得到的某些概率,这种方法往往导致长期来讲更靠谱(严格来说这里的术语是robust )的模型,尤其是在金融市场上,小聪明的人从短期趋势数据上自以为得到了靠谱的模型,把太多的赌注放在了一个建立在因在时间维度上没有随机采样而很可能有偏的数据集上得到的模型上,而真正智慧的玩家则会建议普通人最佳投资方法是无偏见地平均分配资金,避免因模型错误而导致的灾难,这一平均分配的极端形式就是——投资指数。 /*为了得到真正随机,我们不得不蒙上眼睛,忘却那现实的可能有偏,有偏数据集得有偏模型,我们用有偏模型来得到“错误”*/ 在社会文化方面,人们常用“仁者见仁、智者见智”这个俗语来指代三种现象: 1) 偏见:不同的人戴着不同的有色眼镜,对同一现象产生不同的理解或解释。是平凡的解释还是阴谋论的解释?存乎一心。 2) 立场:例如对于“生活的意义”没有统一的标准公理,因此每种生活都是合理的,各人可以持有不同的价值观,优化不同的目标函数。 3) 选择性关注:对于同一事物,不同的人关注的点不一样,象有四腿,各摸一条。 “这只是一种解释(可能),未必是唯一的解释(可能)。(想不出其他解释不代表就不存在其他解释)。” 我们的原始大脑同样也分不清什么是虚拟什么是真实,在获得社会成就和声望的动机的驱使下,即便是虚拟的网络游戏社会,我们也会投入大量精力,某种意义上我们的大脑并没有错,我们的确应该去获得声望,只不过它还没有聪明到跟得上工业文明,它并不明白虚拟世界里面的生存能力和地位并没有办法转化为现实世界的生存能力和地位。 我们匆匆忙忙把自己推入了一个完全不一样的世界,而进化的齿轮转动得却慢了很多拍,于是我们都成了进化时滞的牺牲品,我们用远古的双眼打量着这个世界,关在笼子里的老虎完全不必害怕,但我们还是会汗毛倒竖,汽车酿成的交通事故每天无数,而我们过马路却置若罔闻。一句话:我们的情绪大脑仍然停留在20万年前,而20万年前是没有汽车这种物种的。 神经科学显示,大脑的模块的确遵循用进废退的原则(《The Brain That Changes Itself》),一个经典的证据是钢琴家的大脑中对应手指的神经回路占用面积要比正常人大很多。 真正的理由有时候往往隐藏在意识触及不到的地方,由我们的情绪大脑所掌控,当它引导我们的情绪大脑作出决定之后,才发个红头文件通知我们的理性大脑,我们的理性大脑于是便像文章开头提到的实验中描述的那样,迅速而果断地给出各种听上去很合理的解释,让我们的决定和行为看上去无懈可击。 /*情绪控制人,并让人寻找理性解释,很多理性的理由不过是为一时的情绪背书*/ 人的大脑并不是一个一蹴而就的整体设计,而是随着漫长的岁月在进化中被不断地添添补补,就像一台7拼8凑攒出来的电脑,CPU是新的,主板却是老的,老的主板不能很好的兼容新的CPU,结果CPU的性能便不能很好的发挥出来。可怜我们在进化上比较新近的新皮质(neocortex),拥有强大的计划能力和认知能力,但在一些原始诱惑面前却总是无法做到淡定。因为大脑中的这些原始模块还没有很好的和新模块兼容。 尤其是当人们为一件事情付出了金钱,社会关系,很多很多之后(这在宗教末世论组织和传销组织中何其相似),这些既有付出便会对他们的思维产生越来越强大的影响(经济学中的“沉没成本”便是如此),我们的思想被迫对自己的行为作出合理的解释,这就是著名的“认知失调”。 我们每个人大脑中都有思想钢印。这道钢印由经验打造,用自尊来维护,牢不可破,比钻石的硬度还要高。 而当你进一步意识到自己无法自制的原因是因为你大脑原始的那部分仍然天真地认为你还处在石器时代的时候,你就会觉得任其驱使自己是愚蠢的事情,而我们的情绪大脑自然不希望自己是愚蠢的;而另一方面,认识到以上这些知识,认识到大脑的局限性,并最终摆脱它的错误驱使,则让人情绪上感到聪明和愉悦。于是我们就以彼之矛攻彼之盾,利用情绪大脑本身的动力来推动了它本身。 纸笔缓存思考。 文字符号其实有自己的一套系统,计算语言学上称为语义网络,同一个概念,在大脑中模糊的感觉,和明确地表达成某个特定的词语,是不一样的。你会因为用了某个特定的词语从而想到另一个词语,你写着写着就会发现一些词语就像本身有灵性一样,将其他的词语都带出来了。有时候,这种效应会导致书写变成一场文字游戏,但好的一面是有些时候也是有益于拓宽或启发思维的。 绝大多数时候其实我们都会不假思索地得出一些结论,就像上了发条的自动机,但其实我们并不知道这些结论到底怎么来的。如果你注意一下很多人的发言(论坛、博客等等),如果你把他们的发言分为“前提”、“假设”、“逻辑”、“结论”这四个部分,你会发现一大堆人只会不停地下结论,摆立场,却见不到这些结论或离场的前提、假设和个中逻辑,倒也不是他们不愿意写出逻辑,而是因为反思自己的思维过程实在是一件困难非常的事情。 去教一个完全不懂的人,则是一种最最强大和彻底的反思途径——因为他没有任何预备的知识,所以要让他弄懂你所知道的,你就必须彻底反思你的知识体系,弄清这座大厦的根基在什么地方,弄清它的骨架在什么地方,一砖一瓦到底是怎么垒起来的。 让你自己成为一个持续学习和思考的人,并只写你真正思考和总结之后的产物,其他一切就会随之而来。 阅读博客的人希望得到信息而非噪音。如果实在忍不住想碎碎念的话不妨换一下位置,这么来告诉自己:如果你看到别人博客来上这么一段,你会有兴趣看吗? 被别人指出问题正是改进的空间,藏着掖着的想法永远不可能变得更成熟。 我们必须要带着问题的眼镜看待事物才能发现新的视角,否则就会出现视而不见效应,别的不说,广为人知的例子是阿基米德的“尤里卡!”,如果不是长时间琢磨着一个问题,一直把它放在思维中,是不会从洗澡领悟到“排水测体积”的,否则他洗了那么多年澡怎么不早发现呢? 心理学上把类似这样的过程叫做“自利归因”。术语挺能唬人,但其实很简单,比如你做一件事失败了,你说“唉,都怪XXX(这里的XXX可能代表人,也可能代表天气不好,情绪不好,路况不好这样的事儿)。”(归结于客观原因,推卸自己的责任)。比如一件事情成功了,你说“还不都是我的功劳”(归结于自己,抬高自己)。简而言之自利归因就是把一件事情发生的原因归结为对自己有利的那种情况。 一旦你说出“这件事不是我的原因”这样的话之后,除了心理好受了之外,你也开始相信这件事的失败真的与你无关,你自己这方面不需要作任何改变(因为你觉得不是你的问题),于是结果你下次同样也不会成功。 /*被戳中,满目疮痍,本人犯错时虽然明知道是自己的原因,但还是下意识寻找遮羞布,维护面子,而他人也在语境下维护这种面子,变成房间里的大象。*/ 如果你“兵来腿软,水来上船”,然后给自己找一大堆唧唧歪歪的理由。除了表明你没能耐之外不能表明其它的任何东西。所以你千万要记住,别给自己找理由,因为那等同于说“我不能__,我没有__”(填空自己填),等于否认自己的自由意志和主观能动性。 如果你“兵来腿软,水来上船”,然后给自己找一大堆唧唧歪歪的理由。除了表明你没能耐之外不能表明其它的任何东西。所以你千万要记住,别给自己找理由,因为那等同于说“我不能__,我没有__”(填空自己填),等于否认自己的自由意志和主观能动性。 “技术路线的选择重要但不具有决定性”,用有说服力的数据阐述了技术路线的选择对于个人知识体系的不可替代性并非一个关键因素。 个人的核心竞争力是是他独特的个性知识经验组合。不在于你学的是什么技术,学得多深,IQ多少,而在于你身上有别人没有的独特的个性、背景、知识和经验的组合。如果这种组合,1,绝无仅有;2,在实践中有价值,3,具有可持续发展性,那你就具备核心竞争力。因此,当设计自己的发展路线时,应当最大限度地加强和发挥自己独特的组合,而不是寻求单项的超越。而构建自己独特组合的方式,主要是通过实践,其次是要有意识地构造。 /*想到了现在的学科融合,从特色找突破点,单凭技术实力那是一片paper都发不出去了。本书作者的独特路线,应该就是心理学和代码的融合?*/ 作者相信以下的知识技能组合是具有相当程度的不可替代性的: 专业领域技能:成为一个专业领域的专家,你的专业技能越强,在这个领域的不可替代性就越高。这个自是不用多说的。 跨领域的技能:解决问题的能力,创新思维,判断与决策能力,Critical-Thinking,表达沟通能力,Open Mind 等等。 学习能力:严格来说学习能力也属于跨领域的技能,但由于实在太重要,并且跨任何领域,所以独立出来。如何培养学习能力,到目前为止我所知道的最有效的办法就是持续学习和思考新知识。 性格要素:严格来说这也属于跨领域技能,理由同上。一些我相信很重要的性格要素包括:专注、持之以恒、自省(意识到自己的问题所在的能力,这是改进自身的大前提)、好奇心、自信、谦卑(自信和谦卑是不悖的,前者是相信别人能够做到的自己也能够做到,后者是不要总认为自己确信正确的就一定是正确的,Keep an open mind)等等。 /*老生长谈的话题,对此主要精力还是应该放在主研领域,弥补自身短板上面*/ 他认为人类的直觉实际上也是计算,捷径式的计算,只不过由于我们目前还不了解人类大脑内神经元的全部结构(或者说“感性”的物质基础)这才把“感性”当成人类所特有的; 《Predictably Irrational》更是把这个认识提高到方法论的层面,主张人类的非理性实际上是完全可预知的。事实上,所有这些观点都建立在一个基本事实的基础上,即人类大脑中的千亿神经元是由在漫长的进化过程中被塑造出来的分工明确的、ad hoc的一组子系统构成的。 这些一般性的思维方法,就是波利亚用了整整三本书,五卷本(《How To Solve It》、《数学的发现》、《数学与猜想》)来试图阐明的。波利亚的书是独特的,从小到大,我们看过的数学书几乎无一不是欧几里德式的:从定义到定理,再到推论。是属于“顺流而下”式的。 •时刻不忘未知量(即时刻别忘记你到底想要求什么,问题是什么。)莱布尼兹曾经将人的解题思考过程比喻成晃筛子,把脑袋里面的东西都给抖落出来,然后正在搜索的注意力会抓住一切细微的、与问题有关的东西。事实上,要做到能够令注意力抓住这些有关的东西,就必须时刻将问题放在注意力层面,否则即使关键的东西抖落出来了也可能没注意到。 •用特例启发思考。一个泛化的问题往往给人一种无法把握、无从下手、或无法抓住里面任何东西的感觉,因为条件太泛,所以看起来哪个条件都没法入手。一个泛化的问题往往有一种 “不确定性”(譬如元素的个数不确定,某个变量不确定等等),这种不确定性会成为思维的障碍,通过考虑一个合适的特例,我们不仅使得问题的条件确定下来从而便于通过试错这样的手法去助探问题的内部结构,同时很有可能我们的特例中实质上隐藏了一般性问题的本质结构,于是我们便能够通过对特例的考察寻找一般问题的解。 •反过来推导。反过来推导是一种极其重要的启发法,实际上,反向解题隐含了解题中至为深刻的思想:归约。归约是一种极为重要的手法人类思维本质上善于“顺着”推导,从一组条件出发,运用必然的逻辑关系,得出推论。然而,如果要求的未知量与已知量看上去相隔甚远,这个时候顺着推实际上就是运用另一个启发式方法——试错——了。虽然试错是最常用,又是也是最有效的启发法,然而试错却并不是最高效的。对于许多题目而言,其要求的结论本身就隐藏了推论,不管这个推论是充分的还是必要的,都很可能对解题有帮助。如果从结论能够推导出一个充要推论,那么实际上我们就将问题进行了一次“双向”归约,如果原问题不容易解决,那么归约后的问题也许就容易解决了,通过一层层的归约,让逻辑的枝蔓从结论上一节节的生长,我们往往会发现,离已知量越来越近。 譬如通过驻点来求函数的最值,我们通过考察函数的最值(除了函数边界点外),发现它必然有一个性质,即在这个点上函数的一阶导数为0,虽然一阶导数为0的点未必是最值点,但我们可以肯定的是,任何一阶导数不为0的点都可以排除,这就将解空间缩小到了有穷多个点,剩下的只要做做简单的排除法,答案就出现了。 •调整题目的条件(如,删除、增加、改变条件)。有时候,通过调整题目的条件,我们往往迅速能够发现条件和结论之间是如何联系的。通过扭曲问题的内部结构,我们能发现原本结构里面重要的东西。 •将问题泛化,并求解这个泛化后的问题。刚才不是说过,应该通过特例启发思考吗?为什么现在又反倒要泛化呢?实际上,有少数题目,泛化之后更容易解决。 •下意识孵化法。这个方法有点像老母鸡孵小鸡的过程:我们先把问题的吃透,放在脑子里,然后等着我们的下意识把它解出来。 一天夜里,你被外面的吵闹声叫醒了,你出去一看,发现有一群人,其中有一个人开着很名贵的轿车,他跟你说他们正在玩一个叫“拾荒者”的游戏,由于一些原因,他必须要赢这个游戏,现在他需要一块1.5m*1m的木板,如果你能帮忙的话,愿以一万美元酬报。 答案是:拆门 范畴陷阱:“木板”这个名词在你脑子里的概念中如果是指“那些没有加工的,也许放在木材厂门口的,作为原材料的木板”的话,那么“木板”就会迅速在你的下意识里面建立起一个搜索范畴,你也会迅速的反应到“这深更半夜叫我上哪去找木板呢?”如果你一下就想到了,那么很大的可能性是“木板”这个概念在你脑子里的范畴更大,更抽象,也许包含了所有“木质的、板状的东西”。 知识却也是思维的桎梏。思维定势就是指下意识遵循既有知识框架思考的过程。防止被禁锢的方法就是抽象。在吸收知识的时候进行抽象,同时在面对需要用到知识的新问题时也要对问题进行抽象,从各个属性维度,系统性地联想。譬如大小可以调整、固体可以调整为碎末、棱角可以打磨、重量也可以调整... •好题目举例:烙饼排序问题(考察特例启发法以及观察能力)、Nim问题(还有简单版本的取火柴问题)(烙饼排序问题和Nim问题可参见《编程之美》)、9公升4公升水桶倒6公升水的问题(考察倒过来思考问题的能力)、9点连线问题、6根火柴搭出4个面的问题、“木板”问题(考察思维定势,此外《心理学与生活》的第九章也有好几个经典的问题)、许多数论问题(观察能力、演绎能力、归纳能力)。 那种看到题目直接反应出答案的或许也不是纯粹的好事,因为这样的解题过程严重依赖于既有知识,尤其是做过的类似的题目,其思维过程绝大部分运用的是联想或类比,而非演绎或归纳。更重要的是,联想也分两种,被动联想和策略性联想(参考《找寻逝去的自我》),这里用的却是被动联想。所以,能直接反应出答案并不代表遇到真正新颖的题目的时候的解决能力,后者由于不依赖于既有领域知识,就真正需要看一个人的思维能力和习惯究竟如何了。 去揣测和总结别人的思维是如何触及那关键的一步,而你自己的思维又为什么触及不到它,有一些一般性的原则可以指导你下次也能想到那个“关键的一步”吗,是很有意义的。 如果全局搜索空间没有递归结构,那么考虑分割搜索空间,譬如那些“看到XX,要想到YY”的联系.. “一熊连续向正南、东、北各走一公里回到原点,问熊颜色?” /*这道题实质是通过行走路线分析得出熊在北极,进而得出北极熊是白色的。然而我想法却是从题目本身出发,即什么熊是有颜色的并可以作为题目的答案?*/ 纯设计模式,可能只存在于教学和科学,而不在于我们的商业软件开发。我们作为商业开发,强调的是叫座的基础上叫好,所以折中方案是必须的,客户和我们自己两相宜就OK,是否符合正宗,就不在我们的商业开发管理范畴了。 我告诉他:做事不能走极端。要么全写注释,要么不写注释,都是不对的。我只在我认为要小心的地方,或者我自己都觉得很难理解懂的地方我才写注释。否则,我自己都可能会过段时间理解错了。如果某段代码我看看就能看懂,我就不写注释了。咱们做企业管理软件,深入技术又没有,只要代码能把复杂的业务处理描述的逻辑思路清晰就OK。虽然说理解能力不同,我能快速理解了的未必有新手能够理解。 有一部分所谓的架构师,技术超深厚,框架堪比Spring之类,但自己一个人闷头写框架不断优化,力竭使用最先进的技术思想,希望把最豪华的设计模式融进去,希望把OSGi融进去,希望把AOP融进去,全无视那些想利用框架减轻自己工作量提高自己工作效率的应用功能开发同事。这是在用公司工资玩技术呢,还是在满足个人技术幻想呢,还是在实验呢?到底在干吗?价值在哪里? 还有的人不会推广自己的框架。不善言辞,就幻想着技术总监能够通过行政命令让大家必须用框架,能不自己写代码就不自己写代码,能交给框架做的就交给框架做。但技术总监号召完了,大家仍然我行我素,各自开发为政,让框架开发者很孤单。 有一部分所谓的架构师,技术超深厚,框架堪比Spring之类,但自己一个人闷头写框架不断优化,力竭使用最先进的技术思想,希望把最豪华的设计模式融进去,希望把OSGi融进去,希望把AOP融进去,全无视那些想利用框架减轻自己工作量提高自己工作效率的应用功能开发同事。这是在用公司工资玩技术呢,还是在满足个人技术幻想呢,还是在实验呢?到底在干吗?价值在哪里? 有一部分所谓的架构师,技术超深厚,框架堪比Spring之类,但自己一个人闷头写框架不断优化,力竭使用最先进的技术思想,希望把最豪华的设计模式融进去,希望把OSGi融进去,希望把AOP融进去,全无视那些想利用框架减轻自己工作量提高自己工作效率的应用功能开发同事。这是在用公司工资玩技术呢,还是在满足个人技术幻想呢,还是在实验呢?到底在干吗?价值在哪里? 还有的人不会推广自己的框架。不善言辞,就幻想着技术总监能够通过行政命令让大家必须用框架,能不自己写代码就不自己写代码,能交给框架做的就交给框架做。但技术总监号召完了,大家仍然我行我素,各自开发为政,让框架开发者很孤单。 •心中有锤,就容易为其奴役。 在学习工具的时候始终别忘记它的适用范围。 任何工具都有其适用范畴和前提。然而,我们在学习工具的时候由于投入很多的时间,当然内心希望能够用上这些工具,所以就容易忘掉其适用前提,欣欣然地不管三七二十一就把黄金大锤亮出来,以显示自己的厉害。但如果我们换一个态度,仅仅将它看作我们工具箱中的又一件工具,就可以客观地评估它。 1. 学习C++的第一原则是什么? 关注基本的(fundamental)概念和技术,而并非特定的语言特性,尤其不是C++中细枝末节的语言细节。我们当然是需要掌握语言特性的,但重点在于要从语言特性看到特性背后蕴藏的支持设计和编程的概念(concept)。比如类支持的概念,继承支持的概念,虚函数支持的概念,模板支持的概念... 2. 使用C++的第一原则是什么? 将你的(pongba按:与语言无关的)设计理念(概念)直接映射为C++中的类或模板。“脱离语言思考,使用语言实现”。脱离语言思考的好处是显而易见的:可以避免受到语言细节作为既有框架的干扰,避免过早被实现细节缠住,于是便容易找到最直观的解决方案,即便后来发现语言成了绊脚石,也可以选择换语言或者明确地知道自己做了什么折衷。 •内隐化:思维法则其实也是知识(只不过它是元知识——是帮助我们获得新知识的知识);是内隐的记忆。我们在思考的过程中觉察不到思维法则的作用,它们却在幕后实实在在的左右着我们的思维轨迹。要将思维方法内隐化,需要不断练习,就像需要不断练习才能无意识状态下就能骑自行车一样。 •跨情境运用:思维法则也是知识记忆,是问题解决策略。既然是记忆,就受到提取线索的制约,这就是为什么当波利亚告诉你要“注意未知数”之后你还是不能真正在所有需要你“注意未知数”的地方都能提醒自己“注意未知数”。很多时候未知数是很隐蔽的,未知数并不会总是头顶一个大帽子上面写着“我是未知数”。所以很多时候缺乏对这个策略的“提醒”线索。不同的环境线索,在你大脑中激发的记忆也不一样。就连问题求解中,不同的问题之间的细小差别也可能导致思维轨迹很大的不同,有时你的注意力会被一个无关线索激发的联想吸引开去,忘记如“注意你的未知数”这样的重要法则。而一本从思维角度来讲问题求解的书则可以一遍遍将你置于不同的问题场景下然后在该提醒你的时候提醒你,让你醒悟到“哦,原来这个时候也应该想到这个啊。”,做多了这样的思维演习你就会逐渐从中领悟到某种共性,并将一些思维习惯得到强化,于是终于能够在需要运用某策略的时候能适时的想起来了。 •内隐化:思维法则其实也是知识(只不过它是元知识——是帮助我们获得新知识的知识);是内隐的记忆。我们在思考的过程中觉察不到思维法则的作用,它们却在幕后实实在在的左右着我们的思维轨迹。要将思维方法内隐化,需要不断练习,就像需要不断练习才能无意识状态下就能骑自行车一样。 •对问题解的更多记忆提取线索:我们平时学习算法时几乎仅止于“理解”,别人把一个方案放在你面前,你去验证一下,心说“哦,不错,这个的确可以工作”。然后就没了。知道了算法是怎样一步步被推导出来的,我们就一下拥有了大量的记忆提取线索:对算法发现过程中的任何一个关键步骤(尤其是本质)的回忆都可能使我们能够自己动手推导出剩余的内容。譬如你知道堆(heap)是怎样由朴素的决策树演化而来的,它又是为了解决什么问题的,你即便忘记了具体的细节,也可以自己推导出来。譬如你知道Tarjan算法其实只是从后序遍历经过两个优化调整而来的(其中并査集的使用其实只是优化手段——为了能够迅速判断祖先节点是谁——而非算法本质——当然,算法设计的主要任务本来就是通过问题条件中蕴含的知识来“消除冗余计算”和“避免不必要计算”,所以你也可以说并査集的使用是关乎本质的,只不过,知道了为什么需要引入并査集,就会强烈地感觉到一切是顺理成章的。 思想所处的抽象层面往往比到处都是实现细节的算法本身要低,越是低的抽象层次,越是本质,涵盖范围越是广泛。 •重在分析推理,而不是联想:学了一大通算法和数据结构之后的一个副作用就是,看到一个问题之后,脑袋里立即不管三七二十一冒出一堆可能相干的数据结构和算法来。 如果你经常注意反证法,你会发现一个有趣的现象,反证法里面经常会有这样一句“我们考虑”,而“我们考虑”后面几乎肯定接着一个天外飞仙一般的insight。 算法本质上可以看做是在一个解空间当中的搜索问题,所以要分析一个算法的好坏,首先弄清它的解空间的结构,然后分析它是怎么来探索这个解空间的。