2015春节

2015 春节
2015 Chinese New Year

爆竹声中一岁除,春风送暖入屠苏。
千门万户曈曈日,总把新桃换旧符。

——王安石的《元日》

除夕夜里,稍稍反思一下2014年经历的投稿。

背景:我们写的软件速度快,功能全。比如在文章中,我们强调该软件可以处理很大规模的数据,这是已知其他软件达不到的。

审稿:除去离题万里的审稿意见以及错误的审稿意见,我们得到的反馈是对自己的软件过分称赞,对有竞争关系的其他软件过分贬低。同时这些意见往往对我们有强烈的负面情绪。

反思:比较软件从某种意义上就像是比较孩子。说自己的孩子好没问题,但要是说自己的孩子比别人的好,就易引起强烈的情绪反扑。即使是数字上的比较(比如身高说自己的孩子高于其他小孩XX厘米),有意见的人也可能会说:身高不是重要的标准,你比较的方式不对等等。这个经历告诉我指出其他人/事在科研上的不足应该非常谨慎。或许寻找“和气”、容易接受的比较方式是有必要的。

2015年我们会继续努力,写有价值的文章,做好科研,也希望能通过温和的方式,得到其他科研同行的肯定。此外,希望看到这里的各位 新春快乐!

转:为学

最近学习和研究有点松懈,转一篇古文激励一下自己。
小时候读这篇文章的时候没什么感受,现在读了就觉得应该立刻干活。

为学一首示子侄
彭端淑

天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。

吾资之昏,不逮人也,吾材之庸,不逮人也;旦旦而学之,久而不怠焉,迄乎成,而亦不知其昏与庸也。吾资之聪,倍人也,吾材之敏,倍人也;屏弃而不用,其与昏与庸无以异也。圣人之道,卒于鲁也传之。然则昏庸聪敏之用,岂有常哉?

蜀之鄙有二僧:其一贫,其一富。贫者语于富者曰:“吾欲之南海,何如?”富者曰:“子何恃而往?”曰:“吾一瓶一钵足矣。”富者曰:“吾数年来欲买舟而下,犹未能也。子何恃而往!”越明年,贫者自南海还,以告富者,富者有惭色。

西蜀之去南海,不知几千里也,僧富者不能至而贫者至焉。人之立志,顾不如蜀鄙之僧哉?是故聪与敏,可恃而不可恃也;自恃其聪与敏而不学者,自败者也。昏与庸,可限而不可限也;不自限其昏与庸,而力学不倦者,自力者也。

选自《白鹤堂文集》,作于乾隆九年(公元1744年)。

对RAII的思考

对RAII的思考

Some random thoughts about RAII

写程序时常常需要申请系统资源,比如打开文件,申请一块内存。申请到这些资源后,在程序退出或者资源使用完毕后,应当正确的释放。如果不能正确释放,会造成一系列问题。比如申请的内存没有释放造成内存泄露Memory Leak,申请的进程锁没有被解锁Unlock,造成进程间的死锁DeadLock。在C++语言里,解决这类资源管理问题的管用手法是RAII (Resource Acuiquistion Is Initialization)

这篇笔记是对RAII的一点思考。

 

1. 什么是RAII

简单来讲,把获取资源的代码放到类的构造函数里,把释放资源的代码放到析构函数里。比如用ofstream file(“output.txt”) 可以打开文件,当file变量不起作用是,文件会被自动关闭。

比如下面这张图(from:The RAII Programming Idiom),看看这里面有多少地方需要写释放资源的代码。如果使用RAII,这些其实地方都不用留代码。

RAII  Example
RAII Example

 

 

2. RAII的优缺点

RAII的好处是利用C++语言优势安全、正确的管理资源。同时RAII是C++建议的资源获取方式,这种代码可以被广大C++用户理解。

不方便之处是,使用RAII有一些陷阱。比如不要用RAII一次获取多个资源。

 

3.为什么C++有RAII

C++语言保证了一个类构造之后,析构函数会被自动调用。这个使用方式与资源管理的方式相似。因此可以用类的生命周期来管理资源。

 

4. 为什么C/Java/Python没有RAII

C语言没有原生的构造和析构函数,获取的资源不能有任何自动机制来释放。

Java/Python有语言中的支持,即Dispose Pattern。举例来说就是 try…catch..finally语句。使用者只要把释放资源的语句写到finally,资源就会被释放。

 

4. RAII 和Exception的关系

RAII和Exception紧密相关,更确切的说,构造函数和异常这两个特性在某种程度上互相依赖。

对于构造函数来说(获取资源的语句在构造函数里),构造函数没有返回值,因此想知道资源是否成功获取是不能从函数返回值来判断的,唯一可以用的手法是在资源获取失败时抛出异常。也就是说构造函数需要使用异常。

另一方面,使用异常之后,需要用构造函数来管理资源。因为异常抛出以后,很可能处理异常的代码和异常发生的代码不在一个层次(异常在Call Stack上逐层向上)。为了实现异常安全(Exception Safe),应该使用构造函数(另一个选择是智能指针,但智能指针有智能指针的问题,详见C++FAQ的讨论)。

对已有的C++代码来说,实现或检查代码是不是异常安全不是一个的简单人物。这种情况下,异常这个特性往往会被禁用(比如Google C++ style guide)。如果异常被禁用了,我们就没法从构造函数本身获知资源是否成功获取,那是不是说我们没法使用RAII特性呢?

答案是否定的。我们可以在获取资源后,用其他的类函数来检查资源获取是否成功。比如ostream::is_open()就可以检查文件是否被正常打开。

 

5. 怎么绕开RAII

在C等不提供RAII支持的语言里,可以直接绕开RAII,即保证获取资源后,程序的每一个出口都有释放资源的语句。

这种方法有可能造成多处重复的资源释放代码,或者使用goto语句把所有程序跳转到一处资源释放代码。

 

6. 实践中怎么用RAII

实践中除了把资源获取的语句写到构造函数,把资源释放的语句写到析构函数,还应当注意:

1)获取多个资源时,可以写在多个类的构造函数里,使得每一个类的构造函数对应一个资源。这样在任何资源获取失败时,已经获得的资源会得到释放

2)有时候获取资源失败等于程序失败(Fatal Condition),这种情况下可以直接退出(exit),把清理资源的任务留给操作系统。

 

如何做Research (Research Principles Revealed)

如何做Research

Research Principles Revealed

 

看了Jennifer Widom research_principles 的幻灯,觉得有些方面值得学习。

1. 同事和合作者

交流思想,互相启发,优势互补。比如Jennifer 擅长Details,而合作者Stefano注重Intuition。

2. 注重框架里的假设

学习知识的时候有不同的层次。一般来讲是从抽象到具体,比如一个领域的知识分划到不同的章节,每个章节讲具体的知识细节。

这就需要仔细品味每个章节的特点和章节之间的异同。

对于做研究来讲,更重要的是知识的假设。特别是这些假设不成立的时候,如何发展或变通现有的理论,这样或许能做出新的研究。

 

(转) 思维的特点和缺陷

转载一篇有意思的文章。这篇文章写于2010,修改过4次,这没准说明好文章是改出来的?

关于不了解的领域,兼谈Critical Thinking

 

思维的特点和缺陷

人类总是喜欢歌颂自己的大脑,比如:思想的威力,逻辑的威力,数学的威力(数学来自于思考),科学的威力(科学来源于思考),还有“意识”这个“人类与动物最大的区别”[i]……blah blah……不过,几乎没有人关心过这种想法究竟来自于人体的哪个器官。

心理学中有一个研究偏见的试验是这样设计的,向随机抽样的一群人发放问卷,询问他们两个问题:1、你身边有偏见的人占多大比例;2、你自己有没有偏见,是否严重。结果,远超半数的人回答得非常一致:1、身边绝大多数人有严重偏见;2、我自己没有任何偏见。

人类的大脑就是如此:一生都在不停地犯各式各样的错误,同时还对本身保持一个较高水平的评价。之所以犯错误,是由人类的大脑运作方式决定的,这几乎是无法避免的。比如人类有一种本能化思维方式:类比[ii]——也就是说,习惯于将自己先前总结出来的规律,施加在未知但看起来相似的事物上,而不事先考虑同样的规律是不是起作用,同样,大脑也不去辨别这两种情形是不是真的“相似”。这其中的“道理”大约是这样的:“卷心菜的味道不错,圆生菜和卷心菜长得差不多,那么圆生菜的味道应该也差不多?”举个程序员们喜闻乐见的例子:你在emacs里按Ctrl-X,C按得挺熟练觉得很爽,于是到了gedit和notepad里八成也会试试看灵光与否,或者到win32 cmd下敲find -exec/xargs,或者到LISP里写visitor,或者到Python里写GetSubString(index1, index2, step)函数……在这方面,成年人和婴儿的区别仅在于知识库中积累的数据不一样多而已(所以成年人才不再去尝试已消化过的食物的味道[iii])。在用类比去探索时,我们不认为这有什么不对,但是在已经探索过的人群看来,这非常可笑并且没有必要。

试错法也是人类重要的思维方式[iv]。其中的“道理”大约是:“我不知道是不是行得通,但是做错了代价也不大,所以我想试试看”。低幼儿童会用剪刀去剪房间里的所有物体,其实也是一种试错。前面举的emacs的例子,也可以说是在试错。面对重要的东西,我们往往不会去试错[v],但问题在于每个人对于“重要与否”的评估存在着差异,导致对待同一个事物,某人觉得不重要,可以试错;但另外一个人就会对这种试错非常反感,甚至愤怒。

通常来说,在面对未知事物的时候,我们的第一印象往往是错误的,但我们会(自以为是地)认为自己是正确的。随着对事物的更多了解,每一时刻我们都会(不自觉地)修正自己对事物的看法,但每一次我们都会认为自己完全了解该事物了,认为自己达到终极正确了,同时也会忽略自己刚刚还在犯错误这一事实。这其中的“道理”大约是这样的:“我已经修正了足够多的错误了,那么这里面就不会再有大问题了吧?”在软件开发中,程序员面对BUG也经常如此。心理学中的名词“面试者错觉”(interview illusion)就是在总结这样的一种现象,因为在企业面试的时候,这种现象最显著。

归因错误(更确切地:fundamental attribution error)也是人类易犯的思维错误。其典型特征是:将好的结果归功于自己,将坏的结果归罪于别人。比如:约会迟到,那是因为堵车太厉害;如果准时到达,那是因为自己是一个讲信誉的人,故而“能够有计划地处理一切意外情况从而做到守时”。类似地还有:如果自己不守交通法(比如在“白实线”并线),那是因为有急事需要赶路;如果看到别人同样地行为,则是认为对方是一个“没有素质的人”。再回来头说软件公司的例子:处在组织中任何位置的人,包括CEO、VP、PM、Lead、QA & developer,也都会犯这种错误:一旦出了问题,大官儿会将问题推给小官儿,小官儿推给程序员,程序员推给外部条件,比如语言有缺陷,OS不稳定,SDK出BUG,Partner还延期……等等等等。如果最后成功了,程序员则会说“其实都是我们干的活儿”,CEO会说“那是因为我领导有方”,中层managers会说“CEO什么实际事情都不管,程序员们全都太懒,都是(因为)我们这些最难做人的中层经理们在不停地push”……

人类的趋利避害本能,导致思维模式中不可避免地会有将“必要条件”当“充分条件”的现象,比如放置很久的食物并不一定都腐败变质了,但我们都会选择扔掉。更进一步地,我们会将既不充分也不必要的条件也当作充分条件。比如我们在黑夜里会异常小心,虽然“黑夜”与“犯罪”既不充分也不必要;或者,看到别人手中拿着刀子,首先想到的是“不要伤害到我”。其实动物们也何尝不是如此。如果羚羊会说话,它大概会这样告诉你:“这里闻起来有狮子的味道,我不确定这里是不是有狮子,但是喝过水之后赶紧跑掉总没有坏处。”为什么不会有严格按逻辑推理行动的羚羊呢?比如一只这样思考的羚羊:“这里闻起来有狮子的味道,但这有可能是已经走开的狮子留下的;‘有狮子的味道’仅仅是‘有狮子’的必要条件,并不充分(甚至可能不必要),如果看到狮子了(充分条件),那我就会逃跑,否则我就待在河边喝水……”由于进化方向的随机性,究竟有没有这样的羚羊我们无法判断[vi],但是我们观察到现在的世界上并没有这样的羚羊。我们可以认为:即使曾经有过这样讲逻辑的羚羊,它们也已经灭绝了,因为比起“正常”的羚羊来,这种羚羊没有生存优势。对于羚羊的正确选择是:不严格遵守逻辑,按照“未来预期最大化”和“未来风险最小化”的原则行事。这是一种合理且最优的生存策略,是一种rational choice in an uncertain world(感谢Pongba提供)。在自然选择中生存下来的我们人类,也是同样:严格的逻辑思维不可能是天生的,只能依靠后天的训练。

类似这样的例子还可以举出很多很多……所有的这些本能地、习惯成自然的思维方式(包括但不限于刚刚提及的),会导致这样一种(显而易见的)结果:我们在面对不了解的领域的时候,往往会出现认知上的偏差(以上的说理并不充分。如果有人不认同我也很正常。我也无法做到充分说理,因为我的这一份大脑无法真正说服别人的那一份大脑,除非两者在思想和认识上已经有一定的共同基础)。这些认识上的偏差会导致很多问题。将这些偏差列举出一些来,也正是我写此文的目的。

不要盲目质疑权威[vii]
可能是大家过去都被无良的“权威”欺骗了很多年吧(在某些方面还被欺骗着)。在当今的年代,质疑权威变成了一种时尚(比如屡有民科的种种质疑见诸报端)。但对于懂得如何求知的人,有一条原则还是一直没有变化的:在发表与主流相反的观点前,要多作调查和思考。不要凭自己的直觉去胡乱质疑[viii]。因为在“绝大多数情况下,你都不太可能是遇该问题的幸运第一人”。如果仅凭直觉去质疑,往往会闹出笑话。甚至伟大如爱因斯坦者,在他做出过巨大成就的物理学上,曾经靠直觉指导学术研究,高举反对量子物理的大旗,但还是被无情地击败(Aspect experiment),被后人作为了反面典型,甚至有人笑称: “如果爱因斯坦自191x年开始以钓鱼为业度过余生,对科学界也没有任何损失”。[ix]

再举几个例子。比如,下面的这个科学事实[x],它和多数(未受正确汽车安全教育的)人的直觉相违悖:

a)仅使用安全气囊而不系安全带,会增加死亡和受伤的可能性。

b)安全气囊仅在与安全带一起使用时才能最大程度地挽救生命。

c)安全气囊对儿童有致命的伤害作用。

参考资料:安全带能将乘员的头部伤害减少6成,安全带+安全气囊一起能减少8成(数据来源:NHTSA)。同时,安全气囊造成儿童死亡率上升35%(数据来源:IIHS)。

又比如:近视的遗传率为90%(标准的说法为0.9)。也就是说,一个人到底近视与否,在90%的程度上是由他的父母的基因决定的。

再比如,我们平时“尝”到的各种味道,除掉有限的五种味道之外[xi],其它的都是由鼻子“闻”到而不是舌头“尝”到的。这五种舌头可以感受的味道为:酸、甜、苦、咸、鲜(一部分的上腭也可以识别这些味道)。除此之外,其它的味道都是被鼻子“闻”到的(蒸发后的唾液携带着少量食物分子进入鼻腔从而被闻到)。吃芥末的感受会让人真实体会到这一过程。

还比如,我们直觉上认为大部分为黑色的屏幕会省电,而且传统的CRT屏幕也是这样的。但是对于新型的LCD显示器,屏幕颜色对于省电则变得基本上无关紧要,因为LCD是靠背光照明,无论屏幕颜色是黑是白,它的背光是一直全开的。如果想要追究起来,白色屏幕比黑色屏幕会更省电,因为黑色屏幕是要通过电压驱动液晶分子才能得到的,而白色屏幕是未驱动时的“本来面目”(仅对TN而言的;IPS/OLED则是黑色省电)。想要让LCD显示器省电,关闭它才是王道(手动关闭/自动超时关闭)。

对于权威,不是不能质疑,事实上,许多开创性的理论都是经过质疑权威而发明的。质疑应该通过批判性思维产生,其基础则是知识和实验。关于批判性思维在这里不讲太多,请参考托马斯·杰斐逊编写的学生誓言:我保证使用我的批评才能。我保证发展我的独立思想。我保证接受教育,从而使自己能够自作判断(卡尔·萨根:http://www.cnread.net/cnread1/kpzp/s/sagen/mgcm/025.htm)。

不要放大局部经验
“不要将局部经验(或经历)当成普遍事实”。单讲这一句话不会有太多的人反对,但具体到了某件事情上,这种思维缺陷就容易出现了。每个人都有自己特定的经历,大脑会将这些经历总结归纳成经验和规律,并且不自觉地用它当成金科玉律去衡量接触到的新事物[xii]。对于我们的大脑来说,新事物都是不那么可信的——至少不如自己的经验可信。如果新事物和自己的已有经验冲突,多半我们是要去怀疑它。在怀疑的过程中,因为有了“一票否决/证伪”这样一个逻辑利器,我们的大脑更倾向于相信自己的旧有经验。举个鲜活一点的例子:一个朋友生了小孩后,经常和她的婆婆(来自某省落后的乡村)发生冲突,而冲突的内容几乎都是在育儿方法上。比如有一次,婆婆坚持要给孩子的屁股上擦香油,说如果不这样做的话,长大之后会“屙不净屎”。我想多数人看到这里会觉得比较有趣,也不会认为婆婆的这种“经验”是正确的。但从婆婆的角度来看,这是她大半辈子攒下来的经验,是她的长辈和亲朋代代相传、奉为圭皋的经验,也是她在儿子身上“试验”成功的经验。而媳妇采用的育儿方式是新事物,那是她不愿意去相信和接受的东西。婆婆的“逻辑”大约是这样的:“你说你那方法科学,那怎么还有生出来就活不了的?你说我的方法不科学,我不还是把我儿子养活这么大了?”[xiii]

回到程序员的问题上,这种应用局部经验的情形也不少。比如:“我上次这样试验过,行不通的”,或者“我这样编译过,没问题的”。“行不通”是因为什么行不通?是方法有错还是环境在干扰[xiv]?“编译过没问题”,是表面上没问题还是真的没问题,是编译器的特性还是标准中的规定[xv]?

个人经验和科学理论的冲突是不可避免的,关于如何处理这种冲突,可以按科学界通用的证据原则去处理。并且,证据原则中有如下一些证据强弱的判断式:双盲>单盲,盲法>不盲,试验>观察,随机试验>非随机试验,对照实验>无对照实验,前瞻性观察>回顾性观察,系统性观察>非系统性观察( 个案系列、个案、经验),“个案系列”>个案,专业人员观察>非专业人员观察(上面这段话是引用的,从笔记里Ctrl-Y的,出处忘了)。

不要捍卫一知半解
我们都不必要、也不可能在所有领域内都做到深入了解,像“全才”一类的称呼离现在这个社会越来越遥远了(毕竟早已不是达芬奇所处的年代了)。不管你了解多少个领域,在一个领域上了解得有多深入,都不可能覆盖到所有的知识领域。所以,出现对某个领域一知半解的情况,是一个很正常的事情。比如程序员们都懂一点颜色的表示法——如何用RGB值组成颜色(做过视频处理的人估计还懂ycrcb)。但是如果用Chromatology的高度去要求,估计没有几个人能够合格了(比如D65光源的意义……)。

或者用生活中的例子:一般人都会使用相机,在不少论坛里还能碰上许多“摄影爱好者”或者职业摄影师。但你要是搬出《大不列颠摄影教程》跟他探讨镜头的像场性质(场曲、边缘解像等)、慧差、球差、色差(两种)等性质,那么多数人都会变哑巴[xvi]。

或者另一个例子:几年前,在LCD显示器刚刚开始普及时,很多人都在谈论面板的反应时间,厂商也在想方设法提高该指标,但是有多少人知道反应时间是如何定义的?真正的响应是不是按标注的反应时间?(http://www.tomshardware.com/cn/953,review-953-5.html)

再举一个例子,在中国有不少人会开车,在有些国家多数人都会开车。但是如果你去讨论“主减速比”、“传动比”和“刹车点”、“走线”、“换档时机”,估计多数人会感到难以理解,只有少数竞速爱好者会喜欢这样的话题。但他们也只是比普通人多知道了那么一点儿点儿,比如多数竞速爱好者对于自动变速箱中的“锁止离合器”都没有任何概念。(再比如:铝合金副车架的晶间腐蚀)

多数人对自己存在的不足,在内心深处是能够感觉到的。如果自己能够坦然面对,一般也不会有人嘲笑你(以下情况暂且不计:1、懂得太少又想冒充高手;2、遇到有人格缺陷的高手)。但是这里面有一个“面子”问题,一个人“丢了面子”就想要“找回来”。所以才会发生这样的事情:如果一个人感觉到自己在知识上被打败了,那么他就会设法从其它方面“找回面子”(往往是用诡辩)。比如,如果你和一个纯C语言的“高手”讨论OO,那么他多半会用OO的缺陷和误用来反驳,或者用OO语言中的缺陷来反驳(如执行速度太慢,或语言太复杂,以致于“为了避免复杂性也要用C”,嘻嘻),以此方式来掩饰他在OO上的不足。或者当你去和一个汇编高手讨论LISP语言的威力,那么他多半会用执行速度来避开讨论的中心,或者用“本质上来讲都是图灵机(或者本质上都不是图灵机——因为内存不是无限)”来试图抹杀差异。

(多说一句:“从本质上来说都是……”这种red herring非常好用,诱惑性极强,一个想要理性辩论的人需要努力抵制这种诱惑,like what Gabriel Gray(Syler) did。我曾见过一个用“本质论”的高手,唉……)

一知半解不可怕,可怕的是“捍卫一知半解”(特别地:当一个人在一个小圈子里是“话语领袖”的时候)。作为理性的求知者,要平稳自己的心态,摆正自己的位置,别去计较一时言语上的得失,或者说:“不要太小心眼儿”

不要扩展专家地位
学问讲究深入,市场讲究niche,所以才有刚刚说的“不要捍卫一知半解”。同样的,这一条要说的也是类似的观点,只不过是从另外的一个角度去谈。

在某一领域是专家,换了领域之后多数情况就是白丁,在这种情况下,千万不要把自己还视作专家。例如:北京师范大学教授刘里远,先后就读于儿科专业、生理专业、运动生理专业、生理专业。曾做过三年临床内科医生。这样的“专家”,在周老虎案件中的“专家地位”,就完全可以无视。

人云亦云不是事实
有强烈好奇心的人是少数,几乎没有好奇心的人也是少数。多数人对于自己了不解的领域还是有一部分求知欲望的。即使少数没什么求知欲望的,也会被各种宣传手段强行灌输某些方面的“知识”。对不了解的领域,这些“知识”的积累可能来自于口口相传,可能来自于学校和培训,可能来自于广播电视报纸网站等各种媒体,甚至可能来自于传销、推销人员的灌输。事实上,经过这些传播途径,有许多错误的说法广为流传,正所谓“谎言重复一千遍就是真理”(http://en.wikipedia.org/wiki/Joseph_Goebbels)。我想每个敬业的人,对于自己的专业都会有较深程度的了解,但是毕竟社会分工太过细化,大部分人的知识仅限于自己了解的领域,对不了解的领域,往往不会随时以严谨地态度去审视,而是很容易地就去接受。一不小心,我们就会“中招”,成为错误说法的信徒和奴隶,并将其发扬和传播到更多的人。

比如“微波炉会破坏掉80%的营养”的说法。如果我们了解一点点关于人体的知识,明白人究竟需要什么样的营养,或者说什么才叫“营养”,这种伪科学的说法就不攻自破了[xvii][xviii]。(人类所需的营养,主要是醣,蛋白,脂肪,这三者的比例相加接近100%。剩下的一点点比例是少量的维生素和微量的矿物质)

再比如“肯德鸡没有营养”的说法,也是常见的一种以讹传讹。即使不按照前面的分析法,用常理去推断也能搞明白——肯德鸡的食物是由以下的原料制成的:小麦、牛肉、鸡肉、蔬菜、土豆、玉米、青豆、鸡蛋黄、色拉油、黄瓜、腌制蔬菜、胡萝卜、奶油、巧克力、可乐(主要是水,还有少量的糖)、固体橙汁和咖啡饮料等。如果有人说馒头夹鸡腿“没营养”,我想肯定有人会想“用大嘴巴抽丫儿的”。但如果说汉堡“没营养”,为什么许多人就相信了呢?

这类的例子还有很多,比如国内对“亚健康”的概念的炒作,还有国内多年来对狂犬病的恶意误导(http://www.who.int/mediacentre/factsheets/fs099/en/index.html)……

回到编程的方面,也有不少的例子。比如:熟悉stack的人不了解continuation,熟悉heap的人不了解GC,熟悉过程式编程的人不了解declarative,熟悉OO的人不了解函数式编程,熟悉CreateThread的人不了解pthread_create,熟悉visitor的人不了解multimethod,熟悉observer的不了解:after,熟悉ON_PAINT的人不了解signal/slot,熟悉QBoxLayout的人不了解wxBoxSizer……不了解该领域的人所发表的“高论”,对于熟悉的人来说,往往会觉得很傻很天真。如果缺乏涵养,难免会冷嘲热讽,导致对方敌意地反唇相讥,最终发展成一场面子战争。

那么,如何区分某种广为流传的说法是不是真实可信的?其实很简单,还是用批判性的思维去审核,多查资料,多做功课。“不寻常的见解需要不寻常的证据”(e.g. 毒品成瘾和越战士兵的研究)。如果一个(骇人听闻的)说法在流传,要先去检验一下它有没有证据。如果没有证据,姑且当笑话听好了。如果有证据,要求证一下是不是可重复的(被其它机构独立做出相同的实验结果),再去查阅相关的批判,从中了解到更多情况,多思考,最后再得出自己的结论。(如果自己的结论与主流学术界背道而驰,那么要多加小心,因为主流学术界犯错误的概率,远小于我们作为一个门外汉而犯错误的概率)

P.S. 相比一般的科学实验,计算机“科学”方面的实验做起来就容易多了,所以我们其实可以自己动手检验广为流传的许许多多的观点(比如JAVA VM的效率之类的。http://shootout.alioth.debian.org/)

想象猜测不是事实
对于不了解的领域,我们的大脑也不会停止想象和猜测,想象和猜测不是坏事,许多发明就是这么来的。只不过如果仅仅想象和猜测,但不做功课,那就是臆测了。常见的形式有:“人家专业XX师都是……样子的”或者“这所以做出XXXX事情,肯定是因为……”,再或者“之所以数据显示是这样子,是因为……”[xix]。这样的判断,离开了数据的支持,只能说是一句空话,没有任何意义[xx]。

比如在TopLanguage讨论组(http://groups.google.com/group/pongba/),前几天就发生了某些人对摄影师和闯红灯者的判断失误。在这里并不是要指责曾经判断失误的人,只是用来说明:人的大脑一不小心就会犯错(我的大脑也是一样。所以我才去不停地求证,一切靠统计数据——可信的数据)。

又比如:关于“将头伸出车窗,在某些情况下会导致受伤”这个判断,大家基本上会认同。但究竟是什么原因导致受伤?此时的想象和臆测就不管用了,需要数字来说话。但作为人类,我们当然不可能选择随机双盲法去做试验(同样,也不可能用大量婴儿去做“三鹿氰胺”的毒理/病理实验),所以只能看统计数字并加以归纳。虽然我们通常会认为:将头伸出车窗后,被其它车辆撞击/被树枝广告牌刮伤的可能性是最大的,但是对常这样做的宠物狗的统计结果表明,因飞行物和飞溅物撞击的受伤比例其实最高。同时,电动车窗受伤的报告数字也在警示人们,这种看似不起眼的危险其实发生的比率也很高(不仅仅儿童,许多成年人也是电动窗的受害者)。

再举一个例子(这个例子离多数人的生活有点远,但它正好是我的兴趣爱好。在这种情况下拿出来用于佐证应该也算是合适的):有一种格斗比赛叫做综合格斗(MMA),这种格斗的规则相当开放(它继承自古罗马斗兽场的精神):允许脚踢、膝撞、拳打、肘击,允许各种摔法,允许使用各种关节技(中国俗称擒拿),允许使用各种绞技(勒脖子令对方窒息),并且,即使一方已被打倒在地也不会中断比赛,而是允许另一方的选手用脚踩、足球踢(将对方脑袋当球踢)、或者骑在身上用拳打头或者用膝撞头[xxi](不要与WWE混淆,WWE仅仅是有剧本的表演)……单单听我描述,可能你会认为这种比赛相当残忍,而且伤亡率会相当地高。但是根据统计数字,伤亡率上来讲,看似残忍的综合格斗远比足球、橄榄球等运动要安全。

如果想要避免(或修正)错误的想象和猜测,有一个好办法:批判性地思考,同时一定要多看实验数字[xxii]。

不要预设他人的未知
一个人可能不了解某个领域,但这不代表其他人也不了解。或者,一个人仅仅对某个领域有浅层次的认识,但这并不代表别人也是一样(别人可能在此领域浸淫多年)。所以,不要将自己的未知等同于别人的未知,更不要因此就(甚至故意地)说问题是“不可知”的。举个典型例子:堆积大量的术语和名词,用来说明“这个不是你我能够明白的”,甚至说“不是xx研究能够解决的”……

到底应该如何去做?
简短总结一下:对不了解的领域,要多思考再发言。思考形式应该是critical thinking,要基于对知识的掌握,基于实验和数字。不要自以为是,不要凭空思考,不要随便下结论。

P.S. 讲起道理来谁都会讲,做起来却很难不犯错。所以我们要随时自醒。引用一句话:魔鬼在细节中。

附:不成立的证明
必要条件不可证明

这个道理很明白,但中国人却容易在这方面犯糊涂,导致这方面大大小小的例子很多:

1)钢产量高是工业发达的标致,所以我们必须要大炼钢铁,赶超英美。

2)奥林匹克奖牌多是体育发达的标志,所以我们必须要多拿奖牌,赶超俄美。

3)通过了ISO 9000认证表明工作流程是标准化的,所以我们必须要努力通过ISO 9000。

4)用C++/Java编写的优良软件中常常会出现模式,所以我们必须要努力使用模式。

5)CMM认证体现出……所以我们必须要……

有的时候,这种联系并不都是“必要条件”,而仅仅是相关。但即使相关度为1的,也有不必要也不充分的情况(比如相关的这两个项目都由共同的某个原因所决定。二者都是结果,互相之间无因果关系)。举个例子:有些人会用这样的“逻辑”来论证:“在长安俱乐部有年卡的律师,应该都是名律师吧……”

如果必要条件被当成充分条件来反驳,那就更是一笔糊涂帐了,虽然表面上看起来“还挺有道理“的。例如:

论坛ID_A:只有找出良好的抽象,才能做好软件。

论坛ID_B:放屁!傻B!谁告诉你只要找出抽象就能做好软件了?你雇一堆白痴程序员加一个白痴经理试试?

(关键字提示:“只要……就”和“只有……才”)

问题实验不可证明

理论需要实验来证明。但如果实验有问题,那这种理论的可信度就要受到怀疑了。

许多人可能都听说过“可乐杀精”、“中(成)药能杀病毒”,并且将这些说法广为传播。其实,“可乐杀精”和“中药杀病毒”的试验是这样做的:1、将精液置入试管,然后倒入可乐,静置几小时,然后观察到的结果表明活动精子的数量减少了。2、将病毒培养液置入试管,然后倒入中药制剂,过若干时间后观察到病毒有大批死亡。

对科学试验方法有些了解的人,看到这里就会明白这种试验是多么地靠不住。对于不了解科学实验的基本原则的人,我这里多说两句:这些试验没有进行对比,从而导致了错误的归因和解释(应该随机双盲)。试想:如果倒入的不是可乐、中药,而是白开水、食盐、吊白块、漂白粉,或者什么都不放,会有什么结果?实际上,精子的活性离体并不长久,而且需要弱碱环境(可乐为酸性),而病毒在离体后特别容易灭活(作过病毒培养的人都知道对培养基和温湿度的严格要求)。真正的原因,在没有做对比试验的时候会藏匿起来很难发现。如果有了对比实验,为了解释实验结果,就不得不去寻找真*相[xxiii],从而也就减少了犯错误的可能性(比如这样的对比试验:培养皿中未加入任何中药制剂,只是在桌上放了2小时,然后病毒也大量灭活了)。当然,如果没有对比的试验是故意设计的,那就是另外一回事了。

这方面的例子还有很多,随便找几个:

例子1:在一个汽车论坛中有人这样来证明“开空调影响刹车”:车辆静止怠速,将刹车踏板踩下,然后打开空调,发现踏板变软了,由此证明:开空调会影响刹车。

(刹车一般采用真空助力泵,长时间踩下刹车踏板,会漏气而导致“变软”。所以开不开空调,长时间踩刹车踏板都会“变软”)

例子2:有人说,可乐是酸性的,会导致骨髂中的钙质大量流失。实验设计如下:用酸液去浸泡人的骨骼标本,经过一段时间后发现骨头变软而且有很大的弹性,再进行光谱分析,发现里面的钙质已经大量减少。

(可乐是喝到消化道里的,不可能直接接触骨骼。人的胃中有大量的胃液,其主要成分是盐酸,盐酸比可乐的酸性和腐蚀性要强多了,可以直接融化钢铁)

例子3:《郑玉巧育儿经(婴儿卷)》。其中有一节“新生儿有感情吗”中提到这样的一个案例(第92页):

“医学上有这样一个例子,非常令人吃惊:一个刚刚出生的女婴,无论如何也不吃妈妈的奶,却吃其他产妇的奶。经过多次试验,仍然如此,这使医护人员大惑不解。经过仔细调查,医护人员了解到,这位新生妈妈在怀孕初期,就极力想把胎儿打掉,直到分娩前,还很不情愿接受这个孩子。没想到,孩子出生后竟拒绝吃妈妈的奶!她宁愿吃别的妈妈的奶。如果胎儿不能领会母爱,这一切又怎样解释呢?”(本例引用自XYS网友文章,未考证与原书文字是否精确一致)

(错误的归因。这种错误很可能是由于作者的预设立场而产生的)

题外话:这样的实验,对于没有批判性思维的人,具有相当大的蒙骗性。人们习惯于接受错误的解释,这也正是宗教生存的土壤。

[i] 动物试验表明人类的近亲黑猩猩,以及善于群交的矮黑猩猩都有意识
[ii] 实验表明动物也是经常运用类比法去探索

[iii] 异食癖的不计在内,中医信奉者服用“人中黄”的也暂且不算

[iv] 在中国老一辈的程序员中,用试错法去学习知识、去编程的,也是在有人在

[v] 凡事有例外,年纪稍大的可以回想一下著名的“摸着石头过河”——10亿人的试错

[vi] 同理也无法判断是不是会进化出一只“喜羊羊”和“灰太狼”来

[vii] 同样,也不要盲目相信权威。

[viii] 所谓主流,就是说不包括中国国内的学术界

[ix] 有人说我这样写是贬低爱因斯坦。其实我写的这些都是真实情况,只不过有人习惯于将伟大的人的方方面面都搞成金光闪闪的,见不得别人批评,更有甚者不了解情况就妄下结论。其实爱因斯坦对自己的每次论战失败也都是承认的,只不过他总不服输,他从直觉上认为“老头子不掷骰子”,“一种内在的声音告诉我它并不是真实的”,认为量子物理一定在某个基础的东西上错了。爱因斯坦终其半生之力,也没有战胜量子物理,在死后还被阿斯派克特实验证明是错的(“实在性”和“定域性”只能二选一。无论如何选,爱因斯坦都是错的,因为他认为世界既是定域的,又是实在的)。许多人认为“爱因斯坦对量子物理的批评促进了量子物理的发展”,我想,理智的人都会承认这一点,但这也掩盖不了如下的事实:爱因斯坦在量子物理上犯了错误,而且一错就是几十年。如果按顺序排列的话,也应该先说爱因斯坦错了,然后再说他的错误其实也是“有一定的积极作用”的。(听着咋那么像中学历史课本评价农民起义泥?)爱因斯坦的朋友,和爱因斯坦同时代的科学家保罗·埃伦费斯特可以批评爱因斯坦的顽固,当面对着爱因斯坦宣称要以爱因斯坦为耻,因为爱因斯坦表现得像“早年容忍不了相对论的那些人”,当时埃伦费斯特手中还没有任何证据据明爱因斯坦是错的,我们这些握有可信证据的后人,难道就不能批评爱因斯坦了么?

[x]之所以称其为科学事实,说明它可检验,可解释,可预测

[xi]很多年前认为是四种,所有较早的书中也说是四种,如《裸女》

[xii] 如果这种“金科玉律”已经被一个群体所广泛接受,那么它看起来就“更接近于真理”,如朝鲜,柬埔寨,1984……,还有这一篇报道:http://www.gmw.cn/content/2007-05/14/content_605779.htm

[xiii] 现代医学将发达国家的平均寿命提高到了70多岁,而在此之前,这些国家的平均寿命均没有超过40岁。其中,现代医学对婴儿存活率的提高是非常显著的。如果想要检验,可以试着去找一些50岁以上的人,问问他们的兄弟姐妹夭折过多少。或者参考以下数据:中国在2007年婴儿死亡率(IMR)为15.3人/一千人,(这相当于美国1960年的水平,美国在2002年婴儿死亡率为7.0人/一千人)。与最早有记录的数据比较一下:在1915年的美国,婴儿死亡率为99.9人/一千人;中国的婴儿死亡率在1958年为80.8/一千人,也就是说,当时有将近十二分之一的婴儿是活不下来的(在1948年,则有五分之一婴儿会死掉)

[xiv]编译器BUG,OS出错,内存刷新失败,宇宙射线……

[xv] 比如嵌套类的访问权限和friend声明

[xvi] 有些人会倾向于将“职业”看成更“懂行”、更“专业”。其实这二者没什么必然的决定关系,而且在很多行业均是如此。其实,职业只代表以此为业,能达到职业最低标准即可。懂得多少则在于个人修为。

[xvii]不是所有的非科学都是伪科学,但是如果它明明不是科学,还非要宣称自己的科学的,这样它才算成是伪科学

[xviii] 即使对食物中的微量营养进行检测,用微波炉烹调也是有益无害。比如《美国食品科学》中记录了这样的实验结果:微波炉烹饪方法比传统烹饪方法维生素C损耗减少20%,维生素B1损耗减少40%。中国食品卫生监督部门以前也作过类似的检测分析,卷心菜经微波炉烹饪,维生素C的损耗率为4.76%,而传统烹饪方法导致的损耗率却为19.04%。另外,食品中矿物质、氨基酸的存有率也比其他烹饪方法高得多。如用微波炉烹饪蹄膀,八种必需氨基酸为微波加热前的98.6%

[xix]在国内的汽车论坛,我差不多是最早推广宣传IIHS的统计报告的。当时有很多人看到我列出的数据后感到不爽(因为他们喜欢的车型的伤亡率很高,他们批判的车型的伤亡率却很低),于是他们就找出各种理由批判。在这些种理由中,没有一个站得住脚的,比如说“伤亡高是因为保有量大”,其实原始数字就是折合的百万辆车的伤亡率,或者说“某些车型的伤亡率高是因为旧款多”,其实原始数据已经标明了生产年份……IIHS是一个比较严谨的机构,早就考虑了种种情况,将数据梳理到合理才发表的,而且发表的文件中也有注明。这些人很可能是没有仔细看数据,就凭着自己的喜好开始了想象与猜测,所以才会犯下如此多的低级错误(刚才最后这一句话也是我想象的,嘻嘻)

[xx] 如果不依靠数据的话,甚至许多专业领域内浸淫多年的资深人士,对事情的判断也常常会出错

[xxi]网上某些所谓“铁笼中的黑市拳”的照片,其实就是来自于一个叫UFC的综合格斗赛事

[xxii] 要警惕玩弄数字的诡辩者

[xxiii] 我知道“真*相”二字在国内大多数可“自由发言”的地方是屏蔽的,所以要用间隔符号。

写作Teaching Statement和Research Statement

Writing Teaching Statement and Research Statement

申请了一些学校的职位,除了Cover Letter和CV,最主要的材料就是Teaching Statement和Research Statement。

写作之前,之中,之后,最好看看优秀的写作范例。我收集了一些如下:

Teaching and Research Statements

 

Teaching Statement (Vanderbilt) – including bullet points to help you outline writing.

 

Teaching Statement (from Science) – another perspective

Teaching Statement – Good example

 

Teaching Statement – Good example 2 (from a MIT grad)

Teaching Statement – From Princeton

 

下面是关于Research Statement。做过一些Research后,特别是有了一些结果,Research Statement会相对好写一点。要点还是要Make  a good story with good evidence:

Research Statement (UPenn)

Some very useful advice (Cornell)

 

另外如果能有funding,或者有其他特别strong的理由,别忘了加到research statement里面。

另外,有些人对Teaching 和 Research Statement看法很特别, 比如这个:

用5段话写Research statement

常见的几个Research Statement错误

介绍整个Faculty Application的文章

总结来看:

1. 从大局上讲,要突出自己的主要特点

2. 从细节上讲,提出令人信服的例子

3. 从态度上讲,要从对方角度思维 —— 为什么对方学校要选择自己?为他们想好理由。

一些思考方法

一些思考方法
Some way of thinking

一直以来,导师和一些优秀的同学都有不同寻常的有趣的思考方式、交流方式。通过和他们的接触,我总结了一些思考方法。

1. STAR

与别人交流学术往往在于交流方法,交流思考的方式。而人由于所处环境,学习过程的影响,往往有不同的知识结构。比如学习空间统计的人,往往把问题往空间统计模型上靠。这时,有效的交流不是两个人在各自的领域发表见解,而应该是了解对方的思想。
在这种场合,可以使用STAR方法。

STAR方法通常在找工作时回答Behavior Question时使用。它指的是(wiki):

The STAR (Situation, Task, Action, Result) format is a job interview technique used by interviewers to gather all the relevant information about a specific capability that the job requires. This interview format is said[by whom?] to have a higher degree of predictability of future on-the-job performance than the traditional interview.

  • Situation: The interviewer wants you to present a recent challenge and situation in which you found yourself.
  • Task: What did you have to achieve? The interviewer will be looking to see what you were trying to achieve from the situation.
  • Action: What did you do? The interviewer will be looking for information on what you did, why you did it and what were the alternatives.
  • Results: What was the outcome of your actions? What did you achieve through your actions and did you meet your objectives. What did you learn from this experience and have you used this learning since?

The STAR technique is similar to the SOARA technique.

当我们讨论一个学术问题时,在提出解决方案之前,应该在问题的Situation上首先取得共识。在Task方面,我们应该确定行动的目的,或者解决问题的程度,并了解自己的局限(比如时间精力)。之后在Action上了解自己应该怎么做,具体分步骤怎么做。最后在Result部分,可以可以思考完成整个流程自己学了什么,有哪些经验可以为其他工作所用,向导师汇报,与同学交流等等。

STAR方法在交流学术问题,阐述自己的能力上很有用。它本质上希望能站到对方的角度看问题,从对方的处境,思维方式,行为方式来思考。因此它是提高交流能力的方法。

STAR方法还可以稍作扩展用在写作上,这形成一种写作的结构 (Organize information in terms of problem-solution Hoey 1983):

  1. Description of a situation
  2. Identification of a problem
  3. Description of a solution
  4. Evaluation of the solution

这种方法在科技论文写作中很有用。

2. 五问法

五问法,或者称“五个为什么”,“5 Whys” 是丰田创造的应用于制造业的管理方法。先举两个例子:

(1)(http://www.iceo.com.cn/guanli/110/2012/0807/254654.shtml)

一、工厂的地板上有一摊油,为什么?

答:因为机器漏油。

二、为什么机器会漏油?

答:因为油箱破了。

三、为什么油箱会破?

答:因为我们所采购的油箱材质较差。

四、为什么我们所采购的油箱材质较差?

答:因为价格低。

五、为什么我们要采购价格低但质量差的油箱?

答:对采购员的奖励是视短期节省的开支而定,而不是看长期的绩效表现。

(2)(http://zh.wikipedia.org/wiki/%E4%BA%94%E4%B8%AA%E4%B8%BA%E4%BB%80%E4%B9%88)

  • 我的汽车无法启动。(问题)
  1. 为什么?电池电量耗尽。(第一个为什么)
  2. 为什么?交流发电机不能正常工作。(第二个为什么)
  3. 为什么?:交流发电机皮带断裂。(第三个为什么)
  4. 为什么?:交流发电机皮带远远超出了其使用寿命,从未更换过。(第四个为什么)
  5. 为什么?:我一直没有按照厂家推荐的保养计划对汽车进行过保养和维护。(第五个为什么,根本原因

在实际应用当中,有可能将这种提问进一步扩展到六问、七问,甚至是更多的“为什么”。

从这两个例子可以看出,五问法是一种破茧抽丝,追根究底,找出问题根源的思考方法。在软件开发中,在面对一个bug时,我们如何修正错误呢?就地修改自然是“最省时间”,但是这解决问题了么?如果软件本身架构蹩脚,图方便的就地修改可能会带来长期的隐患。

从研究上讲,最重要的就是弄清问题。先用五问法对一个研究问题彻底搞清楚,才有利于下一步的印证或者仿真。值得注意的是,每一次新的发文,都要在核实、查证上一个为什么的答案是不是禁得起推敲。不然五次发问都是表面功夫。这就丧失了五问法的意义。

 

3. 六顶思考帽

六顶思考帽是一个拓展思维广度,协助决策分析的思维工具。它把思维的类型用六种颜色的帽子来表示。

http://www.mindtools.com/pages/article/newTED_07.htm

  • White Hat:
    With this thinking hat you focus on the data available. Look at the information you have, and see what you can learn from it. Look for gaps in your knowledge, and either try to fill them or take account of them. This is where you analyze past trends, and try to extrapolate from historical data.
  • Red Hat:
    ‘Wearing’ the red hat, you look at problems using intuition, gut reaction, and emotion. Also try to think how other people will react emotionally. Try to understand the responses of people who do not fully know your reasoning.
  • Black Hat:
    Using black hat thinking, look at all the bad points of the decision. Look at it cautiously and defensively. Try to see why it might not work. This is important because it highlights the weak points in a plan. It allows you to eliminate them, alter them, or prepare contingency plans to counter them. Black Hat thinking helps to make your plans ‘tougher’ and more resilient. It can also help you to spot fatal flaws and risks before you embark on a course of action. Black Hat thinking is one of the real benefits of this technique, as many successful people get so used to thinking positively that often they cannot see problems in advance. This leaves them under-prepared for difficulties.
  • Yellow Hat:
    The yellow hat helps you to think positively. It is the optimistic viewpoint that helps you to see all the benefits of the decision and the value in it. Yellow Hat thinking helps you to keep going when everything looks gloomy and difficult.
  • Green Hat:
    The Green Hat stands for creativity. This is where you can develop creative solutions to a problem. It is a freewheeling way of thinking, in which there is little criticism of ideas. A whole range of creativity tools can help you here.
  • Blue Hat:
    The Blue Hat stands for process control. This is the hat worn by people chairing meetings. When running into difficulties because ideas are running dry, they may direct activity into Green Hat thinking. When contingency plans are needed, they will ask for Black Hat thinking, etc.

简单来说,白色注重事实;红色注重直觉和感觉;黑色是悲观角度;黄色是乐观角度;绿色要求创新;蓝色要求对思考进行思考。

通过交替使用不同的思维,来扩展对问题多种角度的考量。

个人认为这个思考方法在于转换自己的思维方式,增加思维的广度。

 

 

推荐吳俊瑩的文章

作为一个工科学生,学术水平应该和管理水平同步提高。
吳俊瑩 老师,据我所知,在一个IT公司工作过,同时对公司、项目管理有仔细的思考。
今年以来,读他的文章给我很多启发。

比如 “研發人員應該「拜」王陽明”中首先提到了获取知识的两个方法,看书和问人。之后提出实践,最后讲“在技術的各種領域中,根本的道理有很多還是相通的,新東西永遠學不完,重點應該是自己有沒有把每一件研發工作都 徹底完成,一步一腳印地累積。” 在学术领域,我凭着兴趣接触了各种项目,在很多方面都有自己小小的贡献,但没有适当的总结,写出论文。如果能早早研读吳俊瑩老师的文章,一定会有更好的结果。

吳俊瑩经常在台湾的ITHOME杂志发文。很多文章非常精彩。可惜没有一个索引页面把他所有的文章组织起来。
我就列出几个最近的文章链接吧:

彼得杜拉克如是說
「不聞不問」不算「信任」