Blog

心智探寻(一):父母,和我们自己

很多心理学知识,放在问题上下文和思维的展开过程当中去引出,会比其他形式更生动,更容易理解,如果你仔细看,会发现几乎每则对话里都会引出一个或几个重要的心理学原理。除了对话所对应的特定问题之外,这些心理学原理,和使用这些原理的思维过程,同样也是我希望籍由对话来传达的「渔」。

逃出你的肖申克(七):改变的科学和科学的改变

「改变」恐怕是最古老但一直保持高度活跃的话题之一。不管是东方还是西方,都有类似「三岁看大,七岁看老」这样的俗语,可见一个人的改变如何困难。虽然我们成年以后仍会不停地学习知识,然而我们对于世界的信念、价值观、看问题的角度和偏好、我们性格深处对于成功失败、风险收益、人际关系、对自我的认知等等一系列「内隐」的心智模式往往会在很早就定型,并且会不断地自我强化——这种自我强化也是改变最困难的原因之一。 改变分为两种,一种是个人的改变,另一种是组织群体的改变。我对于前者更感兴趣。一个人要想改变自己,首先要了解自己,这就像要解一道题目首先得理解题意一样。而了解我们自己是一个更为古老的问题,古希腊人就曾把「了解你自己」刻在阿波罗神殿的门柱上,在解剖学、神经科学发展起来之前,我们对于自身的了解大多源于并止于自省(introspection),自省法直到今天仍然在启发着心理学研究,然而要想实证很多问题,离不开更「物质」的手段,如蓬勃发展的脑科学技术。

信息时代的独立阅读者(二):怎么阅读科普类文章

讲科学证据,本来是个好事情,这些年大众读者经过泛滥的鸡汤文和灵魂写作的洗礼之后,慢慢觉悟到说要看科普文章,最好看有文献引用的,有出处的那些。 但是科普也分好科普和坏科普。重点不在于是不是科普,而是是不是靠谱。 我们知道科学的精髓在于研究方法论,而不是结论本身。如果把科学研究方法论看做一个「管道」,从一端进去的如果是客观事实,那么从另一头导出来的,也更可能(也只是「更可能」,而不是绝对)是客观事实。但如果从一头进去的是垃圾,另一头出来的,仍然是垃圾。这就是著名的「garbage in, garbage out」(垃圾进,垃圾出)原理。

信息时代的独立阅读者(一):内心的小声音

但比阅读更重要的,其实是阅读中的思考,带着脑和心去阅读,我把这个称为「独立阅读」。 在独立阅读中,我们对知识进行再次的深度加工,和自己既有的知识&经验体系去对照、印证,去碰撞,去对比,去分辨,然后破立、融合、存疑、延展、细化。经过了这样一个过程的阅读,看起来我们是阅读一篇文章,但其实我们代入了自己整个身心、思维、切身经验中的第一手素材。

逃出你的肖申克(六):看不见的牢笼(下):柏拉图的洞穴

心理学历史上有这样一个非常经典的实验,其经典之处不仅在于它是著名的行为主义创始人斯金纳所做的,更在于它以一种非常简练的方式揭示了人和动物的某些行为的深刻联系。这个实验被称为“迷信的鸽子”,并被收录在《改变心理学的40项研究》一书中。实验是这样的:给笼子里的一群鸽子喂食,喂食器被触发的时间间隔是固定的,经过一段时间的喂食以后,会发现,笼子里面的鸽子呈现出形形色色的“迷信”行为,有的鸽子不停地转圈,有的鸽子一个劲地啄笼子的某个特定位置,有的鸽子不停地摇头,等等。仿佛他们相信这样做就能影响喂食器给食一样。这个实验有趣就有趣在他跟人类的迷信行为(例如穿某只特定的袜子跟赢球的联系)的本质上的相似性。(出于某些奇怪的心理,心理学家和大众都挺喜欢这种对人类进行降格的实验,其中心理学家们最好的一口的就是这种在动物身上重现人类的行为的实验。) 迷信,毫无疑问可算是一种思维的“牢笼”,所谓迷信就是一种跟现实规律不相符合的心智表达(mental representation),如相信一个无根据或不存在的规律。作为也许是这个世界上唯一一种对真理有着执(bìng)着(tài)追求的物种,我们自然不能容忍自己生活在幻觉当中。所以我们常常对迷信有着一种近乎迷信的反感。 这本倒也无可厚非。只是近几十年来,工作在进化论和心理学的交界处的一群人逐渐意识到,我们所共有的许多看起来很不合理的行为或怪癖,如果放到整个生物演化的大框架下面去看,就讲得通了,这门学科就是进化心理学。这方面最为公众所熟悉的例子之一就是“行为经济学”,行为经济学对传统的“理性”经济人假设进行了卓有成效的质疑。例如有这么一个著名的分钱实验(正式说法叫“最后通牒游戏”):你跟另外一个被试参与这个实验,心理学家给了另一个人一百块钱,他可以随意进行分配比例,可以给你1毛钱,也可以全给你,而你只能做两件事情,接受或者拒绝,如果你拒绝,那么你们两个人都拿不到任何钱。现在,如果对方只给你一毛钱,你会怎么做呢?理性人假设是说,只要他分给你的钱是非零的,你都选择接受,因为从(绝对)获利的角度来说这明显是更好(理性)的选择,但实际上谁也不会这么做,对于不公平的分配,我们往往“宁可玉碎不能瓦全”。这说明我们做决定并不仅仅是为了最大化个人绝对收益。事实上从生物进化的角度来说,拥有相对繁衍优势的基因才最终会被留存下来,“相对(而不是绝对)优势”才是终极的目标函数。为了保持相对优势,我们不仅愿意放弃,甚至有时候愿意牺牲绝对利益。例如有这样一则有趣的寓言:你是一个农夫,你的邻居有一次恶意毁了你半亩田,你很愤怒,这个时候上帝出现了,上帝给你两个选择,一个是保持原样,另一个是上帝再毁掉你半亩田,但同时却毁掉你邻居一整亩田。你会怎么选呢?“杀敌一千自损八百”也是同样的道理。(当然,也无需对人性的阴暗面感到灰心,这个逻辑的反面同样成立,即我们对于合作行为也是“投桃报李”的,比如《合作的进化》就是专门讲我们的合作基因的。) 迷信也是类似的道理。乍看起来迷信的确是百害而无一利的,而且尤其是当你把目光只放在那些“真·迷信”上的时候,你难免会感叹人类有时候真是蠢到家了。但是,实际上,迷信只不过是我们高度进化的适应机制的一个不可避免的副产品(by-product)。说到这个,故事就多了去了。这里再讲两个进化心理学家们最喜欢举的例子(类似的例子在本系列前面的文章中也提过):假想你是原始人,你在树林里面打猎,听到身旁不远处的灌木丛可疑地动了一下,这个时候你会按兵不动,还是更愿意相信后面有一头猛兽而走为上计呢?当然是走为上计,因为如果真有猛兽,你就捡了一条命,如果没有猛兽,你除了吓一跳以及花点力气之外也没什么损失。再如食物中毒:在我们茹毛饮血的远古生活中,食品安全实在是一个反复出现的进化选择压力,假想你在吃了某东西之后不久上吐下泻,即便有可能只是巧合,出于保险起见也还是假定是食物有毒,下次不吃为妙,因为不吃该食物的话还有别的食物可以选择,无关大局;但吃了的话可能代价就大了。 学术界把以上提到的两种错误,即“没风险时误以为有”跟“有风险时误以为没有”分别称为一类错误和二类错误(“妹子无意时误为有意”和“妹子有意时误为无意”)。我们在面对未知的时候,必须在一类和二类错误之间有所取舍,考虑到我们的主要任务是为基因传宗接代,而不是做不要命的科学家,所以进化之筛选择出来的决策系统往往是“宁可信其有不可信其无”的。我们的这个在未知面前为了最大可能性确保生存繁衍优势而作出的特定选择偏好,被统一称为Error Management System。事实上,仔细观察就能发现,在一类和二类错误之间的取舍贯穿了我们日常生活决策的方方面面。例如孕妇辐射服科普了那么多年,销量还是那么火,也是类似的道理:对于大众来说,要深入理解枯燥的科学研究到情感上确信防辐射服的确没有必要的地步,是不大现实的,所以科普了许多年之后对于大多数人来说还是“虽然很可能报纸上、科学家们说的是对的,但是并不排除他们弄错了的可能性”(毕竟科学家们犯错也是家常便饭),既然不完全排除这种可能性,而另一方面穿了也不过就花几百块钱(也没什么太大的不舒服,况且一辈子也就生那么一(几)次孩子),而不穿的话则“不排除”严重后果,那么还是穿了吧。这就是一个典型的以确定性的代价来消除不确定性的风险的现象,正如同发达的保险业一样。

C++11(及现代C++风格)和快速迭代式开发

过去的一年我在微软亚洲研究院做输入法,我们的产品叫“英库拼音输入法” (下载Beta版),如果你用过“英库词典”(现已更名为必应词典),应该知道“英库”这个名字(实际上我们的核心开发团队也有很大一部分来源于英库团队的老成员)。整个项目是微软亚洲研究院的自然语言处理组、互联网搜索与挖掘组和我们创新工程中心,以及微软中国Office商务软件部(MODC)多组合作的结果。至于我们的输入法有哪些创新的feature,以及这些feature背后的种种有趣故事… 本文暂不讨论。虽然整个过程中我也参与了很多feature的设想和设计,但90%的职责还是开发,所以作为client端的核心开发人员之一,我想跟大家分享这一年来在项目中全面使用C++11以及现代C++风格(Elements of Modern C++ Style)来做开发的种种经验。 我们用的开发环境是VS2010 SP1,该版本已经支持了相当多的C++11的特性:lambda表达式,右值引用,auto类型推导,static_assert,decltype,nullptr,exception_ptr等等。C++曾经饱受“学院派”标签的困扰,不过这个标签着实被贴得挺冤,C++11的新feature没有一个是从学院派角度出发来设计的,以上提到的所有这些feature都在我们的项目中得到了适得其所的运用,并且带来了很大的收益。尤其是lambda表达式。 说起来我跟C++也算是有相当大的缘分,03年还在读本科的时候,第一篇发表在程序员上面的文章就是Boost库的源码剖析,那个时候Boost库在国内还真是相当的阳春白雪,至今已经快十年了,Boost库如今已经是写C++代码不可或缺的库,被誉为“准标准库”,C++的TR1基本就脱胎于Boost的一系列子库,而TR2同样也大量从Boost库中取材。之后有好几年,我在CSDN上的博客几乎纯粹是C++的前沿技术文章,包括从06年就开始写的“C++0x漫谈”系列。(后来写技术文章写得少了,也就把博客从CSDN博客独立了出来,便是现在的mindhacks.cn)。自从独立博客了之后我就没有再写过C++相关的文章(不过仍然一直对C++的发展保持了一定的关注),一方面我喜欢关注前沿的进展,写完了Boost源码剖析系列和C++0x漫谈系列之后我觉得这一波的前沿进展从大方面来说也都写得差不多了,所以不想再费时间。另一方面的原因也是我虽然对C++关注较深,但实践经验却始终绝大多数都是“替代经验”,即从别人那儿看来的,并非自己第一手的。而过去一年来深度参与的英库输入法项目弥补了这个缺憾,所以我就决定重新开始写一点C++11的实践经验。算是对努力一年的项目发布第一版的一个小结。

逃出你的肖申克(五):看不见的牢笼(上)

著名科幻作家阿瑟·克拉克有一句名言(这句话是如此有名以至于被人尊称为“克拉克第一定律”):“如果一位有名望的老科学家告诉你某件事情是可能的,那么他很可能是对的。然而如果他说某件事情是不可能的,那么他极有可能是错的。” 所谓成也萧何败萧何,“知识是一把双刃剑”这个道理在心理学领域其实并不新鲜,《Made To Stick》上面就提到这样一个经典的实验:A心里想一首曲子,然后用打拍子的方式打出来,B听着A的拍子要去猜测A打的实际是哪个曲子。参与者选的是一些非常简单的曲子,如“世上只有妈妈好”(此处根据中国国情稍加演绎)。这个实验的亮点在于,往往A认为“那么简单的曲子”怎么可能听不出来呢?而实际上B听了却就是猜不出来。A对B能否猜中的概率估计,与B实际猜中的概率之间,有一个巨大的落差(A以为50%的人能猜出来,而实际上只有可怜的2.5%)。 原因?因为A心里本来就知道答案(曲子本来就是A定的),所以对于A来说这是“显然”的,但B只听到拍子,对B来说再简单的拍子也并不是“显然”的。关键在于,由于A心里明知答案,就无法去设想不知道答案的B听到那样的拍子时是什么感觉,也就无法真正准确地推测出B猜中的概率了。 实验者把这个现象称为“知识的诅咒”:由于知道某个知识,反而影响了判断。在以上的实验当中,如果A自己并不知道曲子,(曲子是实验者选的,拍子也是实验者打的),那么A就能够体会到B的感觉了。 以上这个例子,只要稍加引申一下,就不难类推到一个日常现象:为什么说大多数时候换位思考只是个陷阱。因为真正的换位思考,意味着你必须知道对方大脑中所有真正影响他决策和行为的因素,这包含太多的东西:对方的价值系统,习惯,观念,道德观,甚至对方那一刻的情绪。一个人的行为由众多因素来决定,其中绝大多数因素常常隐藏在我们根本觉察不到的潜意识层面(《Strangers to Ourselves》),连当事人自己都未必知道其自己行为的真正原因,更不用说要别人还能够真正的“换位”了。不仅如此,你还必须摆脱自己大脑中的价值系统、习惯、观念、道德观、情绪的影响。这两者本身都极其困难,乘起来更是难于登天。所以说现实当中的大多所谓换位思考一不小心就沦为以己度人。 有时候,当事情所涉及到的是人之常情,的确是可以以己度人(因为有些事情大家都差不多),例如说每个人都不希望自己的隐私被侵犯,那么当侵犯别人隐私的时候只要想想自己愿不愿意成为对方就可以了,“己所不欲勿施于人”。但当涉及到的是人与人之间不同的观念的时候,例如价值观,那么就会落入以己度人的陷阱,最典型的例子就是当代家庭中父母对子女的人生规划,往往抱着好心,办着坏事,因为当父母“换位思考”什么是“为子女好”的时候,无法摆脱自己价值观的影响,因为价值观是一个人内心非常强大而又隐蔽的东西,我们很难摆脱自己的价值观而真正从另外一个人的价值观角度去考虑(要是真的能够在内心那么容易地“切换”价值观的话,价值观就不叫价值观了),于是父母将“己所欲”施于“子女”。这里父母们自己的价值观,就仿佛前面那个实验当中被试A心里所想的曲子。因此,原则上不仅己所不欲勿施于人,还要己所欲勿施于人。 如果你对于Critical Thinking有所了解,你应该知道这样一个有名的谬误(Fallacy),叫Affirming the consequent,例如:所有植物都需要水,玫瑰需要水,所以玫瑰是植物。这个逻辑咋听起来非常正确,但却是完全错误的。这是我们的“直觉逻辑”常犯的错误之一,由于所有人脑袋里都知道“玫瑰是植物”这个“知识”是正确的,所以爱屋及乌地也认可了它的“伪前提”(也就是说“结论是对的”意味着“逻辑是对的”)。如果把这里的结论换成错误的,你就摆脱了“知识的诅咒”,例如:所有植物都需要水,人需要水,所以人是植物。 以上只是两个简单的例子,实际上,知识的诅咒只是我们思维的众多牢笼之一。

怎样花两年时间去面试一个人

Joel Spolsky曾经感叹:招聘难,难于上青天(此处笔者稍加演绎:))。他有两个辛辣但不乏洞察力的断言:真正的牛人也许一辈子就投大概4次简历,这些家伙一毕业就被好公司抢走了,并且他们的雇主会给他们不赖的待遇,所以他们也不想挪窝。(刚刚去世的Dennis Ritchie就是这样一个人)而“人才”市场上能找到的大多都不是什么人才。招到这帮人轻则费钱重则把你公司搞挂。 诚然,也许没有哪个行业像IT行业这样,无形资产占据公司的绝大多数资产。拒坊间传言比尔·盖茨就曾经说过类似这样的话:只要允许我带走100个人我可以再造一个微软。这话没搜到原版出处,但是从一个侧面反映了IT公司当中智力资产所占的比例之重。 所以一个自然的推论就是,招聘也许是一个公司决策当中最最重要的一个环节。Joel Spolsky把他在这方面的观察,体会和洞见集结成了一本小册子《Smart and Gets Things Done》,开篇就挑战“产品是公司成败的关键”这个传统观念,他认为创造最适合工程师生活的环境,留下最优秀的人才才是最先最重要的一步,接下来好的产品是水到渠成的事情。国内iapp4me.com创始人郝培强正是这个理念,所以他在微博上说: 我们是小公司,工资开的不高,也不招太多的人,但是电脑都是iMac27,iMac21,Macbook pro15,基本上比很多大公司都好多了。软件没盗版,刚才photoshop的正版我也收了。中午管饭,公司备伞。哈哈。节日假正常放,从不加班,早晨11点上班,下午6点下班。我是有资格说某些大公司的员工苦逼的。 事实上,米国找个人尚且难成这样,搞得Joel还费心费力写本书语重心长地劝企业们要善待好工程师,国内找个人更是难上加难,国内高质量问答社区知乎创始人周源就曾经在知乎上分享他呕心沥血的招人历程,看完真是让人慨叹这年头找个靠谱的人多不容易(这条知乎问答还有很多精彩的跟帖)

知其所以然(三):为什么算法这么难?

广大码农同学们大多都有个共识,认为算法是个硬骨头,很难啃,悲剧的是啃完了还未必有用——除了面试的时候。实际工程中一般都是用现成的模块,一般只需了解算法的目的和时空复杂度即可。 不过话说回来,面试的时候面算法,包括面项目中几乎不大可能用到的算法,其实并不能说是毫无道理的。算法往往是对学习和理解能力的一块试金石,难的都能掌握,往往容易的事情不在话下。志于高者得于中。反之则不成立。另一方面,虽说教科书算法大多数都是那些即便用到也是直接拿模块用的,但不幸的是,我们这群搬砖头的有时候还非得做些发明家的事情:要么是得把算法当白盒加以改进以满足手头的特定需求;要么干脆就是要发明轮子。所以,虽说面试的算法本身未必用得到,但熟悉各种算法的人通常更可能熟悉算法的思想,从而更可能具备这里说的两种能力。 那么,为什么说算法很难呢?这个问题只有两种可能的原因: 算法本身就很难。也就是说,算法这个东西对于人类的大脑来说本身就是个困难的事儿。 讲得太烂。 下面会说明,算法之所以被绝大多数人认为很难,以上两个原因兼具。 我们说算法难的时候,有两种情况:一种是学算法难。第二种是设计算法难。对于前者,大多数人(至少我当年如此)学习算法几乎是在背算法,就跟背菜谱似的(“Cookbook”是深受广大码农喜爱的一类书),然而算法和菜谱的区别在于,算法包含的细节复杂度是菜谱的无数倍,算法的问题描述千变万化,逻辑过程百转千回,往往看得人愁肠百结,而相较之下任何菜谱涉及到的基本元素也就那么些(所以程序员肯定都具有成为好厨师的潜力:D)注意,即便你看了算法的证明,某种程度上还是“背”(为什么这么说,后面会详述)。我自己遇到新算法基本是会看证明的,但是发现没多久还是会忘掉,这是死记硬背的标准症状。如果你也啃过算法书,我相信很大可能性你会有同感:为什么当时明明懂了,但没多久就忘掉了呢?为什么当时明明非常理解其证明,但没过多久想要自己去证明时却发现怎么都没法补上证明中缺失的一环呢?