果然,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++驾驭的。
那些细心为你考虑所有问题,希望你连思考都不必的,一定是希望驾驭你。尊重的特征,是真诚。与工具的交流是这样,与人的交流也没有区别。如果我们交流,我要知道所有发生的事情,我可以选择放弃知道,你也可以选择
拒绝告知。但是,欺骗、隐瞒、诱导、强迫、暗示并考验,都是对我故意冒犯和
挑战,此时,我就不得不以反击证明我的智商比你估计的要高一些。或者,你明确地告诉我,在这件事中,我是工具,因此不必负有人类的责任。然
后,我来告诉你我是否愿意。

3月16日,纪念日

3月16日,纪念日2005年3月16日,中国最大的BBS水木清华转为只供校内使用。此前后,北大的一
塌糊涂站、南大的小百合站等纷纷转为校内使用。转为校内使用的意思就是,一
个你每天可以见到的站点,那些熟悉的面孔,瞬间从这个世界上消失,永远也没
有再见到的机会。你甚至没有机会说声再见。很多人慢慢淡忘了3月16日,于是一年又一年过去了。于是人们原谅了QQ,原谅
了360,也原谅了关闭BBS的那些人。2012年3月16日,微博实名制。同样的原因,我永不使用QQ。是以为记。

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有得一拼。问题来了,那块表是防震的。所以,我测试了。我用压腿的那种一格一格的器械
作为参照,每次抬高一格,把表扔下去,而且我注意到了是自由落体,不要用向
用力。很多次,我都失败了,也就是说,表都没有任何问题。真的是防震的啊。当然,你猜到了,后来表终于摔坏了,表蒙子裂了,表也不走了。实验,成功了。同上,我只设计了技术路线,没有考虑实验后果。那是小学五年级前后的事。当我们做任何破坏性实验的时候,我们应该想想当年那个傻小子,智商不能比他
更低。当我们想要检测某个变量的值的时候,我们也同样应该想想他,考虑无损
的检测手段。以上,是问题的二个方面,一定要确保实验是安全的,既要预计实验成功的后
果,也要考虑实验失败的后果。同时,还要考虑,是否有我们没有考虑到的程序
走向,它的后果是什么。这也是我们为什么要写实验报告的一个原因,因为可能的实验后果太多太复杂,
不能凭空想像。有的同学可能会说,现在我做的实验都非常非常简单,那么,写
实验报告的原因是:写实验报告是一种能力,它需要先通过简单的实验来训练,
然后你才能把这种能力应用在复杂的实验上。当确保实验是安全的时候,我们回到问题的第一个方面,要敢于实验,不要害怕。当你还什么也不是的时候,当你对一个系统还不怎么了解的时候,能设计实验整
坏它是非常困难的。更不用说摧毁它。黑客还是什么英雄找到系统的某个弱点,
然后爆炸啊什么的酷场景,只存在于科幻片当中,发生在你身边那台计算机中的
可能性微乎其微到可以忽略。对于一个强健的系统,只有真正了解它的人,才能摧毁它。就像,只有你真正爱
着的人,才能伤害你。而那些你陌生的没有任何期待的人,你又怎么会因为他们
做的任何事情而伤心。这个故事告诉我们:当我们是别人的陌生人的时候,可以
可着劲地折腾,但是当你走入一个人的内心,一举一动就都要小心。我还记得马
越同学文章里写到的她知道妈妈在目送她上学:我走得小心翼翼,因为我走在妈妈
的目光上面。不过计算机,强健得多了。因为它一般地,不会对你产生感情。只要你不使用机
械工具,比如榔头,你的计算机在你初学时是安全的。你不熟悉原理的工具,很
难用它解决问题,当然,也很难用它制造问题。所以,你可以大胆实验。有同学可能会说,我经常"正常"用着用着啪一下机器就不好使了。这可能勉强算大胆,但这不是实验。实验,必须有记录。这也是为什么航海家们
要记航海日记的原因--即使我们挂了,也要让后来人知道发生了什么。实验时,你必须记录你每一个动作。详细到你的同学可以根据你的记录重复你的
实验--这时,通常也可能重复出你造成问题的动作来。如果他按你的记录操作却
没有产生相同的问题,请参照后面的原则"对比法"。也有的同学说:我也不知道我做了什么,我不记得我做了什么,反正毛病就出了。那么你有记录么?如果有记录,那么分析记录,重复实验吧。人类区别于动物的
一个重要方面,就是能从大量的现象中猜测出原因或者瞎编出原因来。如果你没
有记录,那么重复实验并做记录吧。这种重复,不仅带给你如何解决这一个问题的知识;同时,它带给你更重要的,
实验的技能,这些技能也适合于以后更多的实验。以前我读到过《读者》故事里印弟安还是什么老人的,对要走出大山的年轻人
说,人生前三个字是"不要怕"。这和咱们的原则是一致的。后来这个年轻人历尽
沧桑回到山里,老人去世了,给他留了另外三个字,"不要悔"。咱们的原则是,
要确保能恢复到实验前的设置。为什么我们的原则不同于人生呢?因为我们工作在虚拟的世界中,所以,回到过
去真是易如反掌。前提是,你得记着过去是什么样的。你真的还记得过去么,比如你为什么走到此你,比如你曾经的理想?