|
我原本打算将短文取名为《我的第一个 C Program》, 但后来一想,现在这电脑民工车载斗量的, 这样的题目还会有谁来看. 写程序吗,不管哪种语言,,最终当然是通过 0 + 1 来间接实现的, 但我的第一个C程序真还直接应用了二进制算符 (bitwise operator), 所以这个标题还不算误导和哗众取宠. 事情先要从我舅舅说起. 舅舅是一个优秀的科学家,是一位染料涂料工程师兼色盲,曾为中国的电泳涂漆工艺作出过重大贡献。小时候我有一次去舅舅家, 我俩都闲着没事, 他就招呼我过去玩个游戏. 他拿出15根火柴, 分成三堆,分别为三根,五根,七根. 规则很简单, 两人轮流拿, 数量不限, 谁拿到最后一根就算输了. 唯一的限制是每次只能从同一堆里拿.我先拿是输, 后拿也是输, 十几个回合下来, 他已看出我不可救药, 就把规则告诉了我.后来我看到一本书, 里面详细介绍了这个游戏以及决定输赢的数学原理. 原来这游戏并不限于三五七,堆数可以任意, 每堆的火柴数也可任意, 当然不用火柴也可以. 不管你如何变化, 输赢由一条相当简单的规则决定, 必须用二进位制表述. 在完成Courant 数学研究所的博士后研究以后, 正好美国在老布希同志领导下昂首阔步进入经济衰退, 我只好靠汉语拼音的功底在纽约市教育局双语教育部门混饭吃.当然这并非长久之计, 于是听从朋友建议开始学C, 为下海作准备. 这玩艺我以前也学过, 但因为没有动力, 读了第一章后就把书给丢一边了, 然后周而复始. 所以前几章总读了六七遍不止, 但还是C盲一个. 因为无经验可总结, 只好总结教训, 发觉空对空是问题所在. 当初我学FORTRAN, 就是为了完成一个课题,暑假修了三星期课. 三星期过后, 学分拿到了, 课题也完成了. 既然空对空不好,那就空对”地”吧. 这块地可是不好找, 我于是想起了舅舅传授的火柴杆游戏. 因为这游戏需要用到二进制, 想来这快地不错. 说时迟,那时快, 我就开始写起来了, 碰到问题就向书本请教. 如果还是三五七, 一方面太简单,而且没准会被人琢磨出来. 我就把最多允许堆数和每堆最多允许火柴数加以扩大. 电脑里没有火柴, 我就用$代替. 三五七自然还是第一选择, 但挑战者如觉得不过瘾, 可以选上十堆八堆的. 你可以和朋友玩, 也可以和机器玩. 当然如果和机器玩的话, 即使三五七, 一般也就是(人)”肉包子”了,有去无回。 这程序尽管很小, 但用到的概念极多, 等到写完, 书已经看了好几遍了. 看来这块”地”是选对了. 正象买房子所说的, Location, Location, Location. 两三个星期后, “大功告成”. 前面说过,这游戏的数学原理要用二进制表述, 所以每一回合以后, 先要做成百上千的除二, 运算完成后再要做成千上百的乘二. 于是我重返故地, 看看能否用二进制直接运算, 真还给我找到了, 就是前面提到的二进制算符. 程序很小, CPU 的差别无法看出, 但我想二三十倍是起码的, 如果是一百倍我也不会惊讶. 我的电脑没有C的软件, 于是我就去NYU. 一切准备工作做好, 一个回车, 我把眼睛瞪得象电灯泡, 希望看到好消息. 没这样的好事, 一大堆从来没见过的错误呈现在眼前. 我就找了个熟识的小朋友帮忙. 他称赞我的程序写得不错, 只是C的一些概念和 FORTRAN 太不一样,所以出错了. 两小时不到, 大功告成,这次可是没有引号的,而且是0 + 1 型的. 一大帮小天才围了上来, 要和机器人决一高低, 均以肉包子告终. 以后我还写了个”韩信点兵”的程序.这个游戏的诀窍可在《十万个为什么》上找到, 我就不保密了: “三人成行七十稀, 五树梅花二十一枝, 七子团圆是月半, 除百零五便得知.” 我把这两个程序的EXE放在一张碟片上, 每次面试都带着, 哪知从来没人想看看我对C是真懂还是假懂. 历尽千辛万苦, 我总算在华尔街的一家软件公司找到了第一份工作, 主攻房屋贷款的模型, 这张碟片还是没用到. 我的第一个模型出来后, 久久没见到程序员完工的通知.他说既然这是个初步的模型, 以后还要改, 他就不浪费时间了, 等全部完成他再来写程序. 天哪, 他是要我们用一枝笔一张纸来找出模型的不足之处并加以改进. 我自告奋勇说,计算部分的程序我可以写, 但我不知道如何与公司的软体衔接. 公司的二老板说, 衔接问题由他来做. 我的老板将信将疑,”你还会C?” 我说不是写在简历上吗? 他说他也看到的, 不过大家都这样写的. 我把这张碟片的故事告诉他, 他兴致极高, 叫我拿出来, 在上班时间玩了好一阵子, 最后毫无例外地成了肉包子. 以前写这程序时还没有女儿,我也不知这程式我百年之后该怎么办。现在恨简单,只要她对这程序确实理解了,拿这件宝物参加一个什么竞赛应该没什么大问题。 |
|