ACM-ICPC全国邀请赛,长春今天早晨做梦,还在对周老师说:"你们先整,到关键的时候叫我啊。"也许是老
了,以前似乎没有过这么深刻的印象,以致于结束以后还要念念不忘。因为在比赛前腰间盘突出,弯腰很困难,在整个比赛期间,就是坐着或站着看大
家工作。站着够键盘都吃力,真正能伸手的工作,就非常有限了。时不时还要找
个平的地方躺一会,整个是半残障人士。所以,经常是周老师叫我,"你得来了
",然后,我才出现。周老师身兼N职,累得在热身赛的时候在现场睡着了。李老师一直值守在服务器旁
边,她离开服务器的时间总计不到10分钟,且表现出10余年unix管理员的优秀素
质。网络中心的娘家同事们送来了12台交换机和1台千兆交换机,及无线键鼠一套,还
架设了三个无线AP,图书馆娘家的同事送来U口键盘2套。ACM比赛是个大事件。不少计算机学院的同学看到了自己与别的院校的差距,还
有人体验到了生活,累得很快乐。一定还会有老师站出来说,大家辛苦啦,干得
都不错。我只是个技术人员,只看到技术。非技术类的同事和同学们的辛苦,亲眼所见,
但并无亲身体会,就不在这里矫情说什么辛苦了我爱大家之类话了。且我不是负
责人,只能代表自己,不能代表领导和广大人民群众。以下,技术方面的小结和乱谈。1. 系统边界当完成别人交给我们工作的时候,有两种境界:一是精确完成,二是有创意的完
成。请注意,有创意的完成,是以精确完成为基础的。也就是说,创意必须在精确之
上。非精确而有创意,这并非是一种境界,而是一种极其不靠谱的混蛋做法。你要么不要答应这份工作,要么就完成它。如果不能完成,尽可能提前通知。而很多人的做法正相反:或者临期不完成,且没有事前通知;或者完成得半正确
不正确,只有重做才能用--或者说完全不能用。比如下面这段对话就比较典型。我:要求你完成的XX功能,我以为你已经做完了,没有想到你需要现场调试。没
做这个计划。程:一会就能调完我:问题是明天就得安排把装机器的屋子开着。评论:我确实见到过不少人,说好地联调,但是到了现场才发现他什么也没做,
准备一边做一边联调。这种完全不把别人的时间当成人类时间的做法令人愤怒。
有个别领导召唤我去以后,才开始找要给我的材料,然后找不到或者找很久,我
说过:"你慢慢找吧,我先走了。"我们约见是要讨论只有约见才能讨论的东西,
你自己可以独自完成的,请独自完成。我一点也不想陪你消耗生命。对话继续。我:好了,明天屋子会开着,你调吧。这时有同学告诉我,程从二楼下来了。此前我们的电话的原因是他在二楼,我在
一楼。我说,我还没让他下来啊。这涉及到下面的另一个问题,有始有终,稍候
再说。我:你等会再下来,把机器关了,把主机和显示器的电源线都拔了。程:好。等程同学出现在我面前,我问:电源线你拔了么?程:没有啊。我把插排开关关了。我恨不得踹他一脚。有同学事后说,你肯定是没说清楚。我记得我的原话,拨电源线,不是只断电。我:我让你拔电源线啊,那开关要是坏的呢?程:插排开关是好的啊。我:如果着火了呢程同学跑去纠正了。如果着火了,2个亿的体育场就毁我们手里了。有的同学说,唉啊,不能啊,有
防火,有ABCD,有甲乙丙丁保证。如果什么都要别人保证,你的贡献在哪里。要别人的保证的,就是孩子,是需要
别人照顾因此不能以成年人的身份受到尊敬。事实上,我不得不强调,程同学是我所见过的非常优秀和聪明的同学。他的工作
极有效率,程序甚至美工卓越。举他为例,真正的原因是他的例子还值得一举。
有位同学在负责老师说"明早班车是7点,别迟到了"的时候,说"不能7点10分么"。我非常震惊。不仅对"7点10分"这一要求,也对负责老师会提到"别迟到了"感到震
惊。这是多么简单的现代汉语,7点的意思就是7点,不会包含7点10分的。留作业
的时候我要说,"最迟21日的意思是21日晚24点之前",我觉得自己很弱智,对听
我讲这话的同学的智力也是一种侮辱。但是,我们又乐此不疲,你认为原因是什
么?在你有各种创意和扯淡逗乐之前,能够精确地完成你所承诺的事情,极其重要。
重要到,有时候别人更不负责任,也不必指责。像我现在所做的,就是弱智的没
必要的事。我们就在比赛前推迟开赛1小时,因为40台左右选手用机不能引导。那是因为前
一天准备机器的时候没有进行最后一次引导检查。不过,这并不影响上面的讨
论,因为我不想说我多么认真,而是仅指出不认真是多么得令人不能忍受--我自
己的不认真也是一样。系统边界是我们对于外界的承诺,即我们可以承担何种责任。这是我们在一个更
大的系统中存在的原因。既要精确完成自己承诺的,同时,也不应该超过自己承诺的范围。比如下面这件事。热身赛前一天,我们在测试计算机接大屏幕的时候,所有人都没有找到是谁负责
大屏幕。我,周,封,刘鹏同学在玻璃房子里面束手无策,已知体育馆的管理员
不知道该找谁。此时我犯了一个错误,即开始自己解决如何连接这一问题。事后张老师指出,"
你应该找我,我负责协调。"我错了。避免麻烦应该像李辉老师那样,跑到外面
借交换机,但是不能越过边界。我把大屏幕接上了,人家负责接线的人找上门来兴师问罪了。这是我的错误。类
似的,我对程同学说过,"你能不能不评价我们的工作","你最好别表现得好像
周老师的领导似的"。类似的,我对张同学专家说过,"你有解开U口的能力,但
是你没有解开U口的权限。"类似的,我也评价过李超同学专家,他的成熟和技术远超过我们的同学。其中非
常突出的一个表现就是,他每一次都是建议,而不是"你们应该如何"。周老师说,按我以前的做法,我会开除一些志愿者。其实,我一直以为那是和善
的作法--因为我及每一个人都没有权利指导别人该如何为人,我们所能做的只是
消除可能的隐患--尊重开除的志愿者选择的权利。工程中,大系统如同齿轮,每个超出或低于设计要求的,都可能破坏整个系统,
应该剔除。2. 有始有终现场,我看到三个人躺着过,其中一个人是我,腰间盘突出不能久坐的。同事们
提到过志愿者同学有躺倒的,有坐一边发呆的。是体力么?大家的体力确实不怎么好。大连ACM赛的时候爬小山包,几位选手累得够呛,比
我们这些老一些的家伙体力更有不如。但是我并不相信这是体力的问题。而是--对付。对于不喜欢的工作,要断然放弃,不要勉强,无论里面有多么大的好处吸引你。
放弃它也饿不死你的。即便是好处当前,有些同学还是会放挺的。我在他们的身上看到了孩子气--拒绝
成年,拒绝承担责任。可能青春期现在延长到30岁了吧。人类将成为很早进入青
春期很晚退出青春期的动物。你是否读过 威尔斯 的 时间机器。阳光下那些白白净净的家伙,晚上都是要被
吃掉的。它们就是永不长大的幼儿。中间放挺的有之,还有任务结束不回馈的--大多数。如果任务结束不回馈消息,
发出任务的人就得轮询,而不能采用中断机制。也许,不及时回馈坐那等的一个
动机,正是希望休息,也许只是发呆没有主动性而已。所以,我不得要不要求跟我较熟悉的研究生同学。你们要一直跟着周老师,看他
做啥就接过来做;你们做完什么事情要及时报告,好分配下一件工作。也许大环境使然吧,因为领导通常也不在结束的时候通知"你们可以解散了。"就
像我们贴上禁止啥啥,很少在取消的时候贴上取消禁止,那么胆大的就尝试吧。
契约和法的精神于是全宣告失效,虽然小资产阶级们成天叫嚷这两个时尚的词儿。3. 人,生而平等说好第二天戴工作人员牌可以进出,我到体育馆的时候,被门卫告之,"得等你
们领导老师来了一起进。"我事后问过协调的张老师,"请你沟通一下,一起是什么意思,全到齐么,缺一
个也不能进么。"后来知道,协调的张老师通知了体育馆的领导,但是体育馆的领导没有传达消息
给门卫。所以,有同事说,"门卫只是不知道变通而已。"我反对。"如果他们不知道变通,为什么没戴牌的付老师和封老师就放进去了。"我当时的决定是,明天,我要戴牌直接进,不会等"聚齐了",如果不让进我转身
就走。第二天,有志愿者值班,顺利通过。不放我及我们进的原因是:我们像学生。同学们都知道我不是学生,一起打趣我,你不就是老师么。我不是,我与同学共
进退,我甚至不愿意称呼学生为"学生 (第二个字轻声)",因为这个字眼在北方方
言里已经具有了歧视的意味。(我坚信不出10年,大多数同学都会开始俯视当年的
这些老师了。)人,生而平等。因此必须享有相同的尊重的权利,而且不是故作姿态的假惺惺的。我所说的平等,并不包括:老师订盒饭,同学去食堂,当然也不包括我吃麦当劳。
我吃麦当劳是我自己付钱。老师订盒饭类似于另一件事。几年前计算机学院四楼有个打水的屋子,里面有纯净水,很多同学去打,领导和
老师们都说"唉呀,喝就喝呗。"我一直觉得同学去打水是错误的,跟关 (刘?)同
学提到过,她说,"就喝点水么。"问题是,水是花钱买的,即使只有一分钱,那
也不是你的。所以,平等并不包括这些。平等仅包括把你视为成年人 (其实很滑稽,你的确是
成年人,这事实如此清晰),作为成年人尊重和放弃。有同学说,我们不是还在成长阶段么。也许吧。不过以下两种待遇你只能选择其一而不可兼得,要么作为成年人,要么
作为青少年。你不能享受成年人的待遇,行事却是青少年。这多么像有些人一边
呼吁女权和男女平等,一边呼唤农耕封建社会的制度。我为争取平等的尊重付出了代价。2004年,我对领导说,"你对门卫出示证件么。
"领导说,"他认识我。"我说,"他还认识我呢。"没有平等,就没有合作,于是,我
被辞职了。类似的,如果你希望作为成年人被尊重,请做事像个成年人。4. 脚本我一共写了两个shell脚本,都非常短。一个用于备份服务器的答题记录,另一个用于
传出答题排名 (board)。之所以使用shell脚本,而没有采取任何看起来更高端的工具,是因为shell脚本
足够短而可靠,同时,只要是Unix系统管理员都能够维护。备份的脚本,每5分钟把pc^2 (比赛用系统)压缩并备份一次,打时间戳作为区别。
计划是如果服务器完蛋了,立即在另一台备用服务器上解压缩然后继续比赛。脚本如下。#!/bin/bash
while [ 1 ]
do
DATE=`date +%C%y%m%d.%H%M%S`
echo "------------------------" | tee -a backup.log
echo $DATE |tee -a backup.log
tar cvfz pc2.back.$DATE.tar.gz pc2-9.2.1 1>> backup.log 2>> backup.log
echo "done"
sleep 300
done讨论过的几个问题如下。* CPU负荷:压缩需要消耗CPU,这是否会导致服务器过于繁忙?不会。因为压缩每5分钟一次,到最后pc^2积累的数据最多的时候,最慢也会在10秒左右
结束。同时,因为评判时程序的运行是在裁判机上,服务器的CPU大部分时间闲
置,只有在大量提交的时候,可能由于网卡不够好,网络通信占用了一些CPU时间。
与热身赛时偶像给的压力测试题在自动评判情总下的海量提交所造成的CPU冲击相
比,tar的那点时间根本不算什么。这样,在服务器崩溃时,我们可以回退到至多5分钟前的数据。有同学提出,我们是否可以在服务器崩溃的时候热切换到备份服务器,让赛场内
的选手不觉察。这样,当时用户的体验可能不错,不过长久看来,受骗的感觉并
不好。所以,我们事先计划,只要服务器崩溃,即使选手不通觉察,我们也一定
会暂停比赛,广播通知。* 为什么不在同一台服务器上继续比赛因为服务器崩溃的原因至今不明。大家都猜测是pc^2使jvm堆分配时out of
memory,但是目前都没有日志作为证据,甚至没有一个亲眼见到证据的人站出来
发言。所以,不能完全断定服务器崩溃的原因,保守的方法就是换一台服务器。* 为什么不用cron/at而使用sleep为了其他人维护更加方便。尽可能不假设别人拥有相同的技能,是厚道的做法。
如果使用cron,当别人问到怎么用的时候,说"看手册"去,确实很酷,但并非合
作的态度。而sleep就在shell之中,可以认为是自文档的。让别人满机器猜测寻
找你放的东西,这种感觉掉过来感受一下就知道是什么滋味。有名言曰:程序员最痛恨的两件事,一是写文档,二是读没有文档的代码。别人也是人类,因此应该把别人当作人类看待。* 为什么不备份到别的地方去,比如U盘或者网络我亲眼见到在服务器上插U盘导致windows服务器蓝屏死掉,当时正在进行百人左
右的考试。因此,在正运行的服务器上插点什么东西,是不安全的。不备份到网络考虑两个原因:一是会占用带宽;二是麻烦。确实可以使用rsync
之类的工具,但是反正服务器死掉是要广播通知的,恢复比赛所需要的时间是5
分钟还是1分钟,没有多大差别。另一个脚本是上传成绩,分两部分。第一部分,lftp脚本:open 192.168.1.230
user upload 口令
cd ~
repeat 60 mput *html
bye第二部分,调用上述lftp脚本的shell脚本。#/bin/bash
lftp -f upload.lftp之所以要有第二个脚本的存在,同样是为了别人用起来方便。在别人不知道怎么
用的时候洋洋自得地说,"这不就是lftp脚本么,这么用"非常不厚道。之所以用ftp是因为它用起来简单。之所以不用程同学的非常优秀的代码从服务器拉数据,而是坚持推送,是因为我
不信任他。保证服务器工作正常是我最主要的工作,这一工作及责任,我不应该
移交给他人。我担心程同学没有按他承诺的频率拉数据,我担心pc^2 api有bug会导致服务器
崩溃,我担心程同学在我要求封板的时候依然拉数据。等等。而推送数据能避免
所有上述问题。提到信任,建一说过:人不信人枉为人。我想了好几天才答复:我们不能把自己
的责任交给他们,仅以信任约束。信任别人包括两个方面,信任他不会骗你,和信任他有能力不骗你。后者,就是
移交和推卸责任。所以,虽然程同学的代码很优雅,我也仍然坚持这个笨办法。5. 小结对不认真的同学,及自己,我总是想起甲午海战。甲午海战的时候,中国和日本都拥有当时几乎同等先进的舰船。但是,据说我们
的士兵甚至在炮筒上晾晒衣服。甲午海战,中国大败,这次失败的影响一直持续
九一八到1937到今天。当我们对这些理当亡国的混蛋咬牙切齿的时候,当我们也同样不认真的时候,我
们所做的又与他们有什么不同。所谓尊严,从来不是施舍,而是用血和汗水换来的。