CS巴别塔(1)

Twitter风格

Posted in Uncategorized by Kenny Yuan on 2013/12/31

你本来只是喜欢知识,但不知不觉中就对书这种介质产生了不可割舍的情结;你本来只是喜欢电子产品带来的功能,但不知不觉中就对电子产品本身和品牌产生了眷恋……人类的本能性思维模式的确很难战胜:我敢肯定有些被此推“冒犯”到的人会打算立即矢口否认,还会下意识思索如何才能讽刺挖苦一下我这个作者

Advertisements
Tagged with:

允许我跑个题——给新手父母的箴言

Posted in Uncategorized by Kenny Yuan on 2013/12/29
总的来说其实就是一句话:不信中医和伪科学,安全又省钱
 

怀孕时

 
不怕吃螃蟹,不怕钉钉子,不怕用剪刀,不怕吃驴肉,不怕吃兔肉
不用买防辐射服
正常使用手机、电脑,不关WIFI热点
不乱服补药、中药
不保胎
不把宠物狗踢出家门
不查ABO溶血
不胎教
 
 

生产后

 
不做月子,于是就不担心感染和并发症(比如静脉血栓)。
正常吃水果、蔬菜和盐,正常喝水,洗澡刷牙开窗吹空调剪指甲,下床运动爬楼梯
不喝催奶汤
不吃中药产后康,生化汤
不喝米酒水(月子水)
不吃米酒调生鸡蛋
不喝红糖水
不挑马牙
不管螳螂嘴
不捆蜡烛包
不把母乳往婴儿眼里挤
不服中药,于是就不用担心汞、砷中毒
不喝人参水,不用担心猝死
不喝葡萄糖水
不喝甘草水
不剃头
不用枕头防侧睡,于是就不用担心SIDS
不测微量元素(比如常见的剪头发、扎指尖血测量法)
不查视力
不补钙
不测骨密度
不测母乳成分
不套脖圈游泳
不喝浆糊
不喝蜂蜜
不用杜曼闪卡
不早教,不背古诗,不"开发右脑"
添辅食前不喝蔬菜汁,不喝果汁,不喝米汤
辅食里加肉
不穿开裆裤
不把尿、把屎
放心使用纸尿片
按温度增减衣服,不捂
正常照镜子
晚上正常出门,不怕撞鬼
使用安抚奶嘴
不用学步车、学步产品
出生就开始用安全睡篮,座椅。坐车必用
睡婴儿床
黄疸时绝不碰中药茵栀黄
女婴不挤乳房
不查过敏源
不去体检评上中下
不担心上火
不止咳
不吃感冒药
不用红药水,紫药水
不摇婴儿
 
 
 
 

进步的时代

Posted in Uncategorized by Kenny Yuan on 2013/12/29

写太多的tweets,都不会写长文章了

上世纪80年代的时候我正在读小学,当时社会上对戴眼镜的人很歧视,各种嘲笑。但凡小孩子爱看个书什么的,家长就如临大敌,生怕把眼睛用坏了,这辈子就完了,这种情形,就跟90年代的家长防小孩子去游戏厅、2000年代的家长防孩子去网吧、2010年代的家长防孩子用手机平板一样。不知道未来的家长会防孩子做什么?

有一个被广泛引用的研究,其结论中有这样一条:如果让婴儿看电视若干小时,到7岁的时候认知能力等会差于其他的孩子。我想这个结论,应该是家长们特别喜欢去相信的,对吧?但是那个研究并不只有一个结论,另外一个是这样写的:如果这些时间用来玩电子游戏,则观察不到有任何影响——这第二条结论,家长们还会愿意去相信么?

对了,我今天看到这样一个图片:

图像

(近似地)翻译一下——

1815年的一个校长说:这年头的学生们太依赖纸张了。他们都不懂如何能在石板上写字又不弄自己一身灰。他们也不会正确地擦石板。如果纸用光的时候他们该怎么办呢?

Tagged with:

资深架构设计师的30条忠告

Posted in Uncategorized by Kenny Yuan on 2010/10/18

UI really matters!
界面真TMD不能忽视!

The design should base on the problem domain, not on what you have done before.
设计是应该按照问题域来进行的,而不该根据你过去做的事情为蓝本。

It’s hard to say “I was wrong”, but if you don’t say it, you’ll have to pay for it.
说出“我是错的”是很困难的,但是如果你(在该说的时候却)不说,你会为此付出代价。

It’s not your full time job demonstrating how to write code. You can do it, but not all the time.
你的工作不是做编程示范。你可以做,但是不要全身心投入进去。

Bug fixing is also your responsibility, don’t leave it to the maintenance team.
处理BUG也是你的责任,别把它扔给维护团队就不管了,要不然你的设计会被维护团队搞得面目全非的。如果写烂代码更方便的话,维护团队一定会写出大堆的烂代码的。作为架构师,你要去控制修改代码的成本,让成本最低的那一个成为你所期望的那一个(借鉴一下经济学)。

You are not Winston Wolf. Try to eliminate problems before they surface. (good design has less problems; you’re not a firefighter)
你不是一个专门来解决麻烦的(见《低俗小说》)。试着在麻烦出现前将它们干掉。(好的设计能消除问题和麻烦;你不是消防队员)

Design is technical, try to avoid politics. Or negotiate with politics to make things still work.
设计是技术问题。不要让政治参与其中。或者适当妥协以便让事情还能运转。

If your decision is based on some limitations, always remember those limitations along with your decision.
如果你的决策是基于某些限制的,那么在记住你的决策的同时,要记住这些限制(不要直接记住结论)

If you can summarize principles from your work, write it down. Then sometimes you’re able to know you were wrong.
如果你能在工作中总结出原则,就写下来。这样以后你就能知道你曾经如此这般地犯过错(我打赌你写过的多数都是错的,除了OCP,但那不是你发明的,嘿嘿)

If there are many programmers awaiting for your design, you’re definitely dead meat. (Human Resource driven is the sin)
如果有太多的程序员在等你的设计(来开工),你就死定了。(人力资源驱动是一种原罪)

Prevent lame metaphors; software is neither art nor brick building.
别用蹩脚的比喻;软件不是艺术,也不是砖墙。

Tell the user what you can provide; don’t ask them what they REALLY WANT.
告诉用户你能提供什么;别问他们“你到底要什么”。

Quality is your responsibility too, don’t hand it over to QA. (Design in the robust way)
质量也是你的责任;别把它们交给QA。

Don’t get smart. Write it down when you feel like a genius, and attack your idea as the most dangerous enemy.
别耍小聪明。当你感觉自己像天才似地做出一个设计的时候,要把它当成最危险的敌人来对待。

Reuse is not your purpose, it’s neither necessary nor sufficient to success.
“重用”不是你的目的。它不是“成功”的充分条件,也不是必要条件。别单纯为了重用去设计,别忘了重用是为了达到什么样的目的。

A language addict will always be a slave. Try to become a sensai.
语言上瘾者永远是一个奴隶;尝试变成斯普林特老师吧!

Solutions/Tools with high price guarantee nothing on productivity.
售价很高的解决方案/工具从不保证任何生产力。

Don’t say “Microsoft did the same thing”. It proves nothing. (Google/Facebook/Twitter/etc.)
别用“微软也这么干过”来支持你自己。它什么也证明不了(google/facebook/twitter同理)

Don’t try to collect information/requirements first and decide later; welcome to the moving planet.
别尝试先收集所有的信息和需求,然后再决定;欢迎来到地球——这颗移动的行星!

There’s no universal solution; The programming language sometimes can be the one, unfortunately we have lots of languages.
没有万能的解决方案;有时候编程语言可以是一个(万能解决方案),不幸的是我们有很多种语言

Age and experience are not the right way to defend yourself in an argument.
在争论中,年龄和经历不是你证明自己的正确方式(以德服人,以理服人)

Yesterday’s workaround is tomorrow’s limitation.
昨天的Workaround就是明天的限制

Good design evolves; bad design patches.
好的设计在进化,坏的设计不停地打补丁

Design what you’re able to write code for it. If it’s too hard to you, don’t count on the others.
用你能实现的方式来设计;如果困难到你也写不出来了,那么就别指望其它人

Don’t be the captain in the engine room.
不要成为引擎室里的船长(把船开好是你的职责,而添煤则不是)。

Inspect your design in each level.
在不同的级别下仔细检视你的设计。

Understand the hardware; your system doesn’t run in air. (Hardware goes wrong too)
要懂得硬件。你的系统不是在空气中运行的(但是可以Adobe Air)(硬件不是完美的,可能会出各种错误;)

Make your design natural and comfortable. Don’t fight against programmers, and don’t let them fight against your design.
让你的设计是自然而舒服的;别跟程序员斗争,也别让他们和你的设计斗争。(参考QT的舒适与灵活,外加良好的命名和强大的功能;另参见最小惊奇原则)

It’s too late when you realize it’s slow; design for performance;
当你意识到速率太慢的时候,已经太晚了。为性能而设计。

……嗯……如果你仔细数过了这些原则的数目,会发现其实只有29条。第30条我没有写,其实原打算是这样的:

(30)这篇文章是由Kenny Yuan在1.5小时内直接敲出来的,其中英文敲了一小时左右,中文翻译了半小时左右;他写这篇文章是为了说明:滔滔不绝地谈论具有迷惑性的原则是多么的容易!而且居然还能骗到一部分人哩……

(P.S. 之所以选择从“架构”这个角度来忽悠,是受到以下这个的启发:http://97-things.near-time.net/wiki/97-things-every-software-architect-should-know-the-book)

最后祝大家动脑快乐!

(P.P.S. 此为旧文,一直在草稿里忘了发。现在编辑一下发出来,其目的,当然是想要给大家的Google Reader再添一个未读数,嘻嘻——嗯,要keep it on the down low…)

愚蠢的“为什么”

Posted in Uncategorized by Kenny Yuan on 2010/05/17

先讲个小故事(含记叙文6要素):某年某月某天,在某地有一个小讲座。在Q&A阶段,某人问了某个问题:“为什么要选择xxx方式?”。结果他立即就收获了人群中数道鄙视的目光,还有一些轻微的哄笑和嗡嗡的议论。还好,主讲人没有觉得这个问题可笑,认真地回答了这个问题,还给出了数据。

聪明人往往会记住前提和数据,再自己推出结论——这样,在前提和数据变化的时候,他会意识到结论不再成立,而不会再受其困扰;而笨蛋则会直接记住结论。时间长了,有些结论对他来说就是“不言自明”、“理所当然”的——当这种笨蛋占群体中多数的时候,问一个“为什么”也可以让他们开怀大笑……

我相信,以下问题都曾经“可笑”过:

为什么不能让屏显和打印的结果一致?
为什么在PC架构中不可以有虚拟机?(x86 17指令?)
为什么不能搞一个遍地都能运行的ISA?(Java)
为什么点了链接后一定要整个网页刷新?
为什么不能丢开RDBMS自己开发一个更合适的模型?
为什么字母C一定要连按三次才能输入?(T9)
为什么一定要用命令行操作电脑?
(来一个前瞻性的)为什么一定要用鼠标?
……

嗯,最后给笨蛋们提供一个很好使的后悔句式:Why didn’t I think of that?

Tagged with: , ,

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

Posted in Uncategorized by Kenny Yuan on 2009/05/20

Rev 0.4  (Sept. 18, 2010)

思维的特点和缺陷

人类总是喜欢歌颂自己的大脑,比如:思想的威力,逻辑的威力,数学的威力(数学来自于思考),科学的威力(科学来源于思考),还有“意识”这个“人类与动物最大的区别”[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] 我知道“真*相”二字在国内大多数可“自由发言”的地方是屏蔽的,所以要用间隔符号。

Tagged with: