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

周老师,李记者,朱老师

周老师,李记者,朱老师周老师周老师年底要去美国了,佐治亚,研究分布式系统。周老师为人稳重成熟,我长期误认为他比我要年长,结果后来知道还比我小一岁。
他非常经常充满感情地鼓励或批评同学们,琐碎之处像位大妈。某次丹麦项目,第一次课,我见到他咣咣把同学们一顿批,你们不应该这样,你们
不应该那样,你们这样会如何如何,你们那样会如何如何。真是把事情掰碎了揉
细了,然后喂给小鸟一样。相比之下,我非常惭愧,凡事只要声明过一次,再说
第二遍都懒得开口。他在前面说,我坐在下面偷偷擦汗。仿佛他在说,你怎么能
这么不负责任呢。讲过的东西,如果同学们忘记了,他似乎都算作自己没有说得够清楚。包括同学
们故意忘记的时候。同事之前,很多工作,别人不乐意干的,他就说:那我来干吧。配合他的口音,
很理所当然的样子。这里的别人,也包括我。大多涉及另外一些人的故事,这里
就不展开细说了。总之,后果是当他说要出国的时候,我头脑中反映出的第一件
事是:这个任务和那个任务,以后谁负责啊,对了,还有那个和那个。一时,难以找到一个能替代周老师工作的人。我不是领导,不负责分配任务,声
明:考虑这些只是担心领导把任务匀给我而已。周老师是一个必须存在,不可缺少的人。不知不觉,他承担了非常多的工作,又
难以被别人替换。这正是一个人存在的价值,一个人独特的不能被遗忘的地方。Lars说,"就是你
那个同事,头发那样的那个。"Lars说这些的时候,用手向上扶着自己的头发,
比划着周老师所有头发都向上立起来的样子。除了周老师,还有一个形象,他的
头发也是向上立着的。这位仁兄也是位酷哥,名字叫"阿童木"。坏蛋抓他的时
候,喇叭里叫:"抓住他,那个尖尖头发的少年。"周老师是一位立立头发的,少年的形象。我想起王辉老师教导我的一段话,放在这里非常合适。他说,对待众生 (王老师
是佛教徒,所以会有这样的措词,你可以理解为"人民",但请不要理解成"老百姓
")的时候,要像对待孩子和父母。像对待孩子,是指像父母一样关爱孩子,保护
他们,避免伤害,原谅他们的过失;像对待父母,是要意识到自己如幼小的子女
般仰仗着父母,尊重他们,尊重他们的意愿和智慧。头发硬而直立,我记得算命的说是脾气暴躁的象征,不过于周老师并不适用。他
不仅耐心细致,同时能以对待父母之心对待学生,也能以对待孩子之心对待学
生,我不及其万一。这里的学生,当然也包括像我这样挑活拣活的家伙。---------李记者李记者跟我的好几位同事喝过酒,包括周老师,大家抢着付账,除了我。偏偏李
记者不是我的同事。他也不是记者。李记者的名字是 李粲,因为写起来非常费事,所以我编故事的时候就给他起了
个名字叫李记者。这不是职业而是名字,类似的比如李胖子,也是名字。李记者去了天津。他辞职之后,去天津以前,每天整得比没辞职的时候还忙,整天不知道帮哪个朋
友写各种程序。我说,你的朋友真不够意思,反正我没有在这个应该休息的时候
找他工作,觉得自己非常够意思。他跑大连又天津,我也忙着各种事情,终于在他去天津前的一天小聚了一下。我
准备了咖啡,选好了饭店。然后,他来了,带了个笔记本,上面印着个大大的
DELL字样。打开这个笔记本,大美女在屏幕上,下面是键盘。他说,"我现在都用
这种笔记本啦",接着,翻开键盘,下面是纸的,一页一页的笔记本。我说:你不是来辞行的么,带这个干什么?心想,你莫不是要送给我?这么沉的东西。他说:我们谈这个项目吧。我说:啥?于是,他在离开长春以前,我们最后一次见面,变成了又一次技术座谈。第二
天,他飞去了北京见刘典同学,发了张照片,很落莫的样子,穿一身绿得跟迷彩
似的衬衫,挺着肚子,像对着笔记本策划什么的格瓦拉。补充,李记者比我小很多,甚至快要不是一代人了。但是,因为如同周老师一样
成熟稳重,所以我和他都短期误以为他比我年长。结果,又错了。又及,我与李记者的初次见面是在领奖台下。斯时,我穿一件破旧羽绒服,他穿
一身不甚合体的西装,我拿着一本福尔摩斯探案集在看,他想借,我没同意。再
相会时,不知道该是何种情形。----------朱老师朱老师的研究方向是网络安全。朱老师也要出国了,去加拿大。她跟我哥同岁,我研究生的时候教过我计算机网
络。当时我寻求更高深的理论以解决实际工作中的问题,所以巴巴地考研。后来
有同学问过我为什么当初要考,这就是答案。朱老师开课之前的假期,我正在开始看我的第一本英文原著。那个时候没有阅读
英文小说的能力,也对新闻完全不感兴趣,但是读计算机网络书却很有兴趣,能
够投入。当时我正读的是 Doulas E. Comer的 计算机网络与因特网,每个如醉
如痴的。然后朱老师开课,指定的教材怡怡就是这本,我甚为得意。与牛人略
同,这也激励我努力把它读完。后来,跟朱老师做一个项目,把我刺激到了。事实上,我只做了一个开头,然后
就绝望了。当时朱老师的一个方向是主动路由,她让我看 bowman 系统,一个主
动路由的研究实例。我回家架起 sourceinsight 看代码。几天以后,我找到朱老师,说,这绝对整
不了,反正我是不行了。这是一个小型的操作系统,而且,我看到作者们对数据
结构的娴熟掌握。很多常用的结构 dqueue啦,list啦,stack啦,他们都自己实
现了一个小的版本,放在了utilities下面。要知道,这只是整个工程中最小的
一部分。我尽我所能,能够看明白能够看到的,只是我万无能力完成。后来朱老师就让我
把前面的体会交待给了一位接班人,滤除其中的绝望情绪。当时朱老师在自己办公室里支起那几台破机器,嗡嗡直响。几位本科同学来找
她,谈要不要罢餐抗议食堂什么事。朱老师像周老师一样跟学生们耐心地谈着。当时我心想,我一辈子也当不了辅导员了。后来刚到系里的时候,我颇担心了一
段时间,因为大家都说年轻的得先当兼职的辅导员一段时间。结果担心是不必要
的,我想领导们意识到了我完全不具备这种能力,想来他们的心情就像我看
bowman 的代码时一样绝望。----------之所以我把这几位放在一起回忆一下,是因为我想未来的世界可能就是这样。大
家奔起于欧洲美国非洲等各个地方,有些人可能还要往返于火星和地球。我们相
聚之日不多且甚短。小学的时候听老师讲《赠汪伦》,说李白 (此李白诗人也,不是我家的老猫)和
汪伦 (此汪伦与李白似无基情,请以传统眼光视之)分别了,李白这个痛苦啊,
听汪伦唱歌的时候心里非常难受。我当时想,其实他们关系可能不咋地。如果友情真的那么深厚,为什么不生活在
一起呢?李白为什么非要追求啥啥,离开桃花潭呢。如果一定要走,汪伦不能跟
着么。很多年,确切地说二十多年以后,我终于开始明白。我写过一篇博客,感叹义气
尽,讨论了单雄信的那帮哥们有多么不够意思,如程咬金先生所说"该杀"。但是
某一天在雪地里踩着的时候,我突然说:为什么单雄信不能改变自己的立场,顺
从自己的那些朋友们呢。他不应该说别人义气尽,他明明自己也不怎么够意思嘛。最后,大家都没有留下来,各自去追求美好的东西体验不同的人生去了。这就是未来。我们将奔波于整个地球的各个角落。你会发现,今天和你一起喝酒
的朋友,明天就消失了。他给你留了个纸条,说自己心情闷的时候,就跳上了一
辆火车,已经过了俄罗斯。也许,会停在某个地方,也许,明天就穿过苏伊士了。这就是未来。我们在流浪中短暂相聚,一起在烧着火的大铁桶旁烤了一会儿,然
后又各自跑开。谢谢你,谢谢你刚刚递我的那瓶啤酒。挺苦的,不过真带劲。