这学期的《密码学》课上老师喜欢用彩笔在白板上写很多笔记,我不喜欢用手写快速的抄英文,因为不光很慢,而且手会很累,因此就一直用ConTeXt来记录。又一次,在写公式的时候,突然想起了TeX发明人Knuth在主页上贴出的一张他的fvwm配置的屏幕截图来,里面是他在用Emacs编辑Plain TeX文件,内容大概是某本书的5.1.3节(不确定是不是TAOCP)。
印象里截图里的文件有很多符号,心想老头子怎么能记住这么多东西?然后忽然想到,Knuth是在用自己写的软件来工作。他的主页上有tex82的WEB程序,用CWEB处理后就可以编译出可执行文件,把他的TeX源代码编译成dvi文件,这不就是全部了吗?TeX在我们看来是非常伟大的软件,但从Knuth的角度,不过是一个处理文本并输出另一种文本的程序而已,和我写的一些脚本的作用差不多,无非是让生活更舒适罢了。
不过让我写TeX这种规模的程序,我觉得还写不出来。现在我们做的这个C/S程序,我写游戏部分的API,当地人写服务器来调用。我们今天下午从MSN上来回讨论,什么时候他又需要个新功能啦,什么时候我的代码又需要改动啦,总之是不能一次到位的做好。这种软件的功能比较琐碎,因此很难考虑完备。不知道用Knuth的Literate Programming能不能有所好转。不过好在是写游戏的功能模块,要是让我调试和客户端的交互部分,这个月初的经历让我的信心可不是那么高。
当时我低估了程序的复杂度,大言不惭的给当地人说服务器我自己搞定,想想也挺简单的,之前在实验课上我们已经完成了一个C/S查询公交车时间的程序,我当时把查询模块放到了另外的文件里,在服务器代码里调用。写游戏的话就把游戏放在另外一个文件里,用服务器里的代码调用。输入客户端发来的信息,执行,生成返回信息,由服务器发回给客户端就行了。结果在11月初的一个周日晚上,我最终把大部分的代码写完了之后,运行一下试验,却发现了种种我未考虑到的问题,比如服务器要连接多个客户端。开始时我觉得用多进程就行,结果却发现进程见的数据都不是共享的,一个客户端发送信息后,我要通知另一个客户端,这样一来就要用到IPC……为了不用IPC,我就要用线程,my god。
现在把与客户端的交互部分给对方来写,专注于整个程序的一部分,才渐渐的感到轻松。之前我对C语言不是很熟练,因此写出的库有错误。在C语言里要做许多低级的分配工作,而我想当然的用Java或Pascal的方式给做了,结果当地人的程序发生了奇怪的问题,后来加了几个malloc才算搞定。
计算机历史上的一些大人物,多数都有为自己写软件的经历。比如Emacs、Linux都有这种意味在里面,从现在看来确实有高山仰止的感觉。什么时候我也能这样呢?