大连,第36届ACM国际大学生程序设计竞赛,亚洲区大连赛区预选赛。

大连,第36届ACM国际大学生程序设计竞赛,亚洲区大连赛区预选赛。目前的战况,最牛的队已经完成8道题了,我们两个队,每个队2道题。软件工程
实践的数据告诉过我们,最牛的程序员一个人可以抵得上十个程序员。诚哉斯言。昨天,热身赛前,和两位教练去赛场里转了一圈。最靠近门口的,刚好是清华的
一个队。一位女同学正站在那里,我从她的视线里穿过,看到她漠然的目光看着
不知道什么地方。不高,消瘦,黝黑。我想起了当年哈尔滨比赛那个初中生,一
个人作为一支队伍,这支单人队伍完成了3道题,似乎排名也颇靠前。太多牛人值得羡慕了。前几天柴同学转了一篇文章,提到某某人是如何出名的,里面提到这位牛人最初
跟宿舍同学打赌,说自己能在一小时里完成一个 facebook instance。柴同学在
最后评论:这些都是扯淡,羡慕他的那些同学,你能在一小时内完成一个这样的
程序么,连环境都搭不起来吧。我猜想,柴同学的意思是:别只羡慕别人的成绩,多看看差距和实力。赛场的旁边是另一个赛场,运动会。枪声一响的时候就有很多人大喊大叫,为赛
道上的人助威。让我想起,足球,很多应该锻炼的人在看台上,为那些锻炼过度
的人加油。想起达拉斯小牛得了冠军,大家都很兴奋,开始历数经理(?)十一年如一日的
坚持,因而有如今的成就,以此励志。可是,我们坚持过么?坚持过多久?几次?我们还有多少时间可借坚持,或者挥霍?昨天爬牛角山,海拔不到200米,从山脚算起估计几十米。有同学累得不行。怎么
说呢,大家都觉得我的评论是开玩笑。我说:如果现在日本人打回来了,国家要
带咱们跑,你又跑不了,只好被抓住,抓拄以后就是严刑拷打,严刑拷打以后你
就投降了,投降以后就只能做汉奸啦。某个同学说:国家要是都需要咱们跑...好
吧,当成玩笑吧。即使不打仗,现在踢足球、做机器人、电子设备、编程序,哪
个我们又能比过人家了。好吧,那些都是咱们国家别人的事,哪些是我们的责任呢?很快就要结束比赛,无线网就要没了。说点别的。其实,此时在比赛现场,我想起很多。第一次去哈尔滨比赛,关同学在赛场里坐
立不安,我让志愿者给她送去咖啡;胡同学在进场前要求不比了,结果她们队做
出来三道题;我在上面走来走去,明明看到建一他们很高兴,汽球却迟迟不来,
原来是志愿者送得慢了。今天中午,秦同学来看我们,YMH,周老师,我,一起和秦吃了饭。他东北大学
研究生毕业以后在电信(网通?联通?还是记不住)工作,看起来过得不错的样
子。人还是腼腆,不过成熟多了。他已经两个多月没有徒步了,希望保重。我还想起来前几天座谈的时候,有同学希望计算机系的同学可以晚熄灯,我当时
讲的:如果你意识到生命是有限的,你的时间就会多出很多。其实,你永远也不知道,还有多么少的时间。

大连,诡异之城

大连,诡异之城坐901到星海广场,然后徒步整个下午。周,偶像,我,还有三位同学。另三位同学宅在宾馆里,说是做题了。广场上排布了一些游乐设施,但是游人稀少。游人比设施还要少,海风从设施周
围空荡荡的空间上穿过。许多巨大的海盗船跳楼机在空中摆来荡去,座位上空空的。空气里充斥着音乐声
和惊叫声。也不知道那惊叫声是否事先录制的。有时候能看到设施里伸出来两条
腿,远远地看去,以没有一丝云彩的蓝天为背景,不辨真假。也许那腿只是模型
吧。这一次开动的时候放上去,下一次,再换个位置,好象始终有人在玩的样子。有个大转盘似的东西,不停地剧烈振动,飞快旋转。转盘的周围坐着些轻年男
女,一直叫喊;中间站立着一位青年,施施然稳如泰山。我说:他站的地方似乎
转得慢啊。周老师说:他在中间。我说:他的角速度慢,角速度比周围的人慢。
他面对的人一直在变。偶像说:他的脚在动,他自己在转。可是,我分明看到他的脚跨立着,很少移动。而当时,我忘记打开相机的录像功
能。这次出行,我忘了带来总是随身携带的相机,一直在用周老师的。拍了很多照片,包括那些没有人玩的海盗船,摩天轮,各种转来转去的东西,没
有一个乘客,却驶来荡去。回去发上来。说到这想起来,这之前看到 蹦极的。似乎是位女士,按喇叭的要求挺胸抬头,背
向后弯着,变成了蓝天上的剪影。与此同时似乎是偶像喊了一句,"被推下去了"。
她后面的皮筋伸长缩知,几个起落,最后被拽到下面的船上了。那个剪影女士,有朋友在下面尖叫助的,可能也是个模型,而尖叫声是播放的?
告诉大家,真的有人蹦极,你也不妨一试。再之前,我们路过海滩。阳光极其明亮,海风却一点也不热。海滩上很多皮肤非
常白的家伙,仔细看,都是老外。我还看到有人披着极大的裙子,就像三毛提到
在撒哈拉里用来上厕所的那种装备,作用也是相同的--而这里是大连。周老师
说:经常下海的人,都会准备这装备。也有道理,厕所一元钱一次,我用过最贵
的。建筑风格,人群,都似乎是另一个国度。只有两次让我清楚意识到,没错,还是
这里。一次是我们跳上浮桥,浮桥在浪里起伏,尽头是快艇。有个小伙的声音在
身后远处喊,"下来"。另一次,有人朝两个小伙喊,"别扔石头砸着船。"这两声
大喊,都是纯正的胶东方言。现实,扑面而来。但是,这是最初发生的事情。此后的几个小时,我们如同穿过了某个隧道,也
许,至今还没有回来。另,我还在看 鬼吹灯,看到进入日本满蒙黑风口要塞一段。诈尸和小孩的一段。好在,我仍能通过网线了解人间之事。李记者的药量降了一些,因为胃肠反应太
严重,打针被白扎了两下;有同学正努力项目,刻苦得有点过头了似乎;有同学
们似乎在周四的时候没有出席,也忘了请假,黄同学提到一嘴,估计太温柔,没
有人能听懂。另另,此刻,偶像在审别人的文章,说太烂了,不得不拒,这之前还说要攒人品。
此刻,周老师东拼西凑,从一边墙引出网络,从对面的墙引出电源线,正查四川
赛区的八卦。另另另,最后一段徒步,就是大连理工大学里面,我发地图的那段,最诡异。我
看到了非常亮的路,非常黑的小林子。还有似乎有很多人声的体育场,灯火通明
的剧场,五四时期一样的大学生们在群情激昂。为了确定他们和她们是正常人
类,我凑近了问路。奇怪的口音。还有很多,今天不说了,以后单独告诉你。

出发去大连

出发去大连去大连理工大学参加ACM/ICPC比赛。在长白路临时候车室,很多人,像农村赶集一样。空气里充满了白酒和熟食的气
味。列车晚点半小时,大家一拥而入,才发现还有走一段,完成这段路以后,前
面是一个大铁栅栏横在面前。后面很多人挤着,前面是铁门,门对面是穿制服的
铁路人员,感觉我们就像抗战时逃难的市民,等待放行。快半夜了,天很冷,等到放行的时候,我已经冻得肚子疼了。绿皮火车很破,卧铺上的被子蜷成一团,一看就是被睡过不知多少次的。我说:
我记得是一人一铺的啊。没有答理我,同行的兄弟们只是看了我一眼,大家微微
地笑。周老师给我买了一碗方便面,我到处找热水。第二天早晨证明,这碗面非常重
要,因为火车又晚点到达1小时30分,那时我已经快饿晕了。偶像跑来跑去找吃
的,问到我的时候,我提了下还剩一颗杏仁的塑料袋。偶像消失了。我想:你还
是不够饿啊。昨天夜里,我开始看 鬼吹灯,真能吹啊。想看盗墓笔记,排版太差了。昨天的唯一收:我看编译原理的时候,有道题不会。问周老师,他还没看完题
呢,张子忠同学扫了一眼,说:先那啥那啥,再... 然后我明白了--我原来就不
行,周老师也老啦。偶像对张子忠他们不想考研表示非常遗憾。我表示辅导员和团委的老师们骗人
了--关于对诚信的影响。偶像说这么说是不准确的,说我没有证据,是主观的想
法。我表示:我总可以这么想吧。告诉你有影响,但是不告诉你会有什么样的影响,
和如何解除影响。这一夜非常冷,被子也皱缩着,醒了很多次。车窗切割外面射进来的灯光,一明
一灭。另,今天上午注册了,大家都住下了。明天,比赛。

和李记者去剁人

和李记者去剁人gmail一直没响应,搜个java api也能被屏蔽。这大好的时间也不能只用来等待,所
以只好用来娱乐。当年某老师教导我,不应该把东西都放到网上,而是应该放在本地,不安全。那
个时候我还不信。现在我信了。包师弟劝我用QQ,问,如果没有GTALK你怎么办,我说用GMAIL;又问,如果
GMAIL也被封了呢,我说那就出国吧。我非常伤心。昨天梦到了李记者。为了方便第一次见到这个名字的同学,我需要交待一下,李
记者不是记者,他的绰号就是 李记者。因为他的名字李粲写起来困难,可能还
有好多人不认识。其实,他是长春某高新企业的CXO。昨天梦到了他。和一群朋友去一个贼拉有钱的朋友家吃饭,没带典同学。鉴于这
位贼拉有钱的朋友也在人人网,所以不提她是谁了。而且她也不会认为我们应该
出现在她家的。她家,梦里,有越南女佣,好几个。还有老大一片房子。有多大呢,喊一嗓子有
回音。我心好,帮越南女佣拖地,心想:这房子大也不好,你看这么多佣人,这
地上还有这么多的泥啊。很难拖的样子。越南女佣说:感谢你的恩德。我还奇怪,也就是帮你拖拖地而已,看不得别人受累。不用感谢,还恩德呐。后来就是扯淡聊天。李记者出去一会回来了,说是在酒吧里跟人打起来,被人把
大腿扎了。我们就抄家伙,骑上大摩托去打架。李记者说对方是一群越南人。我听到越南女佣打电话:他们出发了,去打你们了。我心想,真不讲究,刚刚还感谢我呢。这会儿还报信。后来一想,人家都是一国
的,唉,有情可原的。我摸了摸右腰间的 leatherman,刀鞘向下,容易拔出。虽然没有打开,仍能想
像刀锋锐利。我对李记者:咱们走吧。其实,这只是梦。可能是因为前两天我们见了一次面。也是有点奇怪的地点。等级考试我是系统管理员,具体的说,看机器的。遇到作弊什么的,都与我无
关,只要服务器不瘫,我干啥都行。但是由于服务器得始终看着,又没有替班
的,所以我不敢出去吃饭。中午,李记者把subway给我带来了。怕吃东西机房里有味,我们就在老数学楼门
口吃。初秋天气微凉,但是阳光极其炫烂。天很蓝,因为对面的建筑较远,幸运的,能
够看到远处有几团云彩。楼前的叶子筛下来一些阳光,我们就坐在细碎的光线
里,只有亮点,没有热量。我们谈到很多。他的身体有些好转,最近开始锻炼身体啦。我们大声嘲笑对方。
他前几天做了个读射频卡的项目,才知道原来那玩艺不是想读就能读出来的,得
先写;我也有过这样的经历。我推荐一本书,设计原本,讲上面的故事。Brooks他们花了十年时间做了个系
统,分子模型,你戴上头盔以后能看到原子摆了一屋子,然后人在里面走来走去。
用户试了两次以后说,"你能给我个椅子不?"他们十年也没想到,这么走来走去
太累人了啦。里面还讲,又做个系统,看辐射对身体的效果,半透明的一个人体,专家绕着看。
结果专家一屁股坐下,用手拔拉着标本,让标本转,而自己不动。我们大笑。后来,他找人喝茶去了,我又回到阴暗的机房里,埋头看<沙丘>。后来,今天上午,我做了这个梦,跟他一起去剁人。李记者,你可以放心,在梦
里,我极少失手。当然,也有一些梦,我不知所措,甚至不知道如何该继续。只好醒过来。令人愁
苦。唉,不说了。

缺牙的时候,我们不停地试探;软件开发,也应如此

缺牙的时候,我们不停地试探;软件开发,也应如此小时候掉牙了的时候,总是用舌头去舔那个缺口,一直到牙齿完全长出来,似乎
想时刻确定它长到了什么程度。最有意思的是,家长告诉,不要去舔,会长歪
的;越是这样,我们越想确定,它歪了么?我在芬兰有一次坐长途大巴,那个司机的头顶大半秃了。之所以能让我有这么深
刻的印象,是因为那几个小时里,他一直轮换着用一只手去摸头顶。似乎这样能
长出来,或者确定没长出来?我们在构造物品,搭积木,或者盖房子的时候,无一不是如此。我们在每一个步
骤测试,确定产品(此处应作人工制品,但是这字太小资了)确实按我们计划开
发,这一个小部分,也符合我们的预期。中间没有任何测试过程,期待直接完成,是愚蠢的。治病的时候,医生也要不停地测试--抽血,验尿,然后才敢给你下药。我们的所
有行为,都依赖于对世界的观察。谈恋爱的人们,小心翼翼地试探--今天气你一次,明天考验你一下。揪玫瑰花瓣
这种行为,大抵只能用于测试智商,或者投入程度了。软件开发中,我们也需要在每个阶段,测试每个单元是否按我们预想的那样工作。
如果"是",那么我们继续。如果"不是",我们要做的不是继续突进,而是停下来
想想哪里出了毛病。这也是我们设计实验和写实验报告的不二法门。遗憾的是,计算机系的似乎有把实验报告写得很糟烂的传统?那么一页半的代码
和结果,你是打算让我相信,你从头开始敲代码,敲到最后,然后编译就通过了
么。那么,你一定不知道,代码不是从上向下写的。从上向下写,就像画蒙娜丽
莎的时候,把这杰作分成1024行,然后一行一行从下向下扫描。写代码,也是先
写眼睛,再写耳朵,可能再改下眼睛...这样的顺序。即使很短的代码也是这样。所以,在不断的修改中,我们需要始终保证我们的代码还是按我们预想的方式工
作的。这就需要测试。说到这里,我总会回想起小时候做航模,没有耐心等到胶完全固化就想去测试机
翼和机身连接的强度。好在,软件从写出来到测试,快得多。前两天写了500来行java,有如下体会,与测试和观察软件的行为有关。在软件从第一行开始成长的过程中,我这样确定它,此刻,仍然符合我所想的。1. log - 我要知道一切,用户能看到的,用户看不到的,你所想的。这次我没有用log4j。上次用了,这次最初以为这样部署起来容易一些,现在后
悔了。最初在软件的规模就应该有个估计,这种规模对于我来说,就应该有log
了。log4j与System.out.println()相比,一个明显的好处是,在发布的时候,只要把
输出信息的级别在配置文件中修改一下,就可以阻止所有的调试信息输出。而
System.out.println()一行行注释起来,就容易落了这个丢了那个。即使你有那个精力,用在看碟打游戏上岂不是更好。自动化那些非创造性的工
作,始终都我们追求的一个目标。log非常重要的另一个原因,我和典同学一样,很少使用dbg这类东西,也不用
IDE的messages,而是喜欢自己输出到控制台之类的。log4j的输出可以与正常的
用户会看到的输出分开。2. 测试 - 不停地考验就像搭积木一样,我们总是要在可能不稳固的地方设置一两个测试点,输出一些
东西,让我们确认,到这一层,还是稳妥的。不要"相信"代码是正确的。如果它是正确的,那么,运行一下证实,这花不了多
少时间;如果它不正确,你需要第一时间知道真相。在错误的基础之上继续写,
接下来付出的代价,除了失败的经验以外,没有任何收益。Tom Hagen说:"我的
代理人希望第一时间知道坏消息。"放心地一遍遍测试吧,你的代码不会因此而认为你不相信它的--只有上帝(和女
人?)才有这个规定。每当修改一小段代码,就应该测试一下。根据回归测试的原则,任何一处修改,
都可能让原来正确的东西变成错误的。所以,每个修改都应该测试。仍然是那个原则,不要"相信"代码是正确的。下面这个例子,就是我犯的错误。
当时我想,这么简单的修改,就不必测了。直到十多分钟以后,发现这家伙的行
为不正常。可是这个醉汉已经又走出好远了。错误的代码:
: while (i.hasNext())
: {
: String current = i.next();
: if(i.next()==null || value==null)
: {
: return false;
: }
: else if(eval(i.next()).equals(eval(value)) )
: {
: return true;
: }
: }正确的代码:: while (i.hasNext())
: {
: String current = i.next();
: if(current==null || value==null)
: {
: return false;
: }
: else if(eval(current).equals(eval(value)) )
: {
: return true;
: }
: }如果我当时做了回归测试,就可以马上发现错误的代码中副作用-- i.next()不
仅取出了值,也移动了"指针"。这样的错误在C/C++中也常发生。3. 一个小技巧如果我们在回归测试中,不断地观察程序的输出,就需要集中注意力找"不同"。
如果输出是一大摊的话,那就更是麻烦,可能还要翻页才行。这也可以自动化。我们可以先把正确的输出写下来,文件名叫 expect.txt 吧。然后我们把每次的输入写下来,文件名叫 input.txt 吧。
如果你有多组输入,多整几个文件。然后我们这样运行我们的程序:proc.exe < input.txt > output.txt如果你有多组输入,就做个批处理,这样:proc.exe < input1.txt > output.txt
proc.exe < input2.txt > output.txt
proc.exe < input3.txt > output.txt现在,可以看看程序是否按我们期待的运行了,基本不需要眼睛:diff output.txt expect.txt如果啥输出也没有,那就是它俩完全相同。这与自然科学研究的技术路线差不多。先做实验,或者观察世界,得到expect.txt;然后假说,得到proc.exe;最后看看proc.exe运行的结果output.txt与实验结果expect.txt是否一样。如果结果好,那么写论文;如果结果不好,有些人会假装没看到,或者...反正
修改实验结果是不行的,因为还有别人也会做实验。4. 更好的东西上述小技巧可以写成一个批处理,改会代码,编译,然后就跑一遍这个批处理。
最初每次期望与结果都是不一样的,也就是还不成。再改再改,后来,diff不出
声了。大功告成。这个批处理的路子早就被俺们这个学科的古人发现了,并且写成了工具,叫做
JUnit。还有其他语言的版本 cppUnit 啥的。牛人总是N多,所以,我们能想到,必然早就被牛人实现了。就像,剧毒之物五
步以内,必有解药。如果你嫌断肠草药性太烈呢,就自己去动手改进吧。

感谢你们需要我

感谢你们需要我明天教师节,今天马老师的同学请老师吃饭,也带上了我。凡有同学们聚餐,我都是跟同学们一桌。今天不幸开始的时候被马老师留在他那
桌,希望我熟悉一下一年级的同学们。建一说:"你一会过来不",我说"很快"。后
来局面演变成了轮番敬酒的时候,我终于找到了机会,回到另一桌。跟同学们在一起,没人敬我酒,也不必回敬。大家喝得也挺HIGH的。后来,我和
大E跟建一谈人生;很晚,最后只剩下了我们,还有个服务员小伙子在一边整理一
堆台布。散了以后,我跟瀚哥到华润万家,21点多了。我趁超市没下班赶紧跑到楼上,给
二猫买了她要的草莓酱。作为惊喜,又带了一瓶蓝莓酱。下楼,跟瀚哥变人生,到11点多了吧。天很冷,但是我们声音很大,所以没有进
旁边的KFC。我冻得小腿转筋,瀚哥一直抱着肩膀,一身可怜单衣,哆哆嗦嗦。之间或之间或之或,短信一干人等,通报我的行程。到家的时候,摸着黑听到二猫一声大喊"爸爸"。然后结巴着跑出来了,说什么我
开灯我关灯啥的。我给她蓝莓酱,问"你要的是这个不?"这是她不要的。中午的时候,她因为只想
要一瓶,放弃了这个愿望。她说:"也挺好。"哈哈。我拿出草莓酱,二猫满床蹦。我告诉她,我记得,是逗她玩的。我要去工作室,要吃饭,要工作。二猫说"爸爸那我还想你呢"。我威胁,你要是不睡我就更得走了。二猫哭着说了几遍,才说清楚:"你要是走
了,我就更睡不着了。"抽空上网看邮件,包师弟此前电话告急的事,原计划此时回电,他已经解决了。
恩,他正占线,短信"不电话你了。"我因为女儿而成为父亲,因为学生而成为老师,因师弟而成为师兄。我们,因为
他人的存在和需要而具有存在的价值。谢谢你们,谢谢你们需要我。从什么时候起二猫突然跟我这么亲近了呢?二猫妈说,从我给二猫上视唱练耳课
开始。其实二猫现在还远不知道,她的爸爸五音不全,自己也唱不准音,更不用说听音
了。就像,我的学生,有的仍然不知道,我们之所以艰难度日,是因为作为老师
的我没有足够的能力--带来项目的能力,理论上的深刻,或者创造性的想法。我不过是你们年少时的玩伴,就像幼儿园、小学、初中、高中,陪伴过你们的那
些老师。当年,你是多么地崇拜他信任他,直到有一天你发现自己比他长得还
高,更有远见,能力更强。其实,一切都没有变化。我一直是你们年少时的玩伴,而不是能伴随你们一生的
师长。那些希望...只是少年眼中的光环。还好,我陪伴你们度过这样的少年时光。所以,谢谢你们需要过我,在此时。