14条原则 (2) 首先检查最简单的:例如,MFC播放avi的时候在上面画东西我见过不少小孩撞了头以后,一边哭一边踹柱子。你一定也见过不少程序编译未
通过,或者逻辑错误,或者在游戏里被PK死了,然后摔鼠标砸键盘的。还有程序出了问题以后,大骂微软这垃圾编译器,或者操作系统的,断言,一定
是"这垃圾的XX有问题。"第二条原则是,首先最简单的。也就是,先检查最容易检查的。如果你病了,大
夫看了一眼,然后就断言,一定是某某病,回去吃某某药吧。你可能根本不敢相
信,虽然他要求你一圈检查,你又觉得他是有意让你多查以便赚钱。马上断言
的,大多是扯淡,只有一项一项排除的,才更可信一些。一项一项排除,从哪里开始呢?从最简单的。一个故事。一次,我在吉林大学某机器上,刚好主人不在,同时授权我使用。我
打开机器,看到了登录界面,用户名已有,要求口令。我开始试各种弱口令。姓
名缩写,电话号码,房间号,我甚至试了空格,无一命中。终于主人回来,告诉我,口令是:没有口令。只需回车,就会登录上去。但是这
最简单的可能,我没有试。另一个故事。当年还是novell网络横行时候,组一个游戏网。novell公司的
netware有个特性,可能是承袭自unix,登录的时候敲的键不会有任何回显,不
像微软会显示"*",你敲一个键,微软就显示一个"*"。所以有人开玩笑,你的密
码都被我看光啦,不就是星星星星星星星么。novell连个星号也不显示。当时我组一个网络,用一般用户什么的都登录正常了,就差用管理员,我记得是
叫admin还是supervisor登录,设置各种权限。就在这时,我卡住了。我登录不
上去。这种活经常干,按说不应该哪里出错。我开始排查,翻过来倒过去,就差
把整个网络重做了。半个小时还是两个小时,时间太久远,我记不清了,终于我想到了一种可能--键
盘上有个键坏掉了。而那个键,正好就在我的密码当中。所以,在系统看来,我
的密码总是错的。问题一旦找到,解决就容易至极,换个键盘。我没有试最简单的可能,有各种原因。阻止我想到那是最简单的可能的一个关键
因素是,我认为那是不可能的原因。很多年以后,有同学跟我说:老师,我编程序什么都觉得还顺利,就是建VC工程
太慢了,老是记不住。我答:那你就只建空工程,连续建20次。然后就记住了。对于那些被视作简单的练习,我都是这样回答的。如果你认为这个练习非常简
单,它一定花不了你多少时间,那么做一次也不费事;如果你认为这个练习太花
费时间了,那么,这一定是一个足够复杂的练习,非常值得一做。那些我们以为最简单的练习或者检查,如果花费的时间不多,为什么不执行一次
呢?断定一个程序正确的最佳方法,不是趴显示器上看两个小时,而是跑一遍。
跑一遍并不能断定它是正确的,但是如果跑不出正确结果,我们却可以飞快地证
实,它是错的。所以,如果程序不是特别大,你可以不停地编译,每隔一小段时间。让编译器保
证你始终走在正确的或尚可挽回的局面中。类似的,有同学问我,WORD写文章的时候,应该多长时间保存一次呢?答案不是
几分钟几小时,而是"你能够承受损失之前"。如果你一分钟能打个百八十字,而
且你不在乎损失这一分钟,那么这时你不必存盘,如果你一分钟只能打个二三十
字,而万一这时断电你会非常难过,你可以十秒钟就存盘一次。文章是由一次次
存盘构成的,而不是一个键入的字构成的,因为只有存盘的结果才能呈现与人。
不然,你就只能吹:我已经有了一个巨完美的证明,只是没有存盘。每次存盘,是可见的微小进步。那些微小的,应该引起我们最大的重视。有的同学可能会问:为什么要先检查最容易检查的,而不是先检查最可能的故障。
因为除非有十足的证据,仅凭猜测,你无法断言"最可能"的是什么。而获取更多
证据的方法,就是检查。如果你假设故障来自某个原因,准备开始检查,这检查
已经变成了一个新的实验,这时,你也应该首先检查一新实验中最容易的一项。当撞到柱子上,先检查完柱子没有移动过来主动攻击你,这几乎瞬间甚至我们没
有觉察就已经完成了;编译失败,逻辑错误,先检查自己的程序,而不是先假设
编译器有毛病,因为你假设编译器有毛病太困难了,通常超出了大多数同学的水
平。关于断言编译器有毛病,参见此系列后面的对比法。大骂微软编译器垃圾,十有八九最终发现垃圾的是自己。也许它的确很垃圾,但
我们编程的时候,肤浅到通常远未触及到它垃圾的部分。又一个故事,雷锋修车。传说雷锋修车的时候有个螺丝找不到了,找了半天也不
见踪影。战友说,算了吧。雷锋说,不行,万一掉到汽车里的某某地方,汽车就
要出大故障了。然后他们又找了很久,终于在就是那个某某地方找到了那个螺丝。这个故事原意说的是雷锋是个认真的好青年。我当时一直不明白,他们为什么不
先找那个某某地方呢?现在想想,如果这个故事是真的,也许他们有找螺丝的程序,先找最容易的,然
后步步向下。虽然过程漫长,但是最终总能解决问题。从最简单的开始检查,其实对应着一种非东方的科学思考方法。相关笑话一个。
说中国老太太和德国老太太把针掉到地上以后的反应。中国老太太会根据针掉的
方向,大致去看看,然后就找到了。德国老太太会把地板画上方格,然后一个格
子一个格子找,凌晨之前也许能找到。表面上看,中国老太太很有灵感,非常聪明。不过,德国老太太的方法的优势在
于,她一定能解决问题。她从某处开始找,可能就是最容易找的格子--虽然这个
格子并非最可能的方向,但是遍历之后,针必然在某个格子中。我们排除故障的时候,可以准备一个checklist (检查表?),把所有的可能原因
列上,然后开始排查。从简单到复杂,当表格扩展到某一位置的时候,问题就显
现出来了。这也是我们为什么要训练写作实验报告的一个原因。有经验的网络工程师检查故障的时候,不是凭直觉,而是先检查下三层,比如用
ping。如果下三层正常,再去检查DNS什么的。为什么先用ping,最主要的原因恐
怕正是因为这个工具用起来简单快速。显示器不亮,最先要排除的原因是什么?不是主板不是操作系统不是厂商的人
品,而是,先确定通电了。尤其是远程诊断的时候,尤其远程的用户并非熟练技
术人员的时候,并参见此系列后面的"永远不要相信你的用户"。编程的时候,我们通常正确的路线开始,用最朴素的方法。当然,什么方法才是
朴素的,是需要时间训练和一定的知识结构的。不是你最熟悉或唯一熟悉的方法
就是朴素的。然后,很多同学会犯一个错误。那就是,如果这个朴素的方法最开始的时候没有
工作,很多同学就放弃这个方法,转向另一个,如果那个方法也不好使,就再转
向一个新的。当你尝试某种技术路线的时候,一定要确保这种技术路线是不能用的。确保它不
能用的方法是,或者1.你了解到它不适合这个项目的缺陷,2.你有充分的实验证
明它不适合,然后你还需要保留证据。这些证据就是你实验报告的内容,用以自
己备忘或吵架用。昨天,帮一个同学改MFC的程序。目标是用CAnimate控件播放avi文件的同时,在
上面画点东西。解决的步骤如下。1. 该同学说,他在OnPaint事件响应中写了画线,但是这线不显示。我请他演示,线确实不显示。我猜他没有发送OnPaint消息,所以响应函数没有
调用。他说他在OnPaint里写了弹出了一个MessagBox,验证这一点。我说,那你
应该看到好几百个MessageBox,如果OnPaint消息一直发送的话。他说,是的,
他看到了。我们没有看到那么多MessageBox。事实上,只在程序载入的时候弹出一个。所
以,OnPaint消息响应里的那些东西都没有一次次被执行。关于上述这一点,并非适用首先检查最简单的这一原则,而是适用"永远不要相
信你的用户",请见后文。2. 我们改了程序,OnPaint源源不断发来,也能画线了。但是线被CAnimate的控
件挡住了。我考虑到的方法: (1)在控件的上面放一个窗口,设置为透明,在那个窗口的工
作区里画东西; (2)网上查到的,设置控件为透明; (3)修改工作区所在窗口的
Z坐标,把它放到控件的顶上。头脑不清醒,有的我还走了几步。反正都不怎么好。 方法(1)这个方法太复杂,
感觉上这样的任务不应该太复杂,尤其是rush一个粗糙原型,不然VC太弱了,违
背了一般较完善系统功能的规律。方法 (2)失败了,原因不明,现象没有任何变
化。方法(3)简单太笨了,当时真的可能没有带大脑,那样控件就会被工作区遮
住,avi的播放就看不到了。然后我想到了一个方法,因为简单,所以马上试了试。简单,可能有效,是我们
选择一个方法的重要理由。我们发现CAnimate派生于CWnd,而CWnd::GetDC()可以取得CDC设备上下文,而
CDC上面是可以画东西的。事情就这样成了。在这个方案之前,还走了一小段弯路。我试图从控件的指针构造CDC。在控件没
有播放avi的时候,画的东西在控件上,当avi播放,画的东西消失了。我们猜
测,当avi播放的时候,CDC或者控件的指针不再安全地关联了。瞎猜的。MSDN中
对于handle,对象的指针,有一大堆文档,没有一一去读。这个原型能跑了,虽然很粗糙,一个劲闪烁。不过简单的,能快速有点效果的,
不停的小恩小惠,正是人类所追求的。其实,相对于这第2条原则,我有一个不良习惯。我往往最后才检查最简单的或最
可能的,尤其是年轻的时候。当时是希望借此积累经验。现在,我更希望把那些
用于积累经验的实验,放到解决问题以后。当然,问题解决以后,可能就没有情
致再去积累经验了。相对于经历本身,我们原始的渴望直接想得到的,往往是终结那一刻的快乐。所
以,我们可以经常向心中的小兽投食:你看,又一个可能的原因排除了,又一个。
这些小奶酪,安慰我们,使脆弱的我们可以坚持走完全程。虽然,那些都不是原因也不是结果,但是那些一路伴随我们的,该记录下来。在
最终审判以前,我们任谁都不知道哪个才是正解。如果没有记录的话,当那一刻
到来,你却早就忘记了如何走到这里。正是那些最简单的所有伴随我们的事件形成了我们,当你开始忘记,你就失去了
自己。
Category: 未分类
2小时行走12公里
2小时行走12公里开了1小时45分钟的会,定下来一个框架,有三位同学分别去写代码了,明天看进
度如何再做定夺。虽然只是定框架之类的工作,很累。我想,我老了。我常跟朋友们开这样的玩笑,你老啦,你也老啦,你们跟不上时代啦。心里,有
时还会加上一句老gada的话,不雅,就不复述在这里了。他人在伦敦,过着美日
子,可能早就忘了当年的理想之一,在师大二舍建XX集团了吧。如果老gada看到
这段话,楼已经有了,两座塔楼,足够大。你老了。其实这是一句夸奖的话,意思是,你超脱了这个时代,不再跟随流俗,
开始有了自己的见解。但是,我老了,这不是夸奖。频频梦到看不清楚东西,在
梦里一个人弯着腰伸出手探寻着,我有多么恐惧。今天开会的显示器离桌缘够远,我只好抻着脖子贴过去看。这种姿势,难以保持
编码十分钟吧。更多的时间,我靠在沙发里,眼睛什么也没看,嗓音沙哑,谨慎
地讨论各种方案,先想到各种失败的可能。用笔,用纸,画些乱七八糟的图。我看到代码在里面流动,可是自己却不能亲手去写。这1小时45分会议以后,我出发,徒步2小时行走12公里。我看到满地的冰。各种
各样,雪化成水然后凝结的坚硬致密的,铁黑色;表面一层冰下面是空洞踩上去
卡卡响的,苍白的。我看到西边的落日,有时昏黄,有时暗红,有时是在凛冽的
风里飘摇的灰白。2公里,我累了。世纪广场,没有一辆车在斑马线上减速。所有的司机,都没有学
习过交通规则,或者,他们都忘记了。下次我应该捡几块砖头,把凡是不停车的
风挡都砸碎。我犹豫了,这次最终放弃了。我想了很多,甚至想到昨天看到介绍
抑郁症的文章里提到唐缺先生的话,即使非常小的事情,也会焦虑。最后我断
言,能够想这么多最后却没有砸,我一定是老了。某次路过这里,是和李记者同行。那一次,我们徒步了整10公里。然后他说什么
也要减速,剩下的不到2公里,我们走了似乎1个小时。然后,是烧烤。最近常常
出现什么名字到嘴边,却想不起来,比如烧烤店的名字。这是以前没有过的。你
知道我要说什么,我不说了。恩,我没老,我想起来了,是大韩食代。不是大
唐,也不是高丽。如果我错了,请不要告诉我吧。然后,似乎是转瞬间的事,李记者就去了天津,在那等我去喝酒了。等我去看他
喝酒,不对,他糖尿病也不能喝了,我们两个人只好看马利喝酒。他在长春的时
候,我们也会经年而不相聚。现在也没有什么不同,似乎。这条路,我一共和三个人一起走过,如李记者一样,此刻都各在艰难时代,也如
同我一样。所以,你可以想像,我们都在努力求生。我徒步2小时,也正是为了能
有精力继续别的。这就像打帝国的时候,我只喜欢打仗,喜欢骑兵攻城掠地,喜
欢投石器吱嘎嘎绞起火球然后忽地甩出去,我不喜欢农民种地,不喜欢采矿也不
喜欢挖石头。可是,为了能尽兴打仗,不得不做这些枯燥的事。作弊弄到钱,也
一样能造出骑兵推平敌人,可是却没了滋味。如果作弊能得到快乐,我们不开机
敌人甚至都没有生出来,岂不是更妙?沿着卫星路继续,没有一个斑马线能让我通过。最终,我发现前面没有路了,两
条车道斜着并在一起,没有斑马线,更没有红绿灯。原来这就是这些路的两侧没
有人行道的原因,设计师根本没有打算行人通过。这时我想的是,如果被车撞飞了,司机会不会以高度近视立体视觉较差为借口而
少赔我钱。到时候谁来替我砍他?我只好在那里过马路。呵呵,很害怕,非常害怕。从结果上看,既然我还活着,
司机们一定很好地把握了安全距离,而我只好相信他们,把性命交给陌生人。货
车飞快,毫不减速,我担心车掀起的风能把我抓到车轮下。出了一身汗,终于通
过四五处双实线到达对岸。以后出行,得必须先确实哪里有红绿灯了。前路漫漫。之后,我穿过一个建在高压线下的公园,穿过灰尘扬起的街道,我路过干涸的人
工湖和拦腰截断的河。我看到高压塔旁的老人蹒跚着走过,像走在3D建模未完工
的城堡之下,我看到楼群间的落日被立交桥分割,在城市蒸腾的热气中抖动着,
像远处的海水泛着金红的光茫。这一路,真的很美,感动得令人流泪。
pics.
有阳光的
晚冬正午阳光的足迹 pic
果然,C语言就不贱嗖嗖的:以realloc为例
果然,C语言就不贱嗖嗖的:以realloc为例贱嗖嗖,也许是东北方言?它的意思大致是别人不需要你做的事情,你偏要替别
人做了,甚至可能还起到了负面的效果。比如网上有张照片的笑话,说是保姆看
小资的单反镜头太脏了,全泡肥皂水里刷了一遍。大致吧,这个时候小资心里的
看法大致就是你怎么这么贱嗖嗖的。据说计算机程序是牛人设计出来,给傻子用的。既然是给傻子用的,就一定要考
虑得非常周到才行。所以,作为傻子之一,我就常有这样的感慨:你怎么这么贱
嗖嗖的。前两天跟包师弟、关同学、孙同学一起写驱动,用了windows7操作系统。整个下
午诸多不顺,原因,我总结的一条就是一众软件都贱嗖嗖的。比如,win7下拖动
文件图标,它跳出来问你,你是要复制啊还是要搬移,还是要怎么的。难道我的
操作指令还不够明确,或者win7的用户比winxp的用户更弱智了,所以它觉得不
得不提醒一下?我想起了当年玩光荣公司的三国志英杰传,每当退出的时候,它都会三番五次地
跟你确认"你真的是要退出了么""你的确是要退出了么""退出游戏可就不能玩了啊
",大致这样的意思。终于客气完了,界面就要回到操作系统之前,它又跳出来
说,"您辛苦啦。"周到,真是周到。看日本小巷里老头老太太不断地相互鞠躬道别,也不过如此。
转过街角,还要回头再哈一下腰吧。周道则周道矣,效率却奇差无比。我要退出就是要退出的意思,你一遍一遍地跟我确认,真是伤害我的自尊,好像
不如此关照不足以彰显我是个弱智儿童。你能悄没声地干活,少跳出来提醒我么。
同样的道理也适用于QQ、360等非要在启动的时候弹出个窗口,提醒我现在有哪
些国家大事。还有windows窗口右上角那个血红的叉子,我想退出的时候能找得
到,不用这么明显地一直一直提醒我你存在。这么贴心 (还有某处方言,窝心)地关照,总让我担心里面包藏祸心。马利老师前两天博客提到,他如何教导了刺头同学。他作为男老师的这种干脆
劲,该罚罚该讲道理讲道理,令人耳目一心。作为对比,我不由得想起当年教过
我的一些女性老师。柔则柔矣,有些确实有阴的痕迹。盖阴柔二字组成一词不是
没有道理的。编排老师不是我等学生应该做的事,所以某些女老师的做法估且跳过。编排另一
位,女医生。N年前我看牙的时候,那位牙医是位女士。当时我做的是根管治疗,
就是拿一根特细的小铁丝往里面捅啊捅,然后钻两圈。我很快就全身温透了。她
总是阴柔地说"快了快了"。此时我想,反正快了,可以再忍一下。但是,仍然没
有"快"结束。如是者三,我就明白了,她在骗我,"快了"二字就再也起不到任何
作用了。再后来,她说其实如果实在受不了,是可以用麻药的。虽然道理上似乎
对,但是我却再也不相信她,一定要封上不治了。"快了"不是一个她预见到可能发生的事件,而是用来安慰病人的一组声音而已。
而它起作用的前提,是病人相信这组声音的意义。当这组声音失去意义的时候,
信任也一同失去了。类似的引导性的关照,你是不是在你的女老师身上也发现过?孙子兵法说,不要告诉士兵行军的目标;使用士兵,要如驱羊群。这种观点据说
现代还有些争议,即是否要发挥人民群众的力量、人民群众到底是不是主人、主
人价值如何体驱啥的。这些观点都太高深了,我完全无法理解。我能理解的是:
君视民如草芥,民视君如寇仇。如果你骗我,利用我,驱使我,认为我是弱智,
我没有理由表现很聪明的样子啊。当软件把用户当成襁褓里的婴儿,这样呵护下成长起来的用户还有能力做些什么
呢?同样,凡事都由老师安排好了的学生,一旦失去或离开老师,会有什么样的
能力呢?据说某些初中学校的教学方法就是让学生做题做题做题,学生们做题做
伤了,到了高中大学就没有后劲了。我倒更乐意相信,那是因为老师在学习方法
上把学生照顾得太无微不致了,学生没有获得 (而不是失去)了主动性和独立性。独立地判断,正是人类区别于动物的一个特征。独立于感受,运用理性;独立于
他人,保持自我。也有个别的程序,知道尊重用户,或者说,把用户当成与它同等聪明和具有判断
力的"人类"。袁小康同学来信问我,C/C++中的realloc函数的事。他说:realloc重新为一个
指针指向的内存分配空间。如果剩余的空间够大,内存地址不变,空间向后延
伸;如果内存空间不够大,那么,系统为这一指针指向的内存重新分配一块空
间,把原来空间里的东西都复制过来。他的问题的:如果还有其他的指针指向同
一空间,那些指针怎么办呢?如果不进行任何处理,那些指针就成了野指针。我回信,猜系统会更新那些指针的地址。而且建议他做实验验证一下。没多一会儿,袁同学回信来,其余的指针的地址并未更新。我猜错了。查了一下资料。C/C++的realloc就是没有更新那些指针的地址,它只是把新的
(或旧的)地址作为返回值了。判断地址是否换了,是程序员,而不是编译器或运
行时库的责任。表面上看,C/C++对程序员关照得并不充分细致。但是,考虑到并非每次realloc
都会导致内存地址改变,如果每次realloc都更新所有指针,会导致效率下降。
这些并非必要的工作,C/C++交由程序员处理,而不是事无巨细,万帮代办。C/C++相信和要求它的程序员是睿智的人类,因此,它的使用者,或者说能够驾驭
它的,也一定是睿智的人类。请注意,是驾驭C/C++的,而不是被C/C++驾驭的。
那些细心为你考虑所有问题,希望你连思考都不必的,一定是希望驾驭你。尊重的特征,是真诚。与工具的交流是这样,与人的交流也没有区别。如果我们交流,我要知道所有发生的事情,我可以选择放弃知道,你也可以选择
拒绝告知。但是,欺骗、隐瞒、诱导、强迫、暗示并考验,都是对我故意冒犯和
挑战,此时,我就不得不以反击证明我的智商比你估计的要高一些。或者,你明确地告诉我,在这件事中,我是工具,因此不必负有人类的责任。然
后,我来告诉你我是否愿意。
pics.
3月16日,纪念日
3月16日,纪念日2005年3月16日,中国最大的BBS水木清华转为只供校内使用。此前后,北大的一
塌糊涂站、南大的小百合站等纷纷转为校内使用。转为校内使用的意思就是,一
个你每天可以见到的站点,那些熟悉的面孔,瞬间从这个世界上消失,永远也没
有再见到的机会。你甚至没有机会说声再见。很多人慢慢淡忘了3月16日,于是一年又一年过去了。于是人们原谅了QQ,原谅
了360,也原谅了关闭BBS的那些人。2012年3月16日,微博实名制。同样的原因,我永不使用QQ。是以为记。
pics
14条原则 (0) & (1)
14条原则 (0)引言这是一个系列博客,源于调试计算机网络的14条原则,适合于广泛得多的领域。
这些原则来自一本并不太著名的书,讲Novell的,这14条原则是"故障诊断和排除
的基本原则"部分。那本书是[美]Logan G. Harbaugh 著《Netware系统故障诊断与排队》。可能是
Harbaugh, L.G., Novell's problem-solving guide for NetWare
systems. The Inside story. 1993, San Jose: Novell Press ;. xii, 459
p. 或者是 Harbaugh, L.G., Troubleshooting NetWare systems. 2nd
ed. 1996, San Francisco: Network Press ;. xxv, 532 p.1996年前后,我看了这本书,这些原则带给我很大帮助。而且越是经过长时间的
考验,越显示出它们的用途。我在某计算机生产商给工程师的维修手册上看到了类似的原则;我在理工科实验
中看到了类似的原则;从本科开始,每个教导我工程和实验方法的老师,他们都
贯彻了类似的原则。希望也能帮助你。14条原则 (1) 不要怕实验,但一定要确保能返回开始试验时的设置。前面提过,我小学诸多学校之一,看起来是个专门培养贵族的学校。大约小学毕
业10多年以后,我才意识到,小学同学中很多人跟我根本不是一个阶级的。比如
我住在半农村半郊区的平房里,他们中的好多人那个时候就住在楼房中。我1994
年大学入学开始长期住在楼房中,所以虽然屋子中间桌子上的水也能结冰,我也
没有觉得有多么异常。说远了,我小学有个邱同学,她的家也住楼,似乎家长之
一或者全部是医生。提她的父母职业的意思是,她的阶级挺高的。邱同学给我印象较深刻的一件事情,是她姥姥去世的时候,她带到学校两样好东
西。一件是一本小册子,比现身份证大一圈,一寸厚,针灸的书。所以后来的某
些同学,我能跟你们扯上一些穴位任督二脉啥的,还真不是从金庸那学的。这本小册子后来归我了,我用一本作文选换的。这本作文选,似乎是用一张林彪
提词邮票换的。邱同学那个时候还带来一件好东西,包括你在内的很多同学也会同意那是好东西。那是一块钻石。有我现在的小手指甲那么大的面积,阳光下那真是光茫四射。托
子是白金或者黄金的,具体颜色我确实不记得了,但是邱同学一定记得我--因为
那上面现在应该还有我的牙印。我说:是真金的?她说:肯定啊。我就用牙咬了一口。狠狠咬的,参考电视上坏人咬黄金时的那个表情。牙印深而
大,真是真金呐。我当时还出过一个主意。据说,金刚石是石墨的同素异形体,用放大镜聚光可以
烤着。这个提议被她拒绝了。我至今也未能验证金刚石和石墨是否同素异形体。我还提议用很多不错的东西跟她换这块金刚石,当然,也被拒绝了。而如你所
知,如果我换来了,这块金刚石一定第一时间被我放在放大镜的光斑下。你现在相信那是培养贵族的学校了吧。"不要怕实验,但一定要确保能返回开始试验时的设置。"这涉及到两个问题。一,不要怕实验,二,要确保能返回开始试验时的设置。上面这个故事告诉我们,万一,只要存在这样的可能,实验的后果都可能是非常
糟糕的。当我们在一个工程中,不能确定某种技术是否应该这样用,比如一个API的参数,
其执行后果,某种特别的算法,或者进程线程同步的用法。这时,我们不应该在
工程中测试这项技术,而是应该再单独建立一个小的原型工程,它是干净的,唯
一的目的就在于测试这项技术。不在复杂的环境下测试,而创造一个相对理想的环境,原因之一就在于,复杂的
环境可能不容易恢复。在实验前,要考试后果,所以尽可能备份。以便失败以后可以再来。我小时候做过三个实验。一个实验是为了验证人自己憋气能不能憋死。我站在立柜的大镜子前面,看着自
己,不呼吸,然后发现越来越暗,最后眼前一黑。当然,你容易猜到,我的实验
失败了,否则你看到我的文字挺超自然的。眼前一黑以后,我撞在镜子上,然后
恢复了呼吸。这大约是小学四五年级时候的事。大约2年内,我才知道,人不能自主地憋死自己,会在失去意识的瞬间恢复呼吸。
我很庆幸,当时不知道另一件事:咬舌自尽成功的人,是由于流出的血液堵塞了
呼吸道而未能及时清除。可以想像,如果当时我就知道,这个实验可能会成功。小时候的另一个实验,是测试我姥家一把小刀是否锋利。用的测试用例是我的手
指。我把小刀按下去,没出血,再使劲,还是不行。结论,这把小刀不够快。但
是它能削铅笔啊。啊,我突然想起来,刀不是这么用的,应该"拉"。于是我按如
上操作,成功了。手指的血刷一下就出来了,止了半天。实验之前,我只想到实验的技术路线是否合理,而没有想到实验万一成功了的后
果。这大约是五六岁时候的事。小学的时候,就是在那个培养贵族的学校,我有一块手表,丹东产的机械表。那
个时候,这也算个不错的东西了,在我心里估计跟现在的ipad3有得一拼。问题来了,那块表是防震的。所以,我测试了。我用压腿的那种一格一格的器械
作为参照,每次抬高一格,把表扔下去,而且我注意到了是自由落体,不要用向
用力。很多次,我都失败了,也就是说,表都没有任何问题。真的是防震的啊。当然,你猜到了,后来表终于摔坏了,表蒙子裂了,表也不走了。实验,成功了。同上,我只设计了技术路线,没有考虑实验后果。那是小学五年级前后的事。当我们做任何破坏性实验的时候,我们应该想想当年那个傻小子,智商不能比他
更低。当我们想要检测某个变量的值的时候,我们也同样应该想想他,考虑无损
的检测手段。以上,是问题的二个方面,一定要确保实验是安全的,既要预计实验成功的后
果,也要考虑实验失败的后果。同时,还要考虑,是否有我们没有考虑到的程序
走向,它的后果是什么。这也是我们为什么要写实验报告的一个原因,因为可能的实验后果太多太复杂,
不能凭空想像。有的同学可能会说,现在我做的实验都非常非常简单,那么,写
实验报告的原因是:写实验报告是一种能力,它需要先通过简单的实验来训练,
然后你才能把这种能力应用在复杂的实验上。当确保实验是安全的时候,我们回到问题的第一个方面,要敢于实验,不要害怕。当你还什么也不是的时候,当你对一个系统还不怎么了解的时候,能设计实验整
坏它是非常困难的。更不用说摧毁它。黑客还是什么英雄找到系统的某个弱点,
然后爆炸啊什么的酷场景,只存在于科幻片当中,发生在你身边那台计算机中的
可能性微乎其微到可以忽略。对于一个强健的系统,只有真正了解它的人,才能摧毁它。就像,只有你真正爱
着的人,才能伤害你。而那些你陌生的没有任何期待的人,你又怎么会因为他们
做的任何事情而伤心。这个故事告诉我们:当我们是别人的陌生人的时候,可以
可着劲地折腾,但是当你走入一个人的内心,一举一动就都要小心。我还记得马
越同学文章里写到的她知道妈妈在目送她上学:我走得小心翼翼,因为我走在妈妈
的目光上面。不过计算机,强健得多了。因为它一般地,不会对你产生感情。只要你不使用机
械工具,比如榔头,你的计算机在你初学时是安全的。你不熟悉原理的工具,很
难用它解决问题,当然,也很难用它制造问题。所以,你可以大胆实验。有同学可能会说,我经常"正常"用着用着啪一下机器就不好使了。这可能勉强算大胆,但这不是实验。实验,必须有记录。这也是为什么航海家们
要记航海日记的原因--即使我们挂了,也要让后来人知道发生了什么。实验时,你必须记录你每一个动作。详细到你的同学可以根据你的记录重复你的
实验--这时,通常也可能重复出你造成问题的动作来。如果他按你的记录操作却
没有产生相同的问题,请参照后面的原则"对比法"。也有的同学说:我也不知道我做了什么,我不记得我做了什么,反正毛病就出了。那么你有记录么?如果有记录,那么分析记录,重复实验吧。人类区别于动物的
一个重要方面,就是能从大量的现象中猜测出原因或者瞎编出原因来。如果你没
有记录,那么重复实验并做记录吧。这种重复,不仅带给你如何解决这一个问题的知识;同时,它带给你更重要的,
实验的技能,这些技能也适合于以后更多的实验。以前我读到过《读者》故事里印弟安还是什么老人的,对要走出大山的年轻人
说,人生前三个字是"不要怕"。这和咱们的原则是一致的。后来这个年轻人历尽
沧桑回到山里,老人去世了,给他留了另外三个字,"不要悔"。咱们的原则是,
要确保能恢复到实验前的设置。为什么我们的原则不同于人生呢?因为我们工作在虚拟的世界中,所以,回到过
去真是易如反掌。前提是,你得记着过去是什么样的。你真的还记得过去么,比如你为什么走到此你,比如你曾经的理想?











