14条原则 (3) 一定要备份服务器

14条原则 (3) 一定要备份服务器这条原则的全文不是如标题所示。它的全文是:一定要备份服务器,一定要备份
服务器,一定要备份服务器,然后还要验证备份正确与否。其他的原则我都记不清全文,唯独这一条例外。太多故事反复验证这一条的重要
性。我的博士导师牛老师。一次我提到数据很重要,而硬盘很贵。他老人家教导我,
数据比硬盘宝贵。他有很多块硬盘,有些数据备份了不止一份。他的学生发表论
文的时候,要求把凡与此论文相关的实验数据全刻一张光盘上,然后他还要把这
些数据备份到硬盘里。有一些文献,在不同的项目或领域中都需要用到,他不是
做快捷方式键接过去,而是再复制一份。他说:数据比硬盘宝贵。所以,我从那以后更坚定地实施版本控制。当时还没有
git和cvs,我把每一版本起个这样的名字,xxx.20050315.221034.zip,全保存起
来。尽管如此,我还是丢过东西。丢东西有时仅仅是没有找到,而我那次比这个严
重,最后也没有找到。因为我备份了错误的东西。一段时间,因为要频繁地实
验,与电化学设备连接在线调试程序,而连设备的那台机器上不能安装编译环
境,所以我也备份可执行程序。结果,某个可执行程序终于验证是正确的了,但
是我却不知道它对应哪个源代码版本。我试图编译所有的源代码版本,把编译结果与验证了的版本进行二进制比对,这
时才深刻地直观感受,VC每一次编译的结果都是打了时间标记的,所以全都不一
样,每次编译都不一样。只好重新编译,重复所有的验证实验,直到找到某个源代码的编译结果与要求完
全相同。也即,把那些实验重做了N次。时间,青春,我感叹。所以,在程序设计中,应该备份且只备份源代码,因为二进制是可以随时编译出
来的。丢失二进制,需要花费的时间不过是编译的时间;如果多一个二进制版
本,就要回归测试了。在备份代码比较大的时候,备份不利丢些东西还有情可缘。比如鲁迅先生 (还是
他的弟子?) 就遗憾地提到他因为搬家遗失了重要的书信、书籍。我当时奇怪
过,那么重要的东西为什么不随身携带,贴心口窝放好?后来才知道,重要的东
西太多了,心口窝那块地方不太够。而那个时代,备份挺困难的,抄书费时间,
想留存手迹却没有数码相机。但是时代不同了,现在备份容易多了。带来的一个副作用是,大家以为容易的东
西就不值钱了。张老师有一次中毒,硬盘里的文件夹全变成隐藏的那种病毒。她说,"我这硬盘里
的东西真的很重要。"我说,"不重要。不然你怎么会把硬盘插在别人的机器上呢?""可是,我要给别人拷东西啊。"那就只能让他把硬盘插在你的机器上,而且,还要事先关闭U盘自动播放,还要不
使用资源管理器,而使用TotalCommander之类的文件管理器。不要相信任何人告
诉你说他的机器没有毒。因为你相信他的同时意味着两件事情,你相信他的人品
不会有意骗你,还相信了他的技术。详见此系列后文"永远不要相信你的用户"。就用一次硬盘没问题吧?其实病毒感染跟狂犬病差不多,感染率有多高不好说,
可能还挺低,但是致死率几乎百分之百。有位仁兄说过,"侥幸是悲催之母",回
答的就是这个问题。有个著名的墨菲法则,说的也是这个。它说,如果蛋糕掉到地上,一定是有奶油
那面朝下。为了避免这种情况,计算机的电源插座设计成D型,反了的话,就插不
进去;计算机的显示器、硬盘、PS/2口、USB口统统设计成了这种形式,反了,就
插不过去。因为如果设计成反了也能插进去,那就一定会有人这么干。Intel
586还是486就能转90度插进去,效果是烧掉。我烧过一个,非常烫手,还没等反
应出来就直接扔出去了。凡可能出错的,必然出错。我们所应该做的,不是做好准备承受出错的后果,而
避免出错。备份就是避免出错的一种有效手段。我有师妹曾经希望我帮助她恢复NTFS中的数据,那是她孩子的照片。我当时没有
找到解决之道。这些数据的宝贵之处在于,她的孩子不会再来一次这段年龄,那
种微笑和大哭永远不会有机会记录。程序员的代码丢了而没有备份,他对老板说,我的代码被猫吃了。一位出租车司
机师傅告诉我,他的手机丢了,通信录也就没了,所有电话一个也没记住。这些
只是小事。图书馆借书数据如果坏了而没有备份,就意味着同学们还书就要靠自
觉了,尤其是大四学生马上就要毕业的时候。教务处选课系统的数据如果没有备
份,同学们就只好跑上来重选,花上一两个小时。这些事情都发生过。有的数据
后来找回来了,有的,就没有那么幸运。一定要备份服务器,一定要备份服务器,一定要备份服务器,然后还要验证备份
正确与否。备份的介质多种多样,取决于你希望留存多久,数据量有多大。我们
用磁带增量备份,用光盘,用移动硬盘,用U盘,用网盘。有这样几条原则。1.多次备份,不同的介质。光盘是会老化的,有一天可能就读
不出来了,或者没有光驱可用;2.除非写保护,否则不允许读。移动硬盘或U盘,
如果没有写保护,除非只在你的机器上用,而且你是个小心谨慎的人,否则感染
病毒以后跟你把所有数据都写到/dev/null上没有什么一个样,纯粹是浪费感
情;3.本地,你自己随时可以访问。网盘,除非有对商家的惩罚条款,否则你怎
么能指望他像你一样重视你的数据。硬盘的价格在数据面前,不值一提;硬盘的投入在人的素质面前也是一样。中日
甲午海战的时候,双方用的舰船据说没有时代的差别,而我们又听说中国海军的
士兵会在炮管上晾被子。你就是买了世界上最贵的服务器又怎么样,如果没有会使用它的技术人员。那不
过就是金属和塑料的组合。没有了人的眼睛,天空的颜色不过就是一种波长,又
有何美感可言。可叹很多领导仍然停留在以设备指标的年代,虽然,他们比把机
器都装库房里怕用坏了的那些要好上很多。不过,他们似乎并不太明白,没有
AK47的战士是低杀伤力的战士,没有战士的AK47却一点杀伤力也没有。同一把枪,甚至不同级别的枪,不同的人使用,区别甚大。相信打CS的同学对此
都深有体会。备份的要考虑的因素:丢失数据损失的时间 (恢复,下载,重写) 和机会成本,
保存的代价。所以,在写东西的时候,我每个段落保存一次,有时备份当天的所
有文档。因为我比较脆弱,不能承受一代段落几十个字的损失,虽然我打字并不
慢。备份应该有多可靠?参见攀岩。保护措施,要一直持续地做,而且要一直可靠。
备份的系统要跟正在运行的系统一样可靠,甚至更可靠,而且一天也不能停止备
份。备份无效而却在它的身上托付终身,比没有备份可危险。顺便说一句,"备份"的另一个含义是"后援"。古龙讲过一个故事,贯彻了极佳的备份原则。在某人的床下有个竖直的洞,洞下
是一条水道,上面有条船,船里24X7有个人在等着时刻开船。等这个家伙万一哪
一天遇刺的时候从这里逃跑。因为这个备份系统代价是生命,所以它如此可靠一直可靠。我们备份失败的代
价,其实也是生命。备份失败的代价是时间,恢复数据的时间。而时间,正是生
命中最不可恢复的部分,而且不可备份。

14条原则 (2) 首先检查最简单的:例如,MFC播放avi的时候在上面画东西

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条原则,我有一个不良习惯。我往往最后才检查最简单的或最
可能的,尤其是年轻的时候。当时是希望借此积累经验。现在,我更希望把那些
用于积累经验的实验,放到解决问题以后。当然,问题解决以后,可能就没有情
致再去积累经验了。相对于经历本身,我们原始的渴望直接想得到的,往往是终结那一刻的快乐。所
以,我们可以经常向心中的小兽投食:你看,又一个可能的原因排除了,又一个。
这些小奶酪,安慰我们,使脆弱的我们可以坚持走完全程。虽然,那些都不是原因也不是结果,但是那些一路伴随我们的,该记录下来。在
最终审判以前,我们任谁都不知道哪个才是正解。如果没有记录的话,当那一刻
到来,你却早就忘记了如何走到这里。正是那些最简单的所有伴随我们的事件形成了我们,当你开始忘记,你就失去了
自己。

2小时行走12公里

2小时行走12公里开了1小时45分钟的会,定下来一个框架,有三位同学分别去写代码了,明天看进
度如何再做定夺。虽然只是定框架之类的工作,很累。我想,我老了。我常跟朋友们开这样的玩笑,你老啦,你也老啦,你们跟不上时代啦。心里,有
时还会加上一句老gada的话,不雅,就不复述在这里了。他人在伦敦,过着美日
子,可能早就忘了当年的理想之一,在师大二舍建XX集团了吧。如果老gada看到
这段话,楼已经有了,两座塔楼,足够大。你老了。其实这是一句夸奖的话,意思是,你超脱了这个时代,不再跟随流俗,
开始有了自己的见解。但是,我老了,这不是夸奖。频频梦到看不清楚东西,在
梦里一个人弯着腰伸出手探寻着,我有多么恐惧。今天开会的显示器离桌缘够远,我只好抻着脖子贴过去看。这种姿势,难以保持
编码十分钟吧。更多的时间,我靠在沙发里,眼睛什么也没看,嗓音沙哑,谨慎
地讨论各种方案,先想到各种失败的可能。用笔,用纸,画些乱七八糟的图。我看到代码在里面流动,可是自己却不能亲手去写。这1小时45分会议以后,我出发,徒步2小时行走12公里。我看到满地的冰。各种
各样,雪化成水然后凝结的坚硬致密的,铁黑色;表面一层冰下面是空洞踩上去
卡卡响的,苍白的。我看到西边的落日,有时昏黄,有时暗红,有时是在凛冽的
风里飘摇的灰白。2公里,我累了。世纪广场,没有一辆车在斑马线上减速。所有的司机,都没有学
习过交通规则,或者,他们都忘记了。下次我应该捡几块砖头,把凡是不停车的
风挡都砸碎。我犹豫了,这次最终放弃了。我想了很多,甚至想到昨天看到介绍
抑郁症的文章里提到唐缺先生的话,即使非常小的事情,也会焦虑。最后我断
言,能够想这么多最后却没有砸,我一定是老了。某次路过这里,是和李记者同行。那一次,我们徒步了整10公里。然后他说什么
也要减速,剩下的不到2公里,我们走了似乎1个小时。然后,是烧烤。最近常常
出现什么名字到嘴边,却想不起来,比如烧烤店的名字。这是以前没有过的。你
知道我要说什么,我不说了。恩,我没老,我想起来了,是大韩食代。不是大
唐,也不是高丽。如果我错了,请不要告诉我吧。然后,似乎是转瞬间的事,李记者就去了天津,在那等我去喝酒了。等我去看他
喝酒,不对,他糖尿病也不能喝了,我们两个人只好看马利喝酒。他在长春的时
候,我们也会经年而不相聚。现在也没有什么不同,似乎。这条路,我一共和三个人一起走过,如李记者一样,此刻都各在艰难时代,也如
同我一样。所以,你可以想像,我们都在努力求生。我徒步2小时,也正是为了能
有精力继续别的。这就像打帝国的时候,我只喜欢打仗,喜欢骑兵攻城掠地,喜
欢投石器吱嘎嘎绞起火球然后忽地甩出去,我不喜欢农民种地,不喜欢采矿也不
喜欢挖石头。可是,为了能尽兴打仗,不得不做这些枯燥的事。作弊弄到钱,也
一样能造出骑兵推平敌人,可是却没了滋味。如果作弊能得到快乐,我们不开机
敌人甚至都没有生出来,岂不是更妙?沿着卫星路继续,没有一个斑马线能让我通过。最终,我发现前面没有路了,两
条车道斜着并在一起,没有斑马线,更没有红绿灯。原来这就是这些路的两侧没
有人行道的原因,设计师根本没有打算行人通过。这时我想的是,如果被车撞飞了,司机会不会以高度近视立体视觉较差为借口而
少赔我钱。到时候谁来替我砍他?我只好在那里过马路。呵呵,很害怕,非常害怕。从结果上看,既然我还活着,
司机们一定很好地把握了安全距离,而我只好相信他们,把性命交给陌生人。货
车飞快,毫不减速,我担心车掀起的风能把我抓到车轮下。出了一身汗,终于通
过四五处双实线到达对岸。以后出行,得必须先确实哪里有红绿灯了。前路漫漫。之后,我穿过一个建在高压线下的公园,穿过灰尘扬起的街道,我路过干涸的人
工湖和拦腰截断的河。我看到高压塔旁的老人蹒跚着走过,像走在3D建模未完工
的城堡之下,我看到楼群间的落日被立交桥分割,在城市蒸腾的热气中抖动着,
像远处的海水泛着金红的光茫。这一路,真的很美,感动得令人流泪。

果然,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。是以为记。