画外音

话说日前读过《编程大师访谈人物——比尔·盖茨》后,只觉得心潮澎湃、热血沸腾,但一时间又觉得无从下笔。恰巧参与了活动“寻找GEEK活动开始-----你就是极客”,并创作“极客之我见”一文后,才有了思路,并重新修改了本文题目。

开始之前

开始编程之前通常要清晰定义系统的软件运行环境及其硬件配置情况,其目的是为了给设计、开发、及测试阶段提供必要的约束,以便程序部署后能在真实环境下以最佳状态运行。同理,开始阅读文章、书籍之前也有必要搞清相关的背景,如创作时间、人物履历、关键专业词汇等,其目的是为了准确理解文字内容,进而深刻理解文字背后所要传达的含义。

言归正传,在《编程大师访谈人物——比尔·盖茨》一文中并未注明访谈的准确日期,不过通过访谈内容就可以推算出访谈年份,以下内容透露了相关线索:

……这样当我在1975年坐下来编写微软的BASIC解释程序时,问题已经不在于是否能写出程序来,而在于能不能把程序压缩到4K,并得到非常快的运行速度。……

……即使到了今天,在我写了微软的BASIC程序10年后,我仍可以在黑板上大段大段写出当时的源代码。

由此可知,访谈应该发生在1985年,当然也不排除1986年的可能。

另,比尔·盖茨的个人履历在文章的开始就介绍了。至于,专业词汇BASICMicrosoft BASIC可以在维基百科上查到相关解释。

接下来,就让我们一起看看大师是怎样炼成的吧!

缘起BASIC

文中提到盖茨“从少年时代热衷于电脑游戏,富于想像力,14时不再上数学课,因为他已很好地掌握了数学知识。”,可见他从小天资聪慧,而且高中时就在软件开发方面显露过人的天赋:

比尔·盖茨从年轻时就开始了计算机软件的职业生涯。当盖茨和微软的联合创始人保罗·艾伦还在华盛顿州的西雅图上高中时,两人就开始做起了编程顾问的工作。

人们常说“机会是留给有准备的人”,接下来发生的一切恰恰证明,盖茨所做的这些准备是多么重要。

……1974年,盖茨在哈佛大学读本科时,他与艾伦合作为第一台商用微型计算机MITS Altair开发了一套BASIC编程语言。在那个项目顺利完成后,两人创办了微软公司,为新兴的微机市场开发并销售软件。

毫无疑问,盖茨抓住了这个千载难逢的好机会,既赢得了创业之路上的第一桶金,又为创业之路指明了前进方向。

关注细节,酷爱编程

在微软成立之初,盖茨丝毫不敢懈怠,而是苦练“内功”、事必躬亲,如他自己所说:

在公司成立后最初的4年,我参与编写和设计了微软所有的程序。在所有这些最初的产品中,无论是BASIC、FORTRAN、BASIC 6800还是BASIC 6502,没有一行代码是我没有检查过的。……

……作为程序员,我认为自己在1975年到1980年之间的提高是最明显的。在1975年,我会说:“嘿,看看,我什么事情都能做。”我真的认为自己可以,因为我读了大量代码,从来没有发现哪段代码是我无法快速读懂的。……

不仅如此,盖茨为了把BASIC解释程序压缩到4K的内存区域中,可谓煞费苦心:

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

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

除此之外,当被问及“你在编程时是什么样的感觉”时,盖茨答道:

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

可见,盖茨认为编程的目的是为了解决实际问题。当编译程序并计算出正确的结果时,他之所以非常开心,是因为正确结果表明他精心设计的解决方案是切实可行的。

简单设计,整体把握

对于盖茨而言,编程最重要的不是把代码写出来编译通过,而是“必须在心中模拟程序是如何工作的,必须完全了解程序各部分是如何一起工作的”。为了能在心中模拟程序运行,因此无论算法、程序、还是功能都应尽量保持简单。正如盖茨所说:

最困难的部分是确定采用什么算法,然后还要尽可能地简化算法。……

如果能够提供一些简单的命令,程序通过这几个简单的命令就能有效地满足用户的需求,那么结果会好得多。非常好的程序的一个标志是在内部也能遵循简单的理念。如果程序想实现复杂的功能,可以通过简单的内部操作调用代码,而不必从头开始去做一系列复杂的操作。

这些观点与KISS(Keep it simple, Stupid!)设计原则简直如出一辙。

即便访谈之时,微软已有160名程序员,盖茨对于简单设计的重视丝毫没有放松:

……编写程序设计文档是至关重要的,因为在把问题当做算法看的时候,问题会得到很大的简化。可以说算法是最简单的形式,从中可以看出问题在什么地方是重叠的。

除了简单设计,盖茨对于程序的整体把握也非常重视,他这样说道:

……最好的软件是其中有一个程序员完全了解程序的工作方式。要做到这一点,必须要特别热爱编程,集中精力让程序变得极为简洁。

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

而且,当被问及“你的编程风格是什么”时,盖茨答道:

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

回答中提到,在完成代码后,盖茨喜欢回去把它从头到尾再全部重写一遍——这样做既有利于对设计细节加深理解、优化设计,又有利于对程序的整体把握。

诚实、谦虚、协作、沟通

盖茨不仅为人诚实、谦虚,而且愿意与他人协作,相互学习、取长补短。盖茨对于遇到的良师益友,不仅清晰记得每个人的名字,而且对于他们给予的帮助更是记忆犹新。其中,诺顿扮演了良师的角色。正如盖茨所说:

我一直记得一个人,他是我在TRW公司遇到的,名叫诺顿。我没有做到特别好的时候,他总会给我指出来。所以当我草率或偷懒的时候,我总是想象着他会走过来,看一看程序,然后告诉我:“你看,这儿有一个更好的方法。”

还有TRW公司的约翰·诺顿,他在读别人的代码时会写一些备忘录——在此之前我从来没有见过有人这么做。后来我也开始尝试那样做了,看别人的代码时我会写下心得。

除了这位印象深刻的良师以外,还有许多优秀、甚至杰出的程序员与盖茨一起开发过程序:

我还非常喜欢为Model 100编写的那个程序,特别是我们把一个非常有用的小编辑器压缩到了软件中。我和一个名叫杰米·铃木(Jey Suzuki)的日本程序员合作完成了那项工作。……

……那时我已经开发完成了8080上的BASIC程序,接下来有大约两周的时间可以和马克·查姆伯林(Mark Chamberlain)一起开发6809版本的BASIC程序。

……后来在微软期间,查尔斯·西蒙尼和微软其他一些人也影响了我。

当然,保罗·艾伦作为盖茨的至交好友,又是微软的联合创始人,他对于盖茨的帮助和影响非同小可。

……最初编写BASIC时,我在纸上画出了设计草案。我的合作者保罗·艾伦设计并实现了所有开发工具。

……当时保罗·艾伦给我带来一本介绍Altair的杂志,我们就想:“老天,我们最好在上面做些事情,这些机器肯定会很受欢迎的。”于是我不再去上课了,我们开始没日没夜地工作起来。……

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

盖茨不仅积极与他人协作,而且大力提倡沟通,从而收集优秀思想,并不断提高程序质量、及程序员的个人能力。

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

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

成功源于对失败的系统反思

盖茨在创办微软之前,也曾参与过一些焦油坑般的大型项目,他是这样说的:

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

正因为盖茨之前拥有了这些关于失败项目的经验,他才有可能进行系统反思,并分析、总结出一套行之有效的项目管理方法:

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

结束语

尽管像比尔·盖茨等编程大师的人生经历是独一无二的,各有精彩所在。然而从访谈的字里行间中仍可一窥大师的所思所想、所作所为,以及习惯和好恶等等细节。这些内容对于喜爱编程的极客而言是无价之宝!正如《道德经》所云:”天下大事,必作于细;天下难事,必成于易。“我们不妨从个人的实际情况出发,在日常工作、生活中,从力所能及的点滴小事做起,养成优良的编程习惯,并积极学习、思考,不断完善编程思想。

最后,让我们去努力精炼有限的人生,使它绽放出无限精彩吧!