2018年2月2日 星期五
记念我的好友华尔
我是在教育局认识华尔的。当年安大略省教育局要设计一个学校用的人力资源管理系统,通过中介公司我与省政府签了一年合约,职责是对设计团队提供有关 Oracle 数据库的技术支援。
通常安大略省政府的机构都集中在多伦多皇后公园一带,不知何故我们这个部门却安排在湖边 Harbour Front 的一栋旧楼办公。上班的第一天经理就给我介绍了和我业务上有关系的几位同事。
“这是 Val (华尔),我们的软件专家。”经理指著一个埋头工作的中年人。当华尔站起来和我握手时我发现他并不比我高,说起话来还带有一种西方人少见的腼腆。
还没到中午华尔就来找我一起吃午餐。他带我去一间酒店顶楼的旋转餐厅,我一望餐牌心里就扑通的跳了一下:一份午餐起码要三十多块,在那年头足够让我一家人吃一顿中式晚餐。不过既来之则安之,我想工作上的应酬是难免的。
想不到的是这种午餐却变成了例牌。一个月下来华尔带我走遍了湖边的大小餐厅,其中四号码头的海鲜餐厅 (Pier 4) 是我们经常去的,我还记得那里有一张标明是海明威专用的桌子。我知道海明威在1920年当过多伦多星报的记者,至于他曾否光顾过这家餐厅就不得而知了。不 到几天我又跟华尔学会了喝啤酒,起初喝半瓶就觉得头晕眼花,后来整瓶喝下都面不改容。这样的午餐实在花费不少,幸亏那个合约的薪酬不错,那样的开销还应付得来。
华尔兴趣广泛,跟他交谈是很惬意的事。电脑软件,加拿大的政治和历史,个人所喜欢的音乐, 我们无所不谈。
谈到政治,我并不隐瞒我中间偏左的观点,但他却是市场经济的拥护者。我们经常争辩到脸红耳赤,但过后大家都不当一回事。
谈到电脑软件发展方向,他说:
“不要小看市场的力量,不要只看到现在杂乱无章各家各法的竞争,有用的东西就是这样造出来的。”
当时日本正进行那雄心勃勃的第五代软件开发。多年后这个由政府主导的大项目无疾而终, 而它大部分的目标都被美国那全靠市场推动的互联网所超越, 我才真正感受到他这句话的份量。
有一次午餐后我俩沿著湖滨大道走回公司,华尔突然停下来望著一艘停靠在码头的游艇。“那是我以前的游艇。”他转过头来,一派无可奈何的神态。
在加拿大生活了这么多年,我已养成少管别人隐私的习惯。可是从华尔的表情来看他当时是需要一个听众,我就不客气的问他这件事的由来。
原来华尔曾经是一家软件公司的总裁。在那微型电脑和互联网还没问世的年代他的顾客已经可以用一部终端机通过电话来接驳他所设计的商业管理系统。由于他那个 管理系统功能多又容易用,吸引到不少用户, 其中包括安大略省“家乡鸡”这样的大公司。他本人也成为一个不折不扣的百万富翁。
可是好景不长,公司丰厚的资产引起他一个合夥人的夺权举动。经过一连串的官司后华尔败下阵来,房子和游艇都没有了,还欠了一身的债。他也只好回到打工仔的生涯。
华尔是我至今所碰到过最牛的程式设计师。我只能用严谨,简洁,漂亮,富前瞻性来形容他的作品。他阅读文献和软件手册的速度也是我万不能比的。
要真正明白一份技术文献的内容我的办法是尽量去了解作者的风格与思路,只有那样我才能及时避免误解作者的原意。可是大多数的文献,特别是大型软件手册的撰 稿人通常都不是这软件的设计师,他们都在按照别人给他的草稿去写自己不懂的东西。在这种情形下我就无法去了解他的思路,也不可能看一两次就掌握其中要旨。 华尔就不同,他有本领很快就看通这种手册。
当时我们用一个名叫 TPU 的文件编辑器 (File Editor)。 华尔从手册中发现这编辑器可以接受一种指令到外面去启动另一个程序。根据这一发现他为这编辑器引进了许多新功能,比如在编辑器中随时可以测试自己所写的 SQL程序。今天很多编辑器都有这个功能,在当时的确是闻所未闻,我们的工作效率因而得到大幅度的提升。
“你是多伦多大学毕业的?” 我想知道那一间大学训练出这种人才。
“对不起,我没有上过大学。”华尔平静的回答, 也没有进一步去解释。
一个能巧妙运用 Finite Automata 原理的设计师居然没有进过大学, 我觉得真不可思议。相比之下,我这种自小忙于读书考试,斤斤计较学历学位的人却在很多方面落后于他。
当时设计团队碰到一个瓶颈:处理学校发薪水那个部件太复杂。那个部件需要处理各种形色的薪酬,津贴,福利, 以及各类的扣减与税项。除此之外还要照顾各个学校处理薪酬的不同做法。
其实在我来以前华尔已经对这个问题作过仔细的研究。他建议由他来写一个特殊的编译器 (Compiler)。对每一项计算用户只需输入像英文一样的指令,他的编译器就会把这些指令翻译成机器语言去完成这项计算。他写了一份建议书,对编译器 的结构,指令的构成,以及它的使用范围和文法的约定都有详尽的探讨。
虽然我没见过写一个特殊编译器来处理商业计算的例子,我对他考虑之周详是五体投地的。但我敢说这部门里的高层没有几个能看得懂他的大作。果然不出我所料,高层的批文是 Infeasible - 不可行。
我并不怪责高层的这项决定 - 谁会押这样大的宝把整个项目的成败都寄托在自己从没见过的怪招?况且求稳都是管理阶层最常见的心态。
华尔的建议遭到高层的否决, 我们经理立刻方寸大乱。同事中也没有人愿意去碰这个烫手山芋。几经变动,建造这个部件的责任最后落在我的身上。
我建议把发薪水那个部件(Payroll Component) 分类为若干个算法 (Algorithm)。每一种算法就直接用数据库里的一组 SQL 程式来完成。这样做我们就摆脱了COBOL 那一类语言。
当然这个方案有一个前提:数据库的设计要好,程式设计师驾驭SQL的能力要强。我这样热衷于SQL,是因为我可以用它在短短的几行内做很多的 事情。况且我有华尔替我准备工具,验证和测试都会是一件很过瘾的事。不过话又说回来,这也不是一个传统的方案。
建议最终是通过了,我想这跟用户中有不少 SQL 发烧友有关。我们也密锣紧鼓的进行攻坚。
在某个意义来讲我是抢了华尔的工作。他也闷闷不乐了两天。但很快华尔就恢复了状态,兴致勃勃的替我更新了一些工具,也帮我一起验证我所设计的程式。
这个系统所用的数据都有时间性的。比如薪水会因升职而增加。津贴,福利,保险费,税项也都可能有所变动。因为这些变动又不是同步的, 进行有关的计算我们得把时间轴线按各种数据的变动进行切割,直到所有的数据都在切割好的小时区内呈现常数为止。
华尔提出一个非常漂亮的办法:利用数据库公 司提供的两个函数,在有关的SQL里来作少许的改动就能进行所需要的切割。我试了几次都得到正确的结果。可是我还是对他说:“我们需要一个严格的证明。”
“对,一定要有一个证明!”
只凭这一句话我们就可以知道华尔不是一个普通的设计师。一般程式设计师往往把他们所写的程式测试两三次就交货了。
可是证明他那个方法很不容易,直到晚饭后我才想到用数学测度论里的一个方法。第二天我把我的证明交了给他。
“好!真好! 我想不到 Set Partition 可以这样用。” 他非常高兴,还向我要那两页纸作记念。后来不止一次对人说,为了证明他这个方法我特别写了一篇论文。
那是我整个打工生涯中最快乐的一段时间。和华尔一起我学到很多东西,我们的技能有很强的互补性,Payroll 这一个部件的主要部分都给我俩包了。
我 们的午餐聚会依然继续。我发现他看过很多文学作品。不过我的英语程度不足以在这方面作深入的探讨,而且我看过的文学作品都局限于一些翻译过来的俄国小说。 尽管如此我还是高兴见到有人喜欢屠格涅夫(Turgenev)。更奇怪的是他连 陀思妥耶夫斯基(Dostoevsky) 的<<白痴>>都看过。
到我们工作完成的时候上头决定不再和他续约,据说原因是他的薪酬过高,而准备留下我去主持这个系统的维修和更新工作。虽然我不知道他的薪酬到底有多高,我 总是觉得对他不公平。刚好教育局的一位华人经理袁先生跳槽到劳工处任职, 他对我说劳工处有适合华尔的空缺,我立刻怂恿华尔去见工。
几天后我问袁先生结果如何。袁先生叹了口气:“他在一大批人面前说他还有这些和那些东西不懂 .......”
我也只好叹了一口气:“因为他懂得的东西太多了,说不完。”
在我的坚持下,我们把华尔短期性的请回来过两次。每一次他都帮我们这个系统解决了一些大难题。我记得最后一次见面是在圣诞节的前夕,在一间小咖啡厅里我们相约好等我这边工作完了一起去成立公司。
“我们是最佳的拍档!” 他握著我的手说。
几个月后我接到他的电话:“Lin ,我接到生意了,写 Foxpro 程式。”
“是替谁做呀?”
“是一些工会。”他小声的回答。
“他们不是社会主义者吗?”
“相信我,他们都是诚实的人。”
他还表示工作再多一点我们应该开始合作。
一连几个月都没有接到他的电话,我想他可能太忙了。直到快到春节的时候我才打电话到他家。
“ Val 在吗?”
对方沉默了一回儿,“你是 ...... ”
“我是 Lin, Val 在教育局的同事。”
“他有谈过你..... 他不在了,脑癌。他曾经想打电话给你们 .......”
我一边掉眼泪一边向全公司的同事发出一个讣告。
**************
此文原於 2010 年发表在我的网易博客。