蚂蚁走路与瘸子跑步

来源:互联网 发布:淘宝数据库设计 编辑:程序博客网 时间:2024/06/10 05:17

上次听一大四的学长说可以用程序把交大的空教室列出来,感觉很好奇,当时不知道这程序怎么写。后来想想,其实也不难。就是先把学校的所有的能上课的教室列一张表,然后放蜘蛛到教务处的课表网页去抓取下来教室(附带上其有课的时间段),然后与教室总列表匹配,如果匹配到了(时间上、空间上),就把在这个时间段的这个教室划去。
   他是用C#写的。我想明白了,也没急着去做。一是因为只熟悉C语言,而我要是能用C语言写出这玩意,估计我直接能进Microsoft或者IBM了。另外是因为那学长说他用了一个月,我觉得也得用不少时间,所以时间不敢放在这上面。
   中间只做过一次,那天是星期天,也就是在前不久,两三个周吧,可是那天中午十一点的时候我写着写着代码,电脑竟然闪了!原来是寝室电费该续了。而且当天不能在续交电费了,只能到第二天下午。郁闷了我很久。
   后来就没做,当时做的时候是直接用的Java的字符处理去找教室,但是还要同时记录下来这个教室的时间段也就是第几周周几还有第几讲这些,所以直接用Java字符处理那些东西,还是比较困难的,但是也做的出来。以后有时间就用这种方法做出来,跟现在用的正则表达式方法来比较一下,看看到底哪种方法更省时间。
   2009年的最后一天,我晚上正在复习让我头痛的物理,心烦意乱,突然莫名其妙的想去做出来这个空教室程序,也觉得Java就那么回事,已经学的相当自信了,另外就是当天晚上通宵供电,我可以有时间去做,而不怕思路因为断电关电脑的缘故而被打断。然后我就先去实际调查了下,列出了一教跟二教的空教室表。
   可是回去看了个烟花,回来感觉很困!不想去做。结果很快睡觉了。
   2010年的第一天晚上我开始写这个程序,而且极有精力很兴奋的去写。(这样的转变让我想起来一个很有趣的关联:或许2009年一年我都是浑浑噩噩的,这一直持续到了这一年的最后一天,然后情况在2010年开始转变,因为2010的第一天我就开始更加实际更加积极了。)
   写完这个程序我用了大概十六七个小时,当然分成了三段时间,两个晚上(第一个晚上熬了个通宵,大概七个小时,第二个晚上用了三四个小时,三点多睡的)今天下午用了四五个小时。
   原本也想着回到家再去写这个程序,可是现在看来回到家我用三天可能也做不完,因为在家上不了网,有些东西,比如说异常的处理,虽然我可以去查API但是如果能够直接在Google或者百度上搜下,只要看别人总结的一句话就明白是哪儿错了。当然这也是因为我现在Java也是刚刚学会,还没用Java写出多少程序来,没有掌握的融会贯通。
   那个学长跟我说过用正则表达式,因为这是个方向的问题。我就学着用了,但是书上讲的跟网上有的一些资料我试了之后感觉很多是不能直接拿来用的,写这些正则表达式的确占去了我不少时间。现在用的正则表达式也很简陋,但是能完成任务,很实用。
   用Java的URL类去读网页的源代码时候简直要让我彻底放弃,当时不知道要处理编码的问题,我知道Java是用unicode的编码,但是我之前看的一个例子上面是直接用Java的URL类读取网页源码了,也没有编码的问题,但是我读出来额全部是乱码,然后我更换编码,看到那个网页的编码是gb2312,可是我试了不行,还是乱码,然后我尝试着Unicode,还是不行,那时已经很晚了,感觉很冷很饿,但是在我要放弃编写去睡觉的时候我想起了utf-8,幸好之前我有写网页的经验,然后试了下,果然成功了!我又看到了那一个个可爱的汉字。
   在网页上面现实的基本是“3-18周(二)6-7节(X1215(犀浦校区))”这种格式,之前我试了Java的正则表达式可以匹配汉字,但是在我实际要处理的时候出现了问题,很难匹配的上,然后就想起来要把这些汉字处理了,而且周几那个“几”的汉子是一定要处理的,因为后面要用到它去匹配,具体方法是用HashMap,map.put("周"," ");map.put("二","2");等等,也就是说把一二三四五改成12345把周更节两个字还有()两个半括号都换成空格,然后再去匹配。
   程序不大,Bug不少。能运行之前找错误跟处理异常就不说了。运行了之后我去检验结果,发现有的教室明明应该去掉了,可是还是赫然在目,搞得我头疼,我只有一遍一遍的去看算法部分,可是那儿根本没有错误,这就难办了。在这上面也是用了很多时间,今天才想起来,可能是网页自身的问题,(不能说是问题,只能说是在我这有问题)因为有六十六个网页,我只仔细看了前面几个分析了规律就去写程序了,可是后面网页可能会有变化,因为毕竟是六十多个网页呢。然后果然发现了一个大的问题,也就是有些教室有课却仍被当成空教室的问题。那就是有的地方形如这种格式“3-18周(二)6-7节(X1215(犀浦校区))”里面没有X1215二是说的一些宽泛的地方,但是这就会出现很大的问题,因为我写的正则表达式是提取出来3-18 二(处理成了2) 6-7 X1215这四段,但是再X1215这种特定的形式没有了情况下,蜘蛛接着往下爬,如果又出来了一个“3-18周(二)1-2节(X1313(犀浦校区))”就会直接把X1313提取出来并与之前的那些时间段匹配,造成错误的匹配。知道这个原因就好办了。我的解决办法是先把这些时间跟地点一块匹配了,然后再从这些匹配来的字段里面匹配出各个值。我原来就想这么写,只不过是有了问题逼得我不得不这么写了。
   还有一个小的Bug竟然不在算法部分(但是肯定跟算法相关),我在检验的时候把没有匹配的记录下来,改进之后看那些问题解决了没有,结果发现,最后一个教室是去不掉的!也就是X2537这个教室,因为匹配时候,教室总的列表里面最后一个教室后面没有空格,而其他的教室后面必须有空格,当时就没考虑到这个X2537的情况。
   想一下,平时看代码的时间不少,很多时候都理所当然的认为这儿就该这么写代码,其实这些代码这有从无到有被写出来的时候才知道它起了多大的作用。比如说先要把抓到的教室判断下它是否在教室列表里面,如果不在直接跳过,但是之前我没想到这个问题,程序运行不下去我才发现了这个问题,加上了一两行代码而已,当然有另外的解决方法,但这是最简单的。可是者最间的的东西,因为它看起来毫不起眼,所以很多人如果去看这个程序肯能不怎么注意就跳过了。
   上面让我感觉写程序,特别是一个人写程序就像是蚂蚁走路,可是程序真正运行起来,或许是一个带着你没发现的众多Bug的程序,可能就是瘸子跑路了。这个程序平均下来要跑3到4分钟,最后一次运行时间是325719ms也就是4分钟多点。
   另外想到了,李开复老师讲到他在Google时候怎么招聘员工的,如果是学生应聘的话,在学校里面至少写过10万行代码。昨天晚上算了算,如果当成大一的时候写的东西太幼稚(当然不排除有高手),不算在内的话,基本上剩下的三年时间每天要写100行代码。关键是坚持。

PS:成都这天真冷啊,打字的时候手凉的要命。另外不是不想复习,实在是老是想这个程序了。马上复习去。十九号之前不写程序,少上网。