查尔斯·西蒙尼访谈(下)

采访者:下面说说你创建程序的整个过程。是否存在适用于所有程序的过程?

西蒙尼:当然。严格来说,对编程而言,我认为我们应该知道自己想要做什么。如果不知道,那么有一个过程确实是解决各种问题的必经之路,那就是要弄清楚:我试图做什么?目标是什么?

打个比方,我想开发一个菜单驱动的文本编辑器,要求响应速度快,并且提供拼写检查器等。在开始真正编程之前,我需要先弄清楚最终产品。有时候,目标的选择取决于我都掌握了哪些技巧。以Bravo为例,这个程序是以算法为导引的。巴特勒•兰普森描述了两个很有意思的算法,于是我们试图围绕这些算法来编写这个编辑器,以充分利用这些算法。此外,J. 斯特罗彻•摩尔(J. Strother Moore),就是Boyer-Moore字符串查找算法的Moore,在文档编辑方面有几个很有意思的算法。于是我们决定:“嘿,这个编辑器要包含摩尔编辑算法、兰普森的屏幕更新算法还有两个缓存。”等到对目标有充分的把握之后,我才会开始真正的编程。我调整姿态,关上房门,并且大声宣布:“现在我要开始编程了。”

采访者:当你调整好状态真正开始编程时,第一步会做什么?

西蒙尼:编程的第一步是想象。就是要在脑海中对来龙去脉有极为清晰的把握。在这个初始阶段,我会使用纸和铅笔。我只是信手涂鸦,并不写代码。我也许会画些方框或箭头,但基本上只是涂鸦,因为真正的想法在我脑海里。我喜欢想象那些有待维护的结构,那些结构代表着我想编码的真实世界。

一旦这个结构考虑得相当严谨和明确,我便开始写代码。我会坐到终端前,或者换在以前的话,就会拿张白纸,开始写代码。这相当容易。我只要把头脑中的想法变换成代码写下来,我知道结果应该是什么样的。大部分代码会水到渠成,不过我维护的那些数据结构才是关键。我会先想好数据结构,并在整个编码过程中将它们牢记于心。

采访者:这是最重要的一步吗?

西蒙尼:当然,这是最重要的一步:最优算法的知识当属科学,结构的想象则是艺术。这些算法的细节,以及编写高效代码实现这些结构的转换,是编程像手艺活的一面。从技术上讲,这就是所谓维护结构的不变性。编写代码以维护不变性是相对简单的技艺,不过这需要非常用心并辅之以大量训练才能练就。

采访者:你对编程感到过厌倦吗?

西蒙尼:是的。

采访者:编写程序的过程是痛苦的还是快乐的?

西蒙尼:两者兼而有之。假装每时每刻都很快乐是做作。就像运动员所说的:“要是没受伤的话,肯定是你还不够努力。”二十年后,我已经体会不到刚开始编程一两年时的那种新鲜感。当然,有时我仍会有这种感觉,只不过不像以往那样常有,这是没办法的事。

采访者:你每天都有固定安排吗?你每天都编程吗,或者你会先把问题放一放,然后集中一周时间搞定它?

西蒙尼:我不是每天都有机会编程。我不用特意把问题放一放,因为总会有人打断我。我一般晚上编程,白天总是被打断。

采访者:晚上你会到办公室还是在家工作?

西蒙尼:我就在办公室工作。我住得很近,非常方便。来办公室就像进自己家另一个房间。我不会窝在家里编程的,来办公室也就是两分钟的事儿。

采访者:你如何管理手下的程序员?你觉得现在自己做管理多过编程吗?

西蒙尼:我两样都做,目前还是编程多一些。开发Bravo时,对程序员的管理非常非常直接。有一次,我其实写了一份极为详尽的工作指令,也就是所谓的元程序。这差不多就是个程序,只不过是用非常非常高级的语言写的。我们从斯坦福大学找了两个机灵鬼作为“试验对象”。他们写的程序完全符合我的要求,这样我们实现了双赢:首先,对我来说,用这种非常高级的语言工作更容易,本质上是在对这些人进行编程;其次,他们真正弄清楚了这个程序,效果远远好过我直接交给他们写好的代码清单,并叮嘱他们仔细研读这个程序。他们掌握了这个程序,因为这是他们写的。瞧,每个人都可以宣称自己写了这个程序。这个程序是我写的,也是他们写的。真是太棒了!我认为管理的最佳方法是言传身教,经常复审代码。我们一直坚持开展代码复审。

采访者:让多名程序员开发一个程序,开发速度会更快吗?

西蒙尼:不一定。编写同一个程序的人员越多,人均产出的实际代码量越少。结果,总的代码产出一开始会更多,之后实际上可能会减少。以两个人为例,也许单位时间只能多写百分之五十的代码。

顺便提一下,代码的效率还会随着开发同一个程序的人员数量的增加而有所降低。最高效的程序往往是一个人写的。唯一的问题是,它可能需要写上一辈子,而这显然是无法接受的。因此你需要找上三五十个,甚或好几百个人开发一个项目。

采访者:你能预估编写一个程序要用多长时间吗?

西蒙尼:预估编写程序要花的时间难度很大。之所以难度很大,原因多种多样。这并不意味着我们就不用尽全力预估,因为预估时间可能用处很大,就像天气预报不仅有经济效益还有其他好处一样。

真正的好程序会永远存在,写起来永无止境,至少只要硬件存在,程序就会存在,甚至更长久。当然,只要Alto计算机存在一天,Bravo就不会消失。编写Bravo的是两个暑期实习生。夏天结束时,其中一人走了,另一个人留了下来。第一个发布版本大概用了3个月。在约5年时间里,一共发布了14个版本。

Multiplan也是大致如此。当你想到Multiplan存在于Microsoft Excel中,就明白Multiplan将不断延续下去。而Macintosh上的Microsoft Excel也不会是这一链条中的最后一个程序。它会在Windows上延续下去。

采访者:开发Bravo时,你是否认为施乐Alto计算机会成为所有人的选择?

西蒙尼:是的,我当时太天真了。不过,Alto后续机器正逐渐成为每个人都能用的机器,由此可见我的看法并没有错。从某种意义上说,Macintosh计算机和Windows程序都是后继者……(说到这里,西蒙尼停下来接电话,草草地说了几句便接着回来和我聊)。来电话的是汤姆•马洛伊(Tom Malloy),我刚才提到的其中一个暑期学生,留下来的就是他。我有一年没跟他聊过了。他后来去了苹果公司,为Lisa电脑开发编辑器程序。

采访者:你为什么会写程序?你把它看作是工作、职业还是挣钱的手段?这是你与生俱来的能力吗?

西蒙尼:应该是兼而有之吧。我年轻时还算有点天分。即使是在我不懂编程的时候,我就知道与编程有很大关系的一些东西。记住那些复杂的事情对我来说轻而易举。随着年龄的增长,这变得越来越困难。想象场景也不再那么清晰。

采访者:为什么想象场景变得不再那么清晰?

西蒙尼:可能只是年纪大了,思维方式也跟着变了。现在,如果试图清晰明确地想象出包含二三十个组件的东西,我就必须全神贯注,甚至还可能会头疼。换作年轻的时候,我可以想象一座有20个房间的城堡,每个房间里有10个不同的物体,这都不在话下。不过现在我做不到了。现在我更多的是依赖早年的经验进行思考。我看到的是一团团未成形的云,不是像明信片画面那样清晰的图景。不过我的程序确实写得更好了。

采访者:成为优秀程序员有什么套路可循吗?

西蒙尼:恐怕没有。

采访者:这种才能是天生的还是来自后天教育?

西蒙尼:挑选合适的人并培养成优秀程序员,有不少套路可循。我们招揽有天分的员工。我不清楚他们何以有如此才华,我也不用去弄清楚。但是他们确实很有才。在此基础之上,环境可以起到很大作用。

进入公司第一天,程序员就会拿到几本书。其中一本是数学家乔治•波利亚写的《怎样解题》。(西蒙尼边说边从他办公桌旁的书柜里取出那本书,翻到某一页。)这两页很重要。这本书的其余内容就是基于这两页展开的。这就像一张问题求解的检查单。这是起飞前、起飞和着陆检查单。它不会教你如何飞行,但是如果不照做,即使你已经懂得怎么飞行,也有可能会坠机身亡。

求解问题时,我们遵循以下四个步骤:首先理解问题,然后拟定计划,接着执行计划,最后回顾整个过程。这样的书我们大概有四本,我觉得我们能使程序员比刚加入公司时变得更加优秀。

采访者:你怎么看待将来程序员的作用?

西蒙尼:如果你是在问我们会不会像以前的物理学家那样自高自大,天知道!任何一门学科只要硕果连连,从事那门学科的人似乎总会飘飘然:“我们早就知道自己真的很聪明。”然后,他们摩拳擦掌,想要解决其他领域的问题。

这让我想到1945年之后的物理学家。他们说:“我们全都搞定了!现在让我们四处看看。”看到生物学与控制论,他们认为:“这些研究大脑的家伙什么都不懂。他们甚至不知道记忆是怎么储存的。这也不足为奇,谁叫他们都是呆瓜呢。现在,让我们来研究研究。我们会搞定它的。我们将运用海森堡方程、量子力学,或者以前派过用场的随便什么玩意,我们会把它应用到大脑研究中,接下来就等着奇迹出现吧。”

这有时行得通,有时行不通。天知道。也许计算机科学将会帮助破译DNA,而不是只提供工具。破译DNA可能会成为黑客的终极梦想。

采访者:你觉得将来程序的编写方式会有重大改变吗?

西蒙尼:我认为未来的计算机会比今天的更高效,但我不觉得会有什么大的差别。我不知道第6代或32代计算机会不会做到一些完全不同的或是很了不起的事情。我对鼓吹多妙多好的新方法格外警惕。光从我们现有的方法来看,我就能看出不少改进余地。我更信赖现有的方法,不是因为我保守,而是因为我知道自己至少不会失去既有好处。

我总是担心,当这些所谓难以置信的新好处到来时,以往所有的好处也将不复存在。然后,它会让你陷入两难境地,你必须自行判断境况是否更好。我喜欢有把握的胜利。我敢断定,改善我们现有的东西,保留既有好处并消除弊端,胜过引入新好处新弊端兼而有之的新玩意。不过也许我是错的,到时我会第一个加入到新事物的行列中。我坚信事情会发生剧变,变得更好,不过这需要时间。

采访者:为什么还要等这么长时间?

西蒙尼:因为必须先等大量愚蠢的想法消逝。这就是为什么进步需要时间。首先,新想法必须不断演变;其次,阻碍进步的坏想法必须消亡。历来就是如此。即使是相对论和量子力学,好的想法也必须经历很长时间才能成形。然后,旧物理学的既得利益者会慢慢消失。

采访者:可以举个例子吗?

西蒙尼:要是提到人们普遍厌恶的打孔卡之类的东西,我估计不会有多大效果。因此,我还是得挑些大多数人相信的东西。我认为“简单崇拜”,即以简单本身作为追求目标的观念,值得高度怀疑。多年来,这个观念一直诱使我们关注那些回报最快的问题。但它只是一种手段。我认为,计算机科学,连同其他所有数理科学(数学、物理和现代分子生物学等),都将通过理解非常复杂的现象而不断改进。数学已经发现了一些复杂的基本对象,在这方面也处于领先地位。有一类这样的对象其传统名称是“简单群”,这颇具讽刺意味地反映出“基本”等于“简单”的旧观念。不过,这两个含义也许并不相同。在计算机中,只是喋喋不休地大谈简单性,我们在实际的人工智能、用户界面和语言等领域也许就会毫无进展。

采访者:不编程的时候,你都做些什么?还有其他兴趣爱好吗?

西蒙尼:还有其他不少有意思的事情,我也乐此不疲。我对埃及象形文字略知一二。学习其他语言、旅行和观察世界都是很不错的活动,我不介意做这些事情。我还持有私人旋翼飞机(直升飞机)飞行员执照。

我不觉得编程要比其他事情重要得多。但是如果你从做事的角度来看,它就变成另一回事了。实际上,比起单纯的编程,正是这份业务工作让我忙得不可开交。我非常愿意在工作过程中做编程。

采访者:你是否认为自己更愿意把时间用来完成编程这项业务工作?

西蒙尼:不。我只是说我编程是因为它是工作。不只是因为我喜欢编程,而且因为我喜欢这项工作。我不会一写代码就雀跃不已,说:“嘿,我又写了一行代码,真是太开心了;写得越多,快乐越多。”绝非如此。这行代码我也许已经写了10遍。只是不断重复键入,以致弄伤手指,可能会非常倒胃口。因此当我编程时,那么做的原因在于它是工作的一部分,这份工作才是我想做的。

抽象的编程和业务的编程之间,主要区别在于后者目的非常明确。否则,它不过是像下棋一样的抽象活动,游戏终了,棋子乱成一堆,游戏就此结束。程序完成时,有人会使用它,我看到他们喜欢它,自己也会从中获得满足。他们中有些人甚至为它付了钱,我能分到其中一部分,可以用这些钱到埃及旅游,或者飞半小时直升飞机。顺便提一下,驾驶飞机跟编程项目非常相似:起飞和降落很刺激,驾驶过程可能会非常累人,而飞机可能会随时解体。

采访者:你怎么看待自己同时代的其他程序员?

西蒙尼:我非常敬重那些影响过我的人,我非常敬重他们。不过我也非常尊重现在跟自己共事的人。

采访者:你跟其他开发过大型程序的程序员有无来往?你会和他们交流想法吗?

西蒙尼:我非常看重竞争。我有幸在两次展会上遇见鲍勃•弗兰克斯顿和丹•布兰克林(这两位是Software Arts公司共同创始人,世界首套电子表格软件VisiCalc的创作者)。我还遇到过乔纳森•萨奇(莲花公司①创始人之一)。但遗憾的是我们来往并不多,这些程序员来西雅图的机会也不多。布鲁斯•阿特维克(Bruce Artwick,微软飞行模拟软件Flight Simulator 的编写者,被称为模拟飞行之父)有时会来造访,还有苹果公司的人,比如比尔•阿特金森(Bill Atkinson,Lisa电脑程序员之一,后来为苹果Macintosh电脑开发了MacPaint程序)——在我眼里他是最棒的——和比尔•巴奇(Bill Budge),为美国艺电公司开发了《弹珠台制造机》②游戏)。这些家伙都很出色。

① Lotus Development Corporation,1995年被IBM收购后更名为Lotus Software。
② Pinball Construction Set’PCS,一种新的游戏类型,用户可以用它制造虚拟的弹珠台街机。

我们没有太多东西可以高谈阔论。我们都很有默契,说上三两句话就能心领神会。我知道,这些家伙只要开口说话,就会知道自己在说什么。因此当他真正开口说话、也确实知道自己在说什么时,就没什么让人意外的了。而且既然我也知道自己在说什么,说的又是同一件事,那又何必说呢,是吧?这就像笑话专场,听众围坐一圈,说笑话的人甚至用不着讲笑话。他们只要报个笑话的编号,大家就笑翻了。

要是能和这些人一起共事,那就太棒了,只可惜我们却是商业上的竞争对手。我觉得我们聚到一起可以成就一番伟业。也许有一天火星人入侵地球,逼不得已,我们必须实施计算机曼哈顿计划③。我们全都会被送到新墨西哥州并肩作战。天知道。

③ Manhattan Project,美国陆军于1942年6月开始实施的利用核裂变反应来研制原子弹的计划,主要在新墨西哥州沙漠地区的一处绝密研究中心进行。

目录