《编程大师访谈录》已经上市,在本书中,最具影响力的当属比尔·盖茨,图灵社区将此篇访谈公布出来,供大家赏读。在访谈开始之前,先让我们了解一下这位大师级人物。

enter image description here

青年时代的盖茨

enter image description here

现在的盖茨

威廉·亨利·盖茨 (William Henry Gates)

昵称比尔·盖茨 (Bill Gates) 1955年10月28日出生,在西雅图长大。他的父亲威廉·亨利·盖茨是一位律师,母亲是一位教师,性格坚强,富有独立性,善于与人交往。盖茨是家中三个孩子中唯一的男孩,排行第二。从少年时代热衷于电脑游戏,富于想像力,14时不再上数学课,因为他已很好地掌握了数学知识。1973年进入哈佛大学法律系学习,19岁时退学,与同伴保罗·艾伦(Paul Allen)创办电脑公司,直到后来创办了微软公司,自任董事长、总裁兼首席执行官。1998年1月,他将总裁一职让给史蒂夫·鲍尔默,2000年1月13日,他宣布不再担任该公司的首席执行官一职,以便从对公司日常事务的管理中脱出身来,集中精力推进下一代视窗因特网平台及其服务工作。 2008年6月27日是盖茨在微软全职工作的最后一天。不过,现在他依然担任微软的非执行主席。

进入访谈:

作为微软的CEO,威廉•H. 比尔•盖茨(William H. Bill Gates)被认为是当今个人计算领域和办公自动化行业一个强有力的推动者。比尔•盖茨从年轻时就开始了计算机软件的职业生涯。当盖茨和微软的联合创始人保罗•艾伦还在华盛顿州的西雅图上高中时,两人就开始做起了编程顾问的工作。1974年,盖茨在哈佛大学读本科时,他与艾伦合作为第一台商用微型计算机MITS Altair开发了一套BASIC编程语言。在那个项目顺利完成后,两人创办了微软公司,为新兴的微机市场开发并销售软件。

微软为软件产业在编程语言、操作系统和应用软件等各方面设定了标准。盖茨为微软提出了新产品的创意和技术发展的远景。在开发新产品时,他还会亲自指导技术小组,投入时间复审和完善微软所销售的软件。 盖茨出生于1955年,是西雅图本地人,至今一直居住在那里。

*    *    *

采访者:显然,作为微软的CEO,你的责任重大。你现在仍在编程吗?

盖茨:我现在不编程了。我仍会在算法设计和基本方法上提供帮助,有时也会看看代码。但自从完成IBM PC BASIC和Model 100上的工作后,我就再也没机会自己动手编写程序了。

采访者:在微软的软件开发过程中,你扮演了什么样的角色?

盖茨:我做两件关键的事情。一是选择在程序中放入哪些功能。为了做到这一点,必须合理把握什么事情容易做、什么事情不容易做。还必须明白你追求的产品系列的策略是什么样的,并要关注硬件领域的进展。 此外,我还致力于实现新功能的最佳方案,也就是如何把新功能做得既小又快。例如,我写过一个备忘录,是关于如何设计和实施Excel中的一项功能的:每当屏幕发生变化时,程序都要重新计算其中的公式。

在公司成立后最初的4年,我参与编写和设计了微软所有的程序。在所有这些最初的产品中,无论是BASIC、FORTRAN、BASIC 6800还是BASIC 6502,没有一行代码是我没有检查过的。但现在我们有大约160名程序员了,所以我主要是做产品和算法的复查。

采访者:你认为你在编程上最大的成就是什么? 盖茨:那得说是为8080编写的BASIC了,因为程序当时所产生的影响,而且因为我们设法把程序做得很小巧,非常适合当时的使用场景。那是我们决定创办微软时所编写的最早的程序。

我们三个人都清楚地记得那个最早的程序。我们得到了一个机会,在新墨西哥州的阿尔伯克基花了整整一个夏天,把程序彻底重写了一遍。我认为可以节省几个字节,让程序更精简。我们非常非常仔细地调试着,最终得到了那个4K的BASIC解释程序。

当你非常了解一个程序,觉得没有人在看了程序后会说“还可以做得更好”时,那种感觉真是太棒了,而且程序用在了很多机器中,让人觉得编写那样一个程序是件很兴奋的事情。

我还非常喜欢为Model 100编写的那个程序,特别是我们把一个非常有用的小编辑器压缩到了软件中。我和一个名叫杰米•铃木(Jey Suzuki)的日本程序员合作完成了那项工作。我们在非常有限的时间内完成了那个项目。如果编写的软件要烧入ROM,你是没有机会可以犯错的。

采访者:你认为计算机编程中最困难的部分是什么?

盖茨:最困难的部分是确定采用什么算法,然后还要尽可能地简化算法。做到最简单的形式是很难的。必须在心中模拟程序是如何工作的,必须完全了解程序各部分是如何一起工作的。最好的软件是其中有一个程序员完全了解程序的工作方式。要做到这一点,必须要特别热爱编程,集中精力让程序变得极为简洁。

采访者:随着计算机能力越来越强大、内存越来越多,编程会变得越来越复杂,还是会变得越来越拙劣呢?这对人们编写程序的方式会产生什么样的影响?

盖茨:我们已经不再生活在每一个程序都精雕细琢的时代了。但是你会发现,程序要做到顶尖,最重要的是,那些关键的内部代码都是由少数几个知道自己在做些什么的人编写出来的。

现在把程序压缩到4K的内存区域中已经不那么重要了。你在很多情况下会看到人们使用C语言,而不再使用汇编语言了。遗憾的是,很多程序都太大了,已经没有一个人可以真正了解整个程序的所有部分了,所以能得到的共享代码也不是很多。此外,因为一直要在同一个程序中添加新功能,所以也没有太多机会让你回去重写代码。

最糟糕的程序是原来的程序员在开始时没有打好基础,而他们也没有再参与到程序的后续开发中。在这类程序上继续工作就会遇到一种我所说的“实验性程序”的情况。程序员对那些程序了解得太少,他们不知道改动之后会影响什么,比如说会不会影响运行速度。他们可能会使用已经存在的代码,他们也有可能并不知道如果修改了代码,会破坏何种依赖关系。于是他们加入了新代码,并在运行之后说:“噢,看哪,它不是那样运行的。”这种处理程序的方法效率非常非常低,但很多项目到了最后却都是这样的。

采访者:在一个像微软这样有160名程序员的公司中,你是如何创造一个环境以确保能开发出成功软件的?

盖茨:一种方法是建立小型的项目团队,通常是四五个人一组,其中一个人经证实有能力掌控整个程序。如果这个项目带头人遇到不确定的事情,他会与经验更为丰富的程序员一起讨论。

我们的部分策略是让所有程序员在进入编码阶段之前都先想清楚每一件事情。编写程序设计文档是至关重要的,因为在把问题当做算法看的时候,问题会得到很大的简化。可以说算法是最简单的形式,从中可以看出问题在什么地方是重叠的。

另一个重要因素是代码复查,要确保代码是看过的,看看资深人士是否能提出如何做得更好的建议。而且你必须参考类似的、做得特别特别好的项目。程序员可以看看以前其他人是怎么做的,从其他项目获得改进自己程序的想法和经验。

采访者:那些程序的构思是怎么来的?

盖茨:嗯,说实在的,还真没有什么正式的流程。在微软,通常在晚上或周末会有一个集思会。大家会有些大致的想法,比如说,我们要做世界上最好的字处理器,我们希望技术出版部门借助这个字处理器能够做他们想做的每一件事。为此我们会坐下来讨论:怎样才能让程序真正快捷?能够嵌入绘图功能吗?能够让字体平滑但又不降低程序的效率吗?各种各样的问题都会透彻地讨论,接着就会出现一些好的想法。

采访者:大体说来,程序的构思是集体智慧的结晶?

盖茨:对于决定要开发哪些程序,我们有一个相当大的团队来提出建议。然后会有一个筛选的过程,最后由我决定哪些想法是有意义的。我要确保项目有一些项目带头人,能够亲自参与项目,确保产品开发成功。为了开发一个产品并制定新的世界级的标准,需要投入非常大量的资源,所以我们选择的项目会非常非常少。

采访者:很多人都在谈论大型软件公司要想吸引能开发出优秀软件的人才有多难,因为这些大侠都太特立独行了,他们喜欢独自作战。在微软,你们是如何吸引并留住那些优秀人才的?

盖茨:优秀的程序员对于软件产品的开发是至关重要的。但是我们不赞同独行侠的做法,不会仅仅因为一个人很优秀,就允许他在代码中不添加注释,或允许他不与其他人沟通,或是允许他把自己的想法强加给别人。

我们希望程序员能够相互尊重。我认为大多数优秀的程序员都希望周围有其他优秀的程序员。当他们想出了一个很好的算法时,他们希望周围有能够欣赏其绝妙之处的同事。因为你在构想那个算法、脑海中产生那样一个模型时,那是个寂寞的事情。如果你原来以为处理过程很复杂,但却找到一个办法,让过程变得很简单,那种感觉好极了。不过你需要从其他程序员那里得到一些反馈。如果已经有了几个优秀的程序员,就会吸引更多优秀的程序员。

传统的管理规则是,程序员的管理者总是一个更加出色的程序员,没有我们所说的“技术倒挂”,让程序员为一个不知道编程为何物的人工作。我们仍旧遵循这一理念:在一定的级别上,我们会用业务经理,但不会用非程序员管理正在开发的软件项目。

采访者:你认为开发优秀的程序有什么特定规则吗?

盖茨:有些人刚一进到项目中就开始坐下来编码,而有些人则在编码之前把所有的过程都想清楚,我认为你会发现那些一开始就坐下来编码的程序员只是在把那些代码当做草稿使用。那些在他们头脑中思考的内容才是最重要的。

你必须得有非常聪明的程序员。一个优秀的程序员会一直不断地思考所开发的程序,无论是开车还是吃饭。不停地思考问题,需要耗费大量的脑力。

采访者:你的编程风格是什么?

盖茨:我喜欢在坐下来编写代码之前先把整个设计方案构想清楚。而在完成代码后,我喜欢回去把它从头到尾再全部重写一遍。

编写程序最重要的部分是设计数据结构。接下来重要的部分是分解各种代码块。在开发到那一步并写出代码之前,你无法敏锐地感知那些公共子例程应该是什么样的。

我所写过的真正优秀的程序都是在开始动手编程前已经花了大量时间去思考的。我在高中时为一台小型机编写了一个BASIC解释程序。我在那个程序中犯了很多错误,后来我得到机会,看到了一些其他的BASIC解释程序。这样当我在1975年坐下来编写微软的BASIC解释程序时,问题已经不在于是否能写出程序来,而在于能不能把程序压缩到4K,并得到非常快的运行速度。整个过程中我都在紧张地思考:“速度够快了吗?其他人会做得更快吗?”

我一直记得一个人,他是我在TRW公司遇到的,名叫诺顿。我没有做到特别好的时候,他总会给我指出来。所以当我草率或偷懒的时候,我总是想象着他会走过来,看一看程序,然后告诉我:“你看,这儿有一个更好的方法。”在编程的过程中很容易引入一些小的低效率的做法,要想获得良好的感觉,就必须时刻保持警觉,不能让这类东西侵入,这也是为什么有时候和其他人在项目中一起工作会让你觉得痛苦的原因。因为他们从来都不能按照你希望的方式编写代码。记得当我们在做BASIC解释程序时,我常常回去重新编写其他人的部分程序,但又没有做出什么特别大的改进。这种做法会困扰你的同事,但有时你觉得必须那样做。

采访者:在和团队一起工作时,你总是设计方面的带头人吗?

盖茨:是的,在我直接参与的所有项目中,我都是设计带头人。最初编写BASIC时,我在纸上画出了设计草案。我的合作者保罗•艾伦设计并实现了所有开发工具。

在坐下来编码之前,大部分指令都已经在我的脑海中运行了。这并不是说所有的设计都已经很好地完成了,我也会做修改的,但所有好的想法在开始编码之前就都想到了。如果在某处有一个bug,我会觉得很不舒服,因为如果存在bug,说明你在脑海中的模拟是不完美的。而一旦脑海中的模拟不完美,在程序中就有可能会有几千个bug。我真的很讨厌看到一些人在编程的时候不动脑筋。

我最有趣的编程经验是在我们编写BASIC程序的时候。那时我已经开发完成了8080上的BASIC程序,接下来有大约两周的时间可以和马克•查姆伯林(Mark Chamberlain)一起开发6809版本的BASIC程序。在那两星期的开始几天,我读了新的指令系统,接着写了三四个程序。我还读了一些其他程序,看看别人是如何使用指令集的。把自己已经理解的问题映射到这个新的指令集中,看看如何将它们紧密地结合在一起,真是非常有趣。 如今的程序变得非常臃肿,因为人们在程序中加入了特殊检查,所以功能的提升往往会降低程序的效率。当他们想增加功能时,就会加入某类检查,却不考虑这样做也许会降低程序效率。必须有一个程序员能完全了解整个程序,防止这种现象的发生。比如我们在完成BASIC程序后,我和其他最初的开发人员都离开了那个项目,程序在此后大约3年的时间里都没有开发过任何创新的东西。直到在过去的一年半中,我们才有程序员感到自己完全掌握并全面了解了那个BASIC程序,能够说:“哦,放些子例程进去,很容易就能去掉行号了。”直到那时我们才对程序做了更新。其实我们一直都想更新那个程序,但是如果程序员仅仅会在表面打些补丁,而不知道如何深入部件或语句分析器的内部,你是没有信心去动那些程序的。

的确,我们会允许程序比本该有的稍臃肿些。但在速度方面,不允许因懒惰而不设法使程序尽可能地快,因为用户会留意到程序是否非常非常快,即使他们未必能直言不讳。那些最成功的软件,程序的运行速度都非常快。

采访者:你是如何在速度和性能之间进行权衡的?

盖茨:有时候是需要在添加功能和快速运行之间进行权衡的,但也有其他办法,即使增加很多很多功能,速度也照样快。一般来说,你要确定程序中最常见的情况是什么,并要确保它们运行通畅,不会陷入到那些特殊情况的检查中。因为如果在主要的交互循环流程中有各种各样的检查,程序就会比别人的慢。

采访者:当你提出一个想法,要做世界上最好的字处理器时,你们是怎样做的,如何设计的?是否考查过市面上所有的字处理器?

盖茨:是的,我们考查了其他字处理器的功能。在考查时你会想:“会有人在屏幕上对字体做平衡处理吗?还是说屏幕上显示的与打印出来的完全一样?运行速度怎么样?”通常,那些尖端的产品中,有人会采用非常非常昂贵的硬件,使用蛮干而不动脑筋的方式解决问题。我们不能那样做,因为运行我们软件的微机速度有限。我们要做的很多事情在高端计算机上都已经有了,我们要在成千上万的微机上也实现这些功能。

你可以在产品中使用大量的技巧。在建立功能列表的同时你要尝试回答下面这个问题:“为什么我们的算法比别人的都好?”功能在某种程度上也可能使产品变得很糟,因为功能越多,用户手册就越厚。而功能只对那些肯花时间去使用它们的人才有用,这不像速度——如果打印页面的速度更快,在屏幕上显示的速度更快,重新计算的速度更快——那么产生的价值是惊人的。如果能够提供一些简单的命令,程序通过这几个简单的命令就能有效地满足用户的需求,那么结果会好得多。非常好的程序的一个标志是在内部也能遵循简单的理念。如果程序想实现复杂的功能,可以通过简单的内部操作调用代码,而不必从头开始去做一系列复杂的操作。

采访者:最终用户的重要程度如何?你如何知道数据库管理员对数据库或报表的真正需求和要求是什么?

盖茨:嗯,对于最终用户究竟想要什么,有些程序员用不着假装对此有很直观的洞察力,但他们仍是世界级的程序员。不过对市场的认识是很重要的,尤其是在应用程序组,所以我们有全职的工作人员,专门向客户演示代码、调研行业规范或其他相关信息。在微软刚成立的时候,我们只开发系统程序。我们是程序员,所以知道程序员想要的是什么。因此我们编写了BASIC语言。

**采访者:**BASIC在哪些方面是最具创新的?

盖茨:我们提供了允许程序员使用机器全部能力的方法。我们嵌入了PEEK 和 POKE 指令,程序员可以读写机器状态。我们提供了名为TRON和TROFE的跟踪调试例程。即使是高级语言,用户也可以把他们想做的各种古怪的小功能添加到计算机中,并且无需使用BASIC程序就可以了解内存使用情况。我们让他们觉得计算机是由他们自己掌控的。

为了把BASIC放到4K的内存中,我们使用了叫做单一表示法解释程序的机制。这是一个非常好的选择。此前我从来没有见过哪一个解释程序这样做过。虽然有些冒险,但我却对这种机制信心十足。我在脑子里把它过了一遍,感觉很好。

采访者:你在编写BASIC解释程序的时候,可曾想过它会如此成功吗?

盖茨:不,根本没有想到。当时保罗•艾伦给我带来一本介绍Altair的杂志,我们就想:“老天,我们最好在上面做些事情,这些机器肯定会很受欢迎的。”于是我不再去上课了,我们开始没日没夜地工作起来。程序的雏形花了大约三个半星期,然后花了大约8个星期让程序最后按我真正喜欢的方式充分完善。过了些时候,我又回去把它重写了一遍。

没有哪一个优秀的程序员会坐在那里说:“我要赚一大笔钱。”或者说:“我要卖出成百上千个拷贝。”因为这种想法不会对你解决问题带来任何帮助。一个优秀的程序员想的是:是否应当把整个子例程都重写一遍,这样就能够让4个人而不仅仅是3个人调用了?能让程序快10%吗?是否应当好好想一想这里的常规状况是什么,这样就可以对校验条件进行排序了?如果是一个优秀的程序员,你会让所有例程互相依赖,这样就不会有什么致命的错误了。这就是为什么必须有精准的判断,愿意备份并修改程序的原因。

采访者:当多人参与到同一程序中时,怎样确保各种不同的人都能融洽地一起工作呢?

盖茨:嗯,首先,项目组必须由能够互相尊重的成员组成,因为这个工作需要密切配合,就像是打一场比赛一样。编程项目需要很多的判断力和创造力。有些优秀的程序员无法融入团队工作,他们喜欢干自己的。但我觉得优秀的一个要素来源于学习如何与其他人一起工作,并教导别人。我会因为和我一起工作的人成长为优秀的程序员而感到欣慰,虽然不像我自己写程序那么开心,但也是很好的事情。我让别人成为一名优秀程序员的方式就是坐下来和他详谈,给他看我写的代码。在一个项目团队中,你的代码也是大家的代码。

采访者:这种过程是自然演变的,还是刻意实施的结果?

盖茨:在我和保罗创办微软之前,我们参与过一些大型的软件开发项目,那些项目可真是灾难。他们只是在不停地往项目组加人,却没有人知道要如何去稳定项目。我们发誓说自己可不能做成那样,我们要做得更好。要多花一些时间组织规划开发组的工作,这种想法对我们一直都非常重要。

最好的方法是显而易见的:保持项目团队精简;确保小组中每个程序员都非常聪明;为他们提供强大的工具;有一套公用术语,以便大家很有效地沟通。而在这些小组外,找一些经验丰富的资深人士,在遇到问题时能够出谋划策。在项目过程中遇到的困难类型有着惊人的共性。在做设计评审时,我非常乐于根据我自己的项目经验提出建议。

采访者:你认为人们编程或操作计算机的方式会发生很大的改变吗?

盖茨:软件开发工具变得比以前好多了。最终我们可能只需要取得规格说明,以及一个怎样有效使用机器的说明,然后就会有一些超高级的编译器来完成很多目前由程序员所做的工作了。

尽管一个编译器,比如C编译器,还无法像人编写的代码那样好,人们仍旧会因此而感到非常满意。但在今后三四年中,我们可以把这个过程中相当多的部分都做到机械化。人们仍然会设计算法,但是很多实现工作都可以通过机器完成了。我认为,在未来5年内,出现的工具所能完成的工作将会像程序员一样好。

采访者:你刚才提到了数学。计算机科学和数学之间的关系是什么?

盖茨:数学对计算机科学有着很大的影响。大多数优秀的程序员都有一定的数学背景,因为它有助于学习证明定理过程中的纯正性,在证明定理的时候不能做模糊的陈述,只能做精准的陈述。在数学中,不仅要建立完整的特征描述,而且要以很不明显的方式把定理结合起来。你常常会去证明一个问题是可以在更短的时间内解决的。数学与编程有很直接的联系,因为我是这么看待这个问题的,所以我的这种观点可能比别人更强烈一些。我认为两者之间有着天然的联系。

采访者:计算机科学真的是科学吗?

盖茨:会是的。这是一个非常新的事物。现在我们希望程序员能完成的一部分工作,在以前是人们用来做博士论文时要做的工作。计算机科学正在飞速发展,但它不像数学,数学天才在300年来一直在不断地丰富着数学理论,而人们愿意投身到计算机领域却不过是最近20年的事情。一些卓越的人加入到计算机科学领域并做出了贡献。和以前相比,编程现在已经是非常主流的工作了。人们在很小的时候就开始接触计算机,这有助于改变计算机科学领域的思维方式。很多优秀的程序员在他们十几岁时就开始编程了,在那个年纪思考问题的方法也许会更灵活一些。

在过去,人们认为单单成为优秀程序员是不够的,你还得去管理别人或处理其他事情。幸运的是,这种情况正在改变,现在人们认识到计算机是一门科学,是值得坚持下去并教授给其他人的。

采访者:经过多年的经验积累后,编程是否一定会更容易呢?

盖茨:不,我认为在过了最初的三四年后,就会非常明显地显现出你是否是一个优秀的程序员。刚开始的几年中,你可能会更多地知道怎样去管理大型项目和不同个性的人,但在三四年后,就能很清楚地看出你会成为什么样的程序员了。在微软没有哪个程序员是在平庸了几年之后突然间一鸣惊人的。我和一个人谈谈他的程序,马上就能知道他是否是个好程序员。如果他真的很棒,每个细节他都会脱口而出。

就像下棋的人一样。如果你特别喜欢下棋,会很容易记住10盘棋中的每一步,因为你已置身其中了。其他人看到国际象棋选手或程序员能记住每个细节时,觉得他们像个怪物。其实这很正常。即使到了今天,在我写了微软的BASIC程序10年后,我仍可以在黑板上大段大段写出当时的源代码。

采访者:你在编程时是什么样的感觉? 盖茨:在编译程序并计算出正确的结果时,我会非常开心。这是真的,不是开玩笑,所有伟大的事情都会有感情因素,编程也不例外。人们很想一上来就开始编码,但是如果编写代码只是为了得出结果,过后却发现所有难题都还没有处理,那么没有什么比这更糟糕的做法了。因为如果真是那样的话,你就不得不修改已经完成的程序。为了享受编码并看着代码运行起来的乐趣,我喜欢等一等,把基础打好。这就像吃饭时把最好的食物留到最后才吃一样。

采访者:你看到年轻的程序员和老程序员的编程方式有什么不同之处吗?

盖茨:今天刚刚起步的程序员根本用不着对程序进行压缩,他们认为要用到的资源总是能马上得到,所以让他们树立一个正确的理念有点困难。10年前每个程序员都曾面临资源有限的状况,所以老程序员总是会想着对程序进行压缩。

编程需要非常大量的精力,所以大多数程序员都比较年轻。这就会带来一个问题,因为编程需要很多的训练。在年轻时,目标不是很持久,可能会被这样那样的事分心。但是年轻的程序员应当坚持下去,他们会变得更出色。作为程序员,我认为自己在1975年到1980年之间的提高是最明显的。在1975年,我会说:“嘿,看看,我什么事情都能做。”我真的认为自己可以,因为我读了大量代码,从来没有发现哪段代码是我无法快速读懂的。今天我仍旧认为检验编程能力的最好方法之一就是给程序员一本30来页的代码,看看他阅读和理解的速度有多快。

采访者:你认为那是天赋吗?

盖茨:一定是天赋。有点像是纯I.Q.(智商)。你必须只专注于代码,并把代码和你已经编写的程序关联起来。很多人会说:“我要花上好几天来看这些代码。”而一个优秀的程序员则会说:“我把代码带回家,晚上花一个小时就能全部看完。”这种能力的差异是巨大的。

采访者:学习计算机科学是成为一名程序员的最佳途径吗?

盖茨:不是,成为程序员的最佳途径是编写程序并研究其他人编写的优秀程序。我自己以前就是去翻计算机科学中心的垃圾桶,找出他们的操作系统的程序清单。

你要愿意去看别人写的代码,然后写自己的代码,再让其他人复查你的代码。你需要身处这个不可思议的反馈循环当中,让世界级的专家告诉你,你做错了什么。你不能让一些小小的个人习性阻碍你获得这些反馈信息。有些世界级的专家会在一些纯属个人偏好的细节上喋喋不休,比如说该怎样注释程序。你必须跳过所有这些东西,因为在某种程度上,他们是试图以自己的形象来塑造程序员,并试图让你按他们的方法行事。而这些可能并没涉及程序的纯质量问题。

如果和一个优秀的程序员聊一聊,你会发现他对他使用的工具非常熟悉,就像一个画家了解他的画具一样。优秀程序员们开发程序的方式都有很多共同之处,这点令人惊奇——他们得到反馈的方式,以及他们是如何精准地进行规范的,哪些是草率成就的,哪些是认真完成的。当你请这些人来看一些代码时,你会发现他们的反应通常是非常非常一致的。

采访者:是否有人对你编码的方式产生了特别的影响?

盖茨:每个编写PDP操作系统的人都对我产生了影响。还有TRW公司的约翰•诺顿,他在读别人的代码时会写一些备忘录——在此之前我从来没有见过有人这么做。后来我也开始尝试那样做了,看别人的代码时我会写下心得。

我和保罗•艾伦一起编写过很多程序,我们之间总会有些共同的想法。当你调试代码或者不能确定一些特定的权衡时,马上就可以找人交谈,那种感觉真的很好。从某种意义上说,那就像是一种休息,可以缓解紧张情绪,不必转换主题就可以与别人接着讨论。在创作的过程中,能够减轻一些压力,但仍能集中注意力,这样是很好的。我和保罗知道如何能够有效地一起工作。你不会发现太多像我们这样的搭档。他对我的影响巨大。后来在微软期间,查尔斯•西蒙尼和微软其他一些人也影响了我。

采访者:软件行业会出现什么情况?我们会继续做另外一个出色的字处理软件或电子表格软件,还是说计算机行业会扩展到我们今天甚至连做梦都想不到的领域中?

盖茨:我们正越来越多地思考计算机。我创造了“软软件”这一新词,是指随着时间的推移,程序自身会与用户的需求和兴趣相吻合。会出现更好的文字处理器和电子表格系统,我们会使用网络、图像和新的体系结构。并且将使用大容量的存储光盘(CD),可以在上面存储百科全书。

真正不同的将是基于规则的编程方式。其不同之处在于,编程不再是“如果发生这种情况,就这么做;如果发生那种情况,就那么做”。这是程序现在的工作方式。今后你会先写下规则,然后让小的推理引擎查看当前的情况描述和规则。程序将尝试推导出新的情况描述并采取相应措施。例如,程序可能包含了重力规则,如果东西从桌子上掉下来,程序就会知道,如果掉下来的是玻璃的话,可能会摔碎。因此,相对于常规类型的编程,这种编程会以很不明显的方式来产生结果。

所谓的专家系统就是基于这种技术构建的。基于规则的编程是通过证明机完成推导的过程,而不是在程序中做明确的说明。也许这些技术在今后的三四年或更长的时间内都不会产生影响。但一个想取得成功的年轻程序员会聪明地把注意力放到这种新的编程方式上。

采访者:基于规则的编程的方式在处理差异很大的信息时会比传统的编程方式更有效吗?

盖茨:嗯,这有点儿不太好解释。假设有一个程序是关于如何建造桥梁的,它采集了所有关于金属压力、弯曲度和特性的信息,并在程序中嵌入了有关工程、材料和这类信息的资料。但如果你跑过来对程序说:“我们想用塑料来建一座桥。”那么这种变化是巨大的,就好像对它说“我想在火星上建一座桥”一样。

基于规则的编程方式在极端情况下,所有体现了金属可以承担多大压力、重力如何产生作用等物理原则都会作为一条一条的规则明确地阐述。所有的推论都来自对这些规则的检查和运用。目前我们还没有足够好的用来证明规则的引擎,如果采取这种极端的方法的话,效率会低得让人无法忍受。但这正是我们正在取得进展的一项技术,而且这种技术可能很快就会改变我们的编程方式。另外一个想法是,可以让很多台计算机同时并行运行。实际上,这可能会有助于提高这种基于规则编程的效率。这种重大的体系结构变革可能会影响人们的编程方式,或是影响他们对编程的看法。

对程序员来说最可怕的事情是,编译器太好了或是计算机太快了,让程序员变得不再重要了。我过去总是担心,自己选择了某个专攻的领域,但其重要性可能会随着时间的推移而降低。

采访者:微软的涉及面很广,而整个计算机行业的变化又非常迅速。你是如何做到与时俱进的?

盖茨:嗯,我不会想着要跟上每一个变化。我正在和IBM、苹果、DEC和日本计算机界的高层人士合作。我必须知道将要发生什么,我不能浪费太多时间去猜测。我和微软的工作人员飞往某处时,我们会谈论计算机界发生的事情。微软的电子邮件系统是一个高效的工具,可以帮助我跟得上行业的发展。

要跟得上行业的发展,方法之一是使用个人计算机。我要确保阅读了用户手册,并使用了排名前十的软件产品。这些产品不会经常变化,所以我对它们还是很熟悉的。如果你真的关心个人计算机软件,就会使用每一个软件,会去了解它们,并考虑你的软件要如何才能比这些软件包做得更好。

从某种意义上说,个人计算机已经变得简单了。现在我们只有两个体系结构,PC和Mac。而在美好的往昔,我们有三四十种完全不兼容的机器,还有一大堆乱七八糟的语言混在一起。因为我们让很多很多用户使用计算机,所以必须让计算机体系结构变成同类的、更加标准化的,以便用户能够了解其中的一些动向。很多在业内发生的事情并没有推进行业的进展。网络和图像方面的工作可能和业内最先进的东西相关,我们会把注意力放在这上面,而不会去管什么这个零售连锁店会倒闭吗,这家伙有没有行贿那个家伙,这家公司给了那个人足够的股票吗?谁会管这些事情呢?真正聪明的人会把注意力放在自己的领域上,他们会给我提供他们认为有重要意义的东西,他们会带给我能够产生影响的项目。

采访者:微软在10年后会怎么样?

盖茨:我们的目标很简单。我们开发的软件要能够让每一个家庭、每一张办公桌上都放上一台计算机。我不知道这是否要用10年的时间,我不擅长猜测准确的时间表。微软还希望参与到生产更好的计算机的工作中,为计算机开发系统软件,并开发很多运行在这些系统软件上的重要的应用软件。

即使会有越来越多的计算机,我们现在也并不认为需要扩充我们软件开发小组的规模,因为我们可以开发那些销量大的程序。我们可以获得高额软件收入,但公司的规模又不会比现在大很多。这意味着在公司中,我们可以了解每个人,可以一起讨论,分享开发工具以保持高质量的开发水准。

当前微软正专注的一个新领域是CD上的应用软件。CD光盘将是我们用来把个人计算机引入家庭的技术。

采访者:你为什么认为CD的出现会让微机进入家庭,而其他技术却不行呢?

盖茨:现在如果买一台计算机,然后再买一个教育软件,你会发现在使用后并不能达到预期的效果。程序在解答问题的数量上、问题的多元化上以及模拟现实生活中的方式上乏善可陈。随着大容量存储光盘CD的出现,教育软件可以创造一个让你产生直接共鸣的环境,其中包含的大量信息、各种各样的解答、亲身参与其中的感觉,都会给人留下深刻印象。

这是一个竞争的世界。有了教育软件,我们就要与报纸、书籍和电视竞争。而当今市面上的教育软件并没有什么竞争力。除非你只是为了不让孩子变傻,否则还真没有什么好的理由把这样一台机器买回家,因为它不会吸引你,不会吸引非计算机人员。

采访者:你觉得在CD光盘上的新软件能够与电视竞争吗?

盖茨:电视是被动的娱乐。可以肯定地说,人们想要的是互动,是有多种路径可以选择,并且能够从计算机得到他们想学习的内容的反馈。他们可以查找感兴趣的东西。CD光盘这种设备是可以互动的,这种特性使它有别于只能观看的电视。

采访者:在设计CD光盘上的应用程序时,你们会采用很多与现在相同的设计原则吗?

**盖茨:**CD光盘软件是完全不同的。我们希望用户可以借助于CD光盘地图软件查看美国地图,指到某处,点一下,放大地图,然后说:“嘿,周围有什么旅馆?”程序就会告诉你答案。如果使用的是百科全书,点到贝多芬的一首交响乐,计算机就会播放出来。这是一个新的接口程序,完全不像字处理器或电子表格那种提高生产力的工具软件。CD光盘上的程序要解决的是完全不同的问题。它和任何一种新媒体一样,有很强的竞争力。如何运用编程技术开发出比别人好的CD光盘应用程序?这是值得深思的。这个市场和我们已开发的程序所面向的市场不一样。在这个市场中,我们希望我们的智慧能有助于开发出一些新颖而又适用的软件。

采访者:这么说,它并不是简单地把一堆报纸放到CD光盘中,再配上一个检索程序?

盖茨:嗯,有些人会那样做,但我们不会,那没什么令人兴奋的。我们深信将来在每一辆汽车、每一栋房屋里都会有一个带CD光盘的计算机。当你到了一个新地方,把那张小小的光盘放进去,拖动图像,它就会显示出你要的路线,告诉你感兴趣的信息。

比如说体育运动。放进去一张体育CD光盘,就能看到运动员的记录和照片。可以观看过去的比赛,可以查看比赛规则。每张CD都会有你希望了解的某个领域的信息。每一张CD都会有小测验,比如:“嘿,你以为你对棒球了如指掌吗?嗯,这个人是谁,他做了什么?”

每张CD上都有互动游戏,在体育CD上这是很明显的。而在音乐CD上,游戏将是“这首曲子是什么”,你可以查看到得分,查看作曲的人,听不同乐器的声音。你会坐在那里,输入自己的得分。如果你是个飞行员,很可能会对机场和飞机的图片感兴趣。所有这些我们都会放到光盘上。

采访者:这些CD光盘上的软件会在书店出售吗?

盖茨:最终会的。在起步阶段,我们要确定哪些销售渠道对CD光盘感兴趣。特别是,会有一个专门销售计算机软件的零售商店吗?我个人并不这么认为,但这很难说。

某些CD应用软件听起来像是天方夜谭。但是发明一种新的媒体需要多长时间呢?我们几乎没有发明过新媒体。录像带不是新媒体,它并没有什么特别之处,只是电视节目的延迟播放。交互式视频磁盘本来有机会成为一个新媒体,但它却没有足够的用户群。它没有足够的信息资料,没有低成本的播放器,使用也不方便。它没有融入到大众文化中。光盘是一种超级的互动式视频,但我们必须做得更好。

CD引发的变革将是巨大的。我认为零部件商品目录将不再会以印刷品的形式发行了。对于主要是用于参考的东西,你需要的不只是翻页,还要以一种不同的方式来查找、处理和查看信息,这种电子形式远胜于其他大多数形式。我们最强的竞争对手显然是书籍。我们不会损害图书市场,但CD将取代商品目录和某些类型的参考资料。

采访者:你认为会从CD光盘中诞生出一种文化吗?就像电视文化那样。

盖茨:我不知道这种文化是什么,但CD比电视更具互动性。CD光盘软件不像现在的个人计算机那样只是针对编程的。但是仍旧会像个人计算机一样让人上瘾、让人能够参与其中。你会参与进来,你会想做测验,你会说:“我是一个超级巨星,让我试试这个。”我们会提供测验功能,这样可以让多人参与进来,挑选问题让别人回答。如果一个孩子沉迷于个人计算机,我认为这远比沉迷于电视要好,因为至少他需要做出选择。我不是那种讨厌电视的人,但我认为电视不会锻炼人的头脑。我家里现在刚好没有买电视机。

采访者:如果采用不同的标准,你认为CD光盘的发展会被削弱吗?

盖茨:对于微软和那些规模比微软大上百倍的公司来说,建立这一领域的标准需要强有力的政治手段。目前可能会出现两种甚至三种不同的、相互不兼容的光盘阅读器。考虑到编写不同版本的软件的成本,这种做法是不合适的。所以在标准上我们投入了很多的注意力和精力。我们正在努力确保我们的标准就是标准。这是很难的,很有挑战性。我们要非常非常迅速地让所有的活动都围绕一个标准开展,并且我们必须确保这个标准是合适的。

只有半导体行业才能做出这样的光盘阅读器。那些成本低得惊人的内存和高速处理器,视频和音频芯片,使我们能够生产出多媒体计算机。半导体行业正在发生着奇迹。单说最近两年,用户就在大量地购买各种零部件,因此价格也被降到一个很有吸引力的水平上。

采访者:你觉得CD光盘会与专家系统合并吗?

盖茨:不会,这两者并不相互依赖。因为CD上可以存放相当大的数据库,所以可以把专家系统所需的数据放到CD上。但它们并不是互相需要的。它们有各自面临的困难和挑战。

CD是视频,是音频,是程序,还是互动的,所以要想开发世界上最好的CD软件,需要各种技能组合在一起,这种要求是惊人的。像任何一种新媒体一样,难度很大。当人们第一次看到电视时,觉得比电台好多了,但电视也就那样做出来了。过了很长时间后,才发明了丰富的色彩、所有的动作、三维填料,以及今天在电视上看到的各种特殊效果。就像电视一样,随着我们媒体经验的增加,CD光盘软件也会越来越好。我现在可以坐在这里,告诉你所有我们不会犯的错误;但是5年后,我还可以坐在这里,告诉你所有我们曾经犯过的错误。尽管我们有创意,也无法马上就很充分地利用媒体。

采访者:你可曾希望能再回去动手编程吗?

盖茨:哦,那是当然。编程时可以控制一切。编程时不存在妥协。每一行代码都是你的,每一行你都觉得很好。这么想有点自私,但就像允许做纯数学一样,在编程中能够看到一些东西运转起来。我有时会忌妒我的同事,因为他们只需要关注他们正在编写的程序。


续写传奇人生 比尔•盖茨一直担任微软公司CEO,直到2000年卸任。在盖茨的带领下,微软先后推出DOS、Windows、Office、企业服务器等重量级软件,四面出击,并不断进军新的领域。1984年到1994年,微软凭借MS-DOS和Windows逐渐统治家用桌面电脑操作系统市场,1990年推出的Office最终成为办公软件领域的领导者。1995年到2005年,微软将产品线扩展到计算机网络和万维网,同时进军其他行业和市场:1995年推出MSN门户网站,并将其与Windows 95绑定;1996年与NBC合资创建MSNBC,拓展有线电视新闻业务;2001年推出Xbox进入游戏机市场。在盖茨的领导下,微软市值曾一度达到470亿美元。

2000年盖茨卸任CEO时,转而为自己创造了一个“首席软件架构师”的职位,并继续担任微软主席。2006年6月,他宣布将在两年内淡出微软公司日常事务,并将自己的职责分派给两个人:雷•奥奇掌管日常管理,克莱 格•蒙代掌管长期产品策略。2008年6月27日是盖茨在微软全职工作的最后一天。不过,现在他依然担任微软的非执行主席。

盖茨从本世纪初开始,就一直在慈善之路身体力行,他和妻子投入近半家产,创建了比尔•盖茨与美琳达•盖茨基金会。2008年从微软退休时,他又将580亿美元资产捐入该基金会。 在微软以外,盖茨投资的公司有:Cascade私人投资公司、bgC3(智囊公司)、Corbis(数字媒体许可和版权服务公司)和TerraPower(核反应设计公司)等。他还购买了由BBC录制的费曼物理学讲座的视频版权。这些视频现在通过微软的Tuva网站向公众开放。盖茨还曾在纪录片《等待超人》中出镜,该片试图分析美国公众教育的失败之处,并荣获2010年圣丹斯影展“观众选择奖”之最佳纪录片奖。


相关阅读